仅拦截顶级帧的 HTTP 请求错误(即 URL 栏中显示的 URL)

Intercept HTTP request errors only for top level frames (i.e. the URL shown in the URL bar)

在 WebExtensions 中,有 API 用于拦截 HTTP 请求和错误。当我使用此代码测试 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]}
);

不是从 URL 栏发起的请求的 API returns 错误。

如果我只关心导航 URL 的请求和错误,即包括单击 link 会更改 URL 栏的内容,但不包括后台请求对于我没有点击并且没有在 URL 栏中看到的图像和其他请求,我该如何强制执行?以及我如何 link 错误 URL 以及导致它的请求(即我如何知道错误来自其 URL 栏的选项卡)?

您可以通过将 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 属性 来了解收到此错误的选项卡,它将唯一标识该选项卡。

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