Update To 11.40.268.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/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"
19
20 namespace content {
21
22 MockRenderProcessHost::MockRenderProcessHost(BrowserContext* browser_context)
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_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());
34
35   RenderProcessHostImpl::RegisterHost(GetID(), this);
36 }
37
38 MockRenderProcessHost::~MockRenderProcessHost() {
39   ChildProcessSecurityPolicyImpl::GetInstance()->Remove(GetID());
40   if (factory_)
41     factory_->Remove(this);
42
43   // In unit tests, Cleanup() might not have been called.
44   if (!deletion_callback_called_) {
45     FOR_EACH_OBSERVER(RenderProcessHostObserver,
46                       observers_,
47                       RenderProcessHostDestroyed(this));
48     RenderProcessHostImpl::UnregisterHost(GetID());
49   }
50 }
51
52 void MockRenderProcessHost::EnableSendQueue() {
53 }
54
55 bool MockRenderProcessHost::Init() {
56   return true;
57 }
58
59 int MockRenderProcessHost::GetNextRoutingID() {
60   return ++prev_routing_id_;
61 }
62
63 void MockRenderProcessHost::AddRoute(
64     int32 routing_id,
65     IPC::Listener* listener) {
66   listeners_.AddWithID(listener, routing_id);
67 }
68
69 void MockRenderProcessHost::RemoveRoute(int32 routing_id) {
70   DCHECK(listeners_.Lookup(routing_id) != NULL);
71   listeners_.Remove(routing_id);
72   Cleanup();
73 }
74
75 void MockRenderProcessHost::AddObserver(RenderProcessHostObserver* observer) {
76   observers_.AddObserver(observer);
77 }
78
79 void MockRenderProcessHost::RemoveObserver(
80     RenderProcessHostObserver* observer) {
81   observers_.RemoveObserver(observer);
82 }
83
84 void MockRenderProcessHost::ReceivedBadMessage() {
85   ++bad_msg_count_;
86 }
87
88 void MockRenderProcessHost::WidgetRestored() {
89 }
90
91 void MockRenderProcessHost::WidgetHidden() {
92 }
93
94 int MockRenderProcessHost::VisibleWidgetCount() const {
95   return 1;
96 }
97
98 bool MockRenderProcessHost::IsIsolatedGuest() const {
99   return is_isolated_guest_;
100 }
101
102 StoragePartition* MockRenderProcessHost::GetStoragePartition() const {
103   return NULL;
104 }
105
106 void MockRenderProcessHost::AddWord(const base::string16& word) {
107 }
108
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;
113   return true;
114 }
115
116 bool MockRenderProcessHost::FastShutdownStarted() const {
117   return fast_shutdown_started_;
118 }
119
120 void MockRenderProcessHost::DumpHandles() {
121 }
122
123 base::ProcessHandle MockRenderProcessHost::GetHandle() const {
124   // Return the current-process handle for the IPC::GetFileHandleForProcess
125   // function.
126   if (process_handle)
127     return *process_handle;
128   return base::GetCurrentProcessHandle();
129 }
130
131 bool MockRenderProcessHost::Send(IPC::Message* msg) {
132   // Save the message in the sink.
133   sink_.OnMessageReceived(*msg);
134   delete msg;
135   return true;
136 }
137
138 int MockRenderProcessHost::GetID() const {
139   return id_;
140 }
141
142 bool MockRenderProcessHost::HasConnection() const {
143   return true;
144 }
145
146 void MockRenderProcessHost::SetIgnoreInputEvents(bool ignore_input_events) {
147 }
148
149 bool MockRenderProcessHost::IgnoreInputEvents() const {
150   return false;
151 }
152
153 void MockRenderProcessHost::Cleanup() {
154   if (listeners_.IsEmpty()) {
155     FOR_EACH_OBSERVER(RenderProcessHostObserver,
156                       observers_,
157                       RenderProcessHostDestroyed(this));
158     base::MessageLoop::current()->DeleteSoon(FROM_HERE, this);
159     RenderProcessHostImpl::UnregisterHost(GetID());
160     deletion_callback_called_ = true;
161   }
162 }
163
164 void MockRenderProcessHost::AddPendingView() {
165 }
166
167 void MockRenderProcessHost::RemovePendingView() {
168 }
169
170 void MockRenderProcessHost::SetSuddenTerminationAllowed(bool allowed) {
171 }
172
173 bool MockRenderProcessHost::SuddenTerminationAllowed() const {
174   return true;
175 }
176
177 BrowserContext* MockRenderProcessHost::GetBrowserContext() const {
178   return browser_context_;
179 }
180
181 bool MockRenderProcessHost::InSameStoragePartition(
182     StoragePartition* partition) const {
183   // Mock RPHs only have one partition.
184   return true;
185 }
186
187 IPC::ChannelProxy* MockRenderProcessHost::GetChannel() {
188   return NULL;
189 }
190
191 void MockRenderProcessHost::AddFilter(BrowserMessageFilter* filter) {
192 }
193
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())
201       num_active_views++;
202   }
203   return num_active_views;
204 }
205
206 bool MockRenderProcessHost::FastShutdownForPageCount(size_t count) {
207   if (static_cast<size_t>(GetActiveViewCount()) == count)
208     return FastShutdownIfPossible();
209   return false;
210 }
211
212 base::TimeDelta MockRenderProcessHost::GetChildProcessIdleTime() const {
213   return base::TimeDelta::FromMilliseconds(0);
214 }
215
216 void MockRenderProcessHost::ResumeRequestsForView(int route_id) {
217 }
218
219 void MockRenderProcessHost::NotifyTimezoneChange() {
220 }
221
222 ServiceRegistry* MockRenderProcessHost::GetServiceRegistry() {
223   return NULL;
224 }
225
226 const base::TimeTicks& MockRenderProcessHost::GetInitTimeForNavigationMetrics()
227     const {
228   static base::TimeTicks dummy_time = base::TimeTicks::Now();
229   return dummy_time;
230 }
231
232 void MockRenderProcessHost::FilterURL(bool empty_allowed, GURL* url) {
233   RenderProcessHostImpl::FilterURL(this, empty_allowed, url);
234 }
235
236 #if defined(ENABLE_WEBRTC)
237 void MockRenderProcessHost::EnableAecDump(const base::FilePath& file) {
238 }
239
240 void MockRenderProcessHost::DisableAecDump() {
241 }
242
243 void MockRenderProcessHost::SetWebRtcLogMessageCallback(
244     base::Callback<void(const std::string&)> callback) {
245 }
246
247 RenderProcessHost::WebRtcStopRtpDumpCallback
248 MockRenderProcessHost::StartRtpDump(
249     bool incoming,
250     bool outgoing,
251     const WebRtcRtpPacketCallback& packet_callback) {
252   return WebRtcStopRtpDumpCallback();
253 }
254 #endif
255
256 void MockRenderProcessHost::ResumeDeferredNavigation(
257     const GlobalRequestID& request_id) {}
258
259 bool MockRenderProcessHost::OnMessageReceived(const IPC::Message& msg) {
260   IPC::Listener* listener = listeners_.Lookup(msg.routing_id());
261   if (listener)
262     return listener->OnMessageReceived(msg);
263   return false;
264 }
265
266 void MockRenderProcessHost::OnChannelConnected(int32 peer_pid) {
267 }
268
269 MockRenderProcessHostFactory::MockRenderProcessHostFactory() {}
270
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);
277   }
278 }
279
280 RenderProcessHost* MockRenderProcessHostFactory::CreateRenderProcessHost(
281     BrowserContext* browser_context,
282     SiteInstance* site_instance) const {
283   MockRenderProcessHost* host = new MockRenderProcessHost(browser_context);
284   if (host) {
285     processes_.push_back(host);
286     host->SetFactory(this);
287   }
288   return host;
289 }
290
291 void MockRenderProcessHostFactory::Remove(MockRenderProcessHost* host) const {
292   for (ScopedVector<MockRenderProcessHost>::iterator it = processes_.begin();
293        it != processes_.end(); ++it) {
294     if (*it == host) {
295       processes_.weak_erase(it);
296       break;
297     }
298   }
299 }
300
301 }  // content