mock_render_thread.cc revision c2e0dbddbe15c98d52c4786dac06cb8952a8ae6d
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_) { 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 OnCreateWindow 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 OnCreateWindow 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 144scoped_ptr<base::SharedMemory> 145 MockRenderThread::HostAllocateSharedMemoryBuffer( 146 size_t buffer_size) { 147 scoped_ptr<base::SharedMemory> shared_buf(new base::SharedMemory); 148 if (!shared_buf->CreateAndMapAnonymous(buffer_size)) { 149 NOTREACHED() << "Cannot map shared memory buffer"; 150 return scoped_ptr<base::SharedMemory>(); 151 } 152 153 return scoped_ptr<base::SharedMemory>(shared_buf.release()); 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 179bool MockRenderThread::ResolveProxy(const GURL& url, std::string* proxy_list) { 180 return false; 181} 182 183#if defined(OS_WIN) 184void MockRenderThread::PreCacheFont(const LOGFONT& log_font) { 185} 186 187void MockRenderThread::ReleaseCachedFonts() { 188} 189 190#endif // OS_WIN 191 192void MockRenderThread::SendCloseMessage() { 193 ViewMsg_Close msg(routing_id_); 194 widget_->OnMessageReceived(msg); 195} 196 197// The Widget expects to be returned valid route_id. 198void MockRenderThread::OnCreateWidget(int opener_id, 199 WebKit::WebPopupType popup_type, 200 int* route_id, 201 int* surface_id) { 202 opener_id_ = opener_id; 203 *route_id = routing_id_; 204 *surface_id = surface_id_; 205} 206 207// The View expects to be returned a valid route_id different from its own. 208void MockRenderThread::OnCreateWindow( 209 const ViewHostMsg_CreateWindow_Params& params, 210 int* route_id, 211 int* surface_id, 212 int64* cloned_session_storage_namespace_id) { 213 *route_id = new_window_routing_id_; 214 *surface_id = surface_id_; 215 *cloned_session_storage_namespace_id = 0; 216} 217 218bool MockRenderThread::OnMessageReceived(const IPC::Message& msg) { 219 // Save the message in the sink. 220 sink_.OnMessageReceived(msg); 221 222 bool handled = true; 223 bool msg_is_ok = true; 224 IPC_BEGIN_MESSAGE_MAP_EX(MockRenderThread, msg, msg_is_ok) 225 IPC_MESSAGE_HANDLER(ViewHostMsg_CreateWidget, OnCreateWidget) 226 IPC_MESSAGE_HANDLER(ViewHostMsg_CreateWindow, OnCreateWindow) 227 IPC_MESSAGE_UNHANDLED(handled = false) 228 IPC_END_MESSAGE_MAP_EX() 229 return handled; 230} 231 232#if defined(OS_WIN) 233void MockRenderThread::OnDuplicateSection( 234 base::SharedMemoryHandle renderer_handle, 235 base::SharedMemoryHandle* browser_handle) { 236 // We don't have to duplicate the input handles since RenderViewTest does not 237 // separate a browser process from a renderer process. 238 *browser_handle = renderer_handle; 239} 240#endif // defined(OS_WIN) 241 242} // namespace content 243