summaryrefslogtreecommitdiffstats
path: root/components/html_viewer/web_message_port_channel_impl.cc
diff options
context:
space:
mode:
authorjam <jam@chromium.org>2015-04-22 13:38:16 -0700
committerCommit bot <commit-bot@chromium.org>2015-04-22 20:39:00 +0000
commit81a5661f60738efa7dbbee0a72f2c1e15f6690f9 (patch)
tree27fe82ed9e8d8b504f6c731365df1fc9e2c3d1f6 /components/html_viewer/web_message_port_channel_impl.cc
parentaa86d5f0d050b3322ed02d81e5f51787726f5511 (diff)
downloadchromium_src-81a5661f60738efa7dbbee0a72f2c1e15f6690f9.zip
chromium_src-81a5661f60738efa7dbbee0a72f2c1e15f6690f9.tar.gz
chromium_src-81a5661f60738efa7dbbee0a72f2c1e15f6690f9.tar.bz2
Move html_viewer from mojo/services to components.
BUG=479353 TBR=jochen for DEPS Review URL: https://codereview.chromium.org/1099303002 Cr-Commit-Position: refs/heads/master@{#326369}
Diffstat (limited to 'components/html_viewer/web_message_port_channel_impl.cc')
-rw-r--r--components/html_viewer/web_message_port_channel_impl.cc132
1 files changed, 132 insertions, 0 deletions
diff --git a/components/html_viewer/web_message_port_channel_impl.cc b/components/html_viewer/web_message_port_channel_impl.cc
new file mode 100644
index 0000000..45e75fc
--- /dev/null
+++ b/components/html_viewer/web_message_port_channel_impl.cc
@@ -0,0 +1,132 @@
+// Copyright 2015 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 "components/html_viewer/web_message_port_channel_impl.h"
+
+#include "base/bind.h"
+#include "base/logging.h"
+#include "base/strings/string16.h"
+#include "third_party/WebKit/public/platform/WebMessagePortChannelClient.h"
+#include "third_party/WebKit/public/platform/WebString.h"
+#include "third_party/mojo/src/mojo/public/cpp/system/message_pipe.h"
+
+using blink::WebMessagePortChannel;
+using blink::WebMessagePortChannelArray;
+using blink::WebMessagePortChannelClient;
+using blink::WebString;
+
+namespace html_viewer {
+
+void WebMessagePortChannelImpl::CreatePair(
+ blink::WebMessagePortChannel** channel1,
+ blink::WebMessagePortChannel** channel2) {
+ mojo::ScopedMessagePipeHandle pipe1;
+ mojo::ScopedMessagePipeHandle pipe2;
+ MojoResult result = mojo::CreateMessagePipe(nullptr, &pipe1, &pipe2);
+ if (result != MOJO_RESULT_OK) {
+ NOTREACHED();
+ return;
+ }
+
+ *channel1 = new WebMessagePortChannelImpl(pipe1.Pass());;
+ *channel2 = new WebMessagePortChannelImpl(pipe2.Pass());
+}
+
+WebMessagePortChannelImpl::WebMessagePortChannelImpl(
+ mojo::ScopedMessagePipeHandle pipe)
+ : client_(nullptr), pipe_(pipe.Pass()) {
+ WaitForNextMessage();
+}
+
+WebMessagePortChannelImpl::~WebMessagePortChannelImpl() {
+}
+
+void WebMessagePortChannelImpl::setClient(WebMessagePortChannelClient* client) {
+ client_ = client;
+}
+
+void WebMessagePortChannelImpl::destroy() {
+ setClient(nullptr);
+ delete this;
+}
+
+void WebMessagePortChannelImpl::postMessage(
+ const WebString& message_as_string,
+ WebMessagePortChannelArray* channels) {
+ base::string16 string = message_as_string;
+
+ std::vector<MojoHandle> handles;
+ if (channels) {
+ for (size_t i = 0; i < channels->size(); ++i) {
+ WebMessagePortChannelImpl* channel =
+ static_cast<WebMessagePortChannelImpl*>((*channels)[i]);
+ handles.push_back(channel->pipe_.release().value());
+ channel->handle_watcher_.Stop();
+ }
+ delete channels;
+ }
+
+ uint32_t num_handles = static_cast<uint32_t>(handles.size());
+ MojoHandle* handles_ptr = handles.empty() ? nullptr : &handles[0];
+
+ MojoResult result = MojoWriteMessage(
+ pipe_.get().value(), string.c_str(),
+ static_cast<uint32_t>(string.length() * sizeof(base::char16)),
+ handles_ptr, num_handles, MOJO_WRITE_MESSAGE_FLAG_NONE);
+ DCHECK_EQ(MOJO_RESULT_OK, result);
+}
+
+bool WebMessagePortChannelImpl::tryGetMessage(
+ WebString* message,
+ WebMessagePortChannelArray& channels) {
+ uint32_t num_bytes = 0;
+ uint32_t num_handles = 0;
+ MojoResult result = MojoReadMessage(
+ pipe_.get().value(), nullptr, &num_bytes, nullptr, &num_handles,
+ MOJO_READ_MESSAGE_FLAG_NONE);
+ if (result != MOJO_RESULT_RESOURCE_EXHAUSTED)
+ return false;
+
+ base::string16 message16;
+ CHECK(num_bytes % sizeof(base::char16) == 0);
+ message16.resize(num_bytes / sizeof(base::char16));
+ std::vector<MojoHandle> handles;
+ handles.resize(num_handles);
+
+ MojoHandle* handles_ptr = handles.empty() ? nullptr : &handles[0];
+ result = MojoReadMessage(
+ pipe_.get().value(), &message16[0], &num_bytes, handles_ptr, &num_handles,
+ MOJO_READ_MESSAGE_FLAG_NONE);
+ if (result != MOJO_RESULT_OK) {
+ NOTREACHED();
+ return false;
+ }
+
+ *message = message16;
+ WebMessagePortChannelArray ports(handles.size());
+ for (size_t i = 0; i < handles.size(); ++i) {
+ mojo::MessagePipeHandle mph(handles[i]);
+ mojo::ScopedMessagePipeHandle handle(mph);
+ ports[i] = new WebMessagePortChannelImpl(handle.Pass());
+ }
+ channels = ports;
+ return true;
+}
+
+void WebMessagePortChannelImpl::WaitForNextMessage() {
+ handle_watcher_.Start(
+ pipe_.get(),
+ MOJO_HANDLE_SIGNAL_READABLE,
+ MOJO_DEADLINE_INDEFINITE,
+ base::Bind(&WebMessagePortChannelImpl::OnMessageAvailable,
+ base::Unretained(this)));
+}
+
+void WebMessagePortChannelImpl::OnMessageAvailable(MojoResult result) {
+ DCHECK_EQ(MOJO_RESULT_OK, result);
+ client_->messageAvailable();
+ WaitForNextMessage();
+}
+
+} // namespace html_viewer