仅拦截顶级帧的 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 获取此类数据相关的任何请求。
在 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 获取此类数据相关的任何请求。