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