blob: 3c5e8d90ed75c5523c12f432d50589b24f897a5d [file] [log] [blame]
// 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/child/webmessageportchannel_impl.h"
#include <stddef.h>
#include "base/bind.h"
#include "base/logging.h"
#include "base/memory/ptr_util.h"
#include "third_party/WebKit/public/platform/WebMessagePortChannelClient.h"
#include "third_party/WebKit/public/platform/WebString.h"
using blink::WebMessagePortChannel;
using blink::WebMessagePortChannelArray;
using blink::WebMessagePortChannelClient;
using blink::WebString;
namespace content {
WebMessagePortChannelImpl::~WebMessagePortChannelImpl() {
setClient(nullptr);
}
WebMessagePortChannelImpl::WebMessagePortChannelImpl(
MessagePort message_port)
: port_(message_port.ReleaseHandle()) {
}
// static
void WebMessagePortChannelImpl::CreatePair(
blink::WebMessagePortChannel** channel1,
blink::WebMessagePortChannel** channel2) {
mojo::MessagePipe pipe;
*channel1 = new WebMessagePortChannelImpl(std::move(pipe.handle0));
*channel2 = new WebMessagePortChannelImpl(std::move(pipe.handle1));
}
// static
std::vector<MessagePort>
WebMessagePortChannelImpl::ExtractMessagePorts(
WebMessagePortChannelArray channels) {
std::vector<MessagePort> message_ports(channels.size());
for (size_t i = 0; i < channels.size(); ++i) {
WebMessagePortChannelImpl* channel_impl =
static_cast<WebMessagePortChannelImpl*>(channels[i].get());
message_ports[i] = channel_impl->ReleaseMessagePort();
DCHECK(message_ports[i].GetHandle().is_valid());
}
return message_ports;
}
// static
WebMessagePortChannelArray
WebMessagePortChannelImpl::CreateFromMessagePorts(
const std::vector<MessagePort>& message_ports) {
WebMessagePortChannelArray channels(message_ports.size());
for (size_t i = 0; i < message_ports.size(); ++i)
channels[i] = base::MakeUnique<WebMessagePortChannelImpl>(message_ports[i]);
return channels;
}
// static
WebMessagePortChannelArray
WebMessagePortChannelImpl::CreateFromMessagePipeHandles(
std::vector<mojo::ScopedMessagePipeHandle> handles) {
WebMessagePortChannelArray channels(handles.size());
for (size_t i = 0; i < handles.size(); ++i) {
channels[i] = base::MakeUnique<WebMessagePortChannelImpl>(
MessagePort(std::move(handles[i])));
}
return channels;
}
MessagePort WebMessagePortChannelImpl::ReleaseMessagePort() {
return MessagePort(port_.ReleaseHandle());
}
WebMessagePortChannelImpl::WebMessagePortChannelImpl(
mojo::ScopedMessagePipeHandle handle)
: port_(std::move(handle)) {
}
void WebMessagePortChannelImpl::setClient(WebMessagePortChannelClient* client) {
if (client) {
port_.SetCallback(
base::Bind(&WebMessagePortChannelClient::messageAvailable,
base::Unretained(client)));
} else {
port_.ClearCallback();
}
}
void WebMessagePortChannelImpl::postMessage(
const WebString& encoded_message,
WebMessagePortChannelArray channels) {
std::vector<MessagePort> ports;
if (!channels.isEmpty()) {
ports.resize(channels.size());
for (size_t i = 0; i < channels.size(); ++i) {
ports[i] = static_cast<WebMessagePortChannelImpl*>(channels[i].get())->
ReleaseMessagePort();
}
}
port_.PostMessage(encoded_message.utf16(), std::move(ports));
}
bool WebMessagePortChannelImpl::tryGetMessage(
WebString* encoded_message,
WebMessagePortChannelArray& channels) {
base::string16 buffer;
std::vector<MessagePort> ports;
if (!port_.GetMessage(&buffer, &ports))
return false;
*encoded_message = WebString::fromUTF16(buffer);
if (!ports.empty()) {
channels = WebMessagePortChannelArray(ports.size());
for (size_t i = 0; i < ports.size(); ++i)
channels[i] = base::MakeUnique<WebMessagePortChannelImpl>(ports[i]);
}
return true;
}
} // namespace content