3

我想将我的 Chrome 扩展程序转换为 Firefox。到目前为止一切顺利,除了我webRequest.onBeforeRequest在 Chrome 扩展程序中有一个 url 重定向,这在 Firefox WebExtensions 中是不允许的

现在我不确定如何在 Firefox 中实现这一点。
在 Chromebackground.js中,它看起来像这样:

chrome.webRequest.onBeforeRequest.addListener(
  function(details) {
    console.log('onBeforeRequest');

    var returnuri;
    returnuri = details.url;
    if ((details.url.indexOf("/malicious/") > -1) || (details.url.indexOf("/bad/") > -1)){
      //I want to redirect to safe content
      returnuri = details.url + (/\&tag=/.test(details.url) ? "" : '/safe/');
    }else{
      returnuri = details.url;
    }
    return {redirectUrl: returnuri};
  },
  {
    urls: [
      "*://malicious.com/*"
    ],
    types: ["main_frame"]
  },
  ["blocking"]
);
4

1 回答 1

4

您引用了WebExtensions 文档

请求可以是:

  • 仅在取消onBeforeRequest
  • 仅在onBeforeSendHeaders

...

onBeforeRequest在或中不允许重定向onHeadersReceived,但在 中允许onBeforeSendHeaders

嗯,这很好地解释了这种情况。您的选择是:

  1. 等到 WebExtensions 更好地支持webRequest.

编辑(2018 年 12 月):这确实是可能的。引用文档

在其中一些事件上,您可以修改请求。具体来说,您可以:

  • 取消请求:
    • onBeforeRequest
    • onBeforeSendHeaders
    • onAuthRequired
  • 将请求重定向到:
    • onBeforeRequest
    • onHeadersReceived

[...]

  1. 如果绝对必须完全不建立连接,则取消而不是重定向请求。

  2. onBeforeSendHeaders改为重定向。考虑到您只检查 URL 并且在该事件中可用,除了 TCP 连接可能在您重定向之前已经建立之外,它应该没有什么区别。

    请注意,相同的代码在 Chrome 中不起作用 - 它不希望在此请求中进行重定向。

    正如您所提到的,与 Chrome 不同,重定向到相同的 URL 会产生一个循环(因为此时需要从头开始重新发出请求)。

    通常,如果您需要检查早期事件中可用的内容并稍后对其采取行动,您可以onBeforeRequest通过保存请求来标记请求,requestId然后将相同的请求 ID 重定向到onBeforeSendHeaders.不幸的是,文档状态requestId也不支持。

于 2016-03-05T09:16:54.687 回答