该页面翻译自 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) {...};