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 <memory>
8 
9 #include "base/optional.h"
10 #include "base/strings/utf_string_conversions.h"
11 #include "build/build_config.h"
12 #include "components/viz/common/surfaces/parent_local_surface_id_allocator.h"
13 #include "components/viz/host/host_frame_sink_manager.h"
14 #include "content/browser/compositor/image_transport_factory.h"
15 #include "content/browser/compositor/surface_utils.h"
16 #include "content/browser/dom_storage/dom_storage_context_wrapper.h"
17 #include "content/browser/dom_storage/session_storage_namespace_impl.h"
18 #include "content/browser/renderer_host/drop_data_util.h"
19 #include "content/browser/renderer_host/input/synthetic_gesture_target.h"
20 #include "content/browser/renderer_host/render_widget_host_input_event_router.h"
21 #include "content/browser/site_instance_impl.h"
22 #include "content/browser/storage_partition_impl.h"
23 #include "content/common/frame_messages.h"
24 #include "content/public/browser/browser_context.h"
25 #include "content/public/browser/browser_thread.h"
26 #include "content/public/browser/navigation_controller.h"
27 #include "content/public/browser/storage_partition.h"
28 #include "content/public/common/content_client.h"
29 #include "content/public/common/drop_data.h"
30 #include "content/test/test_render_frame_host.h"
31 #include "content/test/test_render_view_host.h"
32 #include "content/test/test_web_contents.h"
33 #include "media/base/video_frame.h"
34 #include "mojo/public/cpp/bindings/pending_remote.h"
35 #include "third_party/blink/public/common/page_state/page_state.h"
36 #include "third_party/blink/public/common/web_preferences/web_preferences.h"
37 #include "third_party/blink/public/mojom/page/drag.mojom.h"
38 #include "ui/aura/env.h"
39 #include "ui/compositor/compositor.h"
40 #include "ui/compositor/layer_type.h"
41 #include "ui/gfx/geometry/rect.h"
42 
43 #if defined(USE_AURA)
44 #include "ui/aura/test/test_window_delegate.h"
45 #endif
46 
47 namespace content {
48 
InitNavigateParams(FrameHostMsg_DidCommitProvisionalLoad_Params * params,int nav_entry_id,bool did_create_new_entry,const GURL & url,ui::PageTransition transition)49 void InitNavigateParams(FrameHostMsg_DidCommitProvisionalLoad_Params* params,
50                         int nav_entry_id,
51                         bool did_create_new_entry,
52                         const GURL& url,
53                         ui::PageTransition transition) {
54   params->nav_entry_id = nav_entry_id;
55   params->url = url;
56   params->origin = url::Origin::Create(url);
57   params->referrer = Referrer();
58   params->transition = transition;
59   params->redirects = std::vector<GURL>();
60   params->should_update_history = false;
61   params->did_create_new_entry = did_create_new_entry;
62   params->gesture = NavigationGestureUser;
63   params->method = "GET";
64   params->page_state = blink::PageState::CreateFromURL(url);
65 }
66 
TestRenderWidgetHostView(RenderWidgetHost * rwh)67 TestRenderWidgetHostView::TestRenderWidgetHostView(RenderWidgetHost* rwh)
68     : RenderWidgetHostViewBase(rwh), is_showing_(false), is_occluded_(false) {
69 #if defined(OS_ANDROID)
70   frame_sink_id_ = AllocateFrameSinkId();
71   GetHostFrameSinkManager()->RegisterFrameSinkId(
72       frame_sink_id_, this, viz::ReportFirstSurfaceActivation::kYes);
73 #else
74   default_background_color_ = SK_ColorWHITE;
75   // Not all tests initialize or need an image transport factory.
76   if (ImageTransportFactory::GetInstance()) {
77     frame_sink_id_ = AllocateFrameSinkId();
78     GetHostFrameSinkManager()->RegisterFrameSinkId(
79         frame_sink_id_, this, viz::ReportFirstSurfaceActivation::kYes);
80 #if DCHECK_IS_ON()
81     GetHostFrameSinkManager()->SetFrameSinkDebugLabel(
82         frame_sink_id_, "TestRenderWidgetHostView");
83 #endif
84   }
85 #endif
86 
87   host()->SetView(this);
88 
89   if (host()->delegate() && host()->delegate()->GetInputEventRouter() &&
90       GetFrameSinkId().is_valid()) {
91     host()->delegate()->GetInputEventRouter()->AddFrameSinkIdOwner(
92         GetFrameSinkId(), this);
93   }
94 
95 #if defined(USE_AURA)
96   window_.reset(new aura::Window(
97       aura::test::TestWindowDelegate::CreateSelfDestroyingDelegate()));
98   window_->set_owned_by_parent(false);
99   window_->Init(ui::LayerType::LAYER_NOT_DRAWN);
100 #endif
101 }
102 
~TestRenderWidgetHostView()103 TestRenderWidgetHostView::~TestRenderWidgetHostView() {
104   viz::HostFrameSinkManager* manager = GetHostFrameSinkManager();
105   if (manager)
106     manager->InvalidateFrameSinkId(frame_sink_id_);
107 }
108 
GetNativeView()109 gfx::NativeView TestRenderWidgetHostView::GetNativeView() {
110 #if defined(USE_AURA)
111   return window_.get();
112 #else
113   return nullptr;
114 #endif
115 }
116 
GetNativeViewAccessible()117 gfx::NativeViewAccessible TestRenderWidgetHostView::GetNativeViewAccessible() {
118   return nullptr;
119 }
120 
GetTextInputClient()121 ui::TextInputClient* TestRenderWidgetHostView::GetTextInputClient() {
122   return &text_input_client_;
123 }
124 
HasFocus()125 bool TestRenderWidgetHostView::HasFocus() {
126   return true;
127 }
128 
Show()129 void TestRenderWidgetHostView::Show() {
130   is_showing_ = true;
131   is_occluded_ = false;
132 }
133 
Hide()134 void TestRenderWidgetHostView::Hide() {
135   is_showing_ = false;
136 }
137 
IsShowing()138 bool TestRenderWidgetHostView::IsShowing() {
139   return is_showing_;
140 }
141 
WasUnOccluded()142 void TestRenderWidgetHostView::WasUnOccluded() {
143   is_occluded_ = false;
144 }
145 
WasOccluded()146 void TestRenderWidgetHostView::WasOccluded() {
147   is_occluded_ = true;
148 }
149 
EnsureSurfaceSynchronizedForWebTest()150 void TestRenderWidgetHostView::EnsureSurfaceSynchronizedForWebTest() {
151   ++latest_capture_sequence_number_;
152 }
153 
GetCaptureSequenceNumber() const154 uint32_t TestRenderWidgetHostView::GetCaptureSequenceNumber() const {
155   return latest_capture_sequence_number_;
156 }
157 
UpdateCursor(const WebCursor & cursor)158 void TestRenderWidgetHostView::UpdateCursor(const WebCursor& cursor) {
159   last_cursor_ = cursor;
160 }
161 
RenderProcessGone()162 void TestRenderWidgetHostView::RenderProcessGone() {
163   delete this;
164 }
165 
Destroy()166 void TestRenderWidgetHostView::Destroy() { delete this; }
167 
GetViewBounds()168 gfx::Rect TestRenderWidgetHostView::GetViewBounds() {
169   return gfx::Rect();
170 }
171 
172 #if defined(OS_MAC)
SetActive(bool active)173 void TestRenderWidgetHostView::SetActive(bool active) {
174   // <viettrungluu@gmail.com>: Do I need to do anything here?
175 }
176 
SpeakSelection()177 void TestRenderWidgetHostView::SpeakSelection() {
178 }
179 
SetWindowFrameInScreen(const gfx::Rect & rect)180 void TestRenderWidgetHostView::SetWindowFrameInScreen(const gfx::Rect& rect) {}
181 #endif
182 
GetBoundsInRootWindow()183 gfx::Rect TestRenderWidgetHostView::GetBoundsInRootWindow() {
184   return gfx::Rect();
185 }
186 
TakeFallbackContentFrom(RenderWidgetHostView * view)187 void TestRenderWidgetHostView::TakeFallbackContentFrom(
188     RenderWidgetHostView* view) {
189   base::Optional<SkColor> color = view->GetBackgroundColor();
190   if (color)
191     SetBackgroundColor(*color);
192 }
193 
LockMouse(bool)194 blink::mojom::PointerLockResult TestRenderWidgetHostView::LockMouse(bool) {
195   return blink::mojom::PointerLockResult::kUnknownError;
196 }
197 
ChangeMouseLock(bool)198 blink::mojom::PointerLockResult TestRenderWidgetHostView::ChangeMouseLock(
199     bool) {
200   return blink::mojom::PointerLockResult::kUnknownError;
201 }
202 
UnlockMouse()203 void TestRenderWidgetHostView::UnlockMouse() {
204 }
205 
GetFrameSinkId() const206 const viz::FrameSinkId& TestRenderWidgetHostView::GetFrameSinkId() const {
207   return frame_sink_id_;
208 }
209 
GetLocalSurfaceId() const210 const viz::LocalSurfaceId& TestRenderWidgetHostView::GetLocalSurfaceId() const {
211   return viz::ParentLocalSurfaceIdAllocator::InvalidLocalSurfaceId();
212 }
213 
GetCurrentSurfaceId() const214 viz::SurfaceId TestRenderWidgetHostView::GetCurrentSurfaceId() const {
215   return viz::SurfaceId();
216 }
217 
OnFirstSurfaceActivation(const viz::SurfaceInfo & surface_info)218 void TestRenderWidgetHostView::OnFirstSurfaceActivation(
219     const viz::SurfaceInfo& surface_info) {
220   // TODO(fsamuel): Once surface synchronization is turned on, the fallback
221   // surface should be set here.
222 }
223 
OnFrameTokenChanged(uint32_t frame_token)224 void TestRenderWidgetHostView::OnFrameTokenChanged(uint32_t frame_token) {
225   OnFrameTokenChangedForView(frame_token);
226 }
227 
228 std::unique_ptr<SyntheticGestureTarget>
CreateSyntheticGestureTarget()229 TestRenderWidgetHostView::CreateSyntheticGestureTarget() {
230   NOTIMPLEMENTED();
231   return nullptr;
232 }
233 
UpdateBackgroundColor()234 void TestRenderWidgetHostView::UpdateBackgroundColor() {}
235 
SetDisplayFeatureForTesting(const DisplayFeature * display_feature)236 void TestRenderWidgetHostView::SetDisplayFeatureForTesting(
237     const DisplayFeature* display_feature) {
238   if (display_feature)
239     display_feature_ = *display_feature;
240   else
241     display_feature_ = base::nullopt;
242 }
243 
GetDisplayFeature()244 base::Optional<DisplayFeature> TestRenderWidgetHostView::GetDisplayFeature() {
245   return display_feature_;
246 }
247 
TestRenderViewHost(SiteInstance * instance,std::unique_ptr<RenderWidgetHostImpl> widget,RenderViewHostDelegate * delegate,int32_t routing_id,int32_t main_frame_routing_id,bool swapped_out)248 TestRenderViewHost::TestRenderViewHost(
249     SiteInstance* instance,
250     std::unique_ptr<RenderWidgetHostImpl> widget,
251     RenderViewHostDelegate* delegate,
252     int32_t routing_id,
253     int32_t main_frame_routing_id,
254     bool swapped_out)
255     : RenderViewHostImpl(instance,
256                          std::move(widget),
257                          delegate,
258                          routing_id,
259                          main_frame_routing_id,
260                          swapped_out,
261                          false /* has_initialized_audio_host */),
262       delete_counter_(nullptr) {
263   // TestRenderWidgetHostView installs itself into this->view_ in its
264   // constructor, and deletes itself when TestRenderWidgetHostView::Destroy() is
265   // called.
266   new TestRenderWidgetHostView(GetWidget());
267 }
268 
~TestRenderViewHost()269 TestRenderViewHost::~TestRenderViewHost() {
270   if (delete_counter_)
271     ++*delete_counter_;
272 }
273 
CreateTestRenderView(const base::Optional<base::UnguessableToken> & opener_frame_token,int proxy_route_id,bool window_was_created_with_opener)274 bool TestRenderViewHost::CreateTestRenderView(
275     const base::Optional<base::UnguessableToken>& opener_frame_token,
276     int proxy_route_id,
277     bool window_was_created_with_opener) {
278   return CreateRenderView(opener_frame_token, proxy_route_id,
279                           window_was_created_with_opener);
280 }
281 
CreateRenderView(const base::Optional<base::UnguessableToken> & opener_frame_token,int proxy_route_id,bool window_was_created_with_opener)282 bool TestRenderViewHost::CreateRenderView(
283     const base::Optional<base::UnguessableToken>& opener_frame_token,
284     int proxy_route_id,
285     bool window_was_created_with_opener) {
286   DCHECK(!IsRenderViewLive());
287   GetWidget()->set_renderer_initialized(true);
288   DCHECK(IsRenderViewLive());
289   opener_frame_token_ = opener_frame_token;
290   RenderFrameHostImpl* main_frame =
291       static_cast<RenderFrameHostImpl*>(GetMainFrame());
292   if (main_frame && is_active()) {
293     mojo::PendingRemote<service_manager::mojom::InterfaceProvider>
294         stub_interface_provider_remote;
295     main_frame->BindInterfaceProviderReceiver(
296         stub_interface_provider_remote.InitWithNewPipeAndPassReceiver());
297 
298     mojo::AssociatedRemote<blink::mojom::WidgetHost> blink_widget_host;
299     mojo::AssociatedRemote<blink::mojom::Widget> blink_widget;
300     auto blink_widget_receiver =
301         blink_widget.BindNewEndpointAndPassDedicatedReceiver();
302     GetWidget()->BindWidgetInterfaces(
303         blink_widget_host.BindNewEndpointAndPassDedicatedReceiver(),
304         blink_widget.Unbind());
305 
306     mojo::AssociatedRemote<blink::mojom::FrameWidgetHost> frame_widget_host;
307     mojo::AssociatedRemote<blink::mojom::FrameWidget> frame_widget;
308     auto frame_widget_receiver =
309         frame_widget.BindNewEndpointAndPassDedicatedReceiver();
310     GetWidget()->BindFrameWidgetInterfaces(
311         frame_widget_host.BindNewEndpointAndPassDedicatedReceiver(),
312         frame_widget.Unbind());
313 
314     main_frame->SetRenderFrameCreated(true);
315   }
316 
317   return true;
318 }
319 
GetProcess()320 MockRenderProcessHost* TestRenderViewHost::GetProcess() {
321   return static_cast<MockRenderProcessHost*>(RenderViewHostImpl::GetProcess());
322 }
323 
SimulateWasHidden()324 void TestRenderViewHost::SimulateWasHidden() {
325   GetWidget()->WasHidden();
326 }
327 
SimulateWasShown()328 void TestRenderViewHost::SimulateWasShown() {
329   GetWidget()->WasShown({} /* record_tab_switch_time_request */);
330 }
331 
332 blink::web_pref::WebPreferences
TestComputeWebPreferences()333 TestRenderViewHost::TestComputeWebPreferences() {
334   return static_cast<WebContentsImpl*>(WebContents::FromRenderViewHost(this))
335       ->ComputeWebPreferences();
336 }
337 
IsTestRenderViewHost() const338 bool TestRenderViewHost::IsTestRenderViewHost() const {
339   return true;
340 }
341 
TestStartDragging(const DropData & drop_data,SkBitmap bitmap)342 void TestRenderViewHost::TestStartDragging(const DropData& drop_data,
343                                            SkBitmap bitmap) {
344   StoragePartitionImpl* storage_partition =
345       static_cast<StoragePartitionImpl*>(GetProcess()->GetStoragePartition());
346   GetWidget()->StartDragging(
347       DropDataToDragData(drop_data,
348                          storage_partition->GetNativeFileSystemManager(),
349                          GetProcess()->GetID()),
350       blink::kDragOperationEvery, std::move(bitmap), gfx::Vector2d(),
351       blink::mojom::DragEventSourceInfo::New());
352 }
353 
TestOnUpdateStateWithFile(const base::FilePath & file_path)354 void TestRenderViewHost::TestOnUpdateStateWithFile(
355     const base::FilePath& file_path) {
356   auto state = blink::PageState::CreateForTesting(GURL("http://www.google.com"),
357                                                   false, "data", &file_path);
358   static_cast<RenderFrameHostImpl*>(GetMainFrame())->UpdateState(state);
359 }
360 
RenderViewHostImplTestHarness()361 RenderViewHostImplTestHarness::RenderViewHostImplTestHarness()
362     : RenderViewHostTestHarness(
363           base::test::TaskEnvironment::TimeSource::MOCK_TIME) {
364   std::vector<ui::ScaleFactor> scale_factors;
365   scale_factors.push_back(ui::SCALE_FACTOR_100P);
366   scoped_set_supported_scale_factors_.reset(
367       new ui::test::ScopedSetSupportedScaleFactors(scale_factors));
368 }
369 
~RenderViewHostImplTestHarness()370 RenderViewHostImplTestHarness::~RenderViewHostImplTestHarness() {
371 }
372 
test_rvh()373 TestRenderViewHost* RenderViewHostImplTestHarness::test_rvh() {
374   return contents()->GetRenderViewHost();
375 }
376 
pending_test_rvh()377 TestRenderViewHost* RenderViewHostImplTestHarness::pending_test_rvh() {
378   return contents()->GetPendingMainFrame() ?
379       contents()->GetPendingMainFrame()->GetRenderViewHost() :
380       nullptr;
381 }
382 
active_test_rvh()383 TestRenderViewHost* RenderViewHostImplTestHarness::active_test_rvh() {
384   return static_cast<TestRenderViewHost*>(active_rvh());
385 }
386 
main_test_rfh()387 TestRenderFrameHost* RenderViewHostImplTestHarness::main_test_rfh() {
388   return contents()->GetMainFrame();
389 }
390 
contents()391 TestWebContents* RenderViewHostImplTestHarness::contents() {
392   return static_cast<TestWebContents*>(web_contents());
393 }
394 
395 }  // namespace content
396