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