mock_render_thread.cc revision 5821806d5e7f356e8fa4b058a389a808ea183019
1// Copyright (c) 2012 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include "content/public/test/mock_render_thread.h" 6 7#include "base/process_util.h" 8#include "base/message_loop_proxy.h" 9#include "content/common/view_messages.h" 10#include "ipc/ipc_message_utils.h" 11#include "ipc/ipc_sync_message.h" 12#include "testing/gtest/include/gtest/gtest.h" 13 14namespace content { 15 16MockRenderThread::MockRenderThread() 17 : routing_id_(0), surface_id_(0), opener_id_(0), new_window_routing_id_(0) { 18} 19 20MockRenderThread::~MockRenderThread() { 21} 22 23void MockRenderThread::VerifyRunJavaScriptMessageSend( 24 const string16& expected_alert_message) { 25 const IPC::Message* alert_msg = 26 sink_.GetUniqueMessageMatching(ViewHostMsg_RunJavaScriptMessage::ID); 27 ASSERT_TRUE(alert_msg); 28 PickleIterator iter = IPC::SyncMessage::GetDataIterator(alert_msg); 29 ViewHostMsg_RunJavaScriptMessage::SendParam alert_param; 30 ASSERT_TRUE(IPC::ReadParam(alert_msg, &iter, &alert_param)); 31 EXPECT_EQ(expected_alert_message, alert_param.a); 32} 33 34// Called by the Widget. Used to send messages to the browser. 35// We short-circuit the mechanism and handle the messages right here on this 36// class. 37bool MockRenderThread::Send(IPC::Message* msg) { 38 // We need to simulate a synchronous channel, thus we are going to receive 39 // through this function messages, messages with reply and reply messages. 40 // We can only handle one synchronous message at a time. 41 if (msg->is_reply()) { 42 if (reply_deserializer_.get()) { 43 reply_deserializer_->SerializeOutputParameters(*msg); 44 reply_deserializer_.reset(); 45 } 46 } else { 47 if (msg->is_sync()) { 48 // We actually need to handle deleting the reply deserializer for sync 49 // messages. 50 reply_deserializer_.reset( 51 static_cast<IPC::SyncMessage*>(msg)->GetReplyDeserializer()); 52 } 53 OnMessageReceived(*msg); 54 } 55 delete msg; 56 return true; 57} 58 59MessageLoop* MockRenderThread::GetMessageLoop() { 60 return NULL; 61} 62 63IPC::SyncChannel* MockRenderThread::GetChannel() { 64 return NULL; 65} 66 67std::string MockRenderThread::GetLocale() { 68 return "en-US"; 69} 70 71IPC::SyncMessageFilter* MockRenderThread::GetSyncMessageFilter() { 72 return NULL; 73} 74 75scoped_refptr<base::MessageLoopProxy> 76 MockRenderThread::GetIOMessageLoopProxy() { 77 return scoped_refptr<base::MessageLoopProxy>(); 78} 79 80void MockRenderThread::AddRoute(int32 routing_id, IPC::Listener* listener) { 81 // We may hear this for views created from OnMsgCreateWindow as well, 82 // in which case we don't want to track the new widget. 83 if (routing_id_ == routing_id) 84 widget_ = listener; 85} 86 87void MockRenderThread::RemoveRoute(int32 routing_id) { 88 // We may hear this for views created from OnMsgCreateWindow as well, 89 // in which case we don't want to track the new widget. 90 if (routing_id_ == routing_id) 91 widget_ = NULL; 92} 93 94int MockRenderThread::GenerateRoutingID() { 95 NOTREACHED(); 96 return MSG_ROUTING_NONE; 97} 98 99void MockRenderThread::AddFilter(IPC::ChannelProxy::MessageFilter* filter) { 100 filter->OnFilterAdded(&sink()); 101 // Add this filter to a vector so the MockRenderThread::RemoveFilter function 102 // can check if this filter is added. 103 filters_.push_back(make_scoped_refptr(filter)); 104} 105 106void MockRenderThread::RemoveFilter(IPC::ChannelProxy::MessageFilter* filter) { 107 // Emulate the IPC::ChannelProxy::OnRemoveFilter function. 108 for (size_t i = 0; i < filters_.size(); ++i) { 109 if (filters_[i].get() == filter) { 110 filter->OnFilterRemoved(); 111 filters_.erase(filters_.begin() + i); 112 return; 113 } 114 } 115 NOTREACHED() << "filter to be removed not found"; 116} 117 118void MockRenderThread::SetOutgoingMessageFilter( 119 IPC::ChannelProxy::OutgoingMessageFilter* filter) { 120} 121 122void MockRenderThread::AddObserver(RenderProcessObserver* observer) { 123} 124 125void MockRenderThread::RemoveObserver(RenderProcessObserver* observer) { 126} 127 128void MockRenderThread::SetResourceDispatcherDelegate( 129 ResourceDispatcherDelegate* delegate) { 130} 131 132void MockRenderThread::WidgetHidden() { 133} 134 135void MockRenderThread::WidgetRestored() { 136} 137 138void MockRenderThread::EnsureWebKitInitialized() { 139} 140 141void MockRenderThread::RecordUserMetrics(const std::string& action) { 142} 143 144base::SharedMemoryHandle MockRenderThread::HostAllocateSharedMemoryBuffer( 145 uint32 buffer_size) { 146 base::SharedMemory shared_buf; 147 if (!shared_buf.CreateAndMapAnonymous(buffer_size)) { 148 NOTREACHED() << "Cannot map shared memory buffer"; 149 return base::SharedMemory::NULLHandle(); 150 } 151 base::SharedMemoryHandle handle; 152 shared_buf.GiveToProcess(base::GetCurrentProcessHandle(), &handle); 153 return handle; 154} 155 156void MockRenderThread::RegisterExtension(v8::Extension* extension) { 157} 158 159void MockRenderThread::ScheduleIdleHandler(int64 initial_delay_ms) { 160} 161 162void MockRenderThread::IdleHandler() { 163} 164 165int64 MockRenderThread::GetIdleNotificationDelayInMs() const { 166 return 0; 167} 168 169void MockRenderThread::SetIdleNotificationDelayInMs( 170 int64 idle_notification_delay_in_ms) { 171} 172 173void MockRenderThread::ToggleWebKitSharedTimer(bool suspend) { 174} 175 176void MockRenderThread::UpdateHistograms(int sequence_number) { 177} 178 179#if defined(OS_WIN) 180void MockRenderThread::PreCacheFont(const LOGFONT& log_font) { 181} 182 183void MockRenderThread::ReleaseCachedFonts() { 184} 185 186#endif // OS_WIN 187 188void MockRenderThread::SendCloseMessage() { 189 ViewMsg_Close msg(routing_id_); 190 widget_->OnMessageReceived(msg); 191} 192 193// The Widget expects to be returned valid route_id. 194void MockRenderThread::OnMsgCreateWidget(int opener_id, 195 WebKit::WebPopupType popup_type, 196 int* route_id, 197 int* surface_id) { 198 opener_id_ = opener_id; 199 *route_id = routing_id_; 200 *surface_id = surface_id_; 201} 202 203// The View expects to be returned a valid route_id different from its own. 204void MockRenderThread::OnMsgCreateWindow( 205 const ViewHostMsg_CreateWindow_Params& params, 206 int* route_id, 207 int* surface_id, 208 int64* cloned_session_storage_namespace_id) { 209 *route_id = new_window_routing_id_; 210 *surface_id = surface_id_; 211 *cloned_session_storage_namespace_id = 0; 212} 213 214bool MockRenderThread::OnMessageReceived(const IPC::Message& msg) { 215 // Save the message in the sink. 216 sink_.OnMessageReceived(msg); 217 218 bool handled = true; 219 bool msg_is_ok = true; 220 IPC_BEGIN_MESSAGE_MAP_EX(MockRenderThread, msg, msg_is_ok) 221 IPC_MESSAGE_HANDLER(ViewHostMsg_CreateWidget, OnMsgCreateWidget) 222 IPC_MESSAGE_HANDLER(ViewHostMsg_CreateWindow, OnMsgCreateWindow) 223 IPC_MESSAGE_UNHANDLED(handled = false) 224 IPC_END_MESSAGE_MAP_EX() 225 return handled; 226} 227 228#if defined(OS_WIN) 229void MockRenderThread::OnDuplicateSection( 230 base::SharedMemoryHandle renderer_handle, 231 base::SharedMemoryHandle* browser_handle) { 232 // We don't have to duplicate the input handles since RenderViewTest does not 233 // separate a browser process from a renderer process. 234 *browser_handle = renderer_handle; 235} 236#endif // defined(OS_WIN) 237 238} // namespace content 239