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