mock_render_process_host.cc revision 116680a4aac90f2aa7413d9095a592090648e557
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/message_loop.h" 9#include "base/time/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_view_host_impl.h" 13#include "content/browser/renderer_host/render_widget_host_impl.h" 14#include "content/common/child_process_host_impl.h" 15#include "content/public/browser/global_request_id.h" 16#include "content/public/browser/render_widget_host_iterator.h" 17#include "content/public/browser/storage_partition.h" 18 19namespace content { 20 21MockRenderProcessHost::MockRenderProcessHost(BrowserContext* browser_context) 22 : bad_msg_count_(0), 23 factory_(NULL), 24 id_(ChildProcessHostImpl::GenerateChildProcessUniqueId()), 25 browser_context_(browser_context), 26 prev_routing_id_(0), 27 fast_shutdown_started_(false), 28 deletion_callback_called_(false), 29 is_isolated_guest_(false) { 30 // Child process security operations can't be unit tested unless we add 31 // ourselves as an existing child process. 32 ChildProcessSecurityPolicyImpl::GetInstance()->Add(GetID()); 33 34 RenderProcessHostImpl::RegisterHost(GetID(), this); 35} 36 37MockRenderProcessHost::~MockRenderProcessHost() { 38 ChildProcessSecurityPolicyImpl::GetInstance()->Remove(GetID()); 39 if (factory_) 40 factory_->Remove(this); 41 42 // In unit tests, Cleanup() might not have been called. 43 if (!deletion_callback_called_) { 44 FOR_EACH_OBSERVER(RenderProcessHostObserver, 45 observers_, 46 RenderProcessHostDestroyed(this)); 47 RenderProcessHostImpl::UnregisterHost(GetID()); 48 } 49} 50 51void MockRenderProcessHost::EnableSendQueue() { 52} 53 54bool MockRenderProcessHost::Init() { 55 return true; 56} 57 58int MockRenderProcessHost::GetNextRoutingID() { 59 return ++prev_routing_id_; 60} 61 62void MockRenderProcessHost::AddRoute( 63 int32 routing_id, 64 IPC::Listener* listener) { 65 listeners_.AddWithID(listener, routing_id); 66} 67 68void MockRenderProcessHost::RemoveRoute(int32 routing_id) { 69 DCHECK(listeners_.Lookup(routing_id) != NULL); 70 listeners_.Remove(routing_id); 71 Cleanup(); 72} 73 74void MockRenderProcessHost::AddObserver(RenderProcessHostObserver* observer) { 75 observers_.AddObserver(observer); 76} 77 78void MockRenderProcessHost::RemoveObserver( 79 RenderProcessHostObserver* observer) { 80 observers_.RemoveObserver(observer); 81} 82 83void MockRenderProcessHost::ReceivedBadMessage() { 84 ++bad_msg_count_; 85} 86 87void MockRenderProcessHost::WidgetRestored() { 88} 89 90void MockRenderProcessHost::WidgetHidden() { 91} 92 93int MockRenderProcessHost::VisibleWidgetCount() const { 94 return 1; 95} 96 97bool MockRenderProcessHost::IsIsolatedGuest() const { 98 return is_isolated_guest_; 99} 100 101StoragePartition* MockRenderProcessHost::GetStoragePartition() const { 102 return NULL; 103} 104 105void MockRenderProcessHost::AddWord(const base::string16& word) { 106} 107 108bool MockRenderProcessHost::FastShutdownIfPossible() { 109 // We aren't actually going to do anything, but set |fast_shutdown_started_| 110 // to true so that tests know we've been called. 111 fast_shutdown_started_ = true; 112 return true; 113} 114 115bool MockRenderProcessHost::FastShutdownStarted() const { 116 return fast_shutdown_started_; 117} 118 119void MockRenderProcessHost::DumpHandles() { 120} 121 122base::ProcessHandle MockRenderProcessHost::GetHandle() const { 123 // Return the current-process handle for the IPC::GetFileHandleForProcess 124 // function. 125 return base::Process::Current().handle(); 126} 127 128bool MockRenderProcessHost::Send(IPC::Message* msg) { 129 // Save the message in the sink. 130 sink_.OnMessageReceived(*msg); 131 delete msg; 132 return true; 133} 134 135int MockRenderProcessHost::GetID() const { 136 return id_; 137} 138 139bool MockRenderProcessHost::HasConnection() const { 140 return true; 141} 142 143void MockRenderProcessHost::SetIgnoreInputEvents(bool ignore_input_events) { 144} 145 146bool MockRenderProcessHost::IgnoreInputEvents() const { 147 return false; 148} 149 150void MockRenderProcessHost::Cleanup() { 151 if (listeners_.IsEmpty()) { 152 FOR_EACH_OBSERVER(RenderProcessHostObserver, 153 observers_, 154 RenderProcessHostDestroyed(this)); 155 base::MessageLoop::current()->DeleteSoon(FROM_HERE, this); 156 RenderProcessHostImpl::UnregisterHost(GetID()); 157 deletion_callback_called_ = true; 158 } 159} 160 161void MockRenderProcessHost::AddPendingView() { 162} 163 164void MockRenderProcessHost::RemovePendingView() { 165} 166 167void MockRenderProcessHost::SetSuddenTerminationAllowed(bool allowed) { 168} 169 170bool MockRenderProcessHost::SuddenTerminationAllowed() const { 171 return true; 172} 173 174BrowserContext* MockRenderProcessHost::GetBrowserContext() const { 175 return browser_context_; 176} 177 178bool MockRenderProcessHost::InSameStoragePartition( 179 StoragePartition* partition) const { 180 // Mock RPHs only have one partition. 181 return true; 182} 183 184IPC::ChannelProxy* MockRenderProcessHost::GetChannel() { 185 return NULL; 186} 187 188void MockRenderProcessHost::AddFilter(BrowserMessageFilter* filter) { 189} 190 191int MockRenderProcessHost::GetActiveViewCount() { 192 int num_active_views = 0; 193 scoped_ptr<RenderWidgetHostIterator> widgets( 194 RenderWidgetHost::GetRenderWidgetHosts()); 195 while (RenderWidgetHost* widget = widgets->GetNextHost()) { 196 // Count only RenderWidgetHosts in this process. 197 if (widget->GetProcess()->GetID() == GetID()) 198 num_active_views++; 199 } 200 return num_active_views; 201} 202 203bool MockRenderProcessHost::FastShutdownForPageCount(size_t count) { 204 if (static_cast<size_t>(GetActiveViewCount()) == count) 205 return FastShutdownIfPossible(); 206 return false; 207} 208 209base::TimeDelta MockRenderProcessHost::GetChildProcessIdleTime() const { 210 return base::TimeDelta::FromMilliseconds(0); 211} 212 213void MockRenderProcessHost::ResumeRequestsForView(int route_id) { 214} 215 216void MockRenderProcessHost::NotifyTimezoneChange() { 217} 218 219ServiceRegistry* MockRenderProcessHost::GetServiceRegistry() { 220 return NULL; 221} 222 223void MockRenderProcessHost::FilterURL(bool empty_allowed, GURL* url) { 224 RenderProcessHostImpl::FilterURL(this, empty_allowed, url); 225} 226 227#if defined(ENABLE_WEBRTC) 228void MockRenderProcessHost::EnableAecDump(const base::FilePath& file) { 229} 230 231void MockRenderProcessHost::DisableAecDump() { 232} 233 234void MockRenderProcessHost::SetWebRtcLogMessageCallback( 235 base::Callback<void(const std::string&)> callback) { 236} 237 238RenderProcessHost::WebRtcStopRtpDumpCallback 239MockRenderProcessHost::StartRtpDump( 240 bool incoming, 241 bool outgoing, 242 const WebRtcRtpPacketCallback& packet_callback) { 243 return WebRtcStopRtpDumpCallback(); 244} 245#endif 246 247void MockRenderProcessHost::ResumeDeferredNavigation( 248 const GlobalRequestID& request_id) {} 249 250bool MockRenderProcessHost::OnMessageReceived(const IPC::Message& msg) { 251 IPC::Listener* listener = listeners_.Lookup(msg.routing_id()); 252 if (listener) 253 return listener->OnMessageReceived(msg); 254 return false; 255} 256 257void MockRenderProcessHost::OnChannelConnected(int32 peer_pid) { 258} 259 260MockRenderProcessHostFactory::MockRenderProcessHostFactory() {} 261 262MockRenderProcessHostFactory::~MockRenderProcessHostFactory() { 263 // Detach this object from MockRenderProcesses to prevent STLDeleteElements() 264 // from calling MockRenderProcessHostFactory::Remove(). 265 for (ScopedVector<MockRenderProcessHost>::iterator it = processes_.begin(); 266 it != processes_.end(); ++it) { 267 (*it)->SetFactory(NULL); 268 } 269} 270 271RenderProcessHost* MockRenderProcessHostFactory::CreateRenderProcessHost( 272 BrowserContext* browser_context, 273 SiteInstance* site_instance) const { 274 MockRenderProcessHost* host = new MockRenderProcessHost(browser_context); 275 if (host) { 276 processes_.push_back(host); 277 host->SetFactory(this); 278 } 279 return host; 280} 281 282void MockRenderProcessHostFactory::Remove(MockRenderProcessHost* host) const { 283 for (ScopedVector<MockRenderProcessHost>::iterator it = processes_.begin(); 284 it != processes_.end(); ++it) { 285 if (*it == host) { 286 processes_.weak_erase(it); 287 break; 288 } 289 } 290} 291 292} // content 293