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