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_RENDERER_EXTENSIONS_DISPATCHER_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_RENDERER_EXTENSIONS_DISPATCHER_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include <map>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <set>
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "base/memory/shared_memory.h"
14eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/timer/timer.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/extensions/extension_set.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/extensions/features/feature.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/renderer/extensions/chrome_v8_context.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/renderer/extensions/chrome_v8_context_set.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/renderer/extensions/v8_schema_registry.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/renderer/resource_bundle_source_map.h"
21eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "content/public/renderer/render_process_observer.h"
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "extensions/common/event_filter.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "v8/include/v8.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochclass ChromeRenderViewTest;
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GURL;
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ModuleSystem;
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class URLPattern;
29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)struct ExtensionMsg_ExternalConnectionInfo;
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct ExtensionMsg_Loaded_Params;
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace WebKit {
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WebFrame;
34ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochclass WebSecurityOrigin;
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base {
38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class DictionaryValue;
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ListValue;
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RenderThread;
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace extensions {
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ContentWatcher;
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Extension;
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FilteredEventRouter;
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RequestSender;
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class UserScriptSlave;
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Dispatches extension control messages sent to the renderer and stores
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// renderer extension related state.
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Dispatcher : public content::RenderProcessObserver {
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Dispatcher();
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~Dispatcher();
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::set<std::string>& function_names() const {
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return function_names_;
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool is_extension_process() const { return is_extension_process_; }
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const ExtensionSet* extensions() const { return &extensions_; }
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const ChromeV8ContextSet& v8_context_set() const {
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return v8_context_set_;
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UserScriptSlave* user_script_slave() {
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return user_script_slave_.get();
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  V8SchemaRegistry* v8_schema_registry() {
737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    return v8_schema_registry_.get();
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ContentWatcher* content_watcher() {
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return content_watcher_.get();
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  RequestSender* request_sender() {
79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return request_sender_.get();
80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsExtensionActive(const std::string& extension_id) const;
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Finds the extension ID for the JavaScript context associated with the
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // specified |frame| and isolated world. If |world_id| is zero, finds the
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // extension ID associated with the main world's JavaScript context. If the
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // JavaScript context isn't from an extension, returns empty string.
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string GetExtensionID(const WebKit::WebFrame* frame, int world_id);
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DidCreateScriptContext(WebKit::WebFrame* frame,
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              v8::Handle<v8::Context> context,
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              int extension_group,
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              int world_id);
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void WillReleaseScriptContext(WebKit::WebFrame* frame,
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                v8::Handle<v8::Context> context,
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                int world_id);
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DidCreateDocumentElement(WebKit::WebFrame* frame);
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(mpcomplete): remove. http://crbug.com/100411
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsAdblockWithWebRequestInstalled() const {
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return webrequest_adblock_;
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsAdblockPlusWithWebRequestInstalled() const {
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return webrequest_adblock_plus_;
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsOtherExtensionWithWebRequestInstalled() const {
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return webrequest_other_;
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnExtensionResponse(int request_id,
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           bool success,
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           const base::ListValue& response,
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           const std::string& error);
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Checks that the current context contains an extension that has permission
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // to execute the specified function. If it does not, a v8 exception is thrown
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // and the method returns false. Otherwise returns true.
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool CheckContextAccessToExtensionAPI(
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const std::string& function_name, ChromeV8Context* context) const;
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
122868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Dispatches the event named |event_name| to all render views.
123868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  void DispatchEvent(const std::string& extension_id,
124868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                     const std::string& event_name) const;
125868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
126868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Shared implementation of the various MessageInvoke IPCs.
127868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  void InvokeModuleSystemMethod(
128868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      content::RenderView* render_view,
129868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      const std::string& extension_id,
130868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      const std::string& module_name,
131868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      const std::string& function_name,
132868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      const base::ListValue& args,
133868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      bool user_gesture);
134868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  friend class ::ChromeRenderViewTest;
13790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(RendererPermissionsPolicyDelegateTest,
13890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                           CannotScriptWebstore);
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef void (*BindingInstaller)(ModuleSystem* module_system,
140868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                  v8::Handle<v8::Object> chrome);
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // RenderProcessObserver implementation:
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool OnControlMessageReceived(const IPC::Message& message) OVERRIDE;
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void WebKitInitialized() OVERRIDE;
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void IdleNotification() OVERRIDE;
1467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  virtual void OnRenderProcessShutdown() OVERRIDE;
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnSetChannel(int channel);
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnMessageInvoke(const std::string& extension_id,
150868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                       const std::string& module_name,
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       const std::string& function_name,
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       const base::ListValue& args,
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       bool user_gesture);
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnDispatchOnConnect(int target_port_id,
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           const std::string& channel_name,
156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                           const base::DictionaryValue& source_tab,
157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                           const ExtensionMsg_ExternalConnectionInfo& info);
158eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  void OnDeliverMessage(int target_port_id, const std::string& message);
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void OnDispatchOnDisconnect(int port_id, const std::string& error_message);
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnSetFunctionNames(const std::vector<std::string>& names);
1617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  void OnSetSystemFont(const std::string& font_family,
1627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                       const std::string& font_size);
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnLoaded(
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::vector<ExtensionMsg_Loaded_Params>& loaded_extensions);
16590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  void OnLoadedInternal(scoped_refptr<const Extension> extension);
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnUnloaded(const std::string& id);
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnSetScriptingWhitelist(
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const Extension::ScriptingWhitelist& extension_ids);
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnPageActionsUpdated(const std::string& extension_id,
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::vector<std::string>& page_actions);
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnActivateExtension(const std::string& extension_id);
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnUpdatePermissions(int reason_id,
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           const std::string& extension_id,
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           const APIPermissionSet& apis,
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           const URLPatternSet& explicit_hosts,
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           const URLPatternSet& scriptable_hosts);
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnUpdateTabSpecificPermissions(int page_id,
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      int tab_id,
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      const std::string& extension_id,
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      const URLPatternSet& origin_set);
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnClearTabSpecificPermissions(
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int tab_id,
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::vector<std::string>& extension_ids);
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnUpdateUserScripts(base::SharedMemoryHandle table);
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnUsingWebRequestAPI(
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bool adblock,
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bool adblock_plus,
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bool other_webrequest);
1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void OnShouldSuspend(const std::string& extension_id, int sequence_id);
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void OnSuspend(const std::string& extension_id);
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void OnCancelSuspend(const std::string& extension_id);
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Update the list of active extensions that will be reported when we crash.
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void UpdateActiveExtensions();
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sets up the host permissions for |extension|.
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void InitOriginPermissions(const Extension* extension);
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AddOrRemoveOriginPermissions(
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      UpdatedExtensionPermissionsInfo::Reason reason,
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const Extension* extension,
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const URLPatternSet& origins);
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2034311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  // Enable custom element whitelist in Apps.
2044311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  void EnableCustomElementWhiteList();
2054311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
2067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Adds or removes bindings for every context belonging to |extension_id|, or
2077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // or all contexts if |extension_id| is empty.
2087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  void AddOrRemoveBindings(const std::string& extension_id);
2097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RegisterNativeHandlers(ModuleSystem* module_system,
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              ChromeV8Context* context);
2127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  void AddOrRemoveBindingsForContext(ChromeV8Context* context);
213868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  void RegisterBinding(const std::string& api_name,
214868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                       ChromeV8Context* context);
215868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  void DeregisterBinding(const std::string& api_name, ChromeV8Context* context);
216868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  v8::Handle<v8::Object> GetOrCreateBindObjectIfAvailable(
217868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      const std::string& api_name,
218868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      std::string* bind_name,
219868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      ChromeV8Context* context);
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Inserts static source code into |source_map_|.
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void PopulateSourceMap();
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Inserts BindingInstallers into |lazy_bindings_map_|.
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void PopulateLazyBindingsMap();
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sets up the bindings for the given api.
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void InstallBindings(ModuleSystem* module_system,
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       v8::Handle<v8::Context> v8_context,
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       const std::string& api);
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2324311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  // Returns whether the current renderer hosts a platform app.
2334311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  bool IsWithinPlatformApp();
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  bool IsSandboxedPage(const GURL& url) const;
236ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the Feature::Context type of context for a JavaScript context.
238ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  Feature::Context ClassifyJavaScriptContext(
239ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      const std::string& extension_id,
240ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      int extension_group,
241ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      const GURL& url,
242ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      const WebKit::WebSecurityOrigin& origin);
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Gets |field| from |object| or creates it as an empty object if it doesn't
2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // exist.
2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  v8::Handle<v8::Object> GetOrCreateObject(v8::Handle<v8::Object> object,
2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                           const std::string& field);
2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // True if this renderer is running extensions.
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool is_extension_process_;
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Contains all loaded extensions.  This is essentially the renderer
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // counterpart to ExtensionService in the browser. It contains information
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // about all extensions currently loaded by the browser.
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExtensionSet extensions_;
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
257c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // The IDs of extensions that failed to load, mapped to the error message
258c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // generated on failure.
259c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::map<std::string, std::string> extension_load_errors_;
260c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // All the bindings contexts that are currently loaded for this renderer.
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // There is zero or one for each v8 context.
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ChromeV8ContextSet v8_context_set_;
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<UserScriptSlave> user_script_slave_;
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<ContentWatcher> content_watcher_;
2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Same as above, but on a longer timer and will run even if the process is
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // not idle, to ensure that IdleHandle gets called eventually.
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::RepeatingTimer<content::RenderThread> forced_idle_timer_;
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // All declared function names.
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::set<std::string> function_names_;
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The extensions and apps that are active in this process.
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::set<std::string> active_extension_ids_;
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // True once WebKit has been initialized (and it is therefore safe to poke).
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool is_webkit_initialized_;
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Status of webrequest usage for known extensions.
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(mpcomplete): remove. http://crbug.com/100411
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool webrequest_adblock_;
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool webrequest_adblock_plus_;
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool webrequest_other_;
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ResourceBundleSourceMap source_map_;
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Cache for the v8 representation of extension API schemas.
2917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  scoped_ptr<V8SchemaRegistry> v8_schema_registry_;
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Bindings that are defined lazily and have BindingInstallers to install
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // them.
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::map<std::string, BindingInstaller> lazy_bindings_map_;
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sends API requests to the extension host.
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<RequestSender> request_sender_;
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // The platforms system font family and size;
3017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  std::string system_font_family_;
3027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  std::string system_font_size_;
3037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(Dispatcher);
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace extensions
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CHROME_RENDERER_EXTENSIONS_DISPATCHER_H_
310