chrome.webRequest redirectUrl,其中包含在chrome.storage.local中保存的URL

时间:2014-06-10 00:20:51

标签: javascript google-chrome google-chrome-extension google-chrome-devtools

我试图拦截网络请求并将其重定向到我保存在本地存储上的网址,但它不起作用。我的代码如下:

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: ["<all_urls>"] }, ["blocking"]);

对return statement / url进行硬编码工作:

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

1 个答案:

答案 0 :(得分:5)

chrome.storage api是asynchronous,所以你在这里采取的方法是行不通的。您所拥有的代码所发生的事情的基本贯彻是:

  1. 在网络请求之前,请检查网址是否为http://myapp.com/theurl
  2. 如果是,则对chrome.storage.local.get
  3. 进行异步调用
  4. chrome.storage.local.get调用中的代码(即返回语句)不会立即执行,并会在稍后的某个时间运行
  5. 其余代码继续运行,并且没有从webRequest侦听器返回任何内容
  6. 有几种方法可以让你的工作。最简单的方法是在加载扩展时将本地存储的值存储在某个变量中(称之为storage_cache)。然后从webRequest监听器中你可以说return { redirectUrl: storage_cache.savedUrl };

    如果你的存储会经常变化,那么有比这更好的方法......但是你要选择的任何实现都要记住的关键是不要混淆同步和异步事件。