如何在加载到 Webextensions 之前根据内容阻止资源?

How to block resources based on their content before they are loaded in Webextensions?

我想在资源(如 JavaScript- 或 CSS- 文件)完全加载之前阻止它们。如果资源被阻塞,则条件取决于它们的内容。实际上,没有解决方案,或者?

我所知道的: Webextensions 类似于 Chrome 扩展,因此它们也有 webRequest.onBeforeRequest 侦听器。侦听器允许阻止文件:

function cancel(requestDetails) {
  console.log("Canceling: " + requestDetails.url);
  return {cancel: true};
}

chrome.webRequest.onBeforeRequest.addListener(
  cancel,
  {urls: ["<all_urls>"], types: ["script"]},
  ["blocking"]
);

到此为止,一切都很好。还应该有 requestBody 选项,这样我就可以根据文件的内容做出决定。但是 Mozilla Doc 说:

  1. Firefox does not support the "requestBody" option.

哦,糟糕的故事,不酷。所以我需要一个异步 XHR 请求,以获取 URL 数据:

function cancel(requestDetails) {
   return {cancel: getUrlContent(requestDetails.url, function(result) {
      if(condition) { console.log(true); } else { console.log(false); }
   })};
}

// asynchron XHR request
function getUrlContent(url, callback) { [...] }

=> 这行不通。 return {cancel: X}; 接受正常函数,例如 return {cancel: doSth()}; ,但没有异步回调。我没有选择 "return" 结果取消 JSON.

在其他 Whosebug 问题中,我读到了 nsIContentPolicy,它是
的一部分 XPCOM。我没有找到关于如何在 Firefox Webextension 环境中使用它的提示、示例或描述。这可能吗?如果是,怎么做?

如果这两件事都不可能,我该如何做这样的扩展?我是否必须在没有 Webextension 的情况下使用已弃用的 XPCOM?

看起来 requestBody 将登陆即将推出的 Firefox 版本(目前似乎是 50):bugzilla.mozilla.org/show_bug.cgi?id=1201979。也就是说,您现在可以在 Beta 中进行测试,因为 49 已于本周发布。