mock_render_thread.cc revision 8bcbed890bc3ce4d7a057a8f32cab53fa534672e
13842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz// Copyright (c) 2012 The Chromium Authors. All rights reserved. 23842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz// Use of this source code is governed by a BSD-style license that can be 33842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz// found in the LICENSE file. 43842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz 53842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz#include "content/public/test/mock_render_thread.h" 63842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz 73842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz#include "base/message_loop/message_loop_proxy.h" 83842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz#include "content/common/view_messages.h" 900aed9631b112d7aa7adc98054b62549cfc857daArun Sharma#include "content/public/renderer/render_process_observer.h" 1000aed9631b112d7aa7adc98054b62549cfc857daArun Sharma#include "ipc/ipc_message_utils.h" 1100aed9631b112d7aa7adc98054b62549cfc857daArun Sharma#include "ipc/ipc_sync_message.h" 1200aed9631b112d7aa7adc98054b62549cfc857daArun Sharma#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 if (msg->routing_id() == MSG_ROUTING_CONTROL) 59 OnControlMessageReceived(*msg); 60 else 61 OnMessageReceived(*msg); 62 } 63 delete msg; 64 return true; 65} 66 67base::MessageLoop* MockRenderThread::GetMessageLoop() { 68 return NULL; 69} 70 71IPC::SyncChannel* MockRenderThread::GetChannel() { 72 return NULL; 73} 74 75std::string MockRenderThread::GetLocale() { 76 return "en-US"; 77} 78 79IPC::SyncMessageFilter* MockRenderThread::GetSyncMessageFilter() { 80 return NULL; 81} 82 83scoped_refptr<base::MessageLoopProxy> 84 MockRenderThread::GetIOMessageLoopProxy() { 85 return scoped_refptr<base::MessageLoopProxy>(); 86} 87 88void MockRenderThread::AddRoute(int32 routing_id, IPC::Listener* listener) { 89 // We may hear this for views created from OnCreateWindow as well, 90 // in which case we don't want to track the new widget. 91 if (routing_id_ == routing_id) 92 widget_ = listener; 93} 94 95void MockRenderThread::RemoveRoute(int32 routing_id) { 96 // We may hear this for views created from OnCreateWindow as well, 97 // in which case we don't want to track the new widget. 98 if (routing_id_ == routing_id) 99 widget_ = NULL; 100} 101 102int MockRenderThread::GenerateRoutingID() { 103 NOTREACHED(); 104 return MSG_ROUTING_NONE; 105} 106 107void MockRenderThread::AddFilter(IPC::ChannelProxy::MessageFilter* filter) { 108 filter->OnFilterAdded(&sink()); 109 // Add this filter to a vector so the MockRenderThread::RemoveFilter function 110 // can check if this filter is added. 111 filters_.push_back(make_scoped_refptr(filter)); 112} 113 114void MockRenderThread::RemoveFilter(IPC::ChannelProxy::MessageFilter* filter) { 115 // Emulate the IPC::ChannelProxy::OnRemoveFilter function. 116 for (size_t i = 0; i < filters_.size(); ++i) { 117 if (filters_[i].get() == filter) { 118 filter->OnFilterRemoved(); 119 filters_.erase(filters_.begin() + i); 120 return; 121 } 122 } 123 NOTREACHED() << "filter to be removed not found"; 124} 125 126void MockRenderThread::AddObserver(RenderProcessObserver* observer) { 127 observers_.AddObserver(observer); 128} 129 130void MockRenderThread::RemoveObserver(RenderProcessObserver* observer) { 131 observers_.RemoveObserver(observer); 132} 133 134void MockRenderThread::SetResourceDispatcherDelegate( 135 ResourceDispatcherDelegate* delegate) { 136} 137 138void MockRenderThread::WidgetHidden() { 139} 140 141void MockRenderThread::WidgetRestored() { 142} 143 144void MockRenderThread::EnsureWebKitInitialized() { 145} 146 147void MockRenderThread::RecordUserMetrics(const std::string& action) { 148} 149 150scoped_ptr<base::SharedMemory> 151 MockRenderThread::HostAllocateSharedMemoryBuffer( 152 size_t buffer_size) { 153 scoped_ptr<base::SharedMemory> shared_buf(new base::SharedMemory); 154 if (!shared_buf->CreateAndMapAnonymous(buffer_size)) { 155 NOTREACHED() << "Cannot map shared memory buffer"; 156 return scoped_ptr<base::SharedMemory>(); 157 } 158 159 return scoped_ptr<base::SharedMemory>(shared_buf.release()); 160} 161 162void MockRenderThread::RegisterExtension(v8::Extension* extension) { 163 WebKit::WebScriptController::registerExtension(extension); 164} 165 166void MockRenderThread::ScheduleIdleHandler(int64 initial_delay_ms) { 167} 168 169void MockRenderThread::IdleHandler() { 170} 171 172int64 MockRenderThread::GetIdleNotificationDelayInMs() const { 173 return 0; 174} 175 176void MockRenderThread::SetIdleNotificationDelayInMs( 177 int64 idle_notification_delay_in_ms) { 178} 179 180void MockRenderThread::ToggleWebKitSharedTimer(bool suspend) { 181} 182 183void MockRenderThread::UpdateHistograms(int sequence_number) { 184} 185 186int MockRenderThread::PostTaskToAllWebWorkers(const base::Closure& closure) { 187 return 0; 188} 189 190bool MockRenderThread::ResolveProxy(const GURL& url, std::string* proxy_list) { 191 return false; 192} 193 194#if defined(OS_WIN) 195void MockRenderThread::PreCacheFont(const LOGFONT& log_font) { 196} 197 198void MockRenderThread::ReleaseCachedFonts() { 199} 200 201#endif // OS_WIN 202 203void MockRenderThread::SendCloseMessage() { 204 ViewMsg_Close msg(routing_id_); 205 widget_->OnMessageReceived(msg); 206} 207 208// The Widget expects to be returned valid route_id. 209void MockRenderThread::OnCreateWidget(int opener_id, 210 WebKit::WebPopupType popup_type, 211 int* route_id, 212 int* surface_id) { 213 opener_id_ = opener_id; 214 *route_id = routing_id_; 215 *surface_id = surface_id_; 216} 217 218// The View expects to be returned a valid route_id different from its own. 219void MockRenderThread::OnCreateWindow( 220 const ViewHostMsg_CreateWindow_Params& params, 221 int* route_id, 222 int* main_frame_route_id, 223 int* surface_id, 224 int64* cloned_session_storage_namespace_id) { 225 *route_id = new_window_routing_id_; 226 *main_frame_route_id = new_window_main_frame_routing_id_; 227 *surface_id = surface_id_; 228 *cloned_session_storage_namespace_id = 0; 229} 230 231bool MockRenderThread::OnControlMessageReceived(const IPC::Message& msg) { 232 ObserverListBase<RenderProcessObserver>::Iterator it(observers_); 233 RenderProcessObserver* observer; 234 while ((observer = it.GetNext()) != NULL) { 235 if (observer->OnControlMessageReceived(msg)) 236 return true; 237 } 238 return OnMessageReceived(msg); 239} 240 241bool MockRenderThread::OnMessageReceived(const IPC::Message& msg) { 242 // Save the message in the sink. 243 sink_.OnMessageReceived(msg); 244 245 bool handled = true; 246 bool msg_is_ok = true; 247 IPC_BEGIN_MESSAGE_MAP_EX(MockRenderThread, msg, msg_is_ok) 248 IPC_MESSAGE_HANDLER(ViewHostMsg_CreateWidget, OnCreateWidget) 249 IPC_MESSAGE_HANDLER(ViewHostMsg_CreateWindow, OnCreateWindow) 250 IPC_MESSAGE_UNHANDLED(handled = false) 251 IPC_END_MESSAGE_MAP_EX() 252 return handled; 253} 254 255#if defined(OS_WIN) 256void MockRenderThread::OnDuplicateSection( 257 base::SharedMemoryHandle renderer_handle, 258 base::SharedMemoryHandle* browser_handle) { 259 // We don't have to duplicate the input handles since RenderViewTest does not 260 // separate a browser process from a renderer process. 261 *browser_handle = renderer_handle; 262} 263#endif // defined(OS_WIN) 264 265} // namespace content 266