summaryrefslogtreecommitdiffstats
path: root/chrome/browser/extensions
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/browser/extensions')
-rw-r--r--chrome/browser/extensions/extension_function_dispatcher.cc28
-rw-r--r--chrome/browser/extensions/extension_function_dispatcher.h12
-rw-r--r--chrome/browser/extensions/extension_host.cc12
-rw-r--r--chrome/browser/extensions/extension_host.h2
-rw-r--r--chrome/browser/extensions/extension_message_handler.cc17
-rw-r--r--chrome/browser/extensions/extension_message_handler.h7
-rw-r--r--chrome/browser/extensions/extension_web_ui.cc9
-rw-r--r--chrome/browser/extensions/extension_web_ui.h6
8 files changed, 40 insertions, 53 deletions
diff --git a/chrome/browser/extensions/extension_function_dispatcher.cc b/chrome/browser/extensions/extension_function_dispatcher.cc
index efca9b6..26b466b 100644
--- a/chrome/browser/extensions/extension_function_dispatcher.cc
+++ b/chrome/browser/extensions/extension_function_dispatcher.cc
@@ -26,6 +26,7 @@
#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"
@@ -53,13 +54,10 @@
#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)
@@ -475,28 +473,8 @@ Browser* ExtensionFunctionDispatcher::GetCurrentBrowser(
return browser;
}
-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;
- }
-
+void ExtensionFunctionDispatcher::HandleRequest(
+ const ExtensionHostMsg_DomMessage_Params& params) {
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 9f91d9d..cb67988 100644
--- a/chrome/browser/extensions/extension_function_dispatcher.h
+++ b/chrome/browser/extensions/extension_function_dispatcher.h
@@ -11,7 +11,6 @@
#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;
@@ -21,7 +20,7 @@ class ListValue;
class Profile;
class RenderViewHost;
class TabContents;
-struct ExtensionHostMsg_Request_Params;
+struct ExtensionHostMsg_DomMessage_Params;
// A factory function for creating new ExtensionFunction instances.
typedef ExtensionFunction* (*ExtensionFunctionFactory)();
@@ -29,7 +28,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 : public IPC::Channel::Listener {
+class ExtensionFunctionDispatcher {
public:
class Delegate {
public:
@@ -86,8 +85,8 @@ class ExtensionFunctionDispatcher : public IPC::Channel::Listener {
Delegate* delegate() { return delegate_; }
- // If |message| is an extension request, handle it. Returns true if handled.
- virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE;
+ // Handle a request to execute an extension function.
+ void HandleRequest(const ExtensionHostMsg_DomMessage_Params& params);
// Send a response to a function.
void SendResponse(ExtensionFunction* api, bool success);
@@ -122,9 +121,6 @@ class ExtensionFunctionDispatcher : public IPC::Channel::Listener {
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 d2e5bec..74f28e3 100644
--- a/chrome/browser/extensions/extension_host.cc
+++ b/chrome/browser/extensions/extension_host.cc
@@ -546,6 +546,13 @@ 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;
}
@@ -777,11 +784,6 @@ 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 1a23d20..63adef8 100644
--- a/chrome/browser/extensions/extension_host.h
+++ b/chrome/browser/extensions/extension_host.h
@@ -128,6 +128,8 @@ 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 4447dac..52517cb 100644
--- a/chrome/browser/extensions/extension_message_handler.cc
+++ b/chrome/browser/extensions/extension_message_handler.cc
@@ -10,6 +10,7 @@
#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)
@@ -24,6 +25,7 @@ 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;
@@ -37,3 +39,18 @@ 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 0ba4940..3a5c050 100644
--- a/chrome/browser/extensions/extension_message_handler.h
+++ b/chrome/browser/extensions/extension_message_handler.h
@@ -14,12 +14,6 @@ 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.
@@ -32,6 +26,7 @@ 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 7192c03..1a9b122 100644
--- a/chrome/browser/extensions/extension_web_ui.cc
+++ b/chrome/browser/extensions/extension_web_ui.cc
@@ -28,7 +28,6 @@
#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"
@@ -185,11 +184,9 @@ void ExtensionWebUI::RenderViewReused(RenderViewHost* render_view_host) {
ResetExtensionBookmarkManagerEventRouter();
}
-bool ExtensionWebUI::OnMessageReceived(const IPC::Message& message) {
- if (extension_function_dispatcher_.get())
- return extension_function_dispatcher_->OnMessageReceived(message);
-
- return false;
+void ExtensionWebUI::ProcessWebUIMessage(
+ const ExtensionHostMsg_DomMessage_Params& params) {
+ extension_function_dispatcher_->HandleRequest(params);
}
Browser* ExtensionWebUI::GetBrowser() {
diff --git a/chrome/browser/extensions/extension_web_ui.h b/chrome/browser/extensions/extension_web_ui.h
index f41ead3..34f0899 100644
--- a/chrome/browser/extensions/extension_web_ui.h
+++ b/chrome/browser/extensions/extension_web_ui.h
@@ -14,7 +14,6 @@
#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;
@@ -22,7 +21,7 @@ class PrefService;
class Profile;
class RenderViewHost;
class TabContents;
-struct ExtensionHostMsg_Request_Params;
+struct ExtensionHostMsg_DomMessage_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
@@ -43,9 +42,10 @@ 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();