Estoy tratando de inyectar secuencias de comandos de contenido a través del comando chrome.tabs.executeScript , pero intenta inyectar en cada pestaña abierta en el navegador. ¿Hay una manera de determinar si la extensión tiene el permiso correcto para la pestaña (en el manifest.json, clave de permissions ) antes de intentar inyectar el script? Mi error es: Unchecked runtime.lastError: Cannot access contents of url "https://exmaple.com/". Extension manifest must request permission to access this host.
mi código es:
const chromeManifest = chrome.runtime.getManifest(); chrome.tabs.query({}, tabs => { const [script] = chromeManifest?.content_scripts?.[0].js; tabs.forEach(tab => { /* HERE CHECK IF THERE IS PERMISSION FOR THE TAB */ chrome.tabs.executeScript(tab.id, { file: script, }); }); });Simplemente lea chrome.runtime.lastError en la devolución de llamada de executeScript para suprimir el error.
chrome.tabs.executeScript(tab.id, { file }, () => chrome.runtime.lastError); Como una optimización en caso de que content_scripts de manifest.json matches con un patrón de sitio específico, consulta solo las pestañas que coincidan con este patrón.
Tenga en cuenta que el patrón <all_urls> también coincidirá con las pestañas chrome:// , file:// , chrome-extension:// , mientras que *://*/* solo coincidirá con http:// y https:// .
chrome.runtime.getManifest().content_scripts.forEach(script => { const params = { runAt: script.run_at, allFrames: script.all_frames, matchAboutBlank: script.match_about_blank, }; // <all_urls> is not supported here so we use an empty array const urlQuery = script.matches.filter(m => m !== '<all_urls>'); chrome.tabs.query({ url: urlQuery }, tab => { script.js.forEach(file => { chrome.tabs.executeScript(tab.id, { ...params, file }, () => { const err = chrome.runtime.lastError; // if (err) console.warn(err.message); }); }); }); });