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.
5 #include "content/public/test/mock_render_process_host.h"
7 #include "base/lazy_instance.h"
8 #include "base/message_loop/message_loop.h"
9 #include "base/process/process_handle.h"
10 #include "base/time/time.h"
11 #include "content/browser/child_process_security_policy_impl.h"
12 #include "content/browser/renderer_host/render_process_host_impl.h"
13 #include "content/browser/renderer_host/render_view_host_impl.h"
14 #include "content/browser/renderer_host/render_widget_host_impl.h"
15 #include "content/common/child_process_host_impl.h"
16 #include "content/public/browser/global_request_id.h"
17 #include "content/public/browser/render_widget_host_iterator.h"
18 #include "content/public/browser/storage_partition.h"
22 MockRenderProcessHost::MockRenderProcessHost(BrowserContext* browser_context)
25 id_(ChildProcessHostImpl::GenerateChildProcessUniqueId()),
26 browser_context_(browser_context),
28 fast_shutdown_started_(false),
29 deletion_callback_called_(false),
30 is_isolated_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());
35 RenderProcessHostImpl::RegisterHost(GetID(), this);
38 MockRenderProcessHost::~MockRenderProcessHost() {
39 ChildProcessSecurityPolicyImpl::GetInstance()->Remove(GetID());
41 factory_->Remove(this);
43 // In unit tests, Cleanup() might not have been called.
44 if (!deletion_callback_called_) {
45 FOR_EACH_OBSERVER(RenderProcessHostObserver,
47 RenderProcessHostDestroyed(this));
48 RenderProcessHostImpl::UnregisterHost(GetID());
52 void MockRenderProcessHost::EnableSendQueue() {
55 bool MockRenderProcessHost::Init() {
59 int MockRenderProcessHost::GetNextRoutingID() {
60 return ++prev_routing_id_;
63 void MockRenderProcessHost::AddRoute(
65 IPC::Listener* listener) {
66 listeners_.AddWithID(listener, routing_id);
69 void MockRenderProcessHost::RemoveRoute(int32 routing_id) {
70 DCHECK(listeners_.Lookup(routing_id) != NULL);
71 listeners_.Remove(routing_id);
75 void MockRenderProcessHost::AddObserver(RenderProcessHostObserver* observer) {
76 observers_.AddObserver(observer);
79 void MockRenderProcessHost::RemoveObserver(
80 RenderProcessHostObserver* observer) {
81 observers_.RemoveObserver(observer);
84 void MockRenderProcessHost::ReceivedBadMessage() {
88 void MockRenderProcessHost::WidgetRestored() {
91 void MockRenderProcessHost::WidgetHidden() {
94 int MockRenderProcessHost::VisibleWidgetCount() const {
98 bool MockRenderProcessHost::IsIsolatedGuest() const {
99 return is_isolated_guest_;
102 StoragePartition* MockRenderProcessHost::GetStoragePartition() const {
106 void MockRenderProcessHost::AddWord(const base::string16& word) {
109 bool MockRenderProcessHost::FastShutdownIfPossible() {
110 // We aren't actually going to do anything, but set |fast_shutdown_started_|
111 // to true so that tests know we've been called.
112 fast_shutdown_started_ = true;
116 bool MockRenderProcessHost::FastShutdownStarted() const {
117 return fast_shutdown_started_;
120 void MockRenderProcessHost::DumpHandles() {
123 base::ProcessHandle MockRenderProcessHost::GetHandle() const {
124 // Return the current-process handle for the IPC::GetFileHandleForProcess
127 return *process_handle;
128 return base::GetCurrentProcessHandle();
131 bool MockRenderProcessHost::Send(IPC::Message* msg) {
132 // Save the message in the sink.
133 sink_.OnMessageReceived(*msg);
138 int MockRenderProcessHost::GetID() const {
142 bool MockRenderProcessHost::HasConnection() const {
146 void MockRenderProcessHost::SetIgnoreInputEvents(bool ignore_input_events) {
149 bool MockRenderProcessHost::IgnoreInputEvents() const {
153 void MockRenderProcessHost::Cleanup() {
154 if (listeners_.IsEmpty()) {
155 FOR_EACH_OBSERVER(RenderProcessHostObserver,
157 RenderProcessHostDestroyed(this));
158 base::MessageLoop::current()->DeleteSoon(FROM_HERE, this);
159 RenderProcessHostImpl::UnregisterHost(GetID());
160 deletion_callback_called_ = true;
164 void MockRenderProcessHost::AddPendingView() {
167 void MockRenderProcessHost::RemovePendingView() {
170 void MockRenderProcessHost::SetSuddenTerminationAllowed(bool allowed) {
173 bool MockRenderProcessHost::SuddenTerminationAllowed() const {
177 BrowserContext* MockRenderProcessHost::GetBrowserContext() const {
178 return browser_context_;
181 bool MockRenderProcessHost::InSameStoragePartition(
182 StoragePartition* partition) const {
183 // Mock RPHs only have one partition.
187 IPC::ChannelProxy* MockRenderProcessHost::GetChannel() {
191 void MockRenderProcessHost::AddFilter(BrowserMessageFilter* filter) {
194 int MockRenderProcessHost::GetActiveViewCount() {
195 int num_active_views = 0;
196 scoped_ptr<RenderWidgetHostIterator> widgets(
197 RenderWidgetHost::GetRenderWidgetHosts());
198 while (RenderWidgetHost* widget = widgets->GetNextHost()) {
199 // Count only RenderWidgetHosts in this process.
200 if (widget->GetProcess()->GetID() == GetID())
203 return num_active_views;
206 bool MockRenderProcessHost::FastShutdownForPageCount(size_t count) {
207 if (static_cast<size_t>(GetActiveViewCount()) == count)
208 return FastShutdownIfPossible();
212 base::TimeDelta MockRenderProcessHost::GetChildProcessIdleTime() const {
213 return base::TimeDelta::FromMilliseconds(0);
216 void MockRenderProcessHost::ResumeRequestsForView(int route_id) {
219 void MockRenderProcessHost::NotifyTimezoneChange() {
222 ServiceRegistry* MockRenderProcessHost::GetServiceRegistry() {
226 const base::TimeTicks& MockRenderProcessHost::GetInitTimeForNavigationMetrics()
228 static base::TimeTicks dummy_time = base::TimeTicks::Now();
232 void MockRenderProcessHost::FilterURL(bool empty_allowed, GURL* url) {
233 RenderProcessHostImpl::FilterURL(this, empty_allowed, url);
236 #if defined(ENABLE_WEBRTC)
237 void MockRenderProcessHost::EnableAecDump(const base::FilePath& file) {
240 void MockRenderProcessHost::DisableAecDump() {
243 void MockRenderProcessHost::SetWebRtcLogMessageCallback(
244 base::Callback<void(const std::string&)> callback) {
247 RenderProcessHost::WebRtcStopRtpDumpCallback
248 MockRenderProcessHost::StartRtpDump(
251 const WebRtcRtpPacketCallback& packet_callback) {
252 return WebRtcStopRtpDumpCallback();
256 void MockRenderProcessHost::ResumeDeferredNavigation(
257 const GlobalRequestID& request_id) {}
259 bool MockRenderProcessHost::OnMessageReceived(const IPC::Message& msg) {
260 IPC::Listener* listener = listeners_.Lookup(msg.routing_id());
262 return listener->OnMessageReceived(msg);
266 void MockRenderProcessHost::OnChannelConnected(int32 peer_pid) {
269 MockRenderProcessHostFactory::MockRenderProcessHostFactory() {}
271 MockRenderProcessHostFactory::~MockRenderProcessHostFactory() {
272 // Detach this object from MockRenderProcesses to prevent STLDeleteElements()
273 // from calling MockRenderProcessHostFactory::Remove().
274 for (ScopedVector<MockRenderProcessHost>::iterator it = processes_.begin();
275 it != processes_.end(); ++it) {
276 (*it)->SetFactory(NULL);
280 RenderProcessHost* MockRenderProcessHostFactory::CreateRenderProcessHost(
281 BrowserContext* browser_context,
282 SiteInstance* site_instance) const {
283 MockRenderProcessHost* host = new MockRenderProcessHost(browser_context);
285 processes_.push_back(host);
286 host->SetFactory(this);
291 void MockRenderProcessHostFactory::Remove(MockRenderProcessHost* host) const {
292 for (ScopedVector<MockRenderProcessHost>::iterator it = processes_.begin();
293 it != processes_.end(); ++it) {
295 processes_.weak_erase(it);