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