mock_render_process_host.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_process_host.h" 6 7#include "base/lazy_instance.h" 8#include "base/message_loop.h" 9#include "base/time.h" 10#include "content/browser/child_process_security_policy_impl.h" 11#include "content/browser/renderer_host/render_process_host_impl.h" 12#include "content/browser/renderer_host/render_widget_host_impl.h" 13#include "content/common/child_process_host_impl.h" 14#include "content/public/browser/notification_service.h" 15#include "content/public/browser/notification_types.h" 16#include "content/public/browser/storage_partition.h" 17 18namespace content { 19 20MockRenderProcessHost::MockRenderProcessHost( 21 BrowserContext* browser_context) 22 : transport_dib_(NULL), 23 bad_msg_count_(0), 24 factory_(NULL), 25 id_(ChildProcessHostImpl::GenerateChildProcessUniqueId()), 26 browser_context_(browser_context), 27 fast_shutdown_started_(false) { 28 // Child process security operations can't be unit tested unless we add 29 // ourselves as an existing child process. 30 ChildProcessSecurityPolicyImpl::GetInstance()->Add(GetID()); 31 32 RenderProcessHostImpl::RegisterHost(GetID(), this); 33} 34 35MockRenderProcessHost::~MockRenderProcessHost() { 36 ChildProcessSecurityPolicyImpl::GetInstance()->Remove(GetID()); 37 delete transport_dib_; 38 if (factory_) 39 factory_->Remove(this); 40 // In unit tests, Release() might not have been called. 41 RenderProcessHostImpl::UnregisterHost(GetID()); 42} 43 44void MockRenderProcessHost::EnableSendQueue() { 45} 46 47bool MockRenderProcessHost::Init() { 48 return true; 49} 50 51int MockRenderProcessHost::GetNextRoutingID() { 52 static int prev_routing_id = 0; 53 return ++prev_routing_id; 54} 55 56bool MockRenderProcessHost::WaitForBackingStoreMsg( 57 int render_widget_id, 58 const base::TimeDelta& max_delay, 59 IPC::Message* msg) { 60 return false; 61} 62 63void MockRenderProcessHost::ReceivedBadMessage() { 64 ++bad_msg_count_; 65} 66 67void MockRenderProcessHost::WidgetRestored() { 68} 69 70void MockRenderProcessHost::WidgetHidden() { 71} 72 73int MockRenderProcessHost::VisibleWidgetCount() const { 74 return 1; 75} 76 77bool MockRenderProcessHost::IsGuest() const { 78 return false; 79} 80 81StoragePartition* MockRenderProcessHost::GetStoragePartition() const { 82 return NULL; 83} 84 85void MockRenderProcessHost::AddWord(const string16& word) { 86} 87 88bool MockRenderProcessHost::FastShutdownIfPossible() { 89 // We aren't actually going to do anything, but set |fast_shutdown_started_| 90 // to true so that tests know we've been called. 91 fast_shutdown_started_ = true; 92 return true; 93} 94 95bool MockRenderProcessHost::FastShutdownStarted() const { 96 return fast_shutdown_started_; 97} 98 99void MockRenderProcessHost::DumpHandles() { 100} 101 102base::ProcessHandle MockRenderProcessHost::GetHandle() const { 103 // Return the current-process handle for the IPC::GetFileHandleForProcess 104 // function. 105 return base::Process::Current().handle(); 106} 107 108bool MockRenderProcessHost::Send(IPC::Message* msg) { 109 // Save the message in the sink. 110 sink_.OnMessageReceived(*msg); 111 delete msg; 112 return true; 113} 114 115TransportDIB* MockRenderProcessHost::MapTransportDIB(TransportDIB::Id dib_id) { 116#if defined(OS_WIN) 117 HANDLE duped; 118 DuplicateHandle(GetCurrentProcess(), dib_id.handle, GetCurrentProcess(), 119 &duped, 0, TRUE, DUPLICATE_SAME_ACCESS); 120 return TransportDIB::Map(duped); 121#elif defined(TOOLKIT_GTK) 122 return TransportDIB::Map(dib_id.shmkey); 123#elif defined(OS_ANDROID) 124 // On Android, Handles and Ids are the same underlying type. 125 return TransportDIB::Map(dib_id); 126#else 127 // On POSIX, TransportDIBs are always created in the browser, so we cannot map 128 // one from a dib_id. 129 return TransportDIB::Create(100 * 100 * 4, 0); 130#endif 131} 132 133TransportDIB* MockRenderProcessHost::GetTransportDIB(TransportDIB::Id dib_id) { 134 if (transport_dib_) 135 return transport_dib_; 136 137 transport_dib_ = MapTransportDIB(dib_id); 138 return transport_dib_; 139} 140 141int MockRenderProcessHost::GetID() const { 142 return id_; 143} 144 145bool MockRenderProcessHost::HasConnection() const { 146 return true; 147} 148 149void MockRenderProcessHost::SetIgnoreInputEvents(bool ignore_input_events) { 150} 151 152bool MockRenderProcessHost::IgnoreInputEvents() const { 153 return false; 154} 155 156void MockRenderProcessHost::Attach(RenderWidgetHost* host, 157 int routing_id) { 158 render_widget_hosts_.AddWithID(host, routing_id); 159} 160 161void MockRenderProcessHost::Release(int routing_id) { 162 render_widget_hosts_.Remove(routing_id); 163 Cleanup(); 164} 165 166void MockRenderProcessHost::Cleanup() { 167 if (render_widget_hosts_.IsEmpty()) { 168 NotificationService::current()->Notify( 169 NOTIFICATION_RENDERER_PROCESS_TERMINATED, 170 Source<RenderProcessHost>(this), 171 NotificationService::NoDetails()); 172 base::MessageLoop::current()->DeleteSoon(FROM_HERE, this); 173 RenderProcessHostImpl::UnregisterHost(GetID()); 174 } 175} 176 177void MockRenderProcessHost::AddPendingView() { 178} 179 180void MockRenderProcessHost::RemovePendingView() { 181} 182 183void MockRenderProcessHost::SetSuddenTerminationAllowed(bool allowed) { 184} 185 186bool MockRenderProcessHost::SuddenTerminationAllowed() const { 187 return true; 188} 189 190RenderWidgetHost* MockRenderProcessHost::GetRenderWidgetHostByID( 191 int routing_id) { 192 return render_widget_hosts_.Lookup(routing_id); 193} 194 195BrowserContext* MockRenderProcessHost::GetBrowserContext() const { 196 return browser_context_; 197} 198 199bool MockRenderProcessHost::InSameStoragePartition( 200 StoragePartition* partition) const { 201 // Mock RPHs only have one partition. 202 return true; 203} 204 205IPC::ChannelProxy* MockRenderProcessHost::GetChannel() { 206 return NULL; 207} 208 209bool MockRenderProcessHost::FastShutdownForPageCount(size_t count) { 210 if (render_widget_hosts_.size() == count) 211 return FastShutdownIfPossible(); 212 return false; 213} 214 215base::TimeDelta MockRenderProcessHost::GetChildProcessIdleTime() const { 216 return base::TimeDelta::FromMilliseconds(0); 217} 218 219void MockRenderProcessHost::SurfaceUpdated(int32 surface_id) { 220} 221 222void MockRenderProcessHost::ResumeRequestsForView(int route_id) { 223} 224 225RenderProcessHost::RenderWidgetHostsIterator 226 MockRenderProcessHost::GetRenderWidgetHostsIterator() { 227 return RenderWidgetHostsIterator(&render_widget_hosts_); 228} 229 230bool MockRenderProcessHost::OnMessageReceived(const IPC::Message& msg) { 231 RenderWidgetHost* rwh = render_widget_hosts_.Lookup(msg.routing_id()); 232 if (rwh) 233 return RenderWidgetHostImpl::From(rwh)->OnMessageReceived(msg); 234 return false; 235} 236 237void MockRenderProcessHost::OnChannelConnected(int32 peer_pid) { 238} 239 240MockRenderProcessHostFactory::MockRenderProcessHostFactory() {} 241 242MockRenderProcessHostFactory::~MockRenderProcessHostFactory() { 243 // Detach this object from MockRenderProcesses to prevent STLDeleteElements() 244 // from calling MockRenderProcessHostFactory::Remove(). 245 for (ScopedVector<MockRenderProcessHost>::iterator it = processes_.begin(); 246 it != processes_.end(); ++it) { 247 (*it)->SetFactory(NULL); 248 } 249} 250 251RenderProcessHost* MockRenderProcessHostFactory::CreateRenderProcessHost( 252 BrowserContext* browser_context, 253 SiteInstance* site_instance) const { 254 MockRenderProcessHost* host = new MockRenderProcessHost(browser_context); 255 if (host) { 256 processes_.push_back(host); 257 host->SetFactory(this); 258 } 259 return host; 260} 261 262void MockRenderProcessHostFactory::Remove(MockRenderProcessHost* host) const { 263 for (ScopedVector<MockRenderProcessHost>::iterator it = processes_.begin(); 264 it != processes_.end(); ++it) { 265 if (*it == host) { 266 processes_.weak_erase(it); 267 break; 268 } 269 } 270} 271 272} // content 273