chrome.declarativeWebRequest

描述: 使用 chrome.declarativeWebRequest API 实时地拦截、阻止或者修改请求,它比 chrome.webRequest API 要快得多,因为您注册的规则在浏览器而不是 JavaScript 引擎中求值,这样就减少了来回延迟并且可以获得极高的效率。 
可用版本: 仅用于 Beta 和 dev 分支。 
权限: "declarativeWebRequest" 
主机权限

清单文件

您必须在扩展程序的清单文件中声明 "declarativeWebRequest" 权限和主机权限才能使用这一 API。

manifest.json
{
"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 的属性

namePrefix ( optional string )

如果头信息的名称以指定字符串开头则匹配。

nameSuffix ( optional string )

如果头信息的名称以指定字符串结尾则匹配。

nameContains ( optional array of string or string )

如果头信息的名称包含所有指定的字符串则匹配。

nameEquals ( optional string )

如果头信息的名称与指定字符串相同则匹配。

valuePrefix ( optional string )

如果头信息的值以指定字符串开头则匹配。

valueSuffix ( optional string )

如果头信息的值以指定字符串结尾则匹配。

valueContains ( optional array of string or string )

如果头信息的值包含所有指定的字符串则匹配。

valueEquals ( optional string )

如果头信息的值与指定字符串相同则匹配。

RequestMatcher

通过各种条件匹配网络事件。

RequestMatcher 的属性

url ( optional events.UrlFilter )

如果请求所对应的 URL 满足 UrlFilter 的条件则匹配。

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" )

如果请求的类型包含在列表中则匹配,不匹配指定的任何类型的请求将被过滤出去。

contentType ( optional array of string )

如果响应的 MIME 媒体类型(来自 HTTP Content-Type 头信息)包含在列表中则匹配。

excludeContentType ( optional array of string )

如果响应的 MIME 媒体类型(来自 HTTP Content-Type 头信息)没有包含在列表中则匹配。

requestHeaders ( optional array of HeaderFilter )

如果某些请求头信息匹配 HeaderFilter 中的某一个则匹配该请求。

excludeRequestHeaders ( optional array of HeaderFilter )

如果请求头信息都不匹配任何一个 HeaderFilter 则匹配该请求。

responseHeaders ( optional array of HeaderFilter )

如果某些响应头信息匹配 HeaderFilter 中的某一个则匹配该请求。

excludeResponseHeaders ( optional array of HeaderFilter )

如果响应头信息都不匹配任何一个 HeaderFilter 则匹配该请求。

thirdPartyForCookies ( optional boolean )

如果设为 true,则匹配受第三方 Cookie 策略约束的请求;如果设为 false,则匹配所有其他请求。

stages ( optional array of enum of "onBeforeRequest""onBeforeSendHeaders""onHeadersReceived", or "onAuthRequired" )

包含描述阶段的字符串列表,允许的值包括 'onBeforeRequest'、'onBeforeSendHeaders'、'onHeadersReceived'、'onAuthRequired'。如果该属性存在的话,它会将适用的阶段限制在这一列表中。注意整个条件只能在与所有属性兼容的阶段中适用。

CancelRequest

声明式事件操作,取消网络请求。

RedirectRequest

声明式事件操作,重定向网络请求。

RedirectRequest 的属性

redirectUrl ( string )

请求重定向的目标。

RedirectToTransparentImage

声明式事件操作,将网络请求重定向至透明图片。

RedirectToEmptyDocument

声明式事件操作,将网络请求重定向至空文档。

RedirectByRegEx

对 URL 应用正则表达式,重定向请求。正则表达式采用 RE2 语法

RedirectByRegEx 的属性

from ( string )

匹配表达式,可以包含捕获性分组。为了更接近 JavaScript 正则表达式,捕获性分组以 Perl 语法($1、$2……),而不是 RE2 语法(\1、\2……)引用。

to ( string )

目标表达式。

SetRequestHeader

将指定名称的请求头信息设置为指定值。如果指定名称的头信息原来不存在,则会创建新的。头信息名称的比较不区分大小写,且每个请求中每个请求头信息名称只会出现一次。

SetRequestHeader 的属性

name ( string )

HTTP 请求头信息的名称。

value ( string )

HTTP 请求头信息的值。

RemoveRequestHeader

移除指定名称的请求头信息。不要在同一请求的同一头信息名称上同时使用 SetRequestHeader 和 RemoveRequestHeader。每个请求中每个请求头信息名称只会出现一次。

RemoveRequestHeader 的属性

name ( string )

HTTP 请求头信息的名称(不区分大小写)。

AddResponseHeader

向当前网络请求的响应中添加响应头信息。由于多个响应头信息可能会使用相同的名称,您需要首先删除然后再添加新的响应头信息才能完成替换。

AddResponseHeader 的属性

name ( string )

HTTP 响应头信息的名称。

value ( string )

HTTP 响应头信息的值。

RemoveResponseHeader

删除指定名称和值的所有响应头信息。

RemoveResponseHeader 的属性

name ( string )

HTTP 请求头信息的名称(不区分大小写)。

value ( optional string )

HTTP 响应头信息的值(不区分大小写)。

IgnoreRules

排除所有匹配指定条件的规则。

IgnoreRules 的属性

lowerPriorityThan ( optional integer )

如果设置的话,将忽略优先级低于指定值的规则。这一界限不是持久的,它只会影响同一网络请求阶段的规则与它们对应的操作。

hasTag ( optional string )

如果设置的话,包含指定标签的规则将被忽略。这一忽略不是持久的,它只影响同一网络请求阶段的规则及其操作。注意,规则按照优先级递减的顺序执行,该操作只会影响优先级低于当前规则的规则,具有相同优先级的规则可能会也可能不会被忽略。

SendMessageToExtension

触发 onMessage 事件。

SendMessageToExtension 的属性

message ( string )

传递给事件处理函数的词典中 message 属性的值。

RequestCookie

用于过滤或指定 HTTP 请求中的 Cookie。

RequestCookie 的属性

name ( optional string )

Cookie 的名称。

value ( optional string )

Cookie 的值,可以填充在双引号中。

ResponseCookie

用于指定 HTTP 响应中的 Cookie。

ResponseCookie 的属性

name ( optional string )

Cookie 的名称。

value ( optional string )

Cookie 的值,可以填充在双引号中。

expires ( optional string )

Cookie 的 Expires 属性值。

maxAge ( optional double )

Cookie 的 Max-Age 属性值。

domain ( optional string )

Cookie 的 Domain 属性值。

path ( optional string )

Cookie 的 Path 属性值。

secure ( optional string )

Cookie 的 Secure 属性是否存在。

httpOnly ( optional string )

Cookie 的 HttpOnly 属性是否存在。

FilterResponseCookie

用于 HTTP 响应 Cookie 的过滤器。

FilterResponseCookie 的属性

name ( optional string )

Cookie 的名称。

value ( optional string )

Cookie 的值,可以用双引号填充。

expires ( optional string )

Cookie 的 Expires 属性值。

maxAge ( optional double )

Cookie 的 Max-Age 属性值。

domain ( optional string )

Cookie 的 Domain 属性值。

path ( optional string )

Cookie 的 Path 属性值。

secure ( optional string )

Cookie 的 Secure 属性是否存在。

httpOnly ( optional string )

Cookie 的 HttpOnly 属性是否存在。

ageUpperBound ( optional integer )

Cookie 生命周期的上界(包含)(以当前时间之后多少秒的形式指定),只有过期日期时间在区间 [现在, 现在 + ageUpperBound] 内的 Cookie 满足这一条件,会话 Cookie 以及过期时间在过去的 Cookie 不满足该过滤器的条件。Cookie 的生命周期通过 Cookie 的 'max-age' 或 'expires' 属性来计算,如果两者都指定则使用 'max-age' 来计算 Cookie 的生命周期。

ageLowerBound ( optional integer )

Cookie 生命周期的下界(包含)(以当前时间之后多少秒的形式指定),只有过期日期时间在区间 [现在 + ageLowerBound, 现在] 内的 Cookie 满足这一条件,会话 Cookie 以及过期时间在过去的 Cookie 不满足该过滤器的条件。Cookie 的生命周期通过 Cookie 的 'max-age' 或 'expires' 属性来计算,如果两者都指定则使用 'max-age' 来计算 Cookie 的生命周期。

sessionCookie ( optional boolean )

过滤会话 Cookie,会话 Cookie 没有 'max-age' 或 'expires' 属性指定的生命周期。

AddRequestCookie

向请求中添加或者覆盖(如果相同名称的 Cookie 已经存在)Cookie。注意,您应该首选 Cookie API,因为它在计算上开销更少。

AddRequestCookie 的属性

cookie ( RequestCookie )

要添加至请求的 Cookie,所有字段都不能为 undefined。

AddResponseCookie

向响应中添加或者覆盖(如果相同名称的 Cookie 已经存在)Cookie。注意,您应该首选 Cookie API,因为它在计算上开销更少。

AddResponseCookie 的属性

cookie ( ResponseCookie )

要添加至响应的 Cookie,name 与 value 必须指定。

EditRequestCookie

编辑请求中的一个或多个 Cookie。注意,您应该首选 Cookie API,因为它在计算上开销更少。

EditRequestCookie 的属性

filter ( RequestCookie )

过滤要修改的 Cookie,所有空项都会忽略。

modification ( RequestCookie )

在匹配过滤器的 Cookie 中应该覆盖的属性,设置为空字符串的属性将移除。

EditResponseCookie

编辑响应中的一个或多个 Cookie。注意,您应该首选 Cookie API,因为它在计算上开销更少。

EditResponseCookie 的属性

filter ( FilterResponseCookie )

过滤要修改的 Cookie,所有空项都会忽略。

modification ( ResponseCookie )

在匹配过滤器的 Cookie 中应该覆盖的属性,设置为空字符串的属性将移除。

RemoveRequestCookie

移除请求中的一个或多个 Cookie。注意,您应该首选 Cookie API,因为它在计算上开销更少。

RemoveRequestCookie 的属性

filter ( RequestCookie )

过滤要移除的 Cookie,所有空项都会忽略。

RemoveResponseCookie

移除响应中的一个或多个 Cookie。注意,您应该首选 Cookie API,因为它在计算上开销更少。

RemoveResponseCookie 的属性

filter ( FilterResponseCookie )

过滤要移除的 Cookie,所有空项都会忽略。

事件

onRequest

提供声明式事件 API,包括 $ref:[events.Event.addRules addRules]、$ref:[events.Event.removeRules removeRules] 和 $ref:[events.Event.getRules getRules]。

chrome.declarativeWebRequest.onRequest.addRules(array of Rule rules, function callback)
chrome.declarativeWebRequest.onRequest.removeRules(array of string ruleIdentifiers, function callback)
chrome.declarativeWebRequest.onRequest.getRules(array of string ruleIdentifiers, function callback)

支持的条件

支持的操作

onMessage

当消息通过声明式网络请求 API 的 SendMessageToExtension 操作发送时产生。

addListener

chrome.declarativeWebRequest.onMessage.addListener(function callback)

参数

callback ( function )

callback 参数应该指定一个如下形式的函数:

function(object details) {...};

details ( object )

属性

message ( string )

调用脚本发送的消息。

stage ( enum of "onBeforeRequest""onBeforeSendHeaders""onHeadersReceived", or "onAuthRequired" )

事件发生时网络请求所处的阶段。

requestId ( string )

请求标识符。请求标识符在浏览器会话中保证唯一,所以,它们可以用来联系同一请求的不同事件。

url ( string )

method ( string )

标准 HTTP 方法。

frameId ( integer )

0 表示请求发生在主框架中,正数表示发出请求的子框架标识符。如果加载了(子)框架的文档(type 为 "main_frame" 或 "sub_frame"),frameId 指定该框架的标识符,而不是外层框架的标识符。框架标识符在标签页中保证唯一。

parentFrameId ( integer )

包含发送请求框架的框架(即父框架)标识符,如果不存在父框架则为 -1。

tabId ( integer )

产生请求的标签页标识符。如果请求与标签页无关则为 -1。

type ( enum of "main_frame""sub_frame""stylesheet""script""image""object""xmlhttprequest", or "other" )

请求的资源将如何使用。

timeStamp ( double )

该信号触发的时间,以 1970 年 1 月 1 日午夜开始所经过的毫秒数表示。

chrome.declarativeWebRequest的更多相关文章

  1. Chrome浏览器扩展开发系列之十七:扩展中可用的chrome.events API

    chrome.events中定义了一些常见的事件类型,可以供Chrome浏览器扩展程序发出对应的事件对象. 对于关注的事件,首先要通过addListener()在对应的事件上注册监听器,示例如下: c ...

  2. 关于 Chrome 浏览器中 onresize 事件的 Bug

    我在写插件时用到了 onresize 事件,在反复地测试后发现该事件在 Chrome 及 Opera(内核基本与 Chrome 相同,以下统称 Chrome)浏览器打开时就会执行,这种情况也许不能算作 ...

  3. JavaScript自定义浏览器滚动条兼容IE、 火狐和chrome

    今天为大家分享一下我自己制作的浏览器滚动条,我们知道用css来自定义滚动条也是挺好的方式,css虽然能够改变chrome浏览器的滚动条样式可以自定义,css也能够改变IE浏览器滚动条的颜色.但是css ...

  4. Chrome出了个小bug:论如何在Chrome下劫持原生只读对象

    Chrome出了个小bug:论如何在Chrome下劫持原生只读对象 概述 众所周知,虽然JavaScript是个很灵活的语言,浏览器里很多原生的方法都可以随意覆盖或者重写,比如alert.但是为了保证 ...

  5. 最新 去掉 Chrome 新标签页的8个缩略图

    chrome的新标签页的8个缩略图实在让人不爽,网上找了一些去掉这个略缩图的方法,其中很多已经失效.不过其中一个插件虽然按照原来的方法已经不能用了,但是稍微变通一下仍然是可以用的(本方法于2017.1 ...

  6. 15个关于Chrome的开发必备小技巧[译]

    谷歌Chrome,是当前最流行且被众多web开发人员使用的浏览器.最快六周就更新发布一次以及伴随着它不断强大的开发组件,使得Chrome成为你必备的开发工具.例如,在线编辑CSS,console以及d ...

  7. 动手做第一个Chrome插件

    Chrome插件是令人惊讶的简单,一旦你弄懂它的工作和实现原理.它是由一部分HTML,一部分Js,然后混合了一个叫做manifest.json的Json文件组合而成的整体.这意味着你可以使用你最擅长的 ...

  8. Postman接口调试神器-Chrome浏览器插件

    首先大家可以去这个地址下载 Postman_v4.1.3 这个版本,我用的就是这个版本 http://chromecj.com/web-development/2014-09/60/download. ...

  9. 解决“chrome提示adobe flash player 已经过期”的小问题

    这个小问题也确实困扰我许久,后来看到chrome吧里面有人给出了解决方案: 安装install_flash_player_ppapi, 该软件下载地址:http://labs.adobe.com/do ...

随机推荐

  1. DOM tiny-demo

    <script type="text/javascript" language="javascript">var i = 4; function a ...

  2. kali-xfce的简单配置

    1.更新 设置kali的更新源 在终端中打开sources.list root@kali:~# vim /etc/apt/sources.list 删除里面的注释,清空. 然后输入下面的更新源地址: ...

  3. Centos6.5搭建git远程仓库

    远程仓库搭建 step1:安装git ```yum -y install git``` step2:创建用户git,用来运行git服务 useradd git passwd git //修改git用户 ...

  4. Helvetic Coding Contest 2017 online mirror (teams allowed, unrated)

    G. Fake News (easy) time limit per test 1 second memory limit per test 256 megabytes input standard ...

  5. apr的使用

    APR(Apache Portable Runtime),即Apache可移植运行库,正如官网所言,APR的使命是创建和维护一套软件库,以便在不同操作系统(Windows.Linux等)底层实现的基础 ...

  6. 九度oj 题目1120:全排列

    题目描述: 给定一个由不同的小写字母组成的字符串,输出这个字符串的所有全排列. 我们假设对于小写字母有'a' < 'b' < ... < 'y' < 'z',而且给定的字符串中 ...

  7. tomcat的安装和优化二

    JAVA应用服务器weblogicwebsphere tomcat resin(百度,去哪网,搜狗,人人,互动百科)jboss resin官网:www.caucho.com jvm的调优: 1 JAM ...

  8. spring配置mybatis3

    mybatis官方网站:http://www.mybatis.org/mybatis-3/zh/configuration.html <!--第一步:加载配置数据库相关参数--> < ...

  9. 【bzoj1878】[SDOI2009]HH的项链 - 树状数组 - 离线处理

    [SDOI2009]HH的项链 Time Limit: 4 Sec  Memory Limit: 64 MBSubmit: 4834  Solved: 2384[Submit][Status][Dis ...

  10. HDU4768:Flyer [ 二分的奇妙应用 好题 ]

    传送门 Flyer Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...