15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CHROME_BROWSER_EXTENSIONS_API_WEB_REQUEST_WEB_REQUEST_API_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_BROWSER_EXTENSIONS_API_WEB_REQUEST_WEB_REQUEST_API_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <list>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <map>
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <set>
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/singleton.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/weak_ptr.h"
16eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/api/declarative_webrequest/request_stage.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/api/web_request/web_request_api_helpers.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/api/web_request/web_request_permissions.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_function.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_version_info.h"
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "extensions/common/url_pattern_set.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ipc/ipc_sender.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/completion_callback.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/network_delegate.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_request_headers.h"
28ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "webkit/common/resource_type.h"
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ExtensionInfoMap;
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ExtensionWebRequestTimeTracker;
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GURL;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base {
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DictionaryValue;
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ListValue;
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class StringValue;
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RenderProcessHost;
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace extensions {
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WebRequestRulesRegistry;
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net {
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class AuthCredentials;
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class AuthChallengeInfo;
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class HttpRequestHeaders;
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class HttpResponseHeaders;
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class URLRequest;
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This class observes network events and routes them to the appropriate
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// extensions listening to those events. All methods must be called on the IO
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// thread unless otherwise specified.
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ExtensionWebRequestEventRouter
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : public base::SupportsWeakPtr<ExtensionWebRequestEventRouter> {
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct BlockedRequest;
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  enum EventTypes {
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kInvalidEvent = 0,
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kOnBeforeRequest = 1 << 0,
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kOnBeforeSendHeaders = 1 << 1,
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kOnSendHeaders = 1 << 2,
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kOnHeadersReceived = 1 << 3,
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kOnBeforeRedirect = 1 << 4,
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kOnAuthRequired = 1 << 5,
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kOnResponseStarted = 1 << 6,
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kOnErrorOccurred = 1 << 7,
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kOnCompleted = 1 << 8,
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Internal representation of the webRequest.RequestFilter type, used to
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // filter what network events an extension cares about.
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct RequestFilter {
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RequestFilter();
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ~RequestFilter();
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Returns false if there was an error initializing. If it is a user error,
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // an error message is provided, otherwise the error is internal (and
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // unexpected).
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool InitFromValue(const base::DictionaryValue& value, std::string* error);
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    extensions::URLPatternSet urls;
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::vector<ResourceType::Type> types;
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int tab_id;
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int window_id;
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Internal representation of the extraInfoSpec parameter on webRequest
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // events, used to specify extra information to be included with network
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // events.
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct ExtraInfoSpec {
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    enum Flags {
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      REQUEST_HEADERS = 1<<0,
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      RESPONSE_HEADERS = 1<<1,
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BLOCKING = 1<<2,
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ASYNC_BLOCKING = 1<<3,
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      REQUEST_BODY = 1<<4,
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    };
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    static bool InitFromValue(const base::ListValue& value,
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              int* extra_info_spec);
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Contains an extension's response to a blocking event.
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct EventResponse {
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EventResponse(const std::string& extension_id,
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  const base::Time& extension_install_time);
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ~EventResponse();
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // ID of the extension that sent this response.
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string extension_id;
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The time that the extension was installed. Used for deciding order of
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // precedence in case multiple extensions respond with conflicting
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // decisions.
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::Time extension_install_time;
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Response values. These are mutually exclusive.
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool cancel;
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GURL new_url;
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_ptr<net::HttpRequestHeaders> request_headers;
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_ptr<extension_web_request_api_helpers::ResponseHeaders>
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        response_headers;
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_ptr<net::AuthCredentials> auth_credentials;
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DISALLOW_COPY_AND_ASSIGN(EventResponse);
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static ExtensionWebRequestEventRouter* GetInstance();
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Registers a rule registry. Pass null for |rules_registry| to unregister
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the rule registry for |profile|.
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RegisterRulesRegistry(
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      void* profile,
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      scoped_refptr<extensions::WebRequestRulesRegistry> rules_registry);
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Dispatches the OnBeforeRequest event to any extensions whose filters match
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the given request. Returns net::ERR_IO_PENDING if an extension is
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // intercepting the request, OK otherwise.
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int OnBeforeRequest(void* profile,
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      ExtensionInfoMap* extension_info_map,
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      net::URLRequest* request,
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      const net::CompletionCallback& callback,
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      GURL* new_url);
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Dispatches the onBeforeSendHeaders event. This is fired for HTTP(s)
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // requests only, and allows modification of the outgoing request headers.
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns net::ERR_IO_PENDING if an extension is intercepting the request, OK
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // otherwise.
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int OnBeforeSendHeaders(void* profile,
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          ExtensionInfoMap* extension_info_map,
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          net::URLRequest* request,
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          const net::CompletionCallback& callback,
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          net::HttpRequestHeaders* headers);
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Dispatches the onSendHeaders event. This is fired for HTTP(s) requests
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // only.
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnSendHeaders(void* profile,
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     ExtensionInfoMap* extension_info_map,
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     net::URLRequest* request,
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     const net::HttpRequestHeaders& headers);
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Dispatches the onHeadersReceived event. This is fired for HTTP(s)
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // requests only, and allows modification of incoming response headers.
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns net::ERR_IO_PENDING if an extension is intercepting the request,
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // OK otherwise. |original_response_headers| is reference counted. |callback|
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // and |override_response_headers| are owned by a URLRequestJob. They are
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // guaranteed to be valid until |callback| is called or OnURLRequestDestroyed
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // is called (whatever comes first).
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Do not modify |original_response_headers| directly but write new ones
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // into |override_response_headers|.
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int OnHeadersReceived(
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      void* profile,
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ExtensionInfoMap* extension_info_map,
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      net::URLRequest* request,
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const net::CompletionCallback& callback,
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const net::HttpResponseHeaders* original_response_headers,
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      scoped_refptr<net::HttpResponseHeaders>* override_response_headers);
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Dispatches the OnAuthRequired event to any extensions whose filters match
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the given request. If the listener is not registered as "blocking", then
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // AUTH_REQUIRED_RESPONSE_OK is returned. Otherwise,
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // AUTH_REQUIRED_RESPONSE_IO_PENDING is returned and |callback| will be
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // invoked later.
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::NetworkDelegate::AuthRequiredResponse OnAuthRequired(
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     void* profile,
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     ExtensionInfoMap* extension_info_map,
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     net::URLRequest* request,
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     const net::AuthChallengeInfo& auth_info,
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     const net::NetworkDelegate::AuthCallback& callback,
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     net::AuthCredentials* credentials);
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Dispatches the onBeforeRedirect event. This is fired for HTTP(s) requests
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // only.
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnBeforeRedirect(void* profile,
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        ExtensionInfoMap* extension_info_map,
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        net::URLRequest* request,
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        const GURL& new_location);
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Dispatches the onResponseStarted event indicating that the first bytes of
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the response have arrived.
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnResponseStarted(void* profile,
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         ExtensionInfoMap* extension_info_map,
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         net::URLRequest* request);
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Dispatches the onComplete event.
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnCompleted(void* profile,
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   ExtensionInfoMap* extension_info_map,
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   net::URLRequest* request);
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Dispatches an onErrorOccurred event.
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnErrorOccurred(void* profile,
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      ExtensionInfoMap* extension_info_map,
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      net::URLRequest* request,
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      bool started);
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Notifications when objects are going away.
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnURLRequestDestroyed(void* profile, net::URLRequest* request);
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Called when an event listener handles a blocking event and responds.
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnEventHandled(
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      void* profile,
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::string& extension_id,
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::string& event_name,
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::string& sub_event_name,
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      uint64 request_id,
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EventResponse* response);
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Adds a listener to the given event. |event_name| specifies the event being
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // listened to. |sub_event_name| is an internal event uniquely generated in
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the extension process to correspond to the given filter and
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // extra_info_spec. It returns true on success, false on failure.
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool AddEventListener(
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      void* profile,
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::string& extension_id,
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::string& extension_name,
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::string& event_name,
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::string& sub_event_name,
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const RequestFilter& filter,
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int extra_info_spec,
24890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      int embedder_process_id,
249868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      int embedder_routing_id,
25090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      int web_view_instance_id,
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::WeakPtr<IPC::Sender> ipc_sender);
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Removes the listener for the given sub-event.
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RemoveEventListener(
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      void* profile,
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::string& extension_id,
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::string& sub_event_name);
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Removes the listeners for a given <webview>.
26090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  void RemoveWebViewEventListeners(
26190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      void* profile,
26290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      const std::string& extension_id,
26390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      int embedder_process_id,
26490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      int web_view_instance_id);
26590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Called when an incognito profile is created or destroyed.
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnOTRProfileCreated(void* original_profile,
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           void* otr_profile);
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnOTRProfileDestroyed(void* original_profile,
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             void* otr_profile);
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Registers a |callback| that is executed when the next page load happens.
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The callback is then deleted.
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AddCallbackForPageLoad(const base::Closure& callback);
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend struct DefaultSingletonTraits<ExtensionWebRequestEventRouter>;
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct EventListener;
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef std::map<std::string, std::set<EventListener> > ListenerMapForProfile;
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef std::map<void*, ListenerMapForProfile> ListenerMap;
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef std::map<uint64, BlockedRequest> BlockedRequestMap;
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Map of request_id -> bit vector of EventTypes already signaled
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef std::map<uint64, int> SignaledRequestMap;
2857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // For each profile: a bool indicating whether it is an incognito profile,
2867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // and a pointer to the corresponding (non-)incognito profile.
2877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  typedef std::map<void*, std::pair<bool, void*> > CrossProfileMap;
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef std::list<base::Closure> CallbacksForPageLoad;
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExtensionWebRequestEventRouter();
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~ExtensionWebRequestEventRouter();
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Ensures that future callbacks for |request| are ignored so that it can be
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // destroyed safely.
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ClearPendingCallbacks(net::URLRequest* request);
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool DispatchEvent(
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      void* profile,
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      net::URLRequest* request,
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::vector<const EventListener*>& listeners,
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const base::ListValue& args);
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns a list of event listeners that care about the given event, based
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // on their filter parameters. |extra_info_spec| will contain the combined
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // set of extra_info_spec flags that every matching listener asked for.
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<const EventListener*> GetMatchingListeners(
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      void* profile,
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ExtensionInfoMap* extension_info_map,
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::string& event_name,
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      net::URLRequest* request,
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int* extra_info_spec);
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Helper for the above functions. This is called twice: once for the profile
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // of the event, the next time for the "cross" profile (i.e. the incognito
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // profile if the event is originally for the normal profile, or vice versa).
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void GetMatchingListenersImpl(
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      void* profile,
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ExtensionInfoMap* extension_info_map,
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bool crosses_incognito,
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::string& event_name,
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const GURL& url,
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int tab_id,
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int window_id,
3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      int render_process_host_id,
3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      int routing_id,
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ResourceType::Type resource_type,
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bool is_async_request,
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bool is_request_from_extension,
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int* extra_info_spec,
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      std::vector<const ExtensionWebRequestEventRouter::EventListener*>*
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          matching_listeners);
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Decrements the count of event handlers blocking the given request. When the
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // count reaches 0, we stop blocking the request and proceed it using the
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // method requested by the extension with the highest precedence. Precedence
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // is decided by extension install time. If |response| is non-NULL, this
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // method assumes ownership.
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DecrementBlockCount(
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      void* profile,
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::string& extension_id,
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::string& event_name,
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      uint64 request_id,
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EventResponse* response);
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Processes the generated deltas from blocked_requests_ on the specified
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // request. If |call_back| is true, the callback registered in
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |blocked_requests_| is called.
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The function returns the error code for the network request. This is
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // mostly relevant in case the caller passes |call_callback| = false
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // and wants to return the correct network error code himself.
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int ExecuteDeltas(void* profile, uint64 request_id, bool call_callback);
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Evaluates the rules of the declarative webrequest API and stores
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // modifications to the request that result from WebRequestActions as
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // deltas in |blocked_requests_|. |original_response_headers| should only be
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // set for the OnHeadersReceived stage and NULL otherwise. Returns whether any
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // deltas were generated.
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool ProcessDeclarativeRules(
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      void* profile,
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ExtensionInfoMap* extension_info_map,
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::string& event_name,
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      net::URLRequest* request,
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      extensions::RequestStage request_stage,
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const net::HttpResponseHeaders* original_response_headers);
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // If the BlockedRequest contains messages_to_extension entries in the event
3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // deltas, we send them to subscribers of
3682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // chrome.declarativeWebRequest.onMessage.
3692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SendMessages(void* profile, const BlockedRequest& blocked_request);
3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Called when the RulesRegistry is ready to unblock a request that was
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // waiting for said event.
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnRulesRegistryReady(
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      void* profile,
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::string& event_name,
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      uint64 request_id,
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      extensions::RequestStage request_stage);
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sets the flag that |event_type| has been signaled for |request_id|.
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the value of the flag before setting it.
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool GetAndSetSignaled(uint64 request_id, EventTypes event_type);
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Clears the flag that |event_type| has been signaled for |request_id|.
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ClearSignaled(uint64 request_id, EventTypes event_type);
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns whether |request| represents a top level window navigation.
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsPageLoad(net::URLRequest* request) const;
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Called on a page load to process all registered callbacks.
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void NotifyPageLoad();
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the matching cross profile (the regular profile if |profile| is
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // OTR and vice versa).
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void* GetCrossProfile(void* profile) const;
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // Determines whether the specified profile is an incognito profile (based on
3977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // the contents of the cross-profile table and without dereferencing the
3987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // profile pointer).
3997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  bool IsIncognitoProfile(void* profile) const;
4007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if |request| was already signaled to some event handlers.
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool WasSignaled(const net::URLRequest& request) const;
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A map for each profile that maps an event name to a set of extensions that
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // are listening to that event.
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ListenerMap listeners_;
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A map of network requests that are waiting for at least one event handler
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // to respond.
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BlockedRequestMap blocked_requests_;
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A map of request ids to a bitvector indicating which events have been
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // signaled and should not be sent again.
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SignaledRequestMap signaled_requests_;
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A map of original profile -> corresponding incognito profile (and vice
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // versa).
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CrossProfileMap cross_profile_map_;
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Keeps track of time spent waiting on extensions using the blocking
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // webRequest API.
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<ExtensionWebRequestTimeTracker> request_time_tracker_;
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CallbacksForPageLoad callbacks_for_page_load_;
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Maps each profile (and OTRProfile) to its respective rules registry.
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::map<void*, scoped_refptr<extensions::WebRequestRulesRegistry> >
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      rules_registries_;
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(ExtensionWebRequestEventRouter);
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WebRequestAddEventListener : public SyncIOThreadExtensionFunction {
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DECLARE_EXTENSION_FUNCTION("webRequestInternal.addEventListener",
4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                             WEBREQUESTINTERNAL_ADDEVENTLISTENER)
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~WebRequestAddEventListener() {}
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ExtensionFunction:
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool RunImpl() OVERRIDE;
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WebRequestEventHandled : public SyncIOThreadExtensionFunction {
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
4472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DECLARE_EXTENSION_FUNCTION("webRequestInternal.eventHandled",
4482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                             WEBREQUESTINTERNAL_EVENTHANDLED)
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~WebRequestEventHandled() {}
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ExtensionFunction:
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool RunImpl() OVERRIDE;
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class WebRequestHandlerBehaviorChangedFunction
4582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : public SyncIOThreadExtensionFunction {
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
4602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DECLARE_EXTENSION_FUNCTION("webRequest.handlerBehaviorChanged",
4612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                             WEBREQUEST_HANDLERBEHAVIORCHANGED)
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
4642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~WebRequestHandlerBehaviorChangedFunction() {}
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ExtensionFunction:
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void GetQuotaLimitHeuristics(
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      QuotaLimitHeuristics* heuristics) const OVERRIDE;
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Handle quota exceeded gracefully: Only warn the user but still execute the
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // function.
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnQuotaExceeded(const std::string& error) OVERRIDE;
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool RunImpl() OVERRIDE;
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Send updates to |host| with information about what webRequest-related
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// extensions are installed.
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(mpcomplete): remove. http://crbug.com/100411
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SendExtensionWebRequestStatusToHost(content::RenderProcessHost* host);
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CHROME_BROWSER_EXTENSIONS_API_WEB_REQUEST_WEB_REQUEST_API_H_
481