diff options
Diffstat (limited to 'chrome/browser/extensions')
-rw-r--r-- | chrome/browser/extensions/extension_function_dispatcher.cc | 28 | ||||
-rw-r--r-- | chrome/browser/extensions/extension_function_dispatcher.h | 12 | ||||
-rw-r--r-- | chrome/browser/extensions/extension_host.cc | 12 | ||||
-rw-r--r-- | chrome/browser/extensions/extension_host.h | 2 | ||||
-rw-r--r-- | chrome/browser/extensions/extension_message_handler.cc | 17 | ||||
-rw-r--r-- | chrome/browser/extensions/extension_message_handler.h | 7 | ||||
-rw-r--r-- | chrome/browser/extensions/extension_web_ui.cc | 9 | ||||
-rw-r--r-- | chrome/browser/extensions/extension_web_ui.h | 6 |
8 files changed, 53 insertions, 40 deletions
diff --git a/chrome/browser/extensions/extension_function_dispatcher.cc b/chrome/browser/extensions/extension_function_dispatcher.cc index 26b466b..efca9b6 100644 --- a/chrome/browser/extensions/extension_function_dispatcher.cc +++ b/chrome/browser/extensions/extension_function_dispatcher.cc @@ -26,7 +26,6 @@ #include "chrome/browser/extensions/extension_idle_api.h" #include "chrome/browser/extensions/extension_infobar_module.h" #include "chrome/browser/extensions/extension_management_api.h" -#include "chrome/browser/extensions/extension_message_service.h" #include "chrome/browser/extensions/extension_metrics_module.h" #include "chrome/browser/extensions/extension_module.h" #include "chrome/browser/extensions/extension_omnibox_api.h" @@ -54,10 +53,13 @@ #include "chrome/browser/ui/webui/favicon_source.h" #include "chrome/common/extensions/extension_messages.h" #include "chrome/common/url_constants.h" +#include "content/browser/child_process_security_policy.h" #include "content/browser/renderer_host/render_process_host.h" #include "content/browser/renderer_host/render_view_host.h" #include "content/common/notification_service.h" #include "content/common/result_codes.h" +#include "ipc/ipc_message.h" +#include "ipc/ipc_message_macros.h" #include "third_party/skia/include/core/SkBitmap.h" #if defined(TOOLKIT_VIEWS) @@ -473,8 +475,28 @@ Browser* ExtensionFunctionDispatcher::GetCurrentBrowser( return browser; } -void ExtensionFunctionDispatcher::HandleRequest( - const ExtensionHostMsg_DomMessage_Params& params) { +bool ExtensionFunctionDispatcher::OnMessageReceived( + const IPC::Message& message) { + bool handled = true; + IPC_BEGIN_MESSAGE_MAP(ExtensionFunctionDispatcher, message) + IPC_MESSAGE_HANDLER(ExtensionHostMsg_Request, OnRequest) + IPC_MESSAGE_UNHANDLED(handled = false) + IPC_END_MESSAGE_MAP() + return handled; +} + +void ExtensionFunctionDispatcher::OnRequest( + const ExtensionHostMsg_Request_Params& params) { + if (!ChildProcessSecurityPolicy::GetInstance()-> + HasExtensionBindings(render_view_host_->process()->id())) { + // This can happen if someone uses window.open() to open an extension URL + // from a non-extension context. + render_view_host_->Send(new ExtensionMsg_Response( + render_view_host_->routing_id(), params.request_id, false, + std::string(), "Access to extension API denied.")); + return; + } + scoped_refptr<ExtensionFunction> function( FactoryRegistry::GetInstance()->NewFunction(params.name)); function->set_dispatcher_peer(peer_); diff --git a/chrome/browser/extensions/extension_function_dispatcher.h b/chrome/browser/extensions/extension_function_dispatcher.h index cb67988..9f91d9d 100644 --- a/chrome/browser/extensions/extension_function_dispatcher.h +++ b/chrome/browser/extensions/extension_function_dispatcher.h @@ -11,6 +11,7 @@ #include "base/memory/ref_counted.h" #include "googleurl/src/gurl.h" +#include "ipc/ipc_channel.h" #include "ui/gfx/native_widget_types.h" class Browser; @@ -20,7 +21,7 @@ class ListValue; class Profile; class RenderViewHost; class TabContents; -struct ExtensionHostMsg_DomMessage_Params; +struct ExtensionHostMsg_Request_Params; // A factory function for creating new ExtensionFunction instances. typedef ExtensionFunction* (*ExtensionFunctionFactory)(); @@ -28,7 +29,7 @@ typedef ExtensionFunction* (*ExtensionFunctionFactory)(); // ExtensionFunctionDispatcher receives requests to execute functions from // Chromium extensions running in a RenderViewHost and dispatches them to the // appropriate handler. It lives entirely on the UI thread. -class ExtensionFunctionDispatcher { +class ExtensionFunctionDispatcher : public IPC::Channel::Listener { public: class Delegate { public: @@ -85,8 +86,8 @@ class ExtensionFunctionDispatcher { Delegate* delegate() { return delegate_; } - // Handle a request to execute an extension function. - void HandleRequest(const ExtensionHostMsg_DomMessage_Params& params); + // If |message| is an extension request, handle it. Returns true if handled. + virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE; // Send a response to a function. void SendResponse(ExtensionFunction* api, bool success); @@ -121,6 +122,9 @@ class ExtensionFunctionDispatcher { const Extension* extension, const GURL& url); + // Message handlers. + void OnRequest(const ExtensionHostMsg_Request_Params& params); + // We need to keep a pointer to the profile because we use it in the dtor // in sending EXTENSION_FUNCTION_DISPATCHER_DESTROYED, but by that point // the render_view_host_ has been deleted. diff --git a/chrome/browser/extensions/extension_host.cc b/chrome/browser/extensions/extension_host.cc index 74f28e3..d2e5bec 100644 --- a/chrome/browser/extensions/extension_host.cc +++ b/chrome/browser/extensions/extension_host.cc @@ -546,13 +546,6 @@ WebPreferences ExtensionHost::GetWebkitPrefs() { return webkit_prefs; } -void ExtensionHost::ProcessWebUIMessage( - const ExtensionHostMsg_DomMessage_Params& params) { - if (extension_function_dispatcher_.get()) { - extension_function_dispatcher_->HandleRequest(params); - } -} - RenderViewHostDelegate::View* ExtensionHost::GetViewDelegate() { return this; } @@ -784,6 +777,11 @@ ViewType::Type ExtensionHost::GetRenderViewType() const { } bool ExtensionHost::OnMessageReceived(const IPC::Message& message) { + if (extension_function_dispatcher_.get() && + extension_function_dispatcher_->OnMessageReceived(message)) { + return true; + } + bool handled = true; IPC_BEGIN_MESSAGE_MAP(ExtensionHost, message) IPC_MESSAGE_HANDLER(ViewHostMsg_RunFileChooser, OnRunFileChooser) diff --git a/chrome/browser/extensions/extension_host.h b/chrome/browser/extensions/extension_host.h index 63adef8..1a23d20 100644 --- a/chrome/browser/extensions/extension_host.h +++ b/chrome/browser/extensions/extension_host.h @@ -128,8 +128,6 @@ class ExtensionHost : public RenderViewHostDelegate, // RenderViewHostDelegate implementation. virtual RenderViewHostDelegate::View* GetViewDelegate(); virtual WebPreferences GetWebkitPrefs(); - virtual void ProcessWebUIMessage( - const ExtensionHostMsg_DomMessage_Params& params); virtual void RunJavaScriptMessage(const std::wstring& message, const std::wstring& default_prompt, const GURL& frame_url, diff --git a/chrome/browser/extensions/extension_message_handler.cc b/chrome/browser/extensions/extension_message_handler.cc index 52517cb..4447dac 100644 --- a/chrome/browser/extensions/extension_message_handler.cc +++ b/chrome/browser/extensions/extension_message_handler.cc @@ -10,7 +10,6 @@ #include "content/browser/child_process_security_policy.h" #include "content/browser/renderer_host/render_process_host.h" #include "content/browser/renderer_host/render_view_host.h" -#include "content/browser/renderer_host/render_view_host_delegate.h" ExtensionMessageHandler::ExtensionMessageHandler( RenderViewHost* render_view_host) @@ -25,7 +24,6 @@ bool ExtensionMessageHandler::OnMessageReceived( bool handled = true; IPC_BEGIN_MESSAGE_MAP(ExtensionMessageHandler, message) IPC_MESSAGE_HANDLER(ExtensionHostMsg_PostMessage, OnPostMessage) - IPC_MESSAGE_HANDLER(ExtensionHostMsg_Request, OnRequest) IPC_MESSAGE_UNHANDLED(handled = false) IPC_END_MESSAGE_MAP() return handled; @@ -39,18 +37,3 @@ void ExtensionMessageHandler::OnPostMessage(int port_id, port_id, message); } } - -void ExtensionMessageHandler::OnRequest( - const ExtensionHostMsg_DomMessage_Params& params) { - if (!ChildProcessSecurityPolicy::GetInstance()-> - HasExtensionBindings(render_view_host()->process()->id())) { - // This can happen if someone uses window.open() to open an extension URL - // from a non-extension context. - Send(new ExtensionMsg_Response( - routing_id(), params.request_id, false, std::string(), - "Access to extension API denied.")); - return; - } - - render_view_host()->delegate()->ProcessWebUIMessage(params); -} diff --git a/chrome/browser/extensions/extension_message_handler.h b/chrome/browser/extensions/extension_message_handler.h index 3a5c050..0ba4940 100644 --- a/chrome/browser/extensions/extension_message_handler.h +++ b/chrome/browser/extensions/extension_message_handler.h @@ -14,6 +14,12 @@ struct ExtensionHostMsg_DomMessage_Params; // Filters and dispatches extension-related IPC messages that arrive from // renderers. There is one of these objects for each RenderViewHost in Chrome. // Contrast this with ExtensionTabHelper, which is only created for TabContents. +// +// TODO(aa): Handling of content script messaging should be able to move to EFD +// once there is an EFD for every RVHD where extension code can run. Then we +// could eliminate this class. Right now, we don't end up with an EFD for tab +// contents unless that tab contents is hosting chrome-extension:// URLs. That +// still leaves content scripts. See also: crbug.com/80307. class ExtensionMessageHandler : public RenderViewHostObserver { public: // |sender| is guaranteed to outlive this object. @@ -26,7 +32,6 @@ class ExtensionMessageHandler : public RenderViewHostObserver { private: // Message handlers. void OnPostMessage(int port_id, const std::string& message); - void OnRequest(const ExtensionHostMsg_DomMessage_Params& params); DISALLOW_COPY_AND_ASSIGN(ExtensionMessageHandler); }; diff --git a/chrome/browser/extensions/extension_web_ui.cc b/chrome/browser/extensions/extension_web_ui.cc index 1a9b122..7192c03 100644 --- a/chrome/browser/extensions/extension_web_ui.cc +++ b/chrome/browser/extensions/extension_web_ui.cc @@ -28,6 +28,7 @@ #include "content/browser/tab_contents/tab_contents.h" #include "content/common/bindings_policy.h" #include "content/common/page_transition_types.h" +#include "ipc/ipc_message.h" #include "net/base/file_stream.h" #include "third_party/skia/include/core/SkBitmap.h" #include "ui/gfx/codec/png_codec.h" @@ -184,9 +185,11 @@ void ExtensionWebUI::RenderViewReused(RenderViewHost* render_view_host) { ResetExtensionBookmarkManagerEventRouter(); } -void ExtensionWebUI::ProcessWebUIMessage( - const ExtensionHostMsg_DomMessage_Params& params) { - extension_function_dispatcher_->HandleRequest(params); +bool ExtensionWebUI::OnMessageReceived(const IPC::Message& message) { + if (extension_function_dispatcher_.get()) + return extension_function_dispatcher_->OnMessageReceived(message); + + return false; } Browser* ExtensionWebUI::GetBrowser() { diff --git a/chrome/browser/extensions/extension_web_ui.h b/chrome/browser/extensions/extension_web_ui.h index 34f0899..f41ead3 100644 --- a/chrome/browser/extensions/extension_web_ui.h +++ b/chrome/browser/extensions/extension_web_ui.h @@ -14,6 +14,7 @@ #include "chrome/browser/favicon_service.h" #include "chrome/common/extensions/extension.h" #include "content/browser/webui/web_ui.h" +#include "ipc/ipc_channel.h" class GURL; class ListValue; @@ -21,7 +22,7 @@ class PrefService; class Profile; class RenderViewHost; class TabContents; -struct ExtensionHostMsg_DomMessage_Params; +struct ExtensionHostMsg_Request_Params; // This class implements WebUI for extensions and allows extensions to put UI in // the main tab contents area. For example, each extension can specify an @@ -42,10 +43,9 @@ class ExtensionWebUI } // WebUI + virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE; virtual void RenderViewCreated(RenderViewHost* render_view_host); virtual void RenderViewReused(RenderViewHost* render_view_host); - virtual void ProcessWebUIMessage( - const ExtensionHostMsg_DomMessage_Params& params); // ExtensionFunctionDispatcher::Delegate virtual Browser* GetBrowser(); |