仅针对顶级框架(即URL栏中显示的URL)拦截HTTP请求错误

时间:2017-06-12 18:31:03

标签: javascript firefox-addon firefox-webextensions

在WebExtensions中,有用于拦截HTTP请求和错误的API。当我使用此代码测试webRequest.onErrorOccurred时:

manifest.json

{

  "manifest_version": 2,
  "name": "testOnError",
  "version": "1.0",
  "background": {
    "scripts": ["testOnError.js"]
  },
  "permissions": [
    "webRequest"
  ]
}

然后,testOnError.js

var target = "<all_urls>"; 

/*
e.g., with no network:
"https://developer.mozilla.org/en-US/"
NS_ERROR_NET_ON_RESOLVED in Firefox
net::ERR_INTERNET_DISCONNECTED in Chrome
*/

function logError(responseDetails) {  
  var errorURL=responseDetails.url;
  console.log("response url: "+errorURL);

  var errorCode=responseDetails.error;
  console.log("response error: "+ errorCode);
}
browser.webRequest.onErrorOccurred.addListener(
  logError,
  {urls: [target]}
);

API会返回未从网址栏启动的请求的错误。

如果我只关心导航网址的请求和错误,即包括点击更改网址栏内容的链接,但不包括我未点击的图片和其他请求的后台请求,我这样做没有在URL栏中看到,我该如何强制执行此操作?如何将错误URL与导致它的请求相关联(即如何知道错误来自其URL栏的选项卡)?

1 个答案:

答案 0 :(得分:0)

您可以通过将types: ['main_frame']添加到调用webRequest.onErrorOccurred.addListener时使用的过滤器来执行此操作。这看起来像是:

chrome.webRequest.onErrorOccurred.addListener(logError, {
    urls‌​: [target],
    types: ['main_frame']
});

您的logError函数将使用类似于以下内容的对象进行调用:

webRequest.onErrorOccurred - > arg[0] = Object {
    error: "NS_ERROR_NET_ON_RESOLVED",
    frameId: 0,
    fromCache: false,
    method: "GET",
    originUrl: undefined,
    parentFrameId: -1,
    requestId: "117",
    tabId: 2,
    timeStamp: 1497304152760,
    type: "main_frame",
    url: "http://www.exampleahdsafhd.com/"
}

您可以通过查看tabId属性来了解收到此错误的标签,该属性将唯一标识标签。

请注意,并非所有对网址的更改都会导致导航到新网页。有些网页会更改网址栏中的地址,并独立使用AJAX来获取新内容。这不会检测到URL条地址的更新类型,也不会检测与使用AJAX获取此类数据相关的任何请求。