| Index: chrome/renderer/mock_render_thread.cc
|
| ===================================================================
|
| --- chrome/renderer/mock_render_thread.cc (revision 0)
|
| +++ chrome/renderer/mock_render_thread.cc (revision 0)
|
| @@ -0,0 +1,135 @@
|
| +// Copyright (c) 2008 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 "chrome/renderer/mock_render_thread.h"
|
| +
|
| +#include "base/logging.h"
|
| +#include "chrome/common/ipc_message_utils.h"
|
| +#include "chrome/common/render_messages.h"
|
| +#include "testing/gtest/include/gtest/gtest.h"
|
| +
|
| +MockRenderThread::MockRenderThread()
|
| + : routing_id_(0),
|
| + opener_id_(0),
|
| + widget_(NULL),
|
| + reply_deserializer_(NULL) {
|
| +}
|
| +
|
| +MockRenderThread::~MockRenderThread() {
|
| + // Don't leak the allocated message bodies.
|
| + ClearMessages();
|
| +}
|
| +
|
| +// Called by the Widget. The routing_id must match the routing id assigned
|
| +// to the Widget in reply to ViewHostMsg_CreateWidget message.
|
| +void MockRenderThread::AddRoute(int32 routing_id,
|
| + IPC::Channel::Listener* listener) {
|
| + EXPECT_EQ(routing_id_, routing_id);
|
| + widget_ = listener;
|
| +}
|
| +
|
| +// Called by the Widget. The routing id must match the routing id of AddRoute.
|
| +void MockRenderThread::RemoveRoute(int32 routing_id) {
|
| + EXPECT_EQ(routing_id_, routing_id);
|
| + widget_ = NULL;
|
| +}
|
| +
|
| +// Called by the Widget. Used to send messages to the browser.
|
| +// We short-circuit the mechanim and handle the messages right here on this
|
| +// class.
|
| +bool MockRenderThread::Send(IPC::Message* msg) {
|
| + // We need to simulate a synchronous channel, thus we are going to receive
|
| + // through this function messages, messages with reply and reply messages.
|
| + // We can only handle one synchronous message at a time.
|
| + if (msg->is_reply()) {
|
| + if (reply_deserializer_) {
|
| + reply_deserializer_->SerializeOutputParameters(*msg);
|
| + delete reply_deserializer_;
|
| + reply_deserializer_ = NULL;
|
| + }
|
| + } else {
|
| + if (msg->is_sync()) {
|
| + reply_deserializer_ =
|
| + static_cast<IPC::SyncMessage*>(msg)->GetReplyDeserializer();
|
| + }
|
| + OnMessageReceived(*msg);
|
| + }
|
| + delete msg;
|
| + return true;
|
| +}
|
| +
|
| +void MockRenderThread::ClearMessages() {
|
| + for (size_t i = 0; i < messages_.size(); i++)
|
| + delete[] messages_[i].second;
|
| + messages_.clear();
|
| +}
|
| +
|
| +const IPC::Message* MockRenderThread::GetMessageAt(size_t index) const {
|
| + if (index >= messages_.size())
|
| + return NULL;
|
| + return &messages_[index].first;
|
| +}
|
| +
|
| +const IPC::Message* MockRenderThread::GetFirstMessageMatching(uint16 id) const {
|
| + for (size_t i = 0; i < messages_.size(); i++) {
|
| + if (messages_[i].first.type() == id)
|
| + return &messages_[i].first;
|
| + }
|
| + return NULL;
|
| +}
|
| +
|
| +const IPC::Message* MockRenderThread::GetUniqueMessageMatching(
|
| + uint16 id) const {
|
| + size_t found_index = 0;
|
| + size_t found_count = 0;
|
| + for (size_t i = 0; i < messages_.size(); i++) {
|
| + if (messages_[i].first.type() == id) {
|
| + found_count++;
|
| + found_index = i;
|
| + }
|
| + }
|
| + if (found_count != 1)
|
| + return NULL; // Didn't find a unique one.
|
| + return &messages_[found_index].first;
|
| +}
|
| +
|
| +void MockRenderThread::SendCloseMessage() {
|
| + ViewMsg_Close msg(routing_id_);
|
| + widget_->OnMessageReceived(msg);
|
| +}
|
| +
|
| +void MockRenderThread::OnMessageReceived(const IPC::Message& msg) {
|
| + // Copy the message into a pair. This is tricky since the message doesn't
|
| + // manage its data itself.
|
| + char* data_copy;
|
| + if (msg.size()) {
|
| + data_copy = new char[msg.size()];
|
| + memcpy(data_copy, msg.data(), msg.size());
|
| + } else {
|
| + // Dummy data so we can treat everything the same.
|
| + data_copy = new char[1];
|
| + data_copy[0] = 0;
|
| + }
|
| +
|
| + // Save the message.
|
| + messages_.push_back(
|
| + std::make_pair(IPC::Message(data_copy, msg.size()), data_copy));
|
| +
|
| + // Some messages we do special handling.
|
| + bool handled = true;
|
| + bool msg_is_ok = true;
|
| + IPC_BEGIN_MESSAGE_MAP_EX(MockRenderThread, msg, msg_is_ok)
|
| + IPC_MESSAGE_HANDLER(ViewHostMsg_CreateWidget, OnMsgCreateWidget);
|
| + IPC_MESSAGE_UNHANDLED(handled = false)
|
| + IPC_END_MESSAGE_MAP_EX()
|
| +}
|
| +
|
| +// The Widget expects to be returned valid route_id.
|
| +void MockRenderThread::OnMsgCreateWidget(int opener_id,
|
| + bool focus_on_show,
|
| + int* route_id) {
|
| + opener_id_ = opener_id;
|
| + *route_id = routing_id_;
|
| +}
|
| +
|
|
|
| Property changes on: chrome\renderer\mock_render_thread.cc
|
| ___________________________________________________________________
|
| Added: svn:eol-style
|
| + LF
|
|
|
|
|