在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栏的选项卡)?
答案 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获取此类数据相关的任何请求。