该页面翻译自 Google Chrome Extensions 与 Google Chrome Apps。除非特别说明,该页面的内容遵循 Creative Commons Attribution 3.0 License,代码示例遵循 BSD License。
该 API 还在 beta 测试中,仅对 beta 分支和 dev 分支的 Chrome 用户可用。
| 描述: |
使用 chrome.declarativeWebRequest API 实时地拦截、阻止或者修改请求,它比 chrome.webRequest API 要快得多,因为您注册的规则在浏览器而不是 JavaScript 引擎中求值,这样就减少了来回延迟并且可以获得极高的效率。
|
| 可用版本: |
仅用于 Beta 和
dev 分支。
|
| 权限: |
"declarativeWebRequest"
主机权限 |
您必须在扩展程序的清单文件中声明 "declarativeWebRequest" 权限和主机权限才能使用这一 API。
{
"name": "我的扩展程序",
...
"permissions": [
"declarativeWebRequest",
"*://*/*"
],
...
}
注意,某些类型的不敏感操作不需要主机权限:
CancelRequest
IgnoreRules
RedirectToEmptyDocument
RedirectToTransparentImage
对于您希望触发消息的网络请求,SendMessageToExtension
操作要求对应主机的主机权限。
所有其他操作要求访问所有 URL 的主机权限。
例如,如果扩展程序唯一拥有的主机权限是
"*://*.google.com/*",这样的扩展程序可以设置如下规则:
声明式网络请求 API 遵循声明式 API
的概念,您可以向 chrome.declarativeWebRequest.onRequest
事件对象注册规则。
声明式网络请求API支持一种匹配条件的类型,即
RequestMatcher,当且仅当列出的所有条件都满足时
RequestMatcher 才会匹配网络请求。当用户在 URL
栏中输入“http://www.example.com”时如下的 RequestMatcher
将匹配这一网络请求:
var matcher = new chrome.declarativeWebRequest.RequestMatcher({
url: { hostSuffix: 'example.com', schemes: ['http'] },
resourceType: ['main_frame']
});
向“https://www.example.com”发出的请求因为协议的原因不会被
RequestMatcher 匹配,并且由于
resourceType,所有内嵌框架的请求也不会匹配。
注意:所有条件与操作都必须通过上述例子中所示的构造函数创建。
为了取消所有发送至“example.com”的请求,您可以定义如下规则:
var rule = {
conditions: [
new chrome.declarativeWebRequest.RequestMatcher({
url: { hostSuffix: 'example.com' } })
],
actions: [
new chrome.declarativeWebRequest.CancelRequest()
]};
为了取消发送至“example.com”以及“foobar.com”的所有请求,您可以添加第二个条件,因为每个条件都足以触发所有指定的操作:
var rule2 = {
conditions: [
new chrome.declarativeWebRequest.RequestMatcher({
url: { hostSuffix: 'example.com' } }),
new chrome.declarativeWebRequest.RequestMatcher({
url: { hostSuffix: 'foobar.com' } })
],
actions: [
new chrome.declarativeWebRequest.CancelRequest()
]};
如下所示注册规则:
chrome.declarativeWebRequest.onRequest.addRules([rule2]);
注意:您始终应该一次性批量注册或取消注册规则,而不是单独进行,因为每一次这样的操作都需要重新创建内部的数据结构,这一重新创建的过程需要大量的计算,但是可以利用一种极快的 URL 匹配算法,用于几十万个 URL。事件 API 的性能部分提供了进一步的性能提示。
声明式网络请求 API 遵循网络请求 API 的生命周期模型,这意味着条件只能在网络请求的特定阶段测试,同样地,操作也只能在特定阶段执行。下表列出了与条件和操作兼容的请求阶段。
| 能够处理条件属性的请求阶段: | ||||
|---|---|---|---|---|
| 条件属性 | onBeforeRequest | onBeforeSendHeaders | onHeadersReceived | onAuthRequired |
| url | ✓ | ✓ | ✓ | ✓ |
| resourceType | ✓ | ✓ | ✓ | ✓ |
| contentType | ✓ | |||
| excludeContentType | ✓ | |||
| responseHeaders | ✓ | |||
| excludeResponseHeaders | ✓ | |||
| requestHeaders | ✓ | |||
| excludeRequestHeaders | ✓ | |||
| thirdPartyForCookies | ✓ | ✓ | ✓ | ✓ |
| 能够执行操作的请求阶段: | ||||
| 操作 | onBeforeRequest | onBeforeSendHeaders | onHeadersReceived | onAuthRequired |
| AddRequestCookie | ✓ | |||
| AddResponseCookie | ✓ | |||
| AddResponseHeader | ✓ | |||
| CancelRequest | ✓ | ✓ | ✓ | ✓ |
| EditRequestCookie | ✓ | |||
| EditResponseCookie | ✓ | |||
| IgnoreRules | ✓ | ✓ | ✓ | ✓ |
| RedirectByRegEx | ✓ | |||
| RedirectRequest | ✓ | |||
| RedirectToEmptyDocument | ✓ | |||
| RedirectToTransparentImage | ✓ | |||
| RemoveRequestCookie | ✓ | |||
| RemoveRequestHeader | ✓ | |||
| RemoveResponseCookie | ✓ | |||
| RemoveResponseHeader | ✓ | |||
| SendMessageToExtension | ✓ | ✓ | ✓ | ✓ |
| SetRequestHeader | ✓ | |||
注意:适用的阶段可以使用 "stages" 属性进一步地约束。
例子:可以将
new chrome.declarativeWebRequest.RequestMatcher({contentType: ["image/jpeg"]))
条件与
new chrome.declarativeWebRequest.CancelRequest()
操作组合,因为它们都可以在 onHeadersReceived
阶段求值,然而不能将该请求匹配器与
new chrome.declarativeWebRequest.RedirectToTransparentImage()
组合,因为内容类型确定后就不能再进行重定向了。
规则中可以包含优先级,如事件 API 中所述,这种机制可以用来表达例外。如下例子将阻止除了来自服务器 "myserver.com" 以外所有名称为 "evil.jpg" 的图片请求,。
var rule1 = {
priority: 100,
conditions: [
new chrome.declarativeWebRequest.RequestMatcher({
url: { pathEquals: 'evil.jpg' } })
],
actions: [
new chrome.declarativeWebRequest.CancelRequest()
]
};
var rule2 = {
priority: 1000,
conditions: [
new chrome.declarativeWebRequest.RequestMatcher({
url: { hostSuffix: '.myserver.com' } })
],
actions: [
new chrome.declarativeWebRequest.IgnoreRules({
lowerPriorityThan: 1000 })
]
};
chrome.declarativeWebRequest.onRequest.addRules([rule1, rule2]);
值得重视的是,IgnoreRules
操作并不会在请求阶段之间保留。所有规则的所有条件都在每一个网络请求阶段求值,如果执行了
IgnoreRules
操作,它仅应用于同一网络请求在同一阶段执行的其他操作。
"main_frame", "sub_frame", "stylesheet", "script", "image", "object", "xmlhttprequest", or "other"
)
提供声明式事件 API,包括 $ref:[events.Event.addRules addRules]、$ref:[events.Event.removeRules removeRules] 和 $ref:[events.Event.getRules getRules]。
当消息通过声明式网络请求 API 的 SendMessageToExtension 操作发送时产生。
callback 参数应该指定一个如下形式的函数:
function(object details) {...};