summaryrefslogtreecommitdiffstats
path: root/chrome/browser/extensions
diff options
context:
space:
mode:
authoracolwell@chromium.org <acolwell@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-04-27 17:23:24 +0000
committeracolwell@chromium.org <acolwell@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-04-27 17:23:24 +0000
commit16544bdf5b6500a7390d738a46f3cff017590582 (patch)
treea497bac31ca891c82fb2f656bd969feac8650d41 /chrome/browser/extensions
parent5ce7a3eebe8ccb16f1cd1e04fbcfa1c7c2d9fdf2 (diff)
downloadchromium_src-16544bdf5b6500a7390d738a46f3cff017590582.zip
chromium_src-16544bdf5b6500a7390d738a46f3cff017590582.tar.gz
chromium_src-16544bdf5b6500a7390d738a46f3cff017590582.tar.bz2
Revert 83168 - Revert "Revert 83100 - Remove weird dependency on extensions from webui.Re-plumb extension request messages in a more sane way.Before, each RVH had ProcessWebUIMessage(), which wasserving as a manual way of plumbing both WebUI andextension messages to the right place, even though onlya few RVHD responded to either message.Instead of this, we now just teach more of the stack howto handle IPC messages in general, and delegate them upthrough the stack, giving each layer a chance to handlethem if it knows how.The result is simpler and smaller:179 insertions(+), 252 deletions(-)BUG=80311Review URL: http://codereview.chromium.org/6901021"This reverts commit 643b280cedd9f0b76948686f39f50f295aba362f.TBR=mpcomplete@chromium.org
TBR=aa@chromium.org This is still causing check_deps failures. Review URL: http://codereview.chromium.org/6902074 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@83172 0039d316-1c4b-4281-b951-d872f2087c98
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();