Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(893)

Unified Diff: content/child/webmessageportchannel_impl.cc

Issue 944443003: Step two of optionally sending messages to/from message ports as base::Value. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@n-c-message-as-values-take2
Patch Set: use auto where it makes sense Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « content/child/webmessageportchannel_impl.h ('k') | content/common/message_port_messages.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: content/child/webmessageportchannel_impl.cc
diff --git a/content/child/webmessageportchannel_impl.cc b/content/child/webmessageportchannel_impl.cc
index 9aff263a1dde0b6aa750e03f7e6704df42a72ff0..86764afb268d47f893c89a85bee919fdf63eb04a 100644
--- a/content/child/webmessageportchannel_impl.cc
+++ b/content/child/webmessageportchannel_impl.cc
@@ -36,12 +36,12 @@ WebMessagePortChannelImpl::WebMessagePortChannelImpl(
WebMessagePortChannelImpl::WebMessagePortChannelImpl(
int route_id,
- int message_port_id,
+ const TransferredMessagePort& port,
const scoped_refptr<base::SingleThreadTaskRunner>& main_thread_task_runner)
: client_(NULL),
route_id_(route_id),
- message_port_id_(message_port_id),
- send_messages_as_values_(false),
+ message_port_id_(port.id),
+ send_messages_as_values_(port.send_messages_as_values),
main_thread_task_runner_(main_thread_task_runner) {
AddRef();
Init();
@@ -50,7 +50,7 @@ WebMessagePortChannelImpl::WebMessagePortChannelImpl(
WebMessagePortChannelImpl::~WebMessagePortChannelImpl() {
// If we have any queued messages with attached ports, manually destroy them.
while (!message_queue_.empty()) {
- const std::vector<WebMessagePortChannelImpl*>& channel_array =
+ const WebMessagePortChannelArray& channel_array =
message_queue_.front().ports;
for (size_t i = 0; i < channel_array.size(); i++) {
channel_array[i]->destroy();
@@ -83,25 +83,53 @@ void WebMessagePortChannelImpl::CreatePair(
}
// static
-std::vector<int> WebMessagePortChannelImpl::ExtractMessagePortIDs(
+std::vector<TransferredMessagePort>
+WebMessagePortChannelImpl::ExtractMessagePortIDs(
WebMessagePortChannelArray* channels) {
- std::vector<int> message_port_ids;
+ std::vector<TransferredMessagePort> message_ports;
if (channels) {
- message_port_ids.resize(channels->size());
// 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]);
- // The message port ids might not be set up yet if this channel
- // wasn't created on the main thread.
- DCHECK(webchannel->main_thread_task_runner_->BelongsToCurrentThread());
- message_port_ids[i] = webchannel->message_port_id();
- webchannel->QueueMessages();
- DCHECK(message_port_ids[i] != MSG_ROUTING_NONE);
- }
+ message_ports = ExtractMessagePortIDs(*channels);
delete channels;
}
- return message_port_ids;
+ return message_ports;
+}
+
+// static
+std::vector<TransferredMessagePort>
+WebMessagePortChannelImpl::ExtractMessagePortIDs(
+ const WebMessagePortChannelArray& channels) {
+ std::vector<TransferredMessagePort> message_ports(channels.size());
+ for (size_t i = 0; i < channels.size(); ++i) {
+ WebMessagePortChannelImpl* webchannel =
+ static_cast<WebMessagePortChannelImpl*>(channels[i]);
+ // The message port ids might not be set up yet if this channel
+ // wasn't created on the main thread.
+ DCHECK(webchannel->main_thread_task_runner_->BelongsToCurrentThread());
+ message_ports[i].id = webchannel->message_port_id();
+ message_ports[i].send_messages_as_values =
+ webchannel->send_messages_as_values_;
+ webchannel->QueueMessages();
+ DCHECK(message_ports[i].id != MSG_ROUTING_NONE);
+ }
+ return message_ports;
+}
+
+// static
+WebMessagePortChannelArray WebMessagePortChannelImpl::CreatePorts(
+ const std::vector<TransferredMessagePort>& message_ports,
+ const std::vector<int>& new_routing_ids,
+ const scoped_refptr<base::SingleThreadTaskRunner>&
+ main_thread_task_runner) {
+ DCHECK_EQ(message_ports.size(), new_routing_ids.size());
+ WebMessagePortChannelArray channels(message_ports.size());
+ for (size_t i = 0; i < message_ports.size() && i < new_routing_ids.size();
+ ++i) {
+ channels[i] = new WebMessagePortChannelImpl(
+ new_routing_ids[i], message_ports[i],
+ main_thread_task_runner);
+ }
+ return channels;
}
void WebMessagePortChannelImpl::setClient(WebMessagePortChannelClient* client) {
@@ -174,14 +202,7 @@ bool WebMessagePortChannelImpl::tryGetMessage(
} else {
*message = message_queue_.front().message.message_as_string;
}
- 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);
+ channels = message_queue_.front().ports;
message_queue_.pop();
return true;
}
@@ -263,19 +284,13 @@ bool WebMessagePortChannelImpl::OnMessageReceived(const IPC::Message& message) {
void WebMessagePortChannelImpl::OnMessage(
const MessagePortMessage& message,
- const std::vector<int>& sent_message_port_ids,
+ const std::vector<TransferredMessagePort>& sent_message_ports,
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],
- main_thread_task_runner_.get());
- }
- }
+ msg.ports = CreatePorts(sent_message_ports, new_routing_ids,
+ main_thread_task_runner_.get());
bool was_empty = message_queue_.empty();
message_queue_.push(msg);
@@ -291,14 +306,9 @@ void WebMessagePortChannelImpl::OnMessagesQueued() {
queued_messages.reserve(message_queue_.size());
while (!message_queue_.empty()) {
MessagePortMessage 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();
- channel_array[i]->QueueMessages();
- }
- queued_messages.push_back(std::make_pair(message, port_ids));
+ std::vector<TransferredMessagePort> ports =
+ ExtractMessagePortIDs(message_queue_.front().ports);
+ queued_messages.push_back(std::make_pair(message, ports));
message_queue_.pop();
}
}
« no previous file with comments | « content/child/webmessageportchannel_impl.h ('k') | content/common/message_port_messages.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698