blob: d768e8a37a2ed078c58930f961154d63c751243f [file] [log] [blame]
// Copyright (c) 2012 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 "webkit/support/test_webmessageportchannel.h"
#include "base/bind.h"
#include "base/memory/scoped_ptr.h"
#include "base/message_loop/message_loop.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;
class TestWebMessagePortChannel::Message {
public:
Message(WebString data, WebMessagePortChannelArray* ports)
: data_(data),
ports_(ports) {
}
~Message() {
if (ports_ == NULL)
return;
for (size_t i = 0; i < ports_->size(); ++i)
(*ports_)[i]->destroy();
}
WebString data() const { return data_; }
WebMessagePortChannelArray* ports() { return ports_.get(); }
private:
WebString data_;
scoped_ptr<WebMessagePortChannelArray> ports_;
DISALLOW_COPY_AND_ASSIGN(Message);
};
TestWebMessagePortChannel::TestWebMessagePortChannel()
: client_(NULL) {
AddRef();
}
void TestWebMessagePortChannel::setClient(WebMessagePortChannelClient* client) {
client_ = client;
}
void TestWebMessagePortChannel::destroy() {
while (!message_queue_.empty()) {
delete message_queue_.front();
message_queue_.pop();
}
Release();
}
void TestWebMessagePortChannel::entangle(WebMessagePortChannel* remote) {
remote_ = static_cast<TestWebMessagePortChannel*>(remote);
}
void TestWebMessagePortChannel::postMessage(const WebString& data,
WebMessagePortChannelArray* ports) {
if (remote_.get() == NULL)
return;
base::MessageLoop::current()->PostTask(
FROM_HERE,
base::Bind(&TestWebMessagePortChannel::queueMessage,
remote_.get(),
new Message(data, ports)));
}
bool TestWebMessagePortChannel::tryGetMessage(WebString* data,
WebMessagePortChannelArray& ports) {
if (message_queue_.empty())
return false;
scoped_ptr<Message> message(message_queue_.front());
message_queue_.pop();
*data = message->data();
if (WebMessagePortChannelArray* message_ports = message->ports())
ports.swap(*message_ports);
return true;
}
TestWebMessagePortChannel::~TestWebMessagePortChannel() {}
void TestWebMessagePortChannel::queueMessage(Message* message) {
bool was_empty = message_queue_.empty();
message_queue_.push(message);
if (client_ && was_empty)
client_->messageAvailable();
}