Aquí está mi guión de fondo;
/** * CSS to hide everything on the page, */ const hidePage = `body > : { display: none; }`; /** * When a tab is loaded, check if the plugin is on. If the plugin is on, check if the url matches the page. * If it does, block it */ browser.tabs.onActivated.addListener(function (activeInfo) { browser.storage.local.get("onOff") .then((result) => { if (Object.entries(result).length === 0 || !result.onOff.value) { return; } browser.tabs.query({ currentWindow: true, active: true }).then((tabs) => { let tab = tabs[0]; console.log(tab.url); browser.tabs.insertCSS({code: hidePage}) }, console.error) }); }); y aquí está mi manifest.json
{ "manifest_version": 2, "name": "Beastify", "version": "1.0", "description": "Adds a browser action icon to the toolbar. Click the button to choose a beast. The active tab's body content is then replaced with a picture of the chosen beast. See https://developer.mozilla.org/en-US/Add-ons/WebExtensions/Examples#beastify", "homepage_url": "https://github.com/mdn/webextensions-examples/tree/master/beastify", "icons": { "48": "icons/beasts-48.png" }, "permissions": [ "tabs", "activeTab", "storage" ], "browser_action": { "default_icon": "icons/beasts-32.png", "default_title": "BlockIt", "default_popup": "popup/blockit.html" }, "background": { "scripts": ["background_scripts/blocker.js"] }, "web_accessible_resources": [ "beasts/frog.jpg", "beasts/turtle.jpg", "beasts/snake.jpg" ] }Hay algunas cosas superfluas allí porque estoy creando mi complemento a partir de un tutorial de extensión de Firefox .
El código exacto que está causando el Uncaught (in promise) Error: Missing host permission for the tab es
browser.tabs.insertCSS({code: hidePage})
línea 23 de blocker.js
Creo que tengo los permisos correctos para insertar css desde este script de fondo, por lo que no puedo entender por qué ocurre este error. También traté de ejecutar un script de contenido en lugar de ejecutar la línea anterior que arroja el error, pero falló con el mismo error.
activeTab solo funciona cuando el usuario invoca explícitamente su extensión como se describe en la documentación para extensiones WebExtensions y Chrome ). Evidentemente, su nombre es muy engañoso: debería haber sido algo como activeTabWhenInvoked .
Para acceder a cualquier pestaña sin interacción previa con su extensión, deberá agregar amplios permisos de host en manifest.json:
"permissions": ["<all_urls>"], Ahora no hay necesidad de activeTab , pero es posible que aún desee mantener el permiso de tabs para Firefox anterior a 86, consulte la nota en la documentación .
PD: es mejor eliminar el oyente por completo cuando onOff es falso para que la extensión no se ejecute en vano. Puede hacerlo usando una función con nombre global para el oyente onActivated y observando los cambios en onOff a través del evento browser.storage.onChanged.