| Index: chrome/browser/extensions/extension_message_dispatcher.cc
|
| ===================================================================
|
| --- chrome/browser/extensions/extension_message_dispatcher.cc (revision 0)
|
| +++ chrome/browser/extensions/extension_message_dispatcher.cc (revision 0)
|
| @@ -0,0 +1,111 @@
|
| +// Copyright (c) 2011 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include "chrome/browser/extensions/extension_message_dispatcher.h"
|
| +
|
| +#include "chrome/browser/extensions/extension_function_dispatcher.h"
|
| +#include "chrome/browser/extensions/extension_message_service.h"
|
| +#include "chrome/browser/profiles/profile.h"
|
| +#include "chrome/common/extensions/extension_messages.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/browser/renderer_host/render_view_host_delegate.h"
|
| +#include "content/browser/tab_contents/tab_contents.h"
|
| +#include "content/common/notification_service.h"
|
| +
|
| +ExtensionMessageDispatcher::ExtensionMessageDispatcher(
|
| + int child_id, IPC::Message::Sender* sender, Profile* profile)
|
| + : child_id_(child_id),
|
| + sender_(sender),
|
| + extension_function_dispatcher_(NULL),
|
| + profile_(profile) {
|
| +}
|
| +
|
| +ExtensionMessageDispatcher::~ExtensionMessageDispatcher() {
|
| +}
|
| +
|
| +bool ExtensionMessageDispatcher::OnMessageReceived(
|
| + const IPC::Message& message) {
|
| + bool handled = true;
|
| + IPC_BEGIN_MESSAGE_MAP(ExtensionMessageDispatcher, message)
|
| + IPC_MESSAGE_HANDLER(ExtensionHostMsg_PostMessage, OnPostMessage)
|
| + IPC_MESSAGE_HANDLER(ExtensionHostMsg_Request, OnRequest)
|
| + IPC_MESSAGE_UNHANDLED(handled = false)
|
| + IPC_END_MESSAGE_MAP()
|
| + return handled;
|
| +}
|
| +
|
| +bool ExtensionMessageDispatcher::CanDispatchRequest(
|
| + int child_id,
|
| + int routing_id,
|
| + const ExtensionHostMsg_DomMessage_Params& params) {
|
| + if (!ChildProcessSecurityPolicy::GetInstance()->
|
| + HasExtensionBindings(child_id)) {
|
| + // This can happen if someone uses window.open() to open an extension URL
|
| + // from a non-extension context.
|
| + sender_->Send(new ExtensionMsg_Response(
|
| + routing_id, params.request_id, false, std::string(),
|
| + "Access to extension API denied."));
|
| + return false;
|
| + }
|
| +
|
| + return true;
|
| +}
|
| +
|
| +void ExtensionMessageDispatcher::OnPostMessage(int port_id,
|
| + const std::string& message) {
|
| + if (profile_->GetExtensionMessageService()) {
|
| + profile_->GetExtensionMessageService()->PostMessageFromRenderer(
|
| + port_id, message);
|
| + }
|
| +}
|
| +
|
| +void ExtensionMessageDispatcher::OnRequest(
|
| + const IPC::Message& message,
|
| + const ExtensionHostMsg_DomMessage_Params& params) {
|
| + DCHECK(child_id_);
|
| + if (!extension_function_dispatcher_ ||
|
| + !CanDispatchRequest(child_id_, message.routing_id(), params)) {
|
| + return;
|
| + }
|
| +
|
| + extension_function_dispatcher_->HandleRequest(params);
|
| +}
|
| +
|
| +ExtensionMessageObserver::ExtensionMessageObserver(TabContents* tab_contents)
|
| + : TabContentsObserver(tab_contents),
|
| + ALLOW_THIS_IN_INITIALIZER_LIST(
|
| + dispatcher_(0, this, tab_contents->profile())) {
|
| + // We don't pass in a child_id to dispatcher_ since for TabContents that can
|
| + // change later.
|
| +}
|
| +
|
| +ExtensionMessageObserver::~ExtensionMessageObserver() {
|
| +}
|
| +
|
| +bool ExtensionMessageObserver::OnMessageReceived(const IPC::Message& message) {
|
| + bool handled = true;
|
| + IPC_BEGIN_MESSAGE_MAP(ExtensionMessageObserver, message)
|
| + IPC_MESSAGE_HANDLER(ExtensionHostMsg_Request, OnRequest)
|
| + IPC_MESSAGE_UNHANDLED(handled = false)
|
| + IPC_END_MESSAGE_MAP()
|
| +
|
| + if (!handled)
|
| + handled = dispatcher_.OnMessageReceived(message);
|
| + return handled;
|
| +}
|
| +
|
| +void ExtensionMessageObserver::OnRequest(
|
| + const IPC::Message& message,
|
| + const ExtensionHostMsg_DomMessage_Params& params) {
|
| + if (!dispatcher_.CanDispatchRequest(
|
| + tab_contents()->render_view_host()->process()->id(),
|
| + message.routing_id(),
|
| + params)) {
|
| + return;
|
| + }
|
| +
|
| + tab_contents()->render_view_host()->delegate()->ProcessWebUIMessage(params);
|
| +}
|
|
|
| Property changes on: chrome\browser\extensions\extension_message_dispatcher.cc
|
| ___________________________________________________________________
|
| Added: svn:eol-style
|
| + LF
|
|
|
|
|