Index: content/common/webmessageportchannel_impl.cc |
diff --git a/content/common/webmessageportchannel_impl.cc b/content/common/webmessageportchannel_impl.cc |
deleted file mode 100644 |
index 3db2cf4aa0f9048b6f765201011d7b5e62da6d18..0000000000000000000000000000000000000000 |
--- a/content/common/webmessageportchannel_impl.cc |
+++ /dev/null |
@@ -1,252 +0,0 @@ |
-// 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 "content/common/webmessageportchannel_impl.h" |
- |
-#include "base/bind.h" |
-#include "content/common/child_process.h" |
-#include "content/common/child_thread.h" |
-#include "content/common/worker_messages.h" |
-#include "third_party/WebKit/public/platform/WebMessagePortChannelClient.h" |
-#include "third_party/WebKit/public/platform/WebString.h" |
- |
-using WebKit::WebMessagePortChannel; |
-using WebKit::WebMessagePortChannelArray; |
-using WebKit::WebMessagePortChannelClient; |
-using WebKit::WebString; |
- |
-namespace content { |
- |
-WebMessagePortChannelImpl::WebMessagePortChannelImpl() |
- : client_(NULL), |
- route_id_(MSG_ROUTING_NONE), |
- message_port_id_(MSG_ROUTING_NONE) { |
- AddRef(); |
- Init(); |
-} |
- |
-WebMessagePortChannelImpl::WebMessagePortChannelImpl( |
- int route_id, |
- int message_port_id) |
- : client_(NULL), |
- route_id_(route_id), |
- message_port_id_(message_port_id) { |
- AddRef(); |
- Init(); |
-} |
- |
-WebMessagePortChannelImpl::~WebMessagePortChannelImpl() { |
- // If we have any queued messages with attached ports, manually destroy them. |
- while (!message_queue_.empty()) { |
- const std::vector<WebMessagePortChannelImpl*>& channel_array = |
- message_queue_.front().ports; |
- for (size_t i = 0; i < channel_array.size(); i++) { |
- channel_array[i]->destroy(); |
- } |
- message_queue_.pop(); |
- } |
- |
- if (message_port_id_ != MSG_ROUTING_NONE) |
- Send(new WorkerProcessHostMsg_DestroyMessagePort(message_port_id_)); |
- |
- if (route_id_ != MSG_ROUTING_NONE) |
- ChildThread::current()->RemoveRoute(route_id_); |
-} |
- |
-void WebMessagePortChannelImpl::setClient(WebMessagePortChannelClient* client) { |
- // Must lock here since client_ is called on the main thread. |
- base::AutoLock auto_lock(lock_); |
- client_ = client; |
-} |
- |
-void WebMessagePortChannelImpl::destroy() { |
- setClient(NULL); |
- |
- // Release the object on the main thread, since the destructor might want to |
- // send an IPC, and that has to happen on the main thread. |
- ChildThread::current()->message_loop()->ReleaseSoon(FROM_HERE, this); |
-} |
- |
-void WebMessagePortChannelImpl::entangle(WebMessagePortChannel* channel) { |
- // The message port ids might not be set up yet, if this channel wasn't |
- // created on the main thread. So need to wait until we're on the main thread |
- // before getting the other message port id. |
- scoped_refptr<WebMessagePortChannelImpl> webchannel( |
- static_cast<WebMessagePortChannelImpl*>(channel)); |
- Entangle(webchannel); |
-} |
- |
-void WebMessagePortChannelImpl::postMessage( |
- const WebString& message, |
- WebMessagePortChannelArray* channels) { |
- if (base::MessageLoop::current() != ChildThread::current()->message_loop()) { |
- ChildThread::current()->message_loop()->PostTask( |
- FROM_HERE, |
- base::Bind( |
- &WebMessagePortChannelImpl::postMessage, this, message, channels)); |
- return; |
- } |
- |
- std::vector<int> message_port_ids(channels ? channels->size() : 0); |
- if (channels) { |
- // Extract the port IDs from the source array, then free it. |
- for (size_t i = 0; i < channels->size(); ++i) { |
- WebMessagePortChannelImpl* webchannel = |
- static_cast<WebMessagePortChannelImpl*>((*channels)[i]); |
- message_port_ids[i] = webchannel->message_port_id(); |
- webchannel->QueueMessages(); |
- DCHECK(message_port_ids[i] != MSG_ROUTING_NONE); |
- } |
- delete channels; |
- } |
- |
- IPC::Message* msg = new WorkerProcessHostMsg_PostMessage( |
- message_port_id_, message, message_port_ids); |
- Send(msg); |
-} |
- |
-bool WebMessagePortChannelImpl::tryGetMessage( |
- WebString* message, |
- WebMessagePortChannelArray& channels) { |
- base::AutoLock auto_lock(lock_); |
- if (message_queue_.empty()) |
- return false; |
- |
- *message = message_queue_.front().message; |
- const std::vector<WebMessagePortChannelImpl*>& channel_array = |
- message_queue_.front().ports; |
- WebMessagePortChannelArray result_ports(channel_array.size()); |
- for (size_t i = 0; i < channel_array.size(); i++) { |
- result_ports[i] = channel_array[i]; |
- } |
- |
- channels.swap(result_ports); |
- message_queue_.pop(); |
- return true; |
-} |
- |
-void WebMessagePortChannelImpl::Init() { |
- if (base::MessageLoop::current() != ChildThread::current()->message_loop()) { |
- ChildThread::current()->message_loop()->PostTask( |
- FROM_HERE, base::Bind(&WebMessagePortChannelImpl::Init, this)); |
- return; |
- } |
- |
- if (route_id_ == MSG_ROUTING_NONE) { |
- DCHECK(message_port_id_ == MSG_ROUTING_NONE); |
- Send(new WorkerProcessHostMsg_CreateMessagePort( |
- &route_id_, &message_port_id_)); |
- } |
- |
- ChildThread::current()->AddRoute(route_id_, this); |
-} |
- |
-void WebMessagePortChannelImpl::Entangle( |
- scoped_refptr<WebMessagePortChannelImpl> channel) { |
- if (base::MessageLoop::current() != ChildThread::current()->message_loop()) { |
- ChildThread::current()->message_loop()->PostTask( |
- FROM_HERE, |
- base::Bind(&WebMessagePortChannelImpl::Entangle, this, channel)); |
- return; |
- } |
- |
- Send(new WorkerProcessHostMsg_Entangle( |
- message_port_id_, channel->message_port_id())); |
-} |
- |
-void WebMessagePortChannelImpl::QueueMessages() { |
- if (base::MessageLoop::current() != ChildThread::current()->message_loop()) { |
- ChildThread::current()->message_loop()->PostTask( |
- FROM_HERE, base::Bind(&WebMessagePortChannelImpl::QueueMessages, this)); |
- return; |
- } |
- // This message port is being sent elsewhere (perhaps to another process). |
- // The new endpoint needs to receive the queued messages, including ones that |
- // could still be in-flight. So we tell the browser to queue messages, and it |
- // sends us an ack, whose receipt we know means that no more messages are |
- // in-flight. We then send the queued messages to the browser, which prepends |
- // them to the ones it queued and it sends them to the new endpoint. |
- Send(new WorkerProcessHostMsg_QueueMessages(message_port_id_)); |
- |
- // The process could potentially go away while we're still waiting for |
- // in-flight messages. Ensure it stays alive. |
- ChildProcess::current()->AddRefProcess(); |
-} |
- |
-void WebMessagePortChannelImpl::Send(IPC::Message* message) { |
- if (base::MessageLoop::current() != ChildThread::current()->message_loop()) { |
- DCHECK(!message->is_sync()); |
- ChildThread::current()->message_loop()->PostTask( |
- FROM_HERE, |
- base::Bind(&WebMessagePortChannelImpl::Send, this, message)); |
- return; |
- } |
- |
- ChildThread::current()->Send(message); |
-} |
- |
-bool WebMessagePortChannelImpl::OnMessageReceived(const IPC::Message& message) { |
- bool handled = true; |
- IPC_BEGIN_MESSAGE_MAP(WebMessagePortChannelImpl, message) |
- IPC_MESSAGE_HANDLER(WorkerProcessMsg_Message, OnMessage) |
- IPC_MESSAGE_HANDLER(WorkerProcessMsg_MessagesQueued, OnMessagedQueued) |
- IPC_MESSAGE_UNHANDLED(handled = false) |
- IPC_END_MESSAGE_MAP() |
- return handled; |
-} |
- |
-void WebMessagePortChannelImpl::OnMessage( |
- const string16& message, |
- const std::vector<int>& sent_message_port_ids, |
- const std::vector<int>& new_routing_ids) { |
- base::AutoLock auto_lock(lock_); |
- Message msg; |
- msg.message = message; |
- if (!sent_message_port_ids.empty()) { |
- msg.ports.resize(sent_message_port_ids.size()); |
- for (size_t i = 0; i < sent_message_port_ids.size(); ++i) { |
- msg.ports[i] = new WebMessagePortChannelImpl( |
- new_routing_ids[i], sent_message_port_ids[i]); |
- } |
- } |
- |
- bool was_empty = message_queue_.empty(); |
- message_queue_.push(msg); |
- if (client_ && was_empty) |
- client_->messageAvailable(); |
-} |
- |
-void WebMessagePortChannelImpl::OnMessagedQueued() { |
- std::vector<QueuedMessage> queued_messages; |
- |
- { |
- base::AutoLock auto_lock(lock_); |
- queued_messages.reserve(message_queue_.size()); |
- while (!message_queue_.empty()) { |
- string16 message = message_queue_.front().message; |
- const std::vector<WebMessagePortChannelImpl*>& channel_array = |
- message_queue_.front().ports; |
- std::vector<int> port_ids(channel_array.size()); |
- for (size_t i = 0; i < channel_array.size(); ++i) { |
- port_ids[i] = channel_array[i]->message_port_id(); |
- } |
- queued_messages.push_back(std::make_pair(message, port_ids)); |
- message_queue_.pop(); |
- } |
- } |
- |
- Send(new WorkerProcessHostMsg_SendQueuedMessages( |
- message_port_id_, queued_messages)); |
- |
- message_port_id_ = MSG_ROUTING_NONE; |
- |
- Release(); |
- ChildProcess::current()->ReleaseProcess(); |
-} |
- |
-WebMessagePortChannelImpl::Message::Message() {} |
- |
-WebMessagePortChannelImpl::Message::~Message() {} |
- |
-} // namespace content |