He almacenado algunas URL en chrome.storage.sync como a continuación...
sitesToBeBlocked: { "https://www.google.com/":"https://www.google.com/" , "https://www.example.com/": "https://www.example.com/" }
Ahora estoy tratando de bloquear estas direcciones URL usando el siguiente código...
Manifiesto.json
{ "name": "chrome extension", "description": ".............", "version": "0.0.1", "manifest_version": 2, "background": { "scripts": ["/scripts/background/background.js"] }, "content_scripts": [ { "matches": ["https://*/*","http://*/*"] , "js": ["/scripts/content/jquery-3.6.0.js","/scripts/content/content-script.js"] } ], "permissions": ["storage","unlimitedStorage","webRequest","webRequestBlocking","*://*/*"], "browser_action": { "default_popup": "/popup/popup.html", "default_icon": { ............ } }, "options_ui": { "page": "/options/options.html", "open_in_tab": true }, }
fondo.js
function isRequestCancelled(sitesArray, url){ return sitesArray.includes(url); } function blockListener (details) { chrome.storage.sync.get(null, (items)=>{ var sitesArray = Object.keys(items['sitesToBeBlocked']); return { cancel: isRequestCancelled(sitesArray, details.url ) }; }); } chrome.webRequest.onBeforeRequest.addListener( blockListener ,{ urls: ["<all_urls>"], types: [ 'main_frame' ] }, ['blocking'] );
Pero las URL no están bloqueadas , no sé cuál es el problema... por favor, ayúdenme a encontrar el problema exacto al que me enfrento...
Descubrí el problema en mi código yo mismo ...
En realidad, el problema aquí es que la devolución de llamada de chrome.storage.sync
es una función asíncrona. Debido a lo cual, la devolución de llamada de chrome.webRequest
finaliza antes de la devolución de llamada de chrome.storage.sync
.
La solución puede ser,
Coloque todo dentro de la devolución de llamada de chrome.storage.sync
, de modo que todas las funciones regresen después de que se ejecute la devolución de llamada de chrome.storage.sync
.
Finalmente he solucionado este problema con el código modificado a continuación....
chrome.storage.sync.get(null,(items)=>{ function isRequestCancelled(sitesArray, url){ return sitesArray.includes(url); } function blockListener (details) { var sitesArray = Object.keys(items['sitesToBeBlocked']); return { cancel: isRequestCancelled(sitesArray, details.url ) }; } chrome.webRequest.onBeforeRequest.addListener( blockListener ,{ urls: [" <all_urls>"], types: [ 'main_frame' ] }, ['blocking'] ); });
La pista real se obtiene de la consulta relacionada