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