| Index: chrome/common/extensions/docs/static/experimental.webRequest.html
|
| diff --git a/chrome/common/extensions/docs/static/experimental.webRequest.html b/chrome/common/extensions/docs/static/experimental.webRequest.html
|
| deleted file mode 100644
|
| index fe0c82ded9c89c33f7322d7ba45d6f200cb5367c..0000000000000000000000000000000000000000
|
| --- a/chrome/common/extensions/docs/static/experimental.webRequest.html
|
| +++ /dev/null
|
| @@ -1,319 +0,0 @@
|
| -<div id="pageData-name" class="pageData">WebRequest API</div>
|
| -
|
| -<!-- BEGIN AUTHORED CONTENT -->
|
| -<p id="classSummary">
|
| -Use the <code>chrome.experimental.webRequest</code> module to intercept, block,
|
| -or modify requests in-flight. This module is still experimental. For
|
| -information on how to use experimental APIs, see the
|
| -<a href="experimental.html">chrome.experimental.* APIs</a> page.
|
| -</p>
|
| -
|
| -<h2 id="manifest">Manifest</h2>
|
| -<p>You must declare the "experimental" permission in the <a
|
| - href="manifest.html">extension manifest</a> to use the webRequest settings
|
| -API, along with <a href="manifest.html#permissions">host permissions</a>
|
| -for any hosts whose network requests you want to access.
|
| -For example:</p>
|
| -<pre>{
|
| - "name": "My extension",
|
| - ...
|
| - <b>"permissions": [
|
| - "experimental",
|
| - "*://*.google.com"
|
| - ]</b>,
|
| - ...
|
| -}</pre>
|
| -
|
| -<h2 id="life_cycle">Life-cycle of requests</h2>
|
| -
|
| -<p>
|
| -The webRequest API defines the following events:
|
| -<dl>
|
| - <dt><code>onBeforeRequest (optionally synchronous)</code></dt>
|
| - <dd>Fires when a request is about to occur. This is sent before any TCP
|
| - connection is made and can be used to cancel or redirect requests.</dd>
|
| - <dt><code>onBeforeSendHeaders (optionally synchronous)</code></dt>
|
| - <dd>Fires when a request is about to occur and the initial headers are
|
| - prepared. The event is intended to allow extensions to add, modify and delete
|
| - request headers <a href="#life_cycle_footnote">(*)</a>. The
|
| - <code>onBeforeSendHeaders</code> event is passed to all subscribers, so
|
| - different subscribers may attempt to modify the request, see section <a
|
| - href="#conflict_resolution">conflict resolution</a> for details how this is
|
| - handled. This event can still be used to cancel the request.</dd>
|
| - <dt><code>onSendHeaders</code></dt>
|
| - <dd>Fires after all extensions had a chance of modifying the request headers
|
| - and presents the final <a href="#life_cycle_footnote">(*)</a> version. The
|
| - event is triggered, before the headers are sent to the network. This event is
|
| - informational and handled asynchronously. It does not allow to modify or
|
| - cancel the request.</dd>
|
| - <dt><code>onHeadersReceived (optionally synchronous)</code></dt>
|
| - <dd>Fires each time when a HTTP(S) response header has been received. Due
|
| - to redirects and authentication requests this can happen multiple times per
|
| - request. This event is intended to allow extensions to add, modify and delete
|
| - response headers, like incoming Set-Cookie headers for example.</dd>
|
| - <dt><code>onAuthRequired (optionally synchronous)</code></dt>
|
| - <dd>Fires when a request requires authentication of the user. This signal can
|
| - be handled synchronously to provide authentication credentials. Note that
|
| - extensions may provide invalid credentials. Take care not to enter an infinite
|
| - loop by repeatedly providing invalid credentials.</dd>
|
| - <dt><code>onBeforeRedirect</code></dt>
|
| - <dd>Fires before a redirect is about to be executed. A redirection can be
|
| - triggered by a HTTP response code or by an extension. This event is
|
| - informational and handled asynchronously. It does not allow you to modify or
|
| - cancel the request. </dd>
|
| - <dt><code>onResponseStarted</code></dt>
|
| - <dd>Fires when the first byte of the response body is received. For HTTP
|
| - requests, this means that the status line and response headers are
|
| - available. This event is informational and handled asynchronously. It does not
|
| - allow to modify or cancel the request.</dd>
|
| - <dt><code>onCompleted</code></dt>
|
| - <dd>Fires when a request has been processed successfully.</dd>
|
| - <dt><code>onErrorOccurred</code></dt>
|
| - <dd>Fires when a request could not be processed successfully.</dd>
|
| -</dl>
|
| -The webRequest API gurantees that for each request either
|
| -<code>onComplete</code> or <code>onErrorOccurred</code> is fired as the final
|
| -event.
|
| -</p>
|
| -
|
| -<p>
|
| -The life-cycle of successful requests can be illustrated as follows:
|
| -<pre>
|
| - |
|
| - v
|
| -onBeforeRequest --------------------------------
|
| - | ^ | | [data and file URLs]
|
| - | | | [redirection |
|
| - | ---------- | from extension] |
|
| - v | | |
|
| -onBeforeSendHeaders | | |
|
| - | ^ | | |
|
| - v | | | |
|
| -onSendHeaders | | | |
|
| - | | | | |
|
| - v | | | |
|
| -onHeadersReceived | | | |
|
| - | | | | | | |
|
| - | | v | | | |
|
| - | | onAuthRequired / | |
|
| - | v / | |
|
| - | onBeforeRedirect <---- |
|
| - v |
|
| -onResponseStarted <-----------------------------
|
| - |
|
| - v
|
| -onCompleted
|
| -</pre>
|
| -<em>Note that this diagram does not capture a bug that will be fixed soon: If
|
| -extensions redirect a URL request via the webRequest API, this redirection does
|
| -not trigger <code>onBeforeRedirect</code>. Instead the request is cancelled
|
| -and a new request is started at <code>onBeforeRedirect</code>. See <a
|
| - href="http://crbug.com/79520">http://crbug.com/79520</a>.</em>
|
| -</p>
|
| -
|
| -<p id="life_cycle_footnote">(*) Note that the webRequest API presents an
|
| -abstraction of the network stack to the extension. Internally, one URL request
|
| -can be split into several HTTP requests (for example to fetch individual byte
|
| -ranges from a large file) or can be handled by the network stack without
|
| -communicating with the network. For this reason, the API does not provide the
|
| -final HTTP headers that are sent to the network. For example all headers that
|
| -are related to caching are invisible to the extension.</p>
|
| -
|
| -<p>This is a list of headers that are currently not provided to the
|
| -onBeforeSendHeaders signal. The list is not guaranteed to be complete nor
|
| -stable:
|
| -<ul>
|
| - <li>Authorization</li>
|
| - <li>Cache-Control</li>
|
| - <li>Connection</li>
|
| - <li>Content-Length</li>
|
| - <li>Host</li>
|
| - <li>If-Modified-Since</li>
|
| - <li>If-None-Match</li>
|
| - <li>If-Range</li>
|
| - <li>Partial-Data</li>
|
| - <li>Pragma</li>
|
| - <li>Proxy-Authorization</li>
|
| - <li>Proxy-Connection</li>
|
| - <li>Transfer-Encoding</li>
|
| -</ul>
|
| -</p>
|
| -
|
| -<h2 id="concepts">Concepts of the webRequest API</h2>
|
| -
|
| -<p>The signals of the webRequest API follow certain concepts and patterns that
|
| -shall be described in the following.</p>
|
| -
|
| -<h3 id="Request IDs">Request IDs</h3>
|
| -
|
| -<p>Each request is identified by a request ID. This ID is unique within a
|
| -browser session and the context of an extension. It remains constant during the
|
| -the life-cycle of a request and can be used to match signals for the same
|
| -request. Note that several HTTP requests are mapped to one webRequest in case of
|
| -HTTP redirection or HTTP authentication.</p>
|
| -
|
| -<h3 id="subscription">Subscription</h3>
|
| -
|
| -<p>For each signal XXX of the webRequest API, the API provides a function
|
| -<code>chrome.experimental.webRequest.XXX.addListener()</code> with the following
|
| -signature.</p>
|
| -
|
| -<pre>
|
| -var callback = function(details) {...};
|
| -var opt_filter = {...};
|
| -var opt_extraInfoSpec = [...];
|
| -
|
| -chrome.experimental.webRequest.XXX.addListener(
|
| - callback, opt_filter, opt_extraInfoSpec);
|
| -</pre>
|
| -
|
| -<p>Each <code>addListener()</code> call takes a mandatory callback function as
|
| -the first parameter. This callback function is passed a dictionary containing
|
| -information about the current URL request. The information in this dictionary
|
| -depends on the specific event type as well as the content of
|
| -<code>opt_extraInfoSpec</code>.</p>
|
| -
|
| -<p>If the optional <code>opt_extraInfoSpec</code> array contains the string
|
| -<code>'blocking'</code> (only allowed for specific signals), the callback
|
| -function is handled synchronously. That means that the request is blocked until
|
| -the callback function returns. In this case, the callback can return a <a
|
| - href="#type-BlockingResponse">BlockingResponse</a> that determines the further
|
| -life-cycle of the request. Depending on the context, this response allows
|
| -cancelling or redirecting a request (onBeforeRequest), cancelling or
|
| -modifying headers (onBeforeSendHeaders, onHeadersReceived), or providing
|
| -authentication credentials (onAuthRequired).</p>
|
| -
|
| -<p>Depending on the specific signal, <code>opt_extraInfoSpec</code> may contain
|
| -further strings that indicate that specific information shall be passed to the
|
| -extension. This is used to provide detailed information on requests data only if
|
| -explicitly requested.</p>
|
| -
|
| -<p>The optional <a href="#type-RequestFilter">RequestFilter</a>
|
| -<code>opt_filter</code> allows to limit the requests for which events are
|
| -triggered in various dimensions:
|
| -<dl>
|
| - <dt>URLs</dt>
|
| - <dd>URL patterns like <code>*://www.google.com/foo*bar</code>.</dd>
|
| - <dt>Types</dt>
|
| - <dd>Request types like <code>main_frame</code> (a document that is loaded for
|
| - a top-level frame), <code>sub_frame</code> (a document that is loaded for an
|
| - embedded frame), <code>image</code> (an image on a web site) and others. See
|
| - <a href="#type-RequestFilter">RequestFilter</a>.</dd>
|
| - <dt>Tab IDs</dt>
|
| - <dd>The ID that identifies a specific tab in a window.</dd>
|
| - <dt>Window IDs</dt>
|
| - <dd>The ID that identifies a specific window.</dd>
|
| -</p>
|
| -
|
| -<h2 id="conflict_resolution">Conflict resolution</h2>
|
| -
|
| -<p>In the current implementation of the webRequest API, a request is considered
|
| -as canceled if at least one extension instructs to cancel the request. If
|
| -an extension cancels a request, all extensions are notified by an
|
| -onErrorOccurred event. Only one extension is allowed to redirect a request or
|
| -modify a header at a time. If more than one extension attempts to modify the
|
| -request, the most recently installed extension wins while all others are
|
| -ignored. An extension is currently not notified, if its instruction to modify or
|
| -redirect has been ignored.</p>
|
| -
|
| -<h2>A note about caching</h2>
|
| -<p>
|
| -Chrome employs two caches, an on-disk cache and a very fast in-memory cache.
|
| -The life-time of an in-memory cache is attached to the life-time of a render
|
| -process which roughly corresponds to a tab. Requests that are answered from the
|
| -in-memory cache are invisible to the webRequest API. If a request handler
|
| -changes its behavior (for example the behavior according to which requests are
|
| -blocked), a simple page refresh might not respect this changed behavior.
|
| -<code>chrome.experimental.webRequest.handlerBehaviorChanged()</code> needs to be
|
| -called to flush the in-memory cache. This is a very expensive operation and
|
| -should not be done often.
|
| -</p>
|
| -
|
| -<h2>A note about timestamps</h2>
|
| -<p>
|
| -It's important to note that some technical oddities in the OS's handling
|
| -of distinct Chrome processes can cause the clock to be skewed between the
|
| -browser itself and extension processes. That means that WebRequest's events'
|
| -<code>timeStamp</code> property is only guaranteed to be <i>internally</i>
|
| -consistent. Comparing one event to another event will give you the correct
|
| -offset between them, but comparing them to the current time inside the
|
| -extension (via <code>(new Date()).getTime()</code>, for instance) might give
|
| -unexpected results.
|
| -</p>
|
| -
|
| -<h2 id="examples">Examples</h2>
|
| -
|
| -<p>The following example illustrates how to block all requests to
|
| -<code>www.evil.com</code>:</p>
|
| -<pre>
|
| -chrome.experimental.webRequest.onBeforeRequest.addListener(
|
| - function(details) {
|
| - return {cancel: details.url.indexOf("://www.evil.com/") != -1};
|
| - },
|
| - {},
|
| - ["blocking"]);
|
| -</pre>
|
| -
|
| -<p>The following example achives the same goal in a more efficient way because
|
| -requests that are not targeted to <code>www.evil.com</code> do not need to be
|
| -passed to the extension:</p>
|
| -<pre>
|
| -chrome.experimental.webRequest.onBeforeRequest.addListener(
|
| - function(details) { return {cancel: true}; },
|
| - {urls: ["*://www.evil.com/*"]},
|
| - ["blocking"]);
|
| -</pre>
|
| -
|
| -<p>The following example illustrates how the User-Agent header can be deleted
|
| -from all requests:</p>
|
| -<pre>
|
| -chrome.experimental.webRequest.onBeforeSendHeaders.addListener(
|
| - function(details) {
|
| - delete details.requestHeaders['User-Agent'];
|
| - return {requestHeaders: details.requestHeaders};
|
| - },
|
| - {},
|
| - ["blocking"]);
|
| -</pre>
|
| -
|
| -<!--
|
| -TODO(mkwst): update this section. We do not pass windowIds any more.
|
| -http://crbug.com/98937
|
| -
|
| -<h3 id="tracking_frames">Tracking frames</h3>
|
| -<p>For efficiency reason, the webRequest API does not pass the URL of the frame
|
| -that issued a request to each request. If this information is required, for
|
| -example to distinguish between first and third party requests, this example
|
| -shows how to track the URLs of frames.</p>
|
| -<pre>
|
| -// dictionary "windowId" -> "tabId"-"frameId" -> "frameUrl"
|
| -var frameUrl = {};
|
| -
|
| -function recordFrameUrl(windowId, tabId, frameId, frameUrl) {
|
| - if (!frameUrl[windowId]) {
|
| - frameUrl[windowId] = {};
|
| - }
|
| - frameUrl[windowId][tabId + "-" + frameId] = frameUrl;
|
| -}
|
| -
|
| -function getFrameUrl(windowId, tabId, frameId, frameUrl) {
|
| - return (frameUrl[windowId] || {})[tabId + "-" + frameId];
|
| -}
|
| -
|
| -chrome.experimental.webRequest.onBeforeRequest.addListener(
|
| - function(d) {
|
| - if (d.type == 'main_frame' || d.type == 'sub_frame') {
|
| - recordFrameUrl(d.windowId, d.tabId, d.frameId, d.frameUrl);
|
| - }
|
| - var frameUrl = getFrameUrl(d.windowId, d.tabId, d.frameId);
|
| - // Use the frameUrl e.g. to selectively cancel requests.
|
| - // Attention: The frameUrl can be undefined in some cases. Requests may not
|
| - // originate from a frame (e.g. requests from extensions or shared workers).
|
| - });
|
| -
|
| -chrome.windows.onRemoved.addListener(
|
| - function(windowId) {delete frameUrl[windowId];}
|
| - );
|
| -</pre>
|
| --->
|
| -<!-- END AUTHORED CONTENT -->
|
|
|