chrome.declarativeWebRequest
- 清单文件
- 规则
- 条件与操作的求值
- 使用优先级覆盖规则
- 类型
- HeaderFilter
- RequestMatcher
- CancelRequest
- RedirectRequest
- RedirectToTransparentImage
- RedirectToEmptyDocument
- RedirectByRegEx
- SetRequestHeader
- RemoveRequestHeader
- AddResponseHeader
- RemoveResponseHeader
- IgnoreRules
- SendMessageToExtension
- RequestCookie
- ResponseCookie
- FilterResponseCookie
- AddRequestCookie
- AddResponseCookie
- EditRequestCookie
- EditResponseCookie
- RemoveRequestCookie
- RemoveResponseCookie
- 事件
描述: | 使用 chrome.declarativeWebRequest API 实时地拦截、阻止或者修改请求,它比 chrome.webRequest API 要快得多,因为您注册的规则在浏览器而不是 JavaScript 引擎中求值,这样就减少了来回延迟并且可以获得极高的效率。 |
可用版本: | 仅用于 Beta 和 dev 分支。 |
权限: | "declarativeWebRequest" 主机权限 |
清单文件
您必须在扩展程序的清单文件中声明 "declarativeWebRequest" 权限和主机权限才能使用这一 API。
{ "name": "我的扩展程序", ... "permissions": [ "declarativeWebRequest", "*://*/*" ], ... }
注意,某些类型的不敏感操作不需要主机权限:
CancelRequest
IgnoreRules
RedirectToEmptyDocument
RedirectToTransparentImage
对于您希望触发消息的网络请求,SendMessageToExtension
操作要求对应主机的主机权限。
所有其他操作要求访问所有 URL 的主机权限。
例如,如果扩展程序唯一拥有的主机权限是 "*://*.google.com/*"
,这样的扩展程序可以设置如下规则:
- 取消发送自“http://www.google.com”或“http://anything.else.com”的请求
- 导航至“http://www.google.com”时发送消息,但是导航至“http://something.else.com”时不能发送消息。
扩展程序不能设置规则,将“http://www.google.com”重定向至“http://mail.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
操作,它仅应用于同一网络请求在同一阶段执行的其他操作。
chrome.declarativeWebRequest 参考
类型
HeaderFilter
HeaderFilter 的属性
RequestMatcher
RequestMatcher 的属性
firstPartyForCookiesUrl ( optional events.UrlFilter )
- 如果请求的“第一方”URL 满足 UrlFilter 的条件则匹配,请求的“第一方”URL(如果存在的话)可能与请求的目标 URL 不同,描述的是相对于第三方 Cookie 检查的“第一方”。
resourceType ( optional array of enum of "main_frame"
, "sub_frame"
, "stylesheet"
, "script"
, "image"
, "object"
, "xmlhttprequest"
, or "other"
)
- 如果请求的类型包含在列表中则匹配,不匹配指定的任何类型的请求将被过滤出去。
CancelRequest
RedirectRequest
RedirectToTransparentImage
RedirectToEmptyDocument
RedirectByRegEx
RedirectByRegEx 的属性
SetRequestHeader
SetRequestHeader 的属性
RemoveRequestHeader
RemoveRequestHeader 的属性
name ( string )
- HTTP 请求头信息的名称(不区分大小写)。
AddResponseHeader
AddResponseHeader 的属性
RemoveResponseHeader
RemoveResponseHeader 的属性
IgnoreRules
IgnoreRules 的属性
SendMessageToExtension
RequestCookie
RequestCookie 的属性
ResponseCookie
ResponseCookie 的属性
FilterResponseCookie
FilterResponseCookie 的属性
ageUpperBound ( optional integer )
- Cookie 生命周期的上界(包含)(以当前时间之后多少秒的形式指定),只有过期日期时间在区间 [现在, 现在 + ageUpperBound] 内的 Cookie 满足这一条件,会话 Cookie 以及过期时间在过去的 Cookie 不满足该过滤器的条件。Cookie 的生命周期通过 Cookie 的 'max-age' 或 'expires' 属性来计算,如果两者都指定则使用 'max-age' 来计算 Cookie 的生命周期。
AddRequestCookie
AddRequestCookie 的属性
cookie ( RequestCookie )
- 要添加至请求的 Cookie,所有字段都不能为 undefined。
AddResponseCookie
AddResponseCookie 的属性
cookie ( ResponseCookie )
- 要添加至响应的 Cookie,name 与 value 必须指定。
EditRequestCookie
EditRequestCookie 的属性
EditResponseCookie
EditResponseCookie 的属性
RemoveRequestCookie
RemoveRequestCookie 的属性
filter ( RequestCookie )
- 过滤要移除的 Cookie,所有空项都会忽略。
RemoveResponseCookie
RemoveResponseCookie 的属性
filter ( FilterResponseCookie )
- 过滤要移除的 Cookie,所有空项都会忽略。
事件
onRequest
提供声明式事件 API,包括 $ref:[events.Event.addRules addRules]、$ref:[events.Event.removeRules removeRules] 和 $ref:[events.Event.getRules getRules]。
支持的条件
支持的操作
onMessage
当消息通过声明式网络请求 API 的 SendMessageToExtension 操作发送时产生。
addListener
参数
callback ( function )
callback 参数应该指定一个如下形式的函数:
function(object details) {...};