mock_render_process_host.cc revision a02191e04bc25c4935f804f2c080ae28663d096d
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 // NULL should be used here instead of INVALID_HANDLE_VALUE (or pseudo-handle) 147 // except for when dealing with the small number of Win16-derived APIs 148 // that require INVALID_HANDLE_VALUE (e.g. CreateFile and friends). 149 HANDLE duped = NULL; 150 if (!DuplicateHandle(GetCurrentProcess(), dib_id.handle, GetCurrentProcess(), 151 &duped, 0, TRUE, DUPLICATE_SAME_ACCESS)) 152 duped = NULL; 153 return TransportDIB::Map(duped); 154#elif defined(OS_ANDROID) 155 // On Android, Handles and Ids are the same underlying type. 156 return TransportDIB::Map(dib_id); 157#else 158 // On POSIX, TransportDIBs are always created in the browser, so we cannot map 159 // one from a dib_id. 160 return TransportDIB::Create(100 * 100 * 4, 0); 161#endif 162} 163 164TransportDIB* MockRenderProcessHost::GetTransportDIB(TransportDIB::Id dib_id) { 165 if (transport_dib_) 166 return transport_dib_; 167 168 transport_dib_ = MapTransportDIB(dib_id); 169 return transport_dib_; 170} 171 172int MockRenderProcessHost::GetID() const { 173 return id_; 174} 175 176bool MockRenderProcessHost::HasConnection() const { 177 return true; 178} 179 180void MockRenderProcessHost::SetIgnoreInputEvents(bool ignore_input_events) { 181} 182 183bool MockRenderProcessHost::IgnoreInputEvents() const { 184 return false; 185} 186 187void MockRenderProcessHost::Cleanup() { 188 if (listeners_.IsEmpty()) { 189 FOR_EACH_OBSERVER(RenderProcessHostObserver, 190 observers_, 191 RenderProcessHostDestroyed(this)); 192 base::MessageLoop::current()->DeleteSoon(FROM_HERE, this); 193 RenderProcessHostImpl::UnregisterHost(GetID()); 194 deletion_callback_called_ = true; 195 } 196} 197 198void MockRenderProcessHost::AddPendingView() { 199} 200 201void MockRenderProcessHost::RemovePendingView() { 202} 203 204void MockRenderProcessHost::SetSuddenTerminationAllowed(bool allowed) { 205} 206 207bool MockRenderProcessHost::SuddenTerminationAllowed() const { 208 return true; 209} 210 211BrowserContext* MockRenderProcessHost::GetBrowserContext() const { 212 return browser_context_; 213} 214 215bool MockRenderProcessHost::InSameStoragePartition( 216 StoragePartition* partition) const { 217 // Mock RPHs only have one partition. 218 return true; 219} 220 221IPC::ChannelProxy* MockRenderProcessHost::GetChannel() { 222 return NULL; 223} 224 225void MockRenderProcessHost::AddFilter(BrowserMessageFilter* filter) { 226} 227 228int MockRenderProcessHost::GetActiveViewCount() { 229 int num_active_views = 0; 230 scoped_ptr<RenderWidgetHostIterator> widgets( 231 RenderWidgetHost::GetRenderWidgetHosts()); 232 while (RenderWidgetHost* widget = widgets->GetNextHost()) { 233 // Count only RenderWidgetHosts in this process. 234 if (widget->GetProcess()->GetID() == GetID()) 235 num_active_views++; 236 } 237 return num_active_views; 238} 239 240bool MockRenderProcessHost::FastShutdownForPageCount(size_t count) { 241 if (static_cast<size_t>(GetActiveViewCount()) == count) 242 return FastShutdownIfPossible(); 243 return false; 244} 245 246base::TimeDelta MockRenderProcessHost::GetChildProcessIdleTime() const { 247 return base::TimeDelta::FromMilliseconds(0); 248} 249 250void MockRenderProcessHost::ResumeRequestsForView(int route_id) { 251} 252 253void MockRenderProcessHost::NotifyTimezoneChange() { 254} 255 256void MockRenderProcessHost::FilterURL(bool empty_allowed, GURL* url) { 257 RenderProcessHostImpl::FilterURL(this, empty_allowed, url); 258} 259 260#if defined(ENABLE_WEBRTC) 261void MockRenderProcessHost::EnableAecDump(const base::FilePath& file) { 262} 263 264void MockRenderProcessHost::DisableAecDump() { 265} 266 267void MockRenderProcessHost::SetWebRtcLogMessageCallback( 268 base::Callback<void(const std::string&)> callback) { 269} 270#endif 271 272void MockRenderProcessHost::ResumeDeferredNavigation( 273 const GlobalRequestID& request_id) {} 274 275bool MockRenderProcessHost::OnMessageReceived(const IPC::Message& msg) { 276 IPC::Listener* listener = listeners_.Lookup(msg.routing_id()); 277 if (listener) 278 return listener->OnMessageReceived(msg); 279 return false; 280} 281 282void MockRenderProcessHost::OnChannelConnected(int32 peer_pid) { 283} 284 285MockRenderProcessHostFactory::MockRenderProcessHostFactory() {} 286 287MockRenderProcessHostFactory::~MockRenderProcessHostFactory() { 288 // Detach this object from MockRenderProcesses to prevent STLDeleteElements() 289 // from calling MockRenderProcessHostFactory::Remove(). 290 for (ScopedVector<MockRenderProcessHost>::iterator it = processes_.begin(); 291 it != processes_.end(); ++it) { 292 (*it)->SetFactory(NULL); 293 } 294} 295 296RenderProcessHost* MockRenderProcessHostFactory::CreateRenderProcessHost( 297 BrowserContext* browser_context, 298 SiteInstance* site_instance) const { 299 MockRenderProcessHost* host = new MockRenderProcessHost(browser_context); 300 if (host) { 301 processes_.push_back(host); 302 host->SetFactory(this); 303 } 304 return host; 305} 306 307void MockRenderProcessHostFactory::Remove(MockRenderProcessHost* host) const { 308 for (ScopedVector<MockRenderProcessHost>::iterator it = processes_.begin(); 309 it != processes_.end(); ++it) { 310 if (*it == host) { 311 processes_.weak_erase(it); 312 break; 313 } 314 } 315} 316 317} // content 318