#javascript #google-chrome-extension
Вопрос:
В моем сценарии с внедренным контентом я пытаюсь использовать API хранилища chrome:
content.js
document.addEventListener("paste", (event) => {
let paste = event.clipboardData.getData('text');
var lookalike = isLikeWallet(paste)
if (lookalike) {
chrome.storage.sync.get("wallets", (items) => {
var wallets = items.wallets;
if(!wallets.includes(paste)) {
alert('alert')
}
});
}
});
Это сработало, когда я тестировал его в последний раз — несколько дней назад. Теперь я получаю ошибку:
Uncaught TypeError: Cannot read properties of undefined (reading 'sync')
at HTMLDocument.<anonymous> (contentScript.js:10)
Этот API-интерфейс хранилища, по-видимому, является общепринятым методом доступа к переменным общего состояния в ваших сценариях фона, всплывающих окон и содержимого, и в документации указано: (https://developer.chrome.com/docs/extensions/reference/storage/)
Сценарии содержимого вашего расширения могут напрямую получать доступ к пользовательским данным без необходимости создания фоновой страницы.
Т. е. мне не нужно использовать API обмена сообщениями для отправки данных туда и обратно.
Вот мой манифест.json:
{
"name": "Test extension",
"description": "Description",
"version": "1.0",
"manifest_version": 3,
"background": {
"service_worker": "background.js"
},
"permissions": ["storage", "activeTab"],
"action": {
"default_popup": "popup.html",
"default_icon": {
"16": "/images/test16.png",
"32": "/images/test32.png",
"48": "/images/test48.png",
"128": "/images/test128.png"
}
},
"icons": {
"16": "/images/test16.png",
"32": "/images/test32.png",
"48": "/images/test48.png",
"128": "/images/test128.png"
},
"content_scripts": [
{
"matches": ["<all_urls>"],
"js": ["contentScript.js"]
}
]
}
Заранее благодарю вас за любую помощь! Не уверен, что здесь происходит — тем более, что это работало (и надежно) всего несколько дней назад.
Комментарии:
1. Похоже, вы добавляете
<script>
элемент с этим кодом внутри. Такой код является обычным сценарием веб-страницы, а не сценарием содержимого, поэтому он не может использовать API chrome.storage.2. Спасибо за потенциальное исправление! Просмотрел мое
html
досье, которое popup.html, и единственный элемент сценария предназначен дляpopup.js
. Есть еще какие-нибудь идеи??3. Сценарий всплывающего окна является страницей расширения, поэтому его сценарии не являются сценариями содержимого. Сценарии содержимого выполняются только на веб-страницах, т. е. сайтах http:// и https://, а не на страницах расширений.
4. да, только что упомянул, что b/c, я не думаю, что где — либо ссылаюсь
content.js
на<script>
элемент. Я могу видеть введенный скрипт в исходниках, когда просматриваю веб-страницу. Мое замешательство заключается в том, что я проверил, что сценарий введен на страницу, и в manifest.json он помечен как сценарий содержимого — так почему я не могу использовать API chrome.storage? еще раз, очень признателен за помощь в обдумывании этого5. Единственными другими причинами являются ошибка в браузере, или вы не перезагрузили расширение после добавления
storage
разрешения, или вы видите старую ошибку в пользовательском интерфейсе страницы chrome://расширения.