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