Index: chrome/browser/extensions/api/web_request/web_request_api.h |
diff --git a/chrome/browser/extensions/api/web_request/web_request_api.h b/chrome/browser/extensions/api/web_request/web_request_api.h |
deleted file mode 100644 |
index f66d671f00e4cb6de2d68f5ba2e6c36149c407f2..0000000000000000000000000000000000000000 |
--- a/chrome/browser/extensions/api/web_request/web_request_api.h |
+++ /dev/null |
@@ -1,546 +0,0 @@ |
-// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#ifndef CHROME_BROWSER_EXTENSIONS_API_WEB_REQUEST_WEB_REQUEST_API_H_ |
-#define CHROME_BROWSER_EXTENSIONS_API_WEB_REQUEST_WEB_REQUEST_API_H_ |
- |
-#include <list> |
-#include <map> |
-#include <set> |
-#include <string> |
-#include <vector> |
- |
-#include "base/memory/singleton.h" |
-#include "base/memory/weak_ptr.h" |
-#include "base/time/time.h" |
-#include "content/public/common/resource_type.h" |
-#include "extensions/browser/api/declarative/rules_registry.h" |
-#include "extensions/browser/api/declarative_webrequest/request_stage.h" |
-#include "extensions/browser/api/web_request/web_request_api_helpers.h" |
-#include "extensions/browser/api/web_request/web_request_permissions.h" |
-#include "extensions/browser/browser_context_keyed_api_factory.h" |
-#include "extensions/browser/event_router.h" |
-#include "extensions/browser/extension_function.h" |
-#include "extensions/common/url_pattern_set.h" |
-#include "ipc/ipc_sender.h" |
-#include "net/base/completion_callback.h" |
-#include "net/base/network_delegate.h" |
-#include "net/http/http_request_headers.h" |
- |
-class ExtensionWebRequestTimeTracker; |
-class GURL; |
- |
-namespace base { |
-class DictionaryValue; |
-class ListValue; |
-class StringValue; |
-} |
- |
-namespace content { |
-class BrowserContext; |
-} |
- |
-namespace net { |
-class AuthCredentials; |
-class AuthChallengeInfo; |
-class HttpRequestHeaders; |
-class HttpResponseHeaders; |
-class URLRequest; |
-} |
- |
-namespace extensions { |
- |
-class InfoMap; |
-class WebRequestRulesRegistry; |
-class WebRequestEventRouterDelegate; |
- |
-// Support class for the WebRequest API. Lives on the UI thread. Most of the |
-// work is done by ExtensionWebRequestEventRouter below. This class observes |
-// extensions::EventRouter to deal with event listeners. There is one instance |
-// per BrowserContext which is shared with incognito. |
-class WebRequestAPI : public BrowserContextKeyedAPI, |
- public EventRouter::Observer { |
- public: |
- explicit WebRequestAPI(content::BrowserContext* context); |
- virtual ~WebRequestAPI(); |
- |
- // BrowserContextKeyedAPI support: |
- static BrowserContextKeyedAPIFactory<WebRequestAPI>* GetFactoryInstance(); |
- |
- // EventRouter::Observer overrides: |
- virtual void OnListenerRemoved(const EventListenerInfo& details) OVERRIDE; |
- |
- private: |
- friend class BrowserContextKeyedAPIFactory<WebRequestAPI>; |
- |
- // BrowserContextKeyedAPI support: |
- static const char* service_name() { return "WebRequestAPI"; } |
- static const bool kServiceRedirectedInIncognito = true; |
- static const bool kServiceIsNULLWhileTesting = true; |
- |
- content::BrowserContext* browser_context_; |
- |
- DISALLOW_COPY_AND_ASSIGN(WebRequestAPI); |
-}; |
- |
-} // namespace extensions |
- |
-// This class observes network events and routes them to the appropriate |
-// extensions listening to those events. All methods must be called on the IO |
-// thread unless otherwise specified. |
-class ExtensionWebRequestEventRouter |
- : public base::SupportsWeakPtr<ExtensionWebRequestEventRouter> { |
- public: |
- struct BlockedRequest; |
- |
- enum EventTypes { |
- kInvalidEvent = 0, |
- kOnBeforeRequest = 1 << 0, |
- kOnBeforeSendHeaders = 1 << 1, |
- kOnSendHeaders = 1 << 2, |
- kOnHeadersReceived = 1 << 3, |
- kOnBeforeRedirect = 1 << 4, |
- kOnAuthRequired = 1 << 5, |
- kOnResponseStarted = 1 << 6, |
- kOnErrorOccurred = 1 << 7, |
- kOnCompleted = 1 << 8, |
- }; |
- |
- // Internal representation of the webRequest.RequestFilter type, used to |
- // filter what network events an extension cares about. |
- struct RequestFilter { |
- RequestFilter(); |
- ~RequestFilter(); |
- |
- // Returns false if there was an error initializing. If it is a user error, |
- // an error message is provided, otherwise the error is internal (and |
- // unexpected). |
- bool InitFromValue(const base::DictionaryValue& value, std::string* error); |
- |
- extensions::URLPatternSet urls; |
- std::vector<content::ResourceType> types; |
- int tab_id; |
- int window_id; |
- }; |
- |
- // Internal representation of the extraInfoSpec parameter on webRequest |
- // events, used to specify extra information to be included with network |
- // events. |
- struct ExtraInfoSpec { |
- enum Flags { |
- REQUEST_HEADERS = 1<<0, |
- RESPONSE_HEADERS = 1<<1, |
- BLOCKING = 1<<2, |
- ASYNC_BLOCKING = 1<<3, |
- REQUEST_BODY = 1<<4, |
- }; |
- |
- static bool InitFromValue(const base::ListValue& value, |
- int* extra_info_spec); |
- }; |
- |
- // Contains an extension's response to a blocking event. |
- struct EventResponse { |
- EventResponse(const std::string& extension_id, |
- const base::Time& extension_install_time); |
- ~EventResponse(); |
- |
- // ID of the extension that sent this response. |
- std::string extension_id; |
- |
- // The time that the extension was installed. Used for deciding order of |
- // precedence in case multiple extensions respond with conflicting |
- // decisions. |
- base::Time extension_install_time; |
- |
- // Response values. These are mutually exclusive. |
- bool cancel; |
- GURL new_url; |
- scoped_ptr<net::HttpRequestHeaders> request_headers; |
- scoped_ptr<extension_web_request_api_helpers::ResponseHeaders> |
- response_headers; |
- |
- scoped_ptr<net::AuthCredentials> auth_credentials; |
- |
- DISALLOW_COPY_AND_ASSIGN(EventResponse); |
- }; |
- |
- static ExtensionWebRequestEventRouter* GetInstance(); |
- |
- // Registers a rule registry. Pass null for |rules_registry| to unregister |
- // the rule registry for |browser_context|. |
- void RegisterRulesRegistry( |
- void* browser_context, |
- const extensions::RulesRegistry::WebViewKey& webview_key, |
- scoped_refptr<extensions::WebRequestRulesRegistry> rules_registry); |
- |
- // Dispatches the OnBeforeRequest event to any extensions whose filters match |
- // the given request. Returns net::ERR_IO_PENDING if an extension is |
- // intercepting the request, OK otherwise. |
- int OnBeforeRequest(void* browser_context, |
- extensions::InfoMap* extension_info_map, |
- net::URLRequest* request, |
- const net::CompletionCallback& callback, |
- GURL* new_url); |
- |
- // Dispatches the onBeforeSendHeaders event. This is fired for HTTP(s) |
- // requests only, and allows modification of the outgoing request headers. |
- // Returns net::ERR_IO_PENDING if an extension is intercepting the request, OK |
- // otherwise. |
- int OnBeforeSendHeaders(void* browser_context, |
- extensions::InfoMap* extension_info_map, |
- net::URLRequest* request, |
- const net::CompletionCallback& callback, |
- net::HttpRequestHeaders* headers); |
- |
- // Dispatches the onSendHeaders event. This is fired for HTTP(s) requests |
- // only. |
- void OnSendHeaders(void* browser_context, |
- extensions::InfoMap* extension_info_map, |
- net::URLRequest* request, |
- const net::HttpRequestHeaders& headers); |
- |
- // Dispatches the onHeadersReceived event. This is fired for HTTP(s) |
- // requests only, and allows modification of incoming response headers. |
- // Returns net::ERR_IO_PENDING if an extension is intercepting the request, |
- // OK otherwise. |original_response_headers| is reference counted. |callback| |
- // |override_response_headers| and |allowed_unsafe_redirect_url| are owned by |
- // a URLRequestJob. They are guaranteed to be valid until |callback| is called |
- // or OnURLRequestDestroyed is called (whatever comes first). |
- // Do not modify |original_response_headers| directly but write new ones |
- // into |override_response_headers|. |
- int OnHeadersReceived( |
- void* browser_context, |
- extensions::InfoMap* extension_info_map, |
- net::URLRequest* request, |
- const net::CompletionCallback& callback, |
- const net::HttpResponseHeaders* original_response_headers, |
- scoped_refptr<net::HttpResponseHeaders>* override_response_headers, |
- GURL* allowed_unsafe_redirect_url); |
- |
- // Dispatches the OnAuthRequired event to any extensions whose filters match |
- // the given request. If the listener is not registered as "blocking", then |
- // AUTH_REQUIRED_RESPONSE_OK is returned. Otherwise, |
- // AUTH_REQUIRED_RESPONSE_IO_PENDING is returned and |callback| will be |
- // invoked later. |
- net::NetworkDelegate::AuthRequiredResponse OnAuthRequired( |
- void* browser_context, |
- extensions::InfoMap* extension_info_map, |
- net::URLRequest* request, |
- const net::AuthChallengeInfo& auth_info, |
- const net::NetworkDelegate::AuthCallback& callback, |
- net::AuthCredentials* credentials); |
- |
- // Dispatches the onBeforeRedirect event. This is fired for HTTP(s) requests |
- // only. |
- void OnBeforeRedirect(void* browser_context, |
- extensions::InfoMap* extension_info_map, |
- net::URLRequest* request, |
- const GURL& new_location); |
- |
- // Dispatches the onResponseStarted event indicating that the first bytes of |
- // the response have arrived. |
- void OnResponseStarted(void* browser_context, |
- extensions::InfoMap* extension_info_map, |
- net::URLRequest* request); |
- |
- // Dispatches the onComplete event. |
- void OnCompleted(void* browser_context, |
- extensions::InfoMap* extension_info_map, |
- net::URLRequest* request); |
- |
- // Dispatches an onErrorOccurred event. |
- void OnErrorOccurred(void* browser_context, |
- extensions::InfoMap* extension_info_map, |
- net::URLRequest* request, |
- bool started); |
- |
- // Notifications when objects are going away. |
- void OnURLRequestDestroyed(void* browser_context, net::URLRequest* request); |
- |
- // Called when an event listener handles a blocking event and responds. |
- void OnEventHandled( |
- void* browser_context, |
- const std::string& extension_id, |
- const std::string& event_name, |
- const std::string& sub_event_name, |
- uint64 request_id, |
- EventResponse* response); |
- |
- // Adds a listener to the given event. |event_name| specifies the event being |
- // listened to. |sub_event_name| is an internal event uniquely generated in |
- // the extension process to correspond to the given filter and |
- // extra_info_spec. It returns true on success, false on failure. |
- bool AddEventListener( |
- void* browser_context, |
- const std::string& extension_id, |
- const std::string& extension_name, |
- const std::string& event_name, |
- const std::string& sub_event_name, |
- const RequestFilter& filter, |
- int extra_info_spec, |
- int embedder_process_id, |
- int web_view_instance_id, |
- base::WeakPtr<IPC::Sender> ipc_sender); |
- |
- // Removes the listener for the given sub-event. |
- void RemoveEventListener( |
- void* browser_context, |
- const std::string& extension_id, |
- const std::string& sub_event_name); |
- |
- // Removes the listeners for a given <webview>. |
- void RemoveWebViewEventListeners( |
- void* browser_context, |
- const std::string& extension_id, |
- int embedder_process_id, |
- int web_view_instance_id); |
- |
- // Called when an incognito browser_context is created or destroyed. |
- void OnOTRBrowserContextCreated(void* original_browser_context, |
- void* otr_browser_context); |
- void OnOTRBrowserContextDestroyed(void* original_browser_context, |
- void* otr_browser_context); |
- |
- // Registers a |callback| that is executed when the next page load happens. |
- // The callback is then deleted. |
- void AddCallbackForPageLoad(const base::Closure& callback); |
- |
- private: |
- friend struct DefaultSingletonTraits<ExtensionWebRequestEventRouter>; |
- |
- struct EventListener; |
- typedef std::map<std::string, std::set<EventListener> > |
- ListenerMapForBrowserContext; |
- typedef std::map<void*, ListenerMapForBrowserContext> ListenerMap; |
- typedef std::map<uint64, BlockedRequest> BlockedRequestMap; |
- // Map of request_id -> bit vector of EventTypes already signaled |
- typedef std::map<uint64, int> SignaledRequestMap; |
- // For each browser_context: a bool indicating whether it is an incognito |
- // browser_context, and a pointer to the corresponding (non-)incognito |
- // browser_context. |
- typedef std::map<void*, std::pair<bool, void*> > CrossBrowserContextMap; |
- typedef std::list<base::Closure> CallbacksForPageLoad; |
- |
- ExtensionWebRequestEventRouter(); |
- ~ExtensionWebRequestEventRouter(); |
- |
- // Ensures that future callbacks for |request| are ignored so that it can be |
- // destroyed safely. |
- void ClearPendingCallbacks(net::URLRequest* request); |
- |
- bool DispatchEvent( |
- void* browser_context, |
- net::URLRequest* request, |
- const std::vector<const EventListener*>& listeners, |
- const base::ListValue& args); |
- |
- // Returns a list of event listeners that care about the given event, based |
- // on their filter parameters. |extra_info_spec| will contain the combined |
- // set of extra_info_spec flags that every matching listener asked for. |
- std::vector<const EventListener*> GetMatchingListeners( |
- void* browser_context, |
- extensions::InfoMap* extension_info_map, |
- const std::string& event_name, |
- net::URLRequest* request, |
- int* extra_info_spec); |
- |
- // Helper for the above functions. This is called twice: once for the |
- // browser_context of the event, the next time for the "cross" browser_context |
- // (i.e. the incognito browser_context if the event is originally for the |
- // normal browser_context, or vice versa). |
- void GetMatchingListenersImpl( |
- void* browser_context, |
- net::URLRequest* request, |
- extensions::InfoMap* extension_info_map, |
- bool crosses_incognito, |
- const std::string& event_name, |
- const GURL& url, |
- int render_process_host_id, |
- int routing_id, |
- content::ResourceType resource_type, |
- bool is_async_request, |
- bool is_request_from_extension, |
- int* extra_info_spec, |
- std::vector<const ExtensionWebRequestEventRouter::EventListener*>* |
- matching_listeners); |
- |
- // Decrements the count of event handlers blocking the given request. When the |
- // count reaches 0, we stop blocking the request and proceed it using the |
- // method requested by the extension with the highest precedence. Precedence |
- // is decided by extension install time. If |response| is non-NULL, this |
- // method assumes ownership. |
- void DecrementBlockCount( |
- void* browser_context, |
- const std::string& extension_id, |
- const std::string& event_name, |
- uint64 request_id, |
- EventResponse* response); |
- |
- // Logs an extension action. |
- void LogExtensionActivity( |
- void* browser_context_id, |
- bool is_incognito, |
- const std::string& extension_id, |
- const GURL& url, |
- const std::string& api_call, |
- scoped_ptr<base::DictionaryValue> details); |
- |
- // Processes the generated deltas from blocked_requests_ on the specified |
- // request. If |call_back| is true, the callback registered in |
- // |blocked_requests_| is called. |
- // The function returns the error code for the network request. This is |
- // mostly relevant in case the caller passes |call_callback| = false |
- // and wants to return the correct network error code himself. |
- int ExecuteDeltas( |
- void* browser_context, uint64 request_id, bool call_callback); |
- |
- // Evaluates the rules of the declarative webrequest API and stores |
- // modifications to the request that result from WebRequestActions as |
- // deltas in |blocked_requests_|. |original_response_headers| should only be |
- // set for the OnHeadersReceived stage and NULL otherwise. Returns whether any |
- // deltas were generated. |
- bool ProcessDeclarativeRules( |
- void* browser_context, |
- extensions::InfoMap* extension_info_map, |
- const std::string& event_name, |
- net::URLRequest* request, |
- extensions::RequestStage request_stage, |
- const net::HttpResponseHeaders* original_response_headers); |
- |
- // If the BlockedRequest contains messages_to_extension entries in the event |
- // deltas, we send them to subscribers of |
- // chrome.declarativeWebRequest.onMessage. |
- void SendMessages( |
- void* browser_context, const BlockedRequest& blocked_request); |
- |
- // Called when the RulesRegistry is ready to unblock a request that was |
- // waiting for said event. |
- void OnRulesRegistryReady( |
- void* browser_context, |
- const std::string& event_name, |
- uint64 request_id, |
- extensions::RequestStage request_stage); |
- |
- // Extracts from |request| information for the keys requestId, url, method, |
- // frameId, tabId, type, and timeStamp and writes these into |out| to be |
- // passed on to extensions. |
- void ExtractRequestInfo(net::URLRequest* request, base::DictionaryValue* out); |
- |
- // Sets the flag that |event_type| has been signaled for |request_id|. |
- // Returns the value of the flag before setting it. |
- bool GetAndSetSignaled(uint64 request_id, EventTypes event_type); |
- |
- // Clears the flag that |event_type| has been signaled for |request_id|. |
- void ClearSignaled(uint64 request_id, EventTypes event_type); |
- |
- // Returns whether |request| represents a top level window navigation. |
- bool IsPageLoad(net::URLRequest* request) const; |
- |
- // Called on a page load to process all registered callbacks. |
- void NotifyPageLoad(); |
- |
- // Returns the matching cross browser_context (the regular browser_context if |
- // |browser_context| is OTR and vice versa). |
- void* GetCrossBrowserContext(void* browser_context) const; |
- |
- // Determines whether the specified browser_context is an incognito |
- // browser_context (based on the contents of the cross-browser_context table |
- // and without dereferencing the browser_context pointer). |
- bool IsIncognitoBrowserContext(void* browser_context) const; |
- |
- // Returns true if |request| was already signaled to some event handlers. |
- bool WasSignaled(const net::URLRequest& request) const; |
- |
- // A map for each browser_context that maps an event name to a set of |
- // extensions that are listening to that event. |
- ListenerMap listeners_; |
- |
- // A map of network requests that are waiting for at least one event handler |
- // to respond. |
- BlockedRequestMap blocked_requests_; |
- |
- // A map of request ids to a bitvector indicating which events have been |
- // signaled and should not be sent again. |
- SignaledRequestMap signaled_requests_; |
- |
- // A map of original browser_context -> corresponding incognito |
- // browser_context (and vice versa). |
- CrossBrowserContextMap cross_browser_context_map_; |
- |
- // Keeps track of time spent waiting on extensions using the blocking |
- // webRequest API. |
- scoped_ptr<ExtensionWebRequestTimeTracker> request_time_tracker_; |
- |
- CallbacksForPageLoad callbacks_for_page_load_; |
- |
- typedef std::pair<void*, extensions::RulesRegistry::WebViewKey> |
- RulesRegistryKey; |
- // Maps each browser_context (and OTRBrowserContext) and a webview key to its |
- // respective rules registry. |
- std::map<RulesRegistryKey, |
- scoped_refptr<extensions::WebRequestRulesRegistry> > rules_registries_; |
- |
- scoped_ptr<extensions::WebRequestEventRouterDelegate> |
- web_request_event_router_delegate_; |
- |
- DISALLOW_COPY_AND_ASSIGN(ExtensionWebRequestEventRouter); |
-}; |
- |
-class WebRequestInternalAddEventListenerFunction |
- : public SyncIOThreadExtensionFunction { |
- public: |
- DECLARE_EXTENSION_FUNCTION("webRequestInternal.addEventListener", |
- WEBREQUESTINTERNAL_ADDEVENTLISTENER) |
- |
- protected: |
- virtual ~WebRequestInternalAddEventListenerFunction() {} |
- |
- // ExtensionFunction: |
- virtual bool RunSync() OVERRIDE; |
-}; |
- |
-class WebRequestInternalEventHandledFunction |
- : public SyncIOThreadExtensionFunction { |
- public: |
- DECLARE_EXTENSION_FUNCTION("webRequestInternal.eventHandled", |
- WEBREQUESTINTERNAL_EVENTHANDLED) |
- |
- protected: |
- virtual ~WebRequestInternalEventHandledFunction() {} |
- |
- // Unblocks the network request and sets |error_| such that the developer |
- // console will show the respective error message. Use this function to handle |
- // incorrect requests from the extension that cannot be detected by the schema |
- // validator. |
- void RespondWithError( |
- const std::string& event_name, |
- const std::string& sub_event_name, |
- uint64 request_id, |
- scoped_ptr<ExtensionWebRequestEventRouter::EventResponse> response, |
- const std::string& error); |
- |
- // ExtensionFunction: |
- virtual bool RunSync() OVERRIDE; |
-}; |
- |
-class WebRequestHandlerBehaviorChangedFunction |
- : public SyncIOThreadExtensionFunction { |
- public: |
- DECLARE_EXTENSION_FUNCTION("webRequest.handlerBehaviorChanged", |
- WEBREQUEST_HANDLERBEHAVIORCHANGED) |
- |
- protected: |
- virtual ~WebRequestHandlerBehaviorChangedFunction() {} |
- |
- // ExtensionFunction: |
- virtual void GetQuotaLimitHeuristics( |
- extensions::QuotaLimitHeuristics* heuristics) const OVERRIDE; |
- // Handle quota exceeded gracefully: Only warn the user but still execute the |
- // function. |
- virtual void OnQuotaExceeded(const std::string& error) OVERRIDE; |
- virtual bool RunSync() OVERRIDE; |
-}; |
- |
-#endif // CHROME_BROWSER_EXTENSIONS_API_WEB_REQUEST_WEB_REQUEST_API_H_ |