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