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/test/test_render_view_host.h"
6
7#include "base/memory/scoped_ptr.h"
8#include "content/browser/dom_storage/dom_storage_context_wrapper.h"
9#include "content/browser/dom_storage/session_storage_namespace_impl.h"
10#include "content/browser/site_instance_impl.h"
11#include "content/common/dom_storage/dom_storage_types.h"
12#include "content/common/view_messages.h"
13#include "content/public/browser/browser_context.h"
14#include "content/public/browser/navigation_controller.h"
15#include "content/public/browser/storage_partition.h"
16#include "content/public/common/content_client.h"
17#include "content/public/common/page_state.h"
18#include "content/test/test_backing_store.h"
19#include "content/test/test_web_contents.h"
20#include "media/base/video_frame.h"
21#include "ui/gfx/rect.h"
22#include "webkit/common/webpreferences.h"
23
24namespace content {
25
26namespace {
27
28const int64 kFrameId = 13UL;
29
30}  // namespace
31
32
33void InitNavigateParams(ViewHostMsg_FrameNavigate_Params* params,
34                        int page_id,
35                        const GURL& url,
36                        PageTransition transition) {
37  params->page_id = page_id;
38  params->url = url;
39  params->referrer = Referrer();
40  params->transition = transition;
41  params->redirects = std::vector<GURL>();
42  params->should_update_history = false;
43  params->searchable_form_url = GURL();
44  params->searchable_form_encoding = std::string();
45  params->security_info = std::string();
46  params->gesture = NavigationGestureUser;
47  params->was_within_same_page = false;
48  params->is_post = false;
49  params->page_state = PageState::CreateFromURL(url);
50}
51
52TestRenderWidgetHostView::TestRenderWidgetHostView(RenderWidgetHost* rwh)
53    : rwh_(RenderWidgetHostImpl::From(rwh)),
54      is_showing_(false),
55      did_swap_compositor_frame_(false) {
56  rwh_->SetView(this);
57}
58
59TestRenderWidgetHostView::~TestRenderWidgetHostView() {
60}
61
62RenderWidgetHost* TestRenderWidgetHostView::GetRenderWidgetHost() const {
63  return NULL;
64}
65
66gfx::NativeView TestRenderWidgetHostView::GetNativeView() const {
67  return NULL;
68}
69
70gfx::NativeViewId TestRenderWidgetHostView::GetNativeViewId() const {
71  return 0;
72}
73
74gfx::NativeViewAccessible TestRenderWidgetHostView::GetNativeViewAccessible() {
75  return NULL;
76}
77
78bool TestRenderWidgetHostView::HasFocus() const {
79  return true;
80}
81
82bool TestRenderWidgetHostView::IsSurfaceAvailableForCopy() const {
83  return true;
84}
85
86void TestRenderWidgetHostView::Show() {
87  is_showing_ = true;
88}
89
90void TestRenderWidgetHostView::Hide() {
91  is_showing_ = false;
92}
93
94bool TestRenderWidgetHostView::IsShowing() {
95  return is_showing_;
96}
97
98void TestRenderWidgetHostView::RenderProcessGone(base::TerminationStatus status,
99                                                 int error_code) {
100  delete this;
101}
102
103void TestRenderWidgetHostView::Destroy() { delete this; }
104
105gfx::Rect TestRenderWidgetHostView::GetViewBounds() const {
106  return gfx::Rect();
107}
108
109BackingStore* TestRenderWidgetHostView::AllocBackingStore(
110    const gfx::Size& size) {
111  return new TestBackingStore(rwh_, size);
112}
113
114void TestRenderWidgetHostView::CopyFromCompositingSurface(
115    const gfx::Rect& src_subrect,
116    const gfx::Size& dst_size,
117    const base::Callback<void(bool, const SkBitmap&)>& callback) {
118  callback.Run(false, SkBitmap());
119}
120
121void TestRenderWidgetHostView::CopyFromCompositingSurfaceToVideoFrame(
122    const gfx::Rect& src_subrect,
123    const scoped_refptr<media::VideoFrame>& target,
124    const base::Callback<void(bool)>& callback) {
125  callback.Run(false);
126}
127
128bool TestRenderWidgetHostView::CanCopyToVideoFrame() const {
129  return false;
130}
131
132void TestRenderWidgetHostView::OnAcceleratedCompositingStateChange() {
133}
134
135void TestRenderWidgetHostView::AcceleratedSurfaceInitialized(int host_id,
136                                                             int route_id) {
137}
138
139void TestRenderWidgetHostView::AcceleratedSurfaceBuffersSwapped(
140    const GpuHostMsg_AcceleratedSurfaceBuffersSwapped_Params& params,
141    int gpu_host_id) {
142}
143
144void TestRenderWidgetHostView::AcceleratedSurfacePostSubBuffer(
145    const GpuHostMsg_AcceleratedSurfacePostSubBuffer_Params& params,
146    int gpu_host_id) {
147}
148
149void TestRenderWidgetHostView::AcceleratedSurfaceSuspend() {
150}
151
152bool TestRenderWidgetHostView::HasAcceleratedSurface(
153      const gfx::Size& desired_size) {
154  return false;
155}
156
157#if defined(OS_MACOSX)
158
159void TestRenderWidgetHostView::AboutToWaitForBackingStoreMsg() {
160}
161
162void TestRenderWidgetHostView::SetActive(bool active) {
163  // <viettrungluu@gmail.com>: Do I need to do anything here?
164}
165
166bool TestRenderWidgetHostView::SupportsSpeech() const {
167  return false;
168}
169
170void TestRenderWidgetHostView::SpeakSelection() {
171}
172
173bool TestRenderWidgetHostView::IsSpeaking() const {
174  return false;
175}
176
177void TestRenderWidgetHostView::StopSpeaking() {
178}
179
180bool TestRenderWidgetHostView::PostProcessEventForPluginIme(
181    const NativeWebKeyboardEvent& event) {
182  return false;
183}
184
185#elif defined(OS_WIN) && !defined(USE_AURA)
186void TestRenderWidgetHostView::WillWmDestroy() {
187}
188#endif
189
190gfx::Rect TestRenderWidgetHostView::GetBoundsInRootWindow() {
191  return gfx::Rect();
192}
193
194#if defined(TOOLKIT_GTK)
195GdkEventButton* TestRenderWidgetHostView::GetLastMouseDown() {
196  return NULL;
197}
198
199gfx::NativeView TestRenderWidgetHostView::BuildInputMethodsGtkMenu() {
200  return NULL;
201}
202#endif  // defined(TOOLKIT_GTK)
203
204void TestRenderWidgetHostView::OnSwapCompositorFrame(
205    uint32 output_surface_id,
206    scoped_ptr<cc::CompositorFrame> frame) {
207  did_swap_compositor_frame_ = true;
208}
209
210
211gfx::GLSurfaceHandle TestRenderWidgetHostView::GetCompositingSurface() {
212  return gfx::GLSurfaceHandle();
213}
214
215#if defined(OS_WIN) && !defined(USE_AURA)
216void TestRenderWidgetHostView::SetClickthroughRegion(SkRegion* region) {
217}
218#endif
219
220bool TestRenderWidgetHostView::LockMouse() {
221  return false;
222}
223
224void TestRenderWidgetHostView::UnlockMouse() {
225}
226
227#if defined(OS_WIN) && defined(USE_AURA)
228void TestRenderWidgetHostView::SetParentNativeViewAccessible(
229    gfx::NativeViewAccessible accessible_parent) {
230}
231
232gfx::NativeViewId TestRenderWidgetHostView::GetParentForWindowlessPlugin()
233    const {
234  return 0;
235}
236#endif
237
238TestRenderViewHost::TestRenderViewHost(
239    SiteInstance* instance,
240    RenderViewHostDelegate* delegate,
241    RenderFrameHostDelegate* frame_delegate,
242    RenderWidgetHostDelegate* widget_delegate,
243    int routing_id,
244    int main_frame_routing_id,
245    bool swapped_out)
246    : RenderViewHostImpl(instance,
247                         delegate,
248                         frame_delegate,
249                         widget_delegate,
250                         routing_id,
251                         main_frame_routing_id,
252                         swapped_out,
253                         false /* hidden */),
254      render_view_created_(false),
255      delete_counter_(NULL),
256      simulate_fetch_via_proxy_(false),
257      simulate_history_list_was_cleared_(false),
258      contents_mime_type_("text/html"),
259      opener_route_id_(MSG_ROUTING_NONE) {
260  // TestRenderWidgetHostView installs itself into this->view_ in its
261  // constructor, and deletes itself when TestRenderWidgetHostView::Destroy() is
262  // called.
263  new TestRenderWidgetHostView(this);
264
265  main_frame_id_ = kFrameId;
266}
267
268TestRenderViewHost::~TestRenderViewHost() {
269  if (delete_counter_)
270    ++*delete_counter_;
271}
272
273bool TestRenderViewHost::CreateRenderView(
274    const base::string16& frame_name,
275    int opener_route_id,
276    int32 max_page_id) {
277  DCHECK(!render_view_created_);
278  render_view_created_ = true;
279  opener_route_id_ = opener_route_id;
280  return true;
281}
282
283bool TestRenderViewHost::IsRenderViewLive() const {
284  return render_view_created_;
285}
286
287void TestRenderViewHost::SendNavigate(int page_id, const GURL& url) {
288  SendNavigateWithTransition(page_id, url, PAGE_TRANSITION_LINK);
289}
290
291void TestRenderViewHost::SendFailedNavigate(int page_id, const GURL& url) {
292  SendNavigateWithTransitionAndResponseCode(
293      page_id, url, PAGE_TRANSITION_LINK, 500);
294}
295
296void TestRenderViewHost::SendNavigateWithTransition(
297    int page_id, const GURL& url, PageTransition transition) {
298  SendNavigateWithTransitionAndResponseCode(page_id, url, transition, 200);
299}
300
301void TestRenderViewHost::SendNavigateWithOriginalRequestURL(
302    int page_id, const GURL& url, const GURL& original_request_url) {
303  main_render_frame_host()->OnDidStartProvisionalLoadForFrame(
304      kFrameId, -1, true, url);
305  SendNavigateWithParameters(page_id, url, PAGE_TRANSITION_LINK,
306                             original_request_url, 200, 0);
307}
308
309void TestRenderViewHost::SendNavigateWithFile(
310    int page_id, const GURL& url, const base::FilePath& file_path) {
311  SendNavigateWithParameters(page_id, url, PAGE_TRANSITION_LINK,
312                             url, 200, &file_path);
313}
314
315void TestRenderViewHost::SendNavigateWithParams(
316    ViewHostMsg_FrameNavigate_Params* params) {
317  params->frame_id = kFrameId;
318  ViewHostMsg_FrameNavigate msg(1, *params);
319  OnNavigate(msg);
320}
321
322void TestRenderViewHost::SendNavigateWithTransitionAndResponseCode(
323    int page_id, const GURL& url, PageTransition transition,
324    int response_code) {
325  // DidStartProvisionalLoad may delete the pending entry that holds |url|,
326  // so we keep a copy of it to use in SendNavigateWithParameters.
327  GURL url_copy(url);
328  main_render_frame_host()->OnDidStartProvisionalLoadForFrame(
329      kFrameId, -1, true, url_copy);
330  SendNavigateWithParameters(page_id, url_copy, transition, url_copy,
331                             response_code, 0);
332}
333
334void TestRenderViewHost::SendNavigateWithParameters(
335    int page_id, const GURL& url, PageTransition transition,
336    const GURL& original_request_url, int response_code,
337    const base::FilePath* file_path_for_history_item) {
338  ViewHostMsg_FrameNavigate_Params params;
339  params.page_id = page_id;
340  params.frame_id = kFrameId;
341  params.url = url;
342  params.referrer = Referrer();
343  params.transition = transition;
344  params.redirects = std::vector<GURL>();
345  params.should_update_history = true;
346  params.searchable_form_url = GURL();
347  params.searchable_form_encoding = std::string();
348  params.security_info = std::string();
349  params.gesture = NavigationGestureUser;
350  params.contents_mime_type = contents_mime_type_;
351  params.is_post = false;
352  params.was_within_same_page = false;
353  params.http_status_code = response_code;
354  params.socket_address.set_host("2001:db8::1");
355  params.socket_address.set_port(80);
356  params.was_fetched_via_proxy = simulate_fetch_via_proxy_;
357  params.history_list_was_cleared = simulate_history_list_was_cleared_;
358  params.original_request_url = original_request_url;
359
360  params.page_state = PageState::CreateForTesting(
361      url,
362      false,
363      file_path_for_history_item ? "data" : NULL,
364      file_path_for_history_item);
365
366  ViewHostMsg_FrameNavigate msg(1, params);
367  OnNavigate(msg);
368}
369
370void TestRenderViewHost::SendShouldCloseACK(bool proceed) {
371  base::TimeTicks now = base::TimeTicks::Now();
372  OnShouldCloseACK(proceed, now, now);
373}
374
375void TestRenderViewHost::SetContentsMimeType(const std::string& mime_type) {
376  contents_mime_type_ = mime_type;
377}
378
379void TestRenderViewHost::SimulateSwapOutACK() {
380  OnSwappedOut(false);
381}
382
383void TestRenderViewHost::SimulateWasHidden() {
384  WasHidden();
385}
386
387void TestRenderViewHost::SimulateWasShown() {
388  WasShown();
389}
390
391void TestRenderViewHost::TestOnStartDragging(
392    const DropData& drop_data) {
393  blink::WebDragOperationsMask drag_operation = blink::WebDragOperationEvery;
394  DragEventSourceInfo event_info;
395  OnStartDragging(drop_data, drag_operation, SkBitmap(), gfx::Vector2d(),
396                  event_info);
397}
398
399void TestRenderViewHost::TestOnUpdateStateWithFile(
400    int process_id,
401    const base::FilePath& file_path) {
402  OnUpdateState(process_id,
403                PageState::CreateForTesting(GURL("http://www.google.com"),
404                                            false,
405                                            "data",
406                                            &file_path));
407}
408
409void TestRenderViewHost::set_simulate_fetch_via_proxy(bool proxy) {
410  simulate_fetch_via_proxy_ = proxy;
411}
412
413void TestRenderViewHost::set_simulate_history_list_was_cleared(bool cleared) {
414  simulate_history_list_was_cleared_ = cleared;
415}
416
417RenderViewHostImplTestHarness::RenderViewHostImplTestHarness() {
418  std::vector<ui::ScaleFactor> scale_factors;
419  scale_factors.push_back(ui::SCALE_FACTOR_100P);
420  scoped_set_supported_scale_factors_.reset(
421      new ui::test::ScopedSetSupportedScaleFactors(scale_factors));
422}
423
424RenderViewHostImplTestHarness::~RenderViewHostImplTestHarness() {
425}
426
427TestRenderViewHost* RenderViewHostImplTestHarness::test_rvh() {
428  return static_cast<TestRenderViewHost*>(rvh());
429}
430
431TestRenderViewHost* RenderViewHostImplTestHarness::pending_test_rvh() {
432  return static_cast<TestRenderViewHost*>(pending_rvh());
433}
434
435TestRenderViewHost* RenderViewHostImplTestHarness::active_test_rvh() {
436  return static_cast<TestRenderViewHost*>(active_rvh());
437}
438
439TestRenderFrameHost* RenderViewHostImplTestHarness::main_test_rfh() {
440  return static_cast<TestRenderFrameHost*>(main_rfh());
441}
442
443TestWebContents* RenderViewHostImplTestHarness::contents() {
444  return static_cast<TestWebContents*>(web_contents());
445}
446
447}  // namespace content
448