Index: chrome/browser/automation/extension_port_container.cc |
diff --git a/chrome/browser/automation/extension_port_container.cc b/chrome/browser/automation/extension_port_container.cc |
deleted file mode 100644 |
index bdcbb7e6b314a6d2f5d983322c4dda9d7f0a32b0..0000000000000000000000000000000000000000 |
--- a/chrome/browser/automation/extension_port_container.cc |
+++ /dev/null |
@@ -1,258 +0,0 @@ |
-// Copyright (c) 2010 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/automation/extension_port_container.h" |
- |
-#include "base/logging.h" |
-#include "base/json/json_reader.h" |
-#include "base/json/json_writer.h" |
-#include "base/values.h" |
-#include "chrome/browser/automation/automation_provider.h" |
-#include "chrome/browser/automation/extension_automation_constants.h" |
-#include "chrome/browser/extensions/extension_message_service.h" |
-#include "chrome/browser/profiles/profile.h" |
-#include "chrome/common/automation_messages.h" |
-#include "chrome/common/extensions/extension_messages.h" |
-#include "content/browser/renderer_host/render_process_host.h" |
-#include "content/browser/renderer_host/render_view_host.h" |
- |
-// TODO(siggi): Find a more structured way to read and write JSON messages. |
- |
-namespace ext = extension_automation_constants; |
- |
-ExtensionPortContainer::ExtensionPortContainer(AutomationProvider* automation, |
- int tab_handle) : |
- automation_(automation), service_(NULL), port_id_(-1), |
- tab_handle_(tab_handle) { |
- service_ = automation_->profile()->GetExtensionMessageService(); |
- DCHECK(service_); |
-} |
- |
-ExtensionPortContainer::~ExtensionPortContainer() { |
- DCHECK_EQ(MessageLoop::current()->type(), MessageLoop::TYPE_UI); |
- |
- if (port_id_ != -1) |
- service_->CloseChannel(port_id_); |
-} |
- |
-bool ExtensionPortContainer::PostResponseToExternalPort( |
- const std::string& message) { |
- return automation_->Send( |
- new AutomationMsg_ForwardMessageToExternalHost( |
- tab_handle_, message, ext::kAutomationOrigin, |
- ext::kAutomationPortResponseTarget)); |
-} |
- |
-bool ExtensionPortContainer::PostMessageToExternalPort( |
- const std::string& message) { |
- return automation_->Send( |
- new AutomationMsg_ForwardMessageToExternalHost( |
- tab_handle_, message, |
- ext::kAutomationOrigin, |
- ext::kAutomationPortRequestTarget)); |
-} |
- |
-void ExtensionPortContainer::PostMessageFromExternalPort( |
- const std::string &message) { |
- service_->PostMessageFromRenderer(port_id_, message); |
-} |
- |
-bool ExtensionPortContainer::Connect(const std::string &extension_id, |
- int process_id, |
- int routing_id, |
- int connection_id, |
- const std::string& channel_name, |
- const std::string& tab_json) { |
- DCHECK_EQ(MessageLoop::current()->type(), MessageLoop::TYPE_UI); |
- |
- port_id_ = service_->OpenSpecialChannelToExtension( |
- extension_id, channel_name, tab_json, this); |
- if (port_id_ == -1) { |
- // In this case a disconnect message has been dispatched. |
- return false; |
- } |
- |
- SendConnectionResponse(connection_id, port_id_); |
- return true; |
-} |
- |
-void ExtensionPortContainer::SendConnectionResponse(int connection_id, |
- int port_id) { |
- // Compose the reply message. |
- scoped_ptr<DictionaryValue> msg_dict(new DictionaryValue()); |
- msg_dict->SetInteger(ext::kAutomationRequestIdKey, ext::CHANNEL_OPENED); |
- msg_dict->SetInteger(ext::kAutomationConnectionIdKey, connection_id); |
- msg_dict->SetInteger(ext::kAutomationPortIdKey, port_id); |
- |
- std::string msg_json; |
- base::JSONWriter::Write(msg_dict.get(), false, &msg_json); |
- |
- PostResponseToExternalPort(msg_json); |
-} |
- |
-bool ExtensionPortContainer::Send(IPC::Message *message) { |
- DCHECK_EQ(MessageLoop::current()->type(), MessageLoop::TYPE_UI); |
- |
- IPC_BEGIN_MESSAGE_MAP(ExtensionPortContainer, *message) |
- IPC_MESSAGE_HANDLER(ExtensionMsg_MessageInvoke, OnExtensionMessageInvoke) |
- IPC_MESSAGE_UNHANDLED_ERROR() |
- IPC_END_MESSAGE_MAP() |
- |
- delete message; |
- return true; |
-} |
- |
-void ExtensionPortContainer::OnExtensionMessageInvoke( |
- const std::string& extension_id, |
- const std::string& function_name, |
- const ListValue& args, |
- const GURL& event_url) { |
- if (function_name == ExtensionMessageService::kDispatchOnMessage) { |
- DCHECK_EQ(args.GetSize(), 2u); |
- |
- std::string message; |
- int source_port_id; |
- if (args.GetString(0, &message) && args.GetInteger(1, &source_port_id)) |
- OnExtensionHandleMessage(message, source_port_id); |
- } else if (function_name == ExtensionMessageService::kDispatchOnDisconnect) { |
- DCHECK_EQ(args.GetSize(), 2u); |
- int port_id; |
- if (args.GetInteger(0, &port_id)) |
- OnExtensionPortDisconnected(port_id); |
- } else if (function_name == ExtensionMessageService::kDispatchOnConnect) { |
- // Do nothing. |
- // TODO(siggi): implement |
- } else { |
- NOTREACHED() << function_name << " shouldn't be called."; |
- } |
-} |
- |
-void ExtensionPortContainer::OnExtensionHandleMessage( |
- const std::string& message, int source_port_id) { |
- // Compose the reply message and fire it away. |
- DictionaryValue msg_dict; |
- msg_dict.SetInteger(ext::kAutomationRequestIdKey, ext::POST_MESSAGE); |
- msg_dict.SetInteger(ext::kAutomationPortIdKey, port_id_); |
- msg_dict.SetString(ext::kAutomationMessageDataKey, message); |
- |
- std::string msg_json; |
- base::JSONWriter::Write(&msg_dict, false, &msg_json); |
- |
- PostMessageToExternalPort(msg_json); |
-} |
- |
-void ExtensionPortContainer::OnExtensionPortDisconnected(int source_port_id) { |
- // Compose the disconnect message and fire it away. |
- DictionaryValue msg_dict; |
- msg_dict.SetInteger(ext::kAutomationRequestIdKey, ext::CHANNEL_CLOSED); |
- msg_dict.SetInteger(ext::kAutomationPortIdKey, port_id_); |
- |
- std::string msg_json; |
- base::JSONWriter::Write(&msg_dict, false, &msg_json); |
- |
- PostMessageToExternalPort(msg_json); |
-} |
- |
-bool ExtensionPortContainer::InterceptMessageFromExternalHost( |
- const std::string& message, const std::string& origin, |
- const std::string& target, AutomationProvider* automation, |
- RenderViewHost *view_host, int tab_handle) { |
- if (target != ext::kAutomationPortRequestTarget) |
- return false; |
- |
- if (origin != ext::kAutomationOrigin) { |
- // TODO(siggi): Should we block the message on wrong origin? |
- LOG(WARNING) << "Wrong origin on automation port message " << origin; |
- } |
- |
- scoped_ptr<Value> message_value(base::JSONReader::Read(message, false)); |
- DCHECK(message_value->IsType(Value::TYPE_DICTIONARY)); |
- if (!message_value->IsType(Value::TYPE_DICTIONARY)) |
- return true; |
- |
- DictionaryValue* message_dict = |
- reinterpret_cast<DictionaryValue*>(message_value.get()); |
- |
- int command = -1; |
- bool got_value = message_dict->GetInteger(ext::kAutomationRequestIdKey, |
- &command); |
- DCHECK(got_value); |
- if (!got_value) |
- return true; |
- |
- if (command == ext::OPEN_CHANNEL) { |
- // Extract the "extension_id" and "connection_id" parameters. |
- std::string extension_id; |
- got_value = message_dict->GetString(ext::kAutomationExtensionIdKey, |
- &extension_id); |
- DCHECK(got_value); |
- if (!got_value) |
- return true; |
- |
- int connection_id; |
- got_value = message_dict->GetInteger(ext::kAutomationConnectionIdKey, |
- &connection_id); |
- DCHECK(got_value); |
- if (!got_value) |
- return true; |
- |
- std::string channel_name; |
- // Channel name is optional. |
- message_dict->GetString(ext::kAutomationChannelNameKey, &channel_name); |
- |
- // Tab information is optional, try to retrieve it |
- // and re-flatten it to a string. |
- std::string tab_json("null"); |
- DictionaryValue* tab = NULL; |
- if (message_dict->GetDictionary(ext::kAutomationTabJsonKey, &tab)) |
- base::JSONWriter::Write(tab, false, &tab_json); |
- |
- int routing_id = view_host->routing_id(); |
- // Create the extension port and connect it. |
- scoped_ptr<ExtensionPortContainer> port( |
- new ExtensionPortContainer(automation, tab_handle)); |
- |
- int process_id = view_host->process()->id(); |
- if (port->Connect(extension_id, process_id, routing_id, connection_id, |
- channel_name, tab_json)) { |
- // We have a successful connection. |
- automation->AddPortContainer(port.release()); |
- } |
- } else if (command == ext::POST_MESSAGE) { |
- int port_id = -1; |
- got_value = message_dict->GetInteger(ext::kAutomationPortIdKey, &port_id); |
- DCHECK(got_value); |
- if (!got_value) |
- return true; |
- |
- std::string data; |
- got_value = message_dict->GetString(ext::kAutomationMessageDataKey, &data); |
- DCHECK(got_value); |
- if (!got_value) |
- return true; |
- |
- ExtensionPortContainer* port = automation->GetPortContainer(port_id); |
- DCHECK(port); |
- if (port) |
- port->PostMessageFromExternalPort(data); |
- } else if (command == ext::CHANNEL_CLOSED) { |
- int port_id = -1; |
- got_value = message_dict->GetInteger(ext::kAutomationPortIdKey, &port_id); |
- DCHECK(got_value); |
- if (!got_value) |
- return true; |
- |
- ExtensionPortContainer* port = automation->GetPortContainer(port_id); |
- DCHECK(port); |
- if (port) { |
- // This will delete the port and notify the other end of the disconnect. |
- automation->RemovePortContainer(port); |
- } |
- } else { |
- // We don't expect other messages here. |
- NOTREACHED(); |
- } |
- |
- return true; |
-} |