mock_render_process_host.cc revision 46d4c2bc3267f3f028f39e7e311b0f89aba2e4fd
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 83bool MockRenderProcessHost::WaitForBackingStoreMsg( 84 int render_widget_id, 85 const base::TimeDelta& max_delay, 86 IPC::Message* msg) { 87 return false; 88} 89 90void MockRenderProcessHost::ReceivedBadMessage() { 91 ++bad_msg_count_; 92} 93 94void MockRenderProcessHost::WidgetRestored() { 95} 96 97void MockRenderProcessHost::WidgetHidden() { 98} 99 100int MockRenderProcessHost::VisibleWidgetCount() const { 101 return 1; 102} 103 104bool MockRenderProcessHost::IsIsolatedGuest() const { 105 return is_isolated_guest_; 106} 107 108StoragePartition* MockRenderProcessHost::GetStoragePartition() const { 109 return NULL; 110} 111 112void MockRenderProcessHost::AddWord(const base::string16& word) { 113} 114 115bool MockRenderProcessHost::FastShutdownIfPossible() { 116 // We aren't actually going to do anything, but set |fast_shutdown_started_| 117 // to true so that tests know we've been called. 118 fast_shutdown_started_ = true; 119 return true; 120} 121 122bool MockRenderProcessHost::FastShutdownStarted() const { 123 return fast_shutdown_started_; 124} 125 126void MockRenderProcessHost::DumpHandles() { 127} 128 129base::ProcessHandle MockRenderProcessHost::GetHandle() const { 130 // Return the current-process handle for the IPC::GetFileHandleForProcess 131 // function. 132 return base::Process::Current().handle(); 133} 134 135bool MockRenderProcessHost::Send(IPC::Message* msg) { 136 // Save the message in the sink. 137 sink_.OnMessageReceived(*msg); 138 delete msg; 139 return true; 140} 141 142int MockRenderProcessHost::GetID() const { 143 return id_; 144} 145 146bool MockRenderProcessHost::HasConnection() const { 147 return true; 148} 149 150void MockRenderProcessHost::SetIgnoreInputEvents(bool ignore_input_events) { 151} 152 153bool MockRenderProcessHost::IgnoreInputEvents() const { 154 return false; 155} 156 157void MockRenderProcessHost::Cleanup() { 158 if (listeners_.IsEmpty()) { 159 FOR_EACH_OBSERVER(RenderProcessHostObserver, 160 observers_, 161 RenderProcessHostDestroyed(this)); 162 base::MessageLoop::current()->DeleteSoon(FROM_HERE, this); 163 RenderProcessHostImpl::UnregisterHost(GetID()); 164 deletion_callback_called_ = true; 165 } 166} 167 168void MockRenderProcessHost::AddPendingView() { 169} 170 171void MockRenderProcessHost::RemovePendingView() { 172} 173 174void MockRenderProcessHost::SetSuddenTerminationAllowed(bool allowed) { 175} 176 177bool MockRenderProcessHost::SuddenTerminationAllowed() const { 178 return true; 179} 180 181BrowserContext* MockRenderProcessHost::GetBrowserContext() const { 182 return browser_context_; 183} 184 185bool MockRenderProcessHost::InSameStoragePartition( 186 StoragePartition* partition) const { 187 // Mock RPHs only have one partition. 188 return true; 189} 190 191IPC::ChannelProxy* MockRenderProcessHost::GetChannel() { 192 return NULL; 193} 194 195void MockRenderProcessHost::AddFilter(BrowserMessageFilter* filter) { 196} 197 198int MockRenderProcessHost::GetActiveViewCount() { 199 int num_active_views = 0; 200 scoped_ptr<RenderWidgetHostIterator> widgets( 201 RenderWidgetHost::GetRenderWidgetHosts()); 202 while (RenderWidgetHost* widget = widgets->GetNextHost()) { 203 // Count only RenderWidgetHosts in this process. 204 if (widget->GetProcess()->GetID() == GetID()) 205 num_active_views++; 206 } 207 return num_active_views; 208} 209 210bool MockRenderProcessHost::FastShutdownForPageCount(size_t count) { 211 if (static_cast<size_t>(GetActiveViewCount()) == count) 212 return FastShutdownIfPossible(); 213 return false; 214} 215 216base::TimeDelta MockRenderProcessHost::GetChildProcessIdleTime() const { 217 return base::TimeDelta::FromMilliseconds(0); 218} 219 220void MockRenderProcessHost::ResumeRequestsForView(int route_id) { 221} 222 223void MockRenderProcessHost::NotifyTimezoneChange() { 224} 225 226void MockRenderProcessHost::FilterURL(bool empty_allowed, GURL* url) { 227 RenderProcessHostImpl::FilterURL(this, empty_allowed, url); 228} 229 230#if defined(ENABLE_WEBRTC) 231void MockRenderProcessHost::EnableAecDump(const base::FilePath& file) { 232} 233 234void MockRenderProcessHost::DisableAecDump() { 235} 236 237void MockRenderProcessHost::SetWebRtcLogMessageCallback( 238 base::Callback<void(const std::string&)> callback) { 239} 240 241RenderProcessHost::WebRtcStopRtpDumpCallback 242MockRenderProcessHost::StartRtpDump( 243 bool incoming, 244 bool outgoing, 245 const WebRtcRtpPacketCallback& packet_callback) { 246 return WebRtcStopRtpDumpCallback(); 247} 248#endif 249 250void MockRenderProcessHost::ResumeDeferredNavigation( 251 const GlobalRequestID& request_id) {} 252 253bool MockRenderProcessHost::OnMessageReceived(const IPC::Message& msg) { 254 IPC::Listener* listener = listeners_.Lookup(msg.routing_id()); 255 if (listener) 256 return listener->OnMessageReceived(msg); 257 return false; 258} 259 260void MockRenderProcessHost::OnChannelConnected(int32 peer_pid) { 261} 262 263MockRenderProcessHostFactory::MockRenderProcessHostFactory() {} 264 265MockRenderProcessHostFactory::~MockRenderProcessHostFactory() { 266 // Detach this object from MockRenderProcesses to prevent STLDeleteElements() 267 // from calling MockRenderProcessHostFactory::Remove(). 268 for (ScopedVector<MockRenderProcessHost>::iterator it = processes_.begin(); 269 it != processes_.end(); ++it) { 270 (*it)->SetFactory(NULL); 271 } 272} 273 274RenderProcessHost* MockRenderProcessHostFactory::CreateRenderProcessHost( 275 BrowserContext* browser_context, 276 SiteInstance* site_instance) const { 277 MockRenderProcessHost* host = new MockRenderProcessHost(browser_context); 278 if (host) { 279 processes_.push_back(host); 280 host->SetFactory(this); 281 } 282 return host; 283} 284 285void MockRenderProcessHostFactory::Remove(MockRenderProcessHost* host) const { 286 for (ScopedVector<MockRenderProcessHost>::iterator it = processes_.begin(); 287 it != processes_.end(); ++it) { 288 if (*it == host) { 289 processes_.weak_erase(it); 290 break; 291 } 292 } 293} 294 295} // content 296