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