Upstream version 9.38.198.0
[platform/framework/web/crosswalk.git] / src / content / public / test / mock_render_process_host.cc
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
19 namespace content {
20
21 MockRenderProcessHost::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
37 MockRenderProcessHost::~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
51 void MockRenderProcessHost::EnableSendQueue() {
52 }
53
54 bool MockRenderProcessHost::Init() {
55   return true;
56 }
57
58 int MockRenderProcessHost::GetNextRoutingID() {
59   return ++prev_routing_id_;
60 }
61
62 void MockRenderProcessHost::AddRoute(
63     int32 routing_id,
64     IPC::Listener* listener) {
65   listeners_.AddWithID(listener, routing_id);
66 }
67
68 void MockRenderProcessHost::RemoveRoute(int32 routing_id) {
69   DCHECK(listeners_.Lookup(routing_id) != NULL);
70   listeners_.Remove(routing_id);
71   Cleanup();
72 }
73
74 void MockRenderProcessHost::AddObserver(RenderProcessHostObserver* observer) {
75   observers_.AddObserver(observer);
76 }
77
78 void MockRenderProcessHost::RemoveObserver(
79     RenderProcessHostObserver* observer) {
80   observers_.RemoveObserver(observer);
81 }
82
83 void MockRenderProcessHost::ReceivedBadMessage() {
84   ++bad_msg_count_;
85 }
86
87 void MockRenderProcessHost::WidgetRestored() {
88 }
89
90 void MockRenderProcessHost::WidgetHidden() {
91 }
92
93 int MockRenderProcessHost::VisibleWidgetCount() const {
94   return 1;
95 }
96
97 bool MockRenderProcessHost::IsIsolatedGuest() const {
98   return is_isolated_guest_;
99 }
100
101 StoragePartition* MockRenderProcessHost::GetStoragePartition() const {
102   return NULL;
103 }
104
105 void MockRenderProcessHost::AddWord(const base::string16& word) {
106 }
107
108 bool 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
115 bool MockRenderProcessHost::FastShutdownStarted() const {
116   return fast_shutdown_started_;
117 }
118
119 void MockRenderProcessHost::DumpHandles() {
120 }
121
122 base::ProcessHandle MockRenderProcessHost::GetHandle() const {
123   // Return the current-process handle for the IPC::GetFileHandleForProcess
124   // function.
125   return base::Process::Current().handle();
126 }
127
128 bool MockRenderProcessHost::Send(IPC::Message* msg) {
129   // Save the message in the sink.
130   sink_.OnMessageReceived(*msg);
131   delete msg;
132   return true;
133 }
134
135 int MockRenderProcessHost::GetID() const {
136   return id_;
137 }
138
139 bool MockRenderProcessHost::HasConnection() const {
140   return true;
141 }
142
143 void MockRenderProcessHost::SetIgnoreInputEvents(bool ignore_input_events) {
144 }
145
146 bool MockRenderProcessHost::IgnoreInputEvents() const {
147   return false;
148 }
149
150 void 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
161 void MockRenderProcessHost::AddPendingView() {
162 }
163
164 void MockRenderProcessHost::RemovePendingView() {
165 }
166
167 void MockRenderProcessHost::SetSuddenTerminationAllowed(bool allowed) {
168 }
169
170 bool MockRenderProcessHost::SuddenTerminationAllowed() const {
171   return true;
172 }
173
174 BrowserContext* MockRenderProcessHost::GetBrowserContext() const {
175   return browser_context_;
176 }
177
178 bool MockRenderProcessHost::InSameStoragePartition(
179     StoragePartition* partition) const {
180   // Mock RPHs only have one partition.
181   return true;
182 }
183
184 IPC::ChannelProxy* MockRenderProcessHost::GetChannel() {
185   return NULL;
186 }
187
188 void MockRenderProcessHost::AddFilter(BrowserMessageFilter* filter) {
189 }
190
191 int 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
203 bool MockRenderProcessHost::FastShutdownForPageCount(size_t count) {
204   if (static_cast<size_t>(GetActiveViewCount()) == count)
205     return FastShutdownIfPossible();
206   return false;
207 }
208
209 base::TimeDelta MockRenderProcessHost::GetChildProcessIdleTime() const {
210   return base::TimeDelta::FromMilliseconds(0);
211 }
212
213 void MockRenderProcessHost::ResumeRequestsForView(int route_id) {
214 }
215
216 void MockRenderProcessHost::NotifyTimezoneChange() {
217 }
218
219 ServiceRegistry* MockRenderProcessHost::GetServiceRegistry() {
220   return NULL;
221 }
222
223 void MockRenderProcessHost::FilterURL(bool empty_allowed, GURL* url) {
224   RenderProcessHostImpl::FilterURL(this, empty_allowed, url);
225 }
226
227 #if defined(ENABLE_WEBRTC)
228 void MockRenderProcessHost::EnableAecDump(const base::FilePath& file) {
229 }
230
231 void MockRenderProcessHost::DisableAecDump() {
232 }
233
234 void MockRenderProcessHost::SetWebRtcLogMessageCallback(
235     base::Callback<void(const std::string&)> callback) {
236 }
237
238 RenderProcessHost::WebRtcStopRtpDumpCallback
239 MockRenderProcessHost::StartRtpDump(
240     bool incoming,
241     bool outgoing,
242     const WebRtcRtpPacketCallback& packet_callback) {
243   return WebRtcStopRtpDumpCallback();
244 }
245 #endif
246
247 void MockRenderProcessHost::ResumeDeferredNavigation(
248     const GlobalRequestID& request_id) {}
249
250 bool 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
257 void MockRenderProcessHost::OnChannelConnected(int32 peer_pid) {
258 }
259
260 MockRenderProcessHostFactory::MockRenderProcessHostFactory() {}
261
262 MockRenderProcessHostFactory::~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
271 RenderProcessHost* 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
282 void 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