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