1010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// Copyright 2014 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)
5010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#ifndef EXTENSIONS_RENDERER_DISPATCHER_H_
6010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#define EXTENSIONS_RENDERER_DISPATCHER_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include <map>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <set>
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include <utility>
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/scoped_observer.h"
15eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/timer/timer.h"
16eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "content/public/renderer/render_process_observer.h"
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "extensions/common/event_filter.h"
185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "extensions/common/extension_set.h"
191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "extensions/common/extensions_client.h"
203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "extensions/common/features/feature.h"
21010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "extensions/renderer/resource_bundle_source_map.h"
220529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "extensions/renderer/script_context.h"
230529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "extensions/renderer/script_context_set.h"
245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "extensions/renderer/user_script_set_manager.h"
250529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "extensions/renderer/v8_schema_registry.h"
264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "third_party/WebKit/public/platform/WebString.h"
274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "third_party/WebKit/public/platform/WebVector.h"
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "v8/include/v8.h"
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochclass ChromeRenderViewTest;
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GURL;
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ModuleSystem;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class URLPattern;
34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)struct ExtensionMsg_ExternalConnectionInfo;
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct ExtensionMsg_Loaded_Params;
36f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)struct ExtensionMsg_UpdatePermissions_Params;
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace blink {
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WebFrame;
40ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochclass WebSecurityOrigin;
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base {
44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class DictionaryValue;
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ListValue;
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RenderThread;
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace extensions {
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ContentWatcher;
54010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)class DispatcherDelegate;
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Extension;
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FilteredEventRouter;
57f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class ManifestPermissionSet;
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RequestSender;
59a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochclass ScriptContext;
60116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass ScriptInjectionManager;
611e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)struct Message;
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Dispatches extension control messages sent to the renderer and stores
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// renderer extension related state.
65116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass Dispatcher : public content::RenderProcessObserver,
665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                   public UserScriptSetManager::Observer {
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
68010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  explicit Dispatcher(DispatcherDelegate* delegate);
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~Dispatcher();
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::set<std::string>& function_names() const {
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return function_names_;
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool is_extension_process() const { return is_extension_process_; }
76010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const ExtensionSet* extensions() const { return &extensions_; }
78010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
790529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  const ScriptContextSet& script_context_set() const {
800529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    return script_context_set_;
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
82010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
83010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  V8SchemaRegistry* v8_schema_registry() { return v8_schema_registry_.get(); }
84010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
85010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ContentWatcher* content_watcher() { return content_watcher_.get(); }
86010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
87010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  RequestSender* request_sender() { return request_sender_.get(); }
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
89116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  void OnRenderViewCreated(content::RenderView* render_view);
90116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsExtensionActive(const std::string& extension_id) const;
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Finds the extension for the JavaScript context associated with the
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // specified |frame| and isolated world. If |world_id| is zero, finds the
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // extension ID associated with the main world's JavaScript context. If the
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // JavaScript context isn't from an extension, returns empty string.
971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const Extension* GetExtensionFromFrameAndWorld(const blink::WebFrame* frame,
981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                 int world_id,
991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                 bool use_effective_url);
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
101f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  void DidCreateScriptContext(blink::WebFrame* frame,
102010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                              const v8::Handle<v8::Context>& context,
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              int extension_group,
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              int world_id);
105010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
106f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  void WillReleaseScriptContext(blink::WebFrame* frame,
107010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                const v8::Handle<v8::Context>& context,
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                int world_id);
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
110f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  void DidCreateDocumentElement(blink::WebFrame* frame);
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  void DidMatchCSS(
113f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      blink::WebFrame* frame,
114f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      const blink::WebVector<blink::WebString>& newly_matching_selectors,
115f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      const blink::WebVector<blink::WebString>& stopped_matching_selectors);
1164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnExtensionResponse(int request_id,
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           bool success,
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           const base::ListValue& response,
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           const std::string& error);
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Checks that the current context contains an extension that has permission
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // to execute the specified function. If it does not, a v8 exception is thrown
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // and the method returns false. Otherwise returns true.
125a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  bool CheckContextAccessToExtensionAPI(const std::string& function_name,
126a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                                        ScriptContext* context) const;
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
128868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Dispatches the event named |event_name| to all render views.
129868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  void DispatchEvent(const std::string& extension_id,
130868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                     const std::string& event_name) const;
131868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
132868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Shared implementation of the various MessageInvoke IPCs.
133010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  void InvokeModuleSystemMethod(content::RenderView* render_view,
134010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                const std::string& extension_id,
135010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                const std::string& module_name,
136010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                const std::string& function_name,
137010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                const base::ListValue& args,
138010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                bool user_gesture);
139868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void ClearPortData(int port_id);
1415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Returns a list of (module name, resource id) pairs for the JS modules to
1435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // add to the source map.
1445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  static std::vector<std::pair<std::string, int> > GetJsResources();
1455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  static void RegisterNativeHandlers(ModuleSystem* module_system,
1465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                     ScriptContext* context,
1475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                     Dispatcher* dispatcher,
1485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                     RequestSender* request_sender,
1495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                     V8SchemaRegistry* v8_schema_registry);
1505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  bool WasWebRequestUsedBySomeExtensions() const { return webrequest_used_; }
1521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  friend class ::ChromeRenderViewTest;
15590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(RendererPermissionsPolicyDelegateTest,
15690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                           CannotScriptWebstore);
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // RenderProcessObserver implementation:
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool OnControlMessageReceived(const IPC::Message& message) OVERRIDE;
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void WebKitInitialized() OVERRIDE;
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void IdleNotification() OVERRIDE;
1627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  virtual void OnRenderProcessShutdown() OVERRIDE;
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
164010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  void OnActivateExtension(const std::string& extension_id);
165010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  void OnCancelSuspend(const std::string& extension_id);
166010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  void OnClearTabSpecificPermissions(
167010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      int tab_id,
168010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      const std::vector<std::string>& extension_ids);
169010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  void OnDeliverMessage(int target_port_id, const Message& message);
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnDispatchOnConnect(int target_port_id,
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           const std::string& channel_name,
172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                           const base::DictionaryValue& source_tab,
1734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                           const ExtensionMsg_ExternalConnectionInfo& info,
1744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                           const std::string& tls_channel_id);
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void OnDispatchOnDisconnect(int port_id, const std::string& error_message);
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnLoaded(
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::vector<ExtensionMsg_Loaded_Params>& loaded_extensions);
17890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  void OnLoadedInternal(scoped_refptr<const Extension> extension);
179010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  void OnMessageInvoke(const std::string& extension_id,
180010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                       const std::string& module_name,
181010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                       const std::string& function_name,
182010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                       const base::ListValue& args,
183010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                       bool user_gesture);
184010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  void OnSetChannel(int channel);
185010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  void OnSetFunctionNames(const std::vector<std::string>& names);
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnSetScriptingWhitelist(
1871e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      const ExtensionsClient::ScriptingWhitelist& extension_ids);
188010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  void OnSetSystemFont(const std::string& font_family,
189010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                       const std::string& font_size);
190116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  void OnShouldSuspend(const std::string& extension_id, uint64 sequence_id);
191010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  void OnSuspend(const std::string& extension_id);
19246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  void OnTransferBlobs(const std::vector<std::string>& blob_uuids);
193010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  void OnUnloaded(const std::string& id);
194f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  void OnUpdatePermissions(const ExtensionMsg_UpdatePermissions_Params& params);
195116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  void OnUpdateTabSpecificPermissions(const GURL& url,
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      int tab_id,
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      const std::string& extension_id,
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      const URLPatternSet& origin_set);
199f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  void OnUsingWebRequestAPI(bool webrequest_used);
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // UserScriptSetManager::Observer implementation.
202116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual void OnUserScriptsUpdated(
203116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      const std::set<std::string>& changed_extensions,
204116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      const std::vector<UserScript*>& scripts) OVERRIDE;
205116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void UpdateActiveExtensions();
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sets up the host permissions for |extension|.
2095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  void InitOriginPermissions(const Extension* extension);
2105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Updates the host permissions for extension to include only those in
2125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // |new_patterns|, and remove from |old_patterns| that are no longer allowed.
2135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  void UpdateOriginPermissions(const Extension* extension,
2145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                               const URLPatternSet& old_patterns,
2155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                               const URLPatternSet& new_patterns);
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
217ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Enable custom element whitelist in Apps.
218ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  void EnableCustomElementWhiteList();
219ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
2207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Adds or removes bindings for every context belonging to |extension_id|, or
2217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // or all contexts if |extension_id| is empty.
222010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  void UpdateBindings(const std::string& extension_id);
223010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
224010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  void UpdateBindingsForContext(ScriptContext* context);
225010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
226010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  void RegisterBinding(const std::string& api_name, ScriptContext* context);
2277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RegisterNativeHandlers(ModuleSystem* module_system,
2290529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                              ScriptContext* context);
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Inserts static source code into |source_map_|.
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void PopulateSourceMap();
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
234ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Returns whether the current renderer hosts a platform app.
235ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  bool IsWithinPlatformApp();
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
237ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  bool IsSandboxedPage(const GURL& url) const;
238ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the Feature::Context type of context for a JavaScript context.
240ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  Feature::Context ClassifyJavaScriptContext(
2415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      const Extension* extension,
242ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      int extension_group,
243ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      const GURL& url,
244f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      const blink::WebSecurityOrigin& origin);
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Gets |field| from |object| or creates it as an empty object if it doesn't
2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // exist.
248010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  v8::Handle<v8::Object> GetOrCreateObject(const v8::Handle<v8::Object>& object,
249a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                           const std::string& field,
250a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                           v8::Isolate* isolate);
2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
252010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  v8::Handle<v8::Object> GetOrCreateBindObjectIfAvailable(
253010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      const std::string& api_name,
254010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      std::string* bind_name,
255010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      ScriptContext* context);
256010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
257010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // The delegate for this dispatcher. Not owned, but must extend beyond the
258010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Dispatcher's own lifetime.
259010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DispatcherDelegate* delegate_;
260010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // True if this renderer is running extensions.
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool is_extension_process_;
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Contains all loaded extensions.  This is essentially the renderer
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // counterpart to ExtensionService in the browser. It contains information
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // about all extensions currently loaded by the browser.
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExtensionSet extensions_;
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
269c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // The IDs of extensions that failed to load, mapped to the error message
270c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // generated on failure.
271c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::map<std::string, std::string> extension_load_errors_;
272c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // All the bindings contexts that are currently loaded for this renderer.
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // There is zero or one for each v8 context.
2750529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  ScriptContextSet script_context_set_;
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<ContentWatcher> content_watcher_;
2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  scoped_ptr<UserScriptSetManager> user_script_set_manager_;
280116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
281116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  scoped_ptr<ScriptInjectionManager> script_injection_manager_;
282010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Same as above, but on a longer timer and will run even if the process is
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // not idle, to ensure that IdleHandle gets called eventually.
28523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  scoped_ptr<base::RepeatingTimer<content::RenderThread> > forced_idle_timer_;
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // All declared function names.
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::set<std::string> function_names_;
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The extensions and apps that are active in this process.
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::set<std::string> active_extension_ids_;
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ResourceBundleSourceMap source_map_;
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Cache for the v8 representation of extension API schemas.
2967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  scoped_ptr<V8SchemaRegistry> v8_schema_registry_;
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sends API requests to the extension host.
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<RequestSender> request_sender_;
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // The platforms system font family and size;
3027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  std::string system_font_family_;
3037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  std::string system_font_size_;
3047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
3055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Mapping of port IDs to tabs. If there is no tab, the value would be -1.
3065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  std::map<int, int> port_to_tab_id_map_;
3075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
308010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // True once WebKit has been initialized (and it is therefore safe to poke).
309010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  bool is_webkit_initialized_;
310010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
311116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // It is important for this to come after the ScriptInjectionManager, so that
312116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // the observer is destroyed before the UserScriptSet.
3135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ScopedObserver<UserScriptSetManager, UserScriptSetManager::Observer>
3145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      user_script_set_manager_observer_;
315116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
3161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Status of webrequest usage.
3171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  bool webrequest_used_;
3181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(Dispatcher);
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace extensions
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
324010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#endif  // EXTENSIONS_RENDERER_DISPATCHER_H_
325