- add sources.
[platform/framework/web/crosswalk.git] / src / chrome / common / extensions / docs / templates / intros / declarativeWebRequest.html
1 <h2 id="manifest">Manifest</h2>
2
3 <p>
4 You must declare the "declarativeWebRequest" permission in the
5 <a href="manifest.html">extension manifest</a> to use this API,
6 along with <a href="declare_permissions.html">host permissions</a>.
7 </p>
8
9 <pre data-filename="manifest.json">
10 {
11   "name": "My extension",
12   ...
13 <b>  "permissions": [
14     "declarativeWebRequest",
15     "*://*/*"
16   ]</b>,
17   ...
18 }
19 </pre>
20
21 <p>
22 Note that certain types of non-sensitive actions do not require host
23 permissions:
24 <ul>
25   <li><code>CancelRequest</code>
26   <li><code>IgnoreRules</code>
27   <li><code>RedirectToEmptyDocument</code>
28   <li><code>RedirectToTransparentImage</code>
29 </ul>
30 </p>
31 <p>
32 The <code>SendMessageToExtension</code> action requires host permissions
33 for any hosts whose network requests you want to trigger a message.
34 </p>
35 <p>
36 All other actions require host permissions to all URLs.
37 </p>
38 <p>
39 As an example, if <code>"*://*.google.com/*"</code> is the only host permission
40 an extension has, than such an extension may set up a rule to
41 <ul>
42   <li> cancel a request to "http://www.google.com" or "http://anything.else.com"
43   <li> send a message when navigating to "http://www.google.com" but not to
44 "http://something.else.com"
45 </ul>
46 The extension cannot set up a rule to redirect "http://www.google.com" to
47 "http://mail.google.com".
48 </p>
49
50 <h2 id="rules">Rules</h2>
51
52 <p>
53 The Declarative Web Request API follows the concepts of the <a
54   href="events.html#declarative">Declarative API</a>. You can register rules to
55 the <code>chrome.declarativeWebRequest.onRequest</code> event object.
56 </p>
57
58 <p>
59 The Declarative Web Request API supports a single type of match criteria, the
60 <code>RequestMatcher</code>. The <code>RequestMatcher</code> matches network
61 requests if and only if all listed criteria are met. The following
62 <code>RequestMatcher</code> would match a network request when the user enters
63 "http://www.example.com" in the URL bar:
64 </p>
65
66 <pre>
67 var matcher = new chrome.declarativeWebRequest.RequestMatcher({
68   url: { hostSuffix: 'example.com', schemes: ['http'] },
69   resourceType: ['main_frame']
70   });
71 </pre>
72
73 <p>
74 Requests to "https://www.example.com" would be rejected by the
75 <code>RequestMatcher</code> due to the scheme. Also all requests for an embedded
76 iframe would be rejected due to the <code>resourceType</code>.
77 </p>
78
79 <p class="note">
80 <strong>Note:</strong> All conditions and actions are created via a constructor
81 as shown in the example above.
82 <p>
83
84 <p>
85 In order to cancel all requests to "example.com", you can define a rule as
86 follows:
87 </p>
88 <pre>
89 var rule = {
90   conditions: [
91     new chrome.declarativeWebRequest.RequestMatcher({
92       url: { hostSuffix: 'example.com' } })
93   ],
94   actions: [
95     new chrome.declarativeWebRequest.CancelRequest()
96   ]};
97 </pre>
98
99 <p>
100 In order to cancel all requests to "example.com" and "foobar.com", you can add a
101 second condition, as each condition is sufficient to trigger all specified
102 actions:
103 </p>
104 <pre>
105 var rule2 = {
106   conditions: [
107     new chrome.declarativeWebRequest.RequestMatcher({
108       url: { hostSuffix: 'example.com' } }),
109     new chrome.declarativeWebRequest.RequestMatcher({
110       url: { hostSuffix: 'foobar.com' } })
111   ],
112   actions: [
113     new chrome.declarativeWebRequest.CancelRequest()
114   ]};
115 </pre>
116
117 <p>
118 Register rules as follows:
119 </p>
120 <pre>
121 chrome.declarativeWebRequest.onRequest.addRules([rule2]);
122 </pre>
123
124 <p class="note">
125 <strong>Note:</strong> You should always register or unregister rules in bulk rather than
126 individually because each of these operations recreates internal data
127 structures.  This re-creation is computationally expensive but facilitates a
128 very fast URL matching algorithm for hundreds of thousands of URLs. The
129 <a href="events.html#performance">Performance section</a> of the $ref:[events
130 Events] API provides further performance tips.
131 </p>
132
133
134 <h2 id="evaluation">Evaluation of conditions and actions</h2>
135
136 <p>
137 The Declarative Web Request API follows the
138 <a href="webRequest.html#life_cycle">Life cycle model for web requests</a> of
139 the <a href="webRequest.html">Web Request API</a>. This means that conditions
140 can only be tested at specific stages of a web request and, likewise, actions
141 can also only be executed at specific stages. The following tables list the
142 request stages that are compatible with conditions and actions.
143 </p>
144
145 <p>
146 <table>
147   <tr>
148     <th colspan="5">Request stages during which condition attributes can be processed.
149   </tr>
150   <tr>
151     <th>Condition attribute
152     <th>onBeforeRequest
153     <th>onBeforeSendHeaders
154     <th>onHeadersReceived
155     <th>onAuthRequired
156   </tr>
157   <tr><td>url<td>✓<td>✓<td>✓<td>✓
158   <tr><td>resourceType<td>✓<td>✓<td>✓<td>✓
159   <tr><td>contentType<td><td><td>✓<td>
160   <tr><td>excludeContentType<td><td><td>✓<td>
161   <tr><td>responseHeaders<td><td><td>✓<td>
162   <tr><td>excludeResponseHeaders<td><td><td>✓<td>
163   <tr><td>requestHeaders<td><td>✓<td><td>
164   <tr><td>excludeRequestHeaders<td><td>✓<td><td>
165   <tr><td>thirdPartyForCookies<td>✓<td>✓<td>✓<td>✓
166   <tr>
167     <th colspan="5" style="padding-top:2em">Request stages during which actions can be executed.
168   </tr>
169   <tr>
170     <th>Event
171     <th>onBeforeRequest
172     <th>onBeforeSendHeaders
173     <th>onHeadersReceived
174     <th>onAuthRequired
175   </tr>
176   <tr><td>AddRequestCookie<td><td>✓<td><td>
177   <tr><td>AddResponseCookie<td><td><td>✓<td>
178   <tr><td>AddResponseHeader<td><td><td>✓<td>
179   <tr><td>CancelRequest<td>✓<td>✓<td>✓<td>✓
180   <tr><td>EditRequestCookie<td><td>✓<td><td>
181   <tr><td>EditResponseCookie<td><td><td>✓<td>
182   <tr><td>IgnoreRules<td>✓<td>✓<td>✓<td>✓
183   <tr><td>RedirectByRegEx<td>✓<td><td><td>
184   <tr><td>RedirectRequest<td>✓<td><td><td>
185   <tr><td>RedirectToEmptyDocument<td>✓<td><td><td>
186   <tr><td>RedirectToTransparentImage<td>✓<td><td><td>
187   <tr><td>RemoveRequestCookie<td><td>✓<td><td>
188   <tr><td>RemoveRequestHeader<td><td>✓<td><td>
189   <tr><td>RemoveResponseCookie<td><td><td>✓<td>
190   <tr><td>RemoveResponseHeader<td><td><td>✓<td>
191   <tr><td>SendMessageToExtension<td>✓<td>✓<td>✓<td>✓
192   <tr><td>SetRequestHeader<td><td>✓<td><td>
193 </table>
194 </p>
195
196 <p>
197 <strong>Note:</strong> Applicable stages can be further constrained by using the
198 "stages" attribute.
199 </p>
200 <p>
201 <strong>Example:</strong> It is possible to combine a
202 <code>new chrome.declarativeWebRequest.RequestMatcher({contentType: ["image/jpeg"]})</code>
203 condition with a <code>new chrome.declarativeWebRequest.CancelRequest()</code>
204 action because both of them can be evaluated in the onHeadersReceived stage.
205 It is, however, impossible to combine the request matcher with a
206 <code>new chrome.declarativeWebRequest.RedirectToTransparentImage()</code>
207 because redirects cannot be executed any more by the time the content
208 type has been determined.
209 </p>
210
211 <h2 id="precedences">Using priorities to override rules</h2>
212
213 <p>
214 Rules can be associated with priorities as described in the
215 <a href="events.html#declarative">Events API</a>. This mechanism can be used
216 to express exceptions. The following example will block all requests to
217 images named "evil.jpg" except on the server "myserver.com".
218 </p>
219
220 <pre>
221 var rule1 = {
222   priority: 100,
223   conditions: [
224     new chrome.declarativeWebRequest.RequestMatcher({
225         url: { pathEquals: 'evil.jpg' } })
226   ],
227   actions: [
228     new chrome.declarativeWebRequest.CancelRequest()
229   ]
230 };
231 var rule2 = {
232   priority: 1000,
233   conditions: [
234     new chrome.declarativeWebRequest.RequestMatcher({
235       url: { hostSuffix: '.myserver.com' } })
236   ],
237   actions: [
238     new chrome.declarativeWebRequest.IgnoreRules({
239       lowerPriorityThan: 1000 })
240   ]
241 };
242 chrome.declarativeWebRequest.onRequest.addRules([rule1, rule2]);
243 </pre>
244
245 <p>
246 It is important to recognize that the <code>IgnoreRules</code> action is not
247 persisted across <a href="#evaluation">request stages</a>. All conditions of
248 all rules are evaluated at each stage of a web request. If an
249 <code>IgnoreRules</code> action is executed, it applies only to other actions
250 that are executed for the same web request in the same stage.
251 </p>