Upstream version 5.34.104.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     : transport_dib_(NULL),
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_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   delete transport_dib_;
41   if (factory_)
42     factory_->Remove(this);
43
44   // In unit tests, Cleanup() might not have been called.
45   if (!deletion_callback_called_) {
46     FOR_EACH_OBSERVER(RenderProcessHostObserver,
47                       observers_,
48                       RenderProcessHostDestroyed(this));
49     RenderProcessHostImpl::UnregisterHost(GetID());
50   }
51 }
52
53 void MockRenderProcessHost::EnableSendQueue() {
54 }
55
56 bool MockRenderProcessHost::Init() {
57   return true;
58 }
59
60 int MockRenderProcessHost::GetNextRoutingID() {
61   return ++prev_routing_id_;
62 }
63
64 void MockRenderProcessHost::AddRoute(
65     int32 routing_id,
66     IPC::Listener* listener) {
67   listeners_.AddWithID(listener, routing_id);
68 }
69
70 void MockRenderProcessHost::RemoveRoute(int32 routing_id) {
71   DCHECK(listeners_.Lookup(routing_id) != NULL);
72   listeners_.Remove(routing_id);
73   Cleanup();
74 }
75
76 void MockRenderProcessHost::AddObserver(RenderProcessHostObserver* observer) {
77   observers_.AddObserver(observer);
78 }
79
80 void MockRenderProcessHost::RemoveObserver(
81     RenderProcessHostObserver* observer) {
82   observers_.RemoveObserver(observer);
83 }
84
85 bool MockRenderProcessHost::WaitForBackingStoreMsg(
86     int render_widget_id,
87     const base::TimeDelta& max_delay,
88     IPC::Message* msg) {
89   return false;
90 }
91
92 void MockRenderProcessHost::ReceivedBadMessage() {
93   ++bad_msg_count_;
94 }
95
96 void MockRenderProcessHost::WidgetRestored() {
97 }
98
99 void MockRenderProcessHost::WidgetHidden() {
100 }
101
102 int MockRenderProcessHost::VisibleWidgetCount() const {
103   return 1;
104 }
105
106 bool MockRenderProcessHost::IsGuest() const {
107   return is_guest_;
108 }
109
110 StoragePartition* MockRenderProcessHost::GetStoragePartition() const {
111   return NULL;
112 }
113
114 void MockRenderProcessHost::AddWord(const base::string16& word) {
115 }
116
117 bool MockRenderProcessHost::FastShutdownIfPossible() {
118   // We aren't actually going to do anything, but set |fast_shutdown_started_|
119   // to true so that tests know we've been called.
120   fast_shutdown_started_ = true;
121   return true;
122 }
123
124 bool MockRenderProcessHost::FastShutdownStarted() const {
125   return fast_shutdown_started_;
126 }
127
128 void MockRenderProcessHost::DumpHandles() {
129 }
130
131 base::ProcessHandle MockRenderProcessHost::GetHandle() const {
132   // Return the current-process handle for the IPC::GetFileHandleForProcess
133   // function.
134   return base::Process::Current().handle();
135 }
136
137 bool MockRenderProcessHost::Send(IPC::Message* msg) {
138   // Save the message in the sink.
139   sink_.OnMessageReceived(*msg);
140   delete msg;
141   return true;
142 }
143
144 TransportDIB* MockRenderProcessHost::MapTransportDIB(TransportDIB::Id dib_id) {
145 #if defined(OS_WIN)
146   HANDLE duped;
147   DuplicateHandle(GetCurrentProcess(), dib_id.handle, GetCurrentProcess(),
148                   &duped, 0, TRUE, DUPLICATE_SAME_ACCESS);
149   return TransportDIB::Map(duped);
150 #elif defined(TOOLKIT_GTK)
151   return TransportDIB::Map(dib_id.shmkey);
152 #elif defined(OS_ANDROID)
153   // On Android, Handles and Ids are the same underlying type.
154   return TransportDIB::Map(dib_id);
155 #else
156   // On POSIX, TransportDIBs are always created in the browser, so we cannot map
157   // one from a dib_id.
158   return TransportDIB::Create(100 * 100 * 4, 0);
159 #endif
160 }
161
162 TransportDIB* MockRenderProcessHost::GetTransportDIB(TransportDIB::Id dib_id) {
163   if (transport_dib_)
164     return transport_dib_;
165
166   transport_dib_ = MapTransportDIB(dib_id);
167   return transport_dib_;
168 }
169
170 int MockRenderProcessHost::GetID() const {
171   return id_;
172 }
173
174 bool MockRenderProcessHost::HasConnection() const {
175   return true;
176 }
177
178 void MockRenderProcessHost::SetIgnoreInputEvents(bool ignore_input_events) {
179 }
180
181 bool MockRenderProcessHost::IgnoreInputEvents() const {
182   return false;
183 }
184
185 void MockRenderProcessHost::Cleanup() {
186   if (listeners_.IsEmpty()) {
187     FOR_EACH_OBSERVER(RenderProcessHostObserver,
188                       observers_,
189                       RenderProcessHostDestroyed(this));
190     base::MessageLoop::current()->DeleteSoon(FROM_HERE, this);
191     RenderProcessHostImpl::UnregisterHost(GetID());
192     deletion_callback_called_ = true;
193   }
194 }
195
196 void MockRenderProcessHost::AddPendingView() {
197 }
198
199 void MockRenderProcessHost::RemovePendingView() {
200 }
201
202 void MockRenderProcessHost::SetSuddenTerminationAllowed(bool allowed) {
203 }
204
205 bool MockRenderProcessHost::SuddenTerminationAllowed() const {
206   return true;
207 }
208
209 BrowserContext* MockRenderProcessHost::GetBrowserContext() const {
210   return browser_context_;
211 }
212
213 bool MockRenderProcessHost::InSameStoragePartition(
214     StoragePartition* partition) const {
215   // Mock RPHs only have one partition.
216   return true;
217 }
218
219 IPC::ChannelProxy* MockRenderProcessHost::GetChannel() {
220   return NULL;
221 }
222
223 void MockRenderProcessHost::AddFilter(BrowserMessageFilter* filter) {
224 }
225
226 int MockRenderProcessHost::GetActiveViewCount() {
227   int num_active_views = 0;
228   scoped_ptr<RenderWidgetHostIterator> widgets(
229       RenderWidgetHost::GetRenderWidgetHosts());
230   while (RenderWidgetHost* widget = widgets->GetNextHost()) {
231     // Count only RenderWidgetHosts in this process.
232     if (widget->GetProcess()->GetID() == GetID())
233       num_active_views++;
234   }
235   return num_active_views;
236 }
237
238 bool MockRenderProcessHost::FastShutdownForPageCount(size_t count) {
239   if (static_cast<size_t>(GetActiveViewCount()) == count)
240     return FastShutdownIfPossible();
241   return false;
242 }
243
244 base::TimeDelta MockRenderProcessHost::GetChildProcessIdleTime() const {
245   return base::TimeDelta::FromMilliseconds(0);
246 }
247
248 void MockRenderProcessHost::ResumeRequestsForView(int route_id) {
249 }
250
251 void MockRenderProcessHost::FilterURL(bool empty_allowed, GURL* url) {
252   RenderProcessHostImpl::FilterURL(this, empty_allowed, url);
253 }
254
255 #if defined(ENABLE_WEBRTC)
256 void MockRenderProcessHost::EnableAecDump(const base::FilePath& file) {
257 }
258
259 void MockRenderProcessHost::DisableAecDump() {
260 }
261
262 void MockRenderProcessHost::SetWebRtcLogMessageCallback(
263     base::Callback<void(const std::string&)> callback) {
264 }
265 #endif
266
267 void MockRenderProcessHost::ResumeDeferredNavigation(
268     const GlobalRequestID& request_id) {}
269
270 bool MockRenderProcessHost::OnMessageReceived(const IPC::Message& msg) {
271   IPC::Listener* listener = listeners_.Lookup(msg.routing_id());
272   if (listener)
273     return listener->OnMessageReceived(msg);
274   return false;
275 }
276
277 void MockRenderProcessHost::OnChannelConnected(int32 peer_pid) {
278 }
279
280 MockRenderProcessHostFactory::MockRenderProcessHostFactory() {}
281
282 MockRenderProcessHostFactory::~MockRenderProcessHostFactory() {
283   // Detach this object from MockRenderProcesses to prevent STLDeleteElements()
284   // from calling MockRenderProcessHostFactory::Remove().
285   for (ScopedVector<MockRenderProcessHost>::iterator it = processes_.begin();
286        it != processes_.end(); ++it) {
287     (*it)->SetFactory(NULL);
288   }
289 }
290
291 RenderProcessHost* MockRenderProcessHostFactory::CreateRenderProcessHost(
292     BrowserContext* browser_context,
293     SiteInstance* site_instance) const {
294   MockRenderProcessHost* host = new MockRenderProcessHost(browser_context);
295   if (host) {
296     processes_.push_back(host);
297     host->SetFactory(this);
298   }
299   return host;
300 }
301
302 void MockRenderProcessHostFactory::Remove(MockRenderProcessHost* host) const {
303   for (ScopedVector<MockRenderProcessHost>::iterator it = processes_.begin();
304        it != processes_.end(); ++it) {
305     if (*it == host) {
306       processes_.weak_erase(it);
307       break;
308     }
309   }
310 }
311
312 }  // content