chrome.webRequest redirectUrl con la URL guardada en chrome.storage.local

Estoy intentando interceptar las solicitudes web y redirigirlas a una URL que he guardado en el almacenamiento local, pero no funciona. Mi código es el siguiente:

chrome.webRequest.onBeforeRequest.addListener( function (details) { if (details.url === 'http://myapp.com/theurl') { chrome.storage.local.get("http://myapp.com/theurl", function (result) { return { redirectUrl: result.savedUrl }; //savedUrl property is the modified Url }); } }, { urls: [""] }, ["blocking"]); 

Hardcoding la statement de retorno / url funciona:

 chrome.webRequest.onBeforeRequest.addListener( function (details) { if (details.url === 'http://myapp.com/theurl') { return { returnUrl : 'http://myapp.com/modifiedurl' }; }); } }, { urls: [""] }, ["blocking"]); 

El api chrome.storage es asíncrono , por lo que el enfoque que está tomando aquí no funcionará. El análisis básico de lo que está sucediendo con el código que tiene es:

  1. Antes de la solicitud web, compruebe si la URL es http://myapp.com/theurl
  2. Si es así, haz una llamada asíncrona a chrome.storage.local.get
  3. El código dentro de su llamada chrome.storage.local.get (es decir, la statement de retorno) no se ejecuta de inmediato y se ejecutará más adelante
  4. El rest de su código continúa ejecutándose y su oyente webRequest no devuelve nada.

Hay un par de maneras en que puedes hacer que esto funcione. Lo más fácil sería almacenar los valores del almacenamiento local dentro de alguna variable cuando se carga su extensión (llámelo, por ejemplo, storage_cache ). Luego, desde el oyente webRequest, puede decir return { redirectUrl: storage_cache.savedUrl };

Si su almacenamiento cambiará con frecuencia, hay mejores enfoques que este … pero la clave para recordar para cualquier implementación que elija es no mezclar eventos síncronos y asíncronos.