| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "content/browser/renderer_host/render_widget_host_view_aura.h" | 5 #include "content/browser/renderer_host/render_widget_host_view_aura.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 #include <stdint.h> | 8 #include <stdint.h> |
| 9 | 9 |
| 10 #include <tuple> | 10 #include <tuple> |
| 11 #include <utility> | 11 #include <utility> |
| 12 | 12 |
| 13 #include "base/command_line.h" | 13 #include "base/command_line.h" |
| 14 #include "base/location.h" | 14 #include "base/location.h" |
| 15 #include "base/macros.h" | 15 #include "base/macros.h" |
| 16 #include "base/memory/ptr_util.h" | 16 #include "base/memory/ptr_util.h" |
| 17 #include "base/memory/shared_memory.h" | 17 #include "base/memory/shared_memory.h" |
| 18 #include "base/message_loop/message_loop.h" | 18 #include "base/message_loop/message_loop.h" |
| 19 #include "base/run_loop.h" | 19 #include "base/run_loop.h" |
| 20 #include "base/single_thread_task_runner.h" | 20 #include "base/single_thread_task_runner.h" |
| 21 #include "base/strings/utf_string_conversions.h" | 21 #include "base/strings/utf_string_conversions.h" |
| 22 #include "base/test/scoped_feature_list.h" | 22 #include "base/test/scoped_feature_list.h" |
| 23 #include "base/test/simple_test_tick_clock.h" | 23 #include "base/test/simple_test_tick_clock.h" |
| 24 #include "base/threading/thread_task_runner_handle.h" | 24 #include "base/threading/thread_task_runner_handle.h" |
| 25 #include "build/build_config.h" | 25 #include "build/build_config.h" |
| 26 #include "cc/output/begin_frame_args.h" | 26 #include "cc/output/begin_frame_args.h" |
| 27 #include "cc/output/compositor_frame.h" | 27 #include "cc/output/compositor_frame.h" |
| 28 #include "cc/output/compositor_frame_metadata.h" | 28 #include "cc/output/compositor_frame_metadata.h" |
| 29 #include "cc/output/copy_output_request.h" | 29 #include "cc/output/copy_output_request.h" |
| 30 #include "cc/surfaces/local_surface_id_allocator.h" |
| 30 #include "cc/surfaces/surface.h" | 31 #include "cc/surfaces/surface.h" |
| 31 #include "cc/surfaces/surface_manager.h" | 32 #include "cc/surfaces/surface_manager.h" |
| 32 #include "cc/test/begin_frame_args_test.h" | 33 #include "cc/test/begin_frame_args_test.h" |
| 33 #include "cc/test/fake_external_begin_frame_source.h" | 34 #include "cc/test/fake_external_begin_frame_source.h" |
| 34 #include "components/viz/display_compositor/gl_helper.h" | 35 #include "components/viz/display_compositor/gl_helper.h" |
| 35 #include "components/viz/display_compositor/host_shared_bitmap_manager.h" | 36 #include "components/viz/display_compositor/host_shared_bitmap_manager.h" |
| 36 #include "content/browser/browser_thread_impl.h" | 37 #include "content/browser/browser_thread_impl.h" |
| 37 #include "content/browser/compositor/test/no_transport_image_transport_factory.h
" | 38 #include "content/browser/compositor/test/no_transport_image_transport_factory.h
" |
| 38 #include "content/browser/frame_host/render_widget_host_view_guest.h" | 39 #include "content/browser/frame_host/render_widget_host_view_guest.h" |
| 39 #include "content/browser/gpu/compositor_util.h" | 40 #include "content/browser/gpu/compositor_util.h" |
| (...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 123 void InstallDelegatedFrameHostClient( | 124 void InstallDelegatedFrameHostClient( |
| 124 RenderWidgetHostViewAura* render_widget_host_view, | 125 RenderWidgetHostViewAura* render_widget_host_view, |
| 125 std::unique_ptr<DelegatedFrameHostClient> delegated_frame_host_client); | 126 std::unique_ptr<DelegatedFrameHostClient> delegated_frame_host_client); |
| 126 | 127 |
| 127 namespace { | 128 namespace { |
| 128 | 129 |
| 129 const cc::LocalSurfaceId kArbitraryLocalSurfaceId( | 130 const cc::LocalSurfaceId kArbitraryLocalSurfaceId( |
| 130 1, | 131 1, |
| 131 base::UnguessableToken::Deserialize(2, 3)); | 132 base::UnguessableToken::Deserialize(2, 3)); |
| 132 | 133 |
| 133 cc::LocalSurfaceId CreateLocalSurfaceId() { | |
| 134 return cc::LocalSurfaceId(1, base::UnguessableToken::Create()); | |
| 135 } | |
| 136 | |
| 137 class TestOverscrollDelegate : public OverscrollControllerDelegate { | 134 class TestOverscrollDelegate : public OverscrollControllerDelegate { |
| 138 public: | 135 public: |
| 139 explicit TestOverscrollDelegate(RenderWidgetHostView* view) | 136 explicit TestOverscrollDelegate(RenderWidgetHostView* view) |
| 140 : view_(view), | 137 : view_(view), |
| 141 current_mode_(OVERSCROLL_NONE), | 138 current_mode_(OVERSCROLL_NONE), |
| 142 completed_mode_(OVERSCROLL_NONE), | 139 completed_mode_(OVERSCROLL_NONE), |
| 143 delta_x_(0.f), | 140 delta_x_(0.f), |
| 144 delta_y_(0.f) {} | 141 delta_y_(0.f) {} |
| 145 | 142 |
| 146 ~TestOverscrollDelegate() override {} | 143 ~TestOverscrollDelegate() override {} |
| (...skipping 671 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 818 RenderWidgetHostViewAura* parent_view_; | 815 RenderWidgetHostViewAura* parent_view_; |
| 819 | 816 |
| 820 // Tests should set these to nullptr if they've already triggered their | 817 // Tests should set these to nullptr if they've already triggered their |
| 821 // destruction. | 818 // destruction. |
| 822 MockRenderWidgetHostImpl* widget_host_; | 819 MockRenderWidgetHostImpl* widget_host_; |
| 823 FakeRenderWidgetHostViewAura* view_; | 820 FakeRenderWidgetHostViewAura* view_; |
| 824 | 821 |
| 825 IPC::TestSink* sink_; | 822 IPC::TestSink* sink_; |
| 826 base::test::ScopedFeatureList feature_list_; | 823 base::test::ScopedFeatureList feature_list_; |
| 827 | 824 |
| 825 cc::LocalSurfaceIdAllocator local_surface_id_allocator_; |
| 826 |
| 828 private: | 827 private: |
| 829 DISALLOW_COPY_AND_ASSIGN(RenderWidgetHostViewAuraTest); | 828 DISALLOW_COPY_AND_ASSIGN(RenderWidgetHostViewAuraTest); |
| 830 }; | 829 }; |
| 831 | 830 |
| 832 class RenderWidgetHostViewAuraRafAlignedTouchEnabledTest | 831 class RenderWidgetHostViewAuraRafAlignedTouchEnabledTest |
| 833 : public RenderWidgetHostViewAuraTest { | 832 : public RenderWidgetHostViewAuraTest { |
| 834 public: | 833 public: |
| 835 void SetUp() override { | 834 void SetUp() override { |
| 836 EnableRafAlignedTouchInput(); | 835 EnableRafAlignedTouchInput(); |
| 837 RenderWidgetHostViewAuraTest::SetUp(); | 836 RenderWidgetHostViewAuraTest::SetUp(); |
| (...skipping 1265 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2103 resource.id = 1; | 2102 resource.id = 1; |
| 2104 frame.resource_list.push_back(resource); | 2103 frame.resource_list.push_back(resource); |
| 2105 view_->SubmitCompositorFrame(kArbitraryLocalSurfaceId, std::move(frame)); | 2104 view_->SubmitCompositorFrame(kArbitraryLocalSurfaceId, std::move(frame)); |
| 2106 EXPECT_EQ(0u, sink_->message_count()); | 2105 EXPECT_EQ(0u, sink_->message_count()); |
| 2107 | 2106 |
| 2108 // Signal that a new RendererCompositorFrameSink was created by the renderer. | 2107 // Signal that a new RendererCompositorFrameSink was created by the renderer. |
| 2109 view_->CreateNewRendererCompositorFrameSink(); | 2108 view_->CreateNewRendererCompositorFrameSink(); |
| 2110 | 2109 |
| 2111 // Submit another frame. The resources for the previous frame belong to the | 2110 // Submit another frame. The resources for the previous frame belong to the |
| 2112 // old RendererCompositorFrameSink and should not be returned. | 2111 // old RendererCompositorFrameSink and should not be returned. |
| 2113 view_->SubmitCompositorFrame(CreateLocalSurfaceId(), | 2112 view_->SubmitCompositorFrame(local_surface_id_allocator_.GenerateId(), |
| 2114 MakeDelegatedFrame(1.f, view_size, view_rect)); | 2113 MakeDelegatedFrame(1.f, view_size, view_rect)); |
| 2115 EXPECT_EQ(0u, sink_->message_count()); | 2114 EXPECT_EQ(0u, sink_->message_count()); |
| 2116 | 2115 |
| 2117 // Report that the surface is drawn to trigger an ACK. | 2116 // Report that the surface is drawn to trigger an ACK. |
| 2118 view_->renderer_compositor_frame_sink_->Reset(); | 2117 view_->renderer_compositor_frame_sink_->Reset(); |
| 2119 cc::Surface* surface = manager->GetSurfaceForId(view_->surface_id()); | 2118 cc::Surface* surface = manager->GetSurfaceForId(view_->surface_id()); |
| 2120 EXPECT_TRUE(surface); | 2119 EXPECT_TRUE(surface); |
| 2121 surface->RunDrawCallback(); | 2120 surface->RunDrawCallback(); |
| 2122 view_->renderer_compositor_frame_sink_->Flush(); | 2121 view_->renderer_compositor_frame_sink_->Flush(); |
| 2123 EXPECT_TRUE(view_->renderer_compositor_frame_sink_->did_receive_ack()); | 2122 EXPECT_TRUE(view_->renderer_compositor_frame_sink_->did_receive_ack()); |
| (...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2249 root->layer()->Remove(mirror->root()); | 2248 root->layer()->Remove(mirror->root()); |
| 2250 } | 2249 } |
| 2251 } | 2250 } |
| 2252 | 2251 |
| 2253 // If the view size is larger than the compositor frame then extra layers | 2252 // If the view size is larger than the compositor frame then extra layers |
| 2254 // should be created to fill the gap. | 2253 // should be created to fill the gap. |
| 2255 TEST_F(RenderWidgetHostViewAuraTest, DelegatedFrameGutter) { | 2254 TEST_F(RenderWidgetHostViewAuraTest, DelegatedFrameGutter) { |
| 2256 gfx::Size large_size(100, 100); | 2255 gfx::Size large_size(100, 100); |
| 2257 gfx::Size small_size(40, 45); | 2256 gfx::Size small_size(40, 45); |
| 2258 gfx::Size medium_size(40, 95); | 2257 gfx::Size medium_size(40, 95); |
| 2258 cc::LocalSurfaceId small_id = local_surface_id_allocator_.GenerateId(); |
| 2259 cc::LocalSurfaceId medium_id = local_surface_id_allocator_.GenerateId(); |
| 2259 | 2260 |
| 2260 // Prevent the DelegatedFrameHost from skipping frames. | 2261 // Prevent the DelegatedFrameHost from skipping frames. |
| 2261 // XXX | 2262 // XXX |
| 2262 view_->DisableResizeLock(); | 2263 view_->DisableResizeLock(); |
| 2263 | 2264 |
| 2264 view_->InitAsChild(nullptr); | 2265 view_->InitAsChild(nullptr); |
| 2265 aura::client::ParentWindowWithContext( | 2266 aura::client::ParentWindowWithContext( |
| 2266 view_->GetNativeView(), parent_view_->GetNativeView()->GetRootWindow(), | 2267 view_->GetNativeView(), parent_view_->GetNativeView()->GetRootWindow(), |
| 2267 gfx::Rect()); | 2268 gfx::Rect()); |
| 2268 view_->SetSize(large_size); | 2269 view_->SetSize(large_size); |
| 2269 view_->Show(); | 2270 view_->Show(); |
| 2270 cc::CompositorFrame frame = | 2271 cc::CompositorFrame frame = |
| 2271 MakeDelegatedFrame(1.f, small_size, gfx::Rect(small_size)); | 2272 MakeDelegatedFrame(1.f, small_size, gfx::Rect(small_size)); |
| 2272 frame.metadata.root_background_color = SK_ColorRED; | 2273 frame.metadata.root_background_color = SK_ColorRED; |
| 2273 view_->SubmitCompositorFrame(kArbitraryLocalSurfaceId, std::move(frame)); | 2274 view_->SubmitCompositorFrame(small_id, std::move(frame)); |
| 2274 | 2275 |
| 2275 ui::Layer* parent_layer = view_->GetNativeView()->layer(); | 2276 ui::Layer* parent_layer = view_->GetNativeView()->layer(); |
| 2276 | 2277 |
| 2277 ASSERT_EQ(2u, parent_layer->children().size()); | 2278 ASSERT_EQ(2u, parent_layer->children().size()); |
| 2278 EXPECT_EQ(gfx::Rect(40, 0, 60, 100), parent_layer->children()[0]->bounds()); | 2279 EXPECT_EQ(gfx::Rect(40, 0, 60, 100), parent_layer->children()[0]->bounds()); |
| 2279 EXPECT_EQ(SK_ColorRED, parent_layer->children()[0]->background_color()); | 2280 EXPECT_EQ(SK_ColorRED, parent_layer->children()[0]->background_color()); |
| 2280 EXPECT_EQ(gfx::Rect(0, 45, 40, 55), parent_layer->children()[1]->bounds()); | 2281 EXPECT_EQ(gfx::Rect(0, 45, 40, 55), parent_layer->children()[1]->bounds()); |
| 2281 EXPECT_EQ(SK_ColorRED, parent_layer->children()[1]->background_color()); | 2282 EXPECT_EQ(SK_ColorRED, parent_layer->children()[1]->background_color()); |
| 2282 | 2283 |
| 2283 delegates_.back()->set_is_fullscreen(true); | 2284 delegates_.back()->set_is_fullscreen(true); |
| 2284 view_->SetSize(medium_size); | 2285 view_->SetSize(medium_size); |
| 2285 | 2286 |
| 2286 // Right gutter is unnecessary. | 2287 // Right gutter is unnecessary. |
| 2287 ASSERT_EQ(1u, parent_layer->children().size()); | 2288 ASSERT_EQ(1u, parent_layer->children().size()); |
| 2288 EXPECT_EQ(gfx::Rect(0, 45, 40, 50), parent_layer->children()[0]->bounds()); | 2289 EXPECT_EQ(gfx::Rect(0, 45, 40, 50), parent_layer->children()[0]->bounds()); |
| 2289 | 2290 |
| 2290 // RWH is fullscreen, so gutters should be black. | 2291 // RWH is fullscreen, so gutters should be black. |
| 2291 EXPECT_EQ(SK_ColorBLACK, parent_layer->children()[0]->background_color()); | 2292 EXPECT_EQ(SK_ColorBLACK, parent_layer->children()[0]->background_color()); |
| 2292 | 2293 |
| 2293 frame = MakeDelegatedFrame(1.f, medium_size, gfx::Rect(medium_size)); | 2294 frame = MakeDelegatedFrame(1.f, medium_size, gfx::Rect(medium_size)); |
| 2294 view_->SubmitCompositorFrame(kArbitraryLocalSurfaceId, std::move(frame)); | 2295 view_->SubmitCompositorFrame(medium_id, std::move(frame)); |
| 2295 EXPECT_EQ(0u, parent_layer->children().size()); | 2296 EXPECT_EQ(0u, parent_layer->children().size()); |
| 2296 | 2297 |
| 2297 view_->SetSize(large_size); | 2298 view_->SetSize(large_size); |
| 2298 ASSERT_EQ(2u, parent_layer->children().size()); | 2299 ASSERT_EQ(2u, parent_layer->children().size()); |
| 2299 | 2300 |
| 2300 // This should evict the frame and remove the gutter layers. | 2301 // This should evict the frame and remove the gutter layers. |
| 2301 view_->Hide(); | 2302 view_->Hide(); |
| 2302 view_->SetSize(small_size); | 2303 view_->SetSize(small_size); |
| 2303 ASSERT_EQ(0u, parent_layer->children().size()); | 2304 ASSERT_EQ(0u, parent_layer->children().size()); |
| 2304 } | 2305 } |
| 2305 | 2306 |
| 2306 TEST_F(RenderWidgetHostViewAuraTest, Resize) { | 2307 TEST_F(RenderWidgetHostViewAuraTest, Resize) { |
| 2307 gfx::Size size1(100, 100); | 2308 gfx::Size size1(100, 100); |
| 2308 gfx::Size size2(200, 200); | 2309 gfx::Size size2(200, 200); |
| 2309 gfx::Size size3(300, 300); | 2310 gfx::Size size3(300, 300); |
| 2311 cc::LocalSurfaceId id1 = local_surface_id_allocator_.GenerateId(); |
| 2312 cc::LocalSurfaceId id2 = local_surface_id_allocator_.GenerateId(); |
| 2313 cc::LocalSurfaceId id3 = local_surface_id_allocator_.GenerateId(); |
| 2310 | 2314 |
| 2311 aura::Window* root_window = parent_view_->GetNativeView()->GetRootWindow(); | 2315 aura::Window* root_window = parent_view_->GetNativeView()->GetRootWindow(); |
| 2312 view_->InitAsChild(nullptr); | 2316 view_->InitAsChild(nullptr); |
| 2313 aura::client::ParentWindowWithContext( | 2317 aura::client::ParentWindowWithContext( |
| 2314 view_->GetNativeView(), root_window, gfx::Rect(size1)); | 2318 view_->GetNativeView(), root_window, gfx::Rect(size1)); |
| 2315 view_->Show(); | 2319 view_->Show(); |
| 2316 view_->SetSize(size1); | 2320 view_->SetSize(size1); |
| 2317 view_->SubmitCompositorFrame( | 2321 view_->SubmitCompositorFrame( |
| 2318 kArbitraryLocalSurfaceId, | 2322 id1, MakeDelegatedFrame(1.f, size1, gfx::Rect(size1))); |
| 2319 MakeDelegatedFrame(1.f, size1, gfx::Rect(size1))); | |
| 2320 ui::DrawWaiterForTest::WaitForCommit( | 2323 ui::DrawWaiterForTest::WaitForCommit( |
| 2321 root_window->GetHost()->compositor()); | 2324 root_window->GetHost()->compositor()); |
| 2322 ViewHostMsg_UpdateRect_Params update_params; | 2325 ViewHostMsg_UpdateRect_Params update_params; |
| 2323 update_params.view_size = size1; | 2326 update_params.view_size = size1; |
| 2324 update_params.flags = ViewHostMsg_UpdateRect_Flags::IS_RESIZE_ACK; | 2327 update_params.flags = ViewHostMsg_UpdateRect_Flags::IS_RESIZE_ACK; |
| 2325 widget_host_->OnMessageReceived( | 2328 widget_host_->OnMessageReceived( |
| 2326 ViewHostMsg_UpdateRect(widget_host_->GetRoutingID(), update_params)); | 2329 ViewHostMsg_UpdateRect(widget_host_->GetRoutingID(), update_params)); |
| 2327 sink_->ClearMessages(); | 2330 sink_->ClearMessages(); |
| 2328 // Resize logic is idle (no pending resize, no pending commit). | 2331 // Resize logic is idle (no pending resize, no pending commit). |
| 2329 EXPECT_EQ(size1.ToString(), view_->GetRequestedRendererSize().ToString()); | 2332 EXPECT_EQ(size1.ToString(), view_->GetRequestedRendererSize().ToString()); |
| (...skipping 18 matching lines...) Expand all Loading... |
| 2348 // Resize renderer again, before receiving a frame. Should not produce a | 2351 // Resize renderer again, before receiving a frame. Should not produce a |
| 2349 // Resize message. | 2352 // Resize message. |
| 2350 view_->SetSize(size3); | 2353 view_->SetSize(size3); |
| 2351 EXPECT_EQ(size2.ToString(), view_->GetRequestedRendererSize().ToString()); | 2354 EXPECT_EQ(size2.ToString(), view_->GetRequestedRendererSize().ToString()); |
| 2352 EXPECT_EQ(0u, sink_->message_count()); | 2355 EXPECT_EQ(0u, sink_->message_count()); |
| 2353 | 2356 |
| 2354 // Receive a frame of the new size, should be skipped and not produce a Resize | 2357 // Receive a frame of the new size, should be skipped and not produce a Resize |
| 2355 // message. | 2358 // message. |
| 2356 view_->renderer_compositor_frame_sink_->Reset(); | 2359 view_->renderer_compositor_frame_sink_->Reset(); |
| 2357 view_->SubmitCompositorFrame( | 2360 view_->SubmitCompositorFrame( |
| 2358 kArbitraryLocalSurfaceId, | 2361 id3, MakeDelegatedFrame(1.f, size3, gfx::Rect(size3))); |
| 2359 MakeDelegatedFrame(1.f, size3, gfx::Rect(size3))); | |
| 2360 view_->renderer_compositor_frame_sink_->Flush(); | 2362 view_->renderer_compositor_frame_sink_->Flush(); |
| 2361 // Expect the frame ack; | 2363 // Expect the frame ack; |
| 2362 EXPECT_TRUE(view_->renderer_compositor_frame_sink_->did_receive_ack()); | 2364 EXPECT_TRUE(view_->renderer_compositor_frame_sink_->did_receive_ack()); |
| 2363 EXPECT_EQ(size2.ToString(), view_->GetRequestedRendererSize().ToString()); | 2365 EXPECT_EQ(size2.ToString(), view_->GetRequestedRendererSize().ToString()); |
| 2364 | 2366 |
| 2365 // Receive a frame of the correct size, should not be skipped and, and should | 2367 // Receive a frame of the correct size, should not be skipped and, and should |
| 2366 // produce a Resize message after the commit. | 2368 // produce a Resize message after the commit. |
| 2367 view_->renderer_compositor_frame_sink_->Reset(); | 2369 view_->renderer_compositor_frame_sink_->Reset(); |
| 2368 view_->SubmitCompositorFrame( | 2370 view_->SubmitCompositorFrame( |
| 2369 kArbitraryLocalSurfaceId, | 2371 id2, MakeDelegatedFrame(1.f, size2, gfx::Rect(size2))); |
| 2370 MakeDelegatedFrame(1.f, size2, gfx::Rect(size2))); | |
| 2371 view_->renderer_compositor_frame_sink_->Flush(); | 2372 view_->renderer_compositor_frame_sink_->Flush(); |
| 2372 cc::SurfaceId surface_id = view_->surface_id(); | 2373 cc::SurfaceId surface_id = view_->surface_id(); |
| 2373 if (!surface_id.is_valid()) { | 2374 if (!surface_id.is_valid()) { |
| 2374 // No frame ack yet. | 2375 // No frame ack yet. |
| 2375 EXPECT_FALSE(view_->renderer_compositor_frame_sink_->did_receive_ack()); | 2376 EXPECT_FALSE(view_->renderer_compositor_frame_sink_->did_receive_ack()); |
| 2376 } else { | 2377 } else { |
| 2377 // Frame isn't desired size, so early ack. | 2378 // Frame isn't desired size, so early ack. |
| 2378 EXPECT_TRUE(view_->renderer_compositor_frame_sink_->did_receive_ack()); | 2379 EXPECT_TRUE(view_->renderer_compositor_frame_sink_->did_receive_ack()); |
| 2379 } | 2380 } |
| 2380 EXPECT_EQ(size2.ToString(), view_->GetRequestedRendererSize().ToString()); | 2381 EXPECT_EQ(size2.ToString(), view_->GetRequestedRendererSize().ToString()); |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2417 update_params.view_size = size3; | 2418 update_params.view_size = size3; |
| 2418 widget_host_->OnMessageReceived( | 2419 widget_host_->OnMessageReceived( |
| 2419 ViewHostMsg_UpdateRect(widget_host_->GetRoutingID(), update_params)); | 2420 ViewHostMsg_UpdateRect(widget_host_->GetRoutingID(), update_params)); |
| 2420 sink_->ClearMessages(); | 2421 sink_->ClearMessages(); |
| 2421 } | 2422 } |
| 2422 | 2423 |
| 2423 // Skipped frames should not drop their damage. | 2424 // Skipped frames should not drop their damage. |
| 2424 TEST_F(RenderWidgetHostViewAuraTest, SkippedDelegatedFrames) { | 2425 TEST_F(RenderWidgetHostViewAuraTest, SkippedDelegatedFrames) { |
| 2425 gfx::Rect view_rect(100, 100); | 2426 gfx::Rect view_rect(100, 100); |
| 2426 gfx::Size frame_size = view_rect.size(); | 2427 gfx::Size frame_size = view_rect.size(); |
| 2428 cc::LocalSurfaceId local_surface_id = kArbitraryLocalSurfaceId; |
| 2427 | 2429 |
| 2428 view_->InitAsChild(nullptr); | 2430 view_->InitAsChild(nullptr); |
| 2429 aura::client::ParentWindowWithContext( | 2431 aura::client::ParentWindowWithContext( |
| 2430 view_->GetNativeView(), | 2432 view_->GetNativeView(), |
| 2431 parent_view_->GetNativeView()->GetRootWindow(), | 2433 parent_view_->GetNativeView()->GetRootWindow(), |
| 2432 gfx::Rect()); | 2434 gfx::Rect()); |
| 2433 view_->SetSize(view_rect.size()); | 2435 view_->SetSize(view_rect.size()); |
| 2434 | 2436 |
| 2435 MockWindowObserver observer; | 2437 MockWindowObserver observer; |
| 2436 view_->window_->AddObserver(&observer); | 2438 view_->window_->AddObserver(&observer); |
| 2437 | 2439 |
| 2438 // A full frame of damage. | 2440 // A full frame of damage. |
| 2439 EXPECT_CALL(observer, OnDelegatedFrameDamage(view_->window_, view_rect)); | 2441 EXPECT_CALL(observer, OnDelegatedFrameDamage(view_->window_, view_rect)); |
| 2440 view_->SubmitCompositorFrame(kArbitraryLocalSurfaceId, | 2442 view_->SubmitCompositorFrame(local_surface_id, |
| 2441 MakeDelegatedFrame(1.f, frame_size, view_rect)); | 2443 MakeDelegatedFrame(1.f, frame_size, view_rect)); |
| 2442 testing::Mock::VerifyAndClearExpectations(&observer); | 2444 testing::Mock::VerifyAndClearExpectations(&observer); |
| 2443 view_->RunOnCompositingDidCommit(); | 2445 view_->RunOnCompositingDidCommit(); |
| 2444 | 2446 |
| 2445 // A partial damage frame. | 2447 // A partial damage frame. |
| 2446 gfx::Rect partial_view_rect(30, 30, 20, 20); | 2448 gfx::Rect partial_view_rect(30, 30, 20, 20); |
| 2447 EXPECT_CALL(observer, | 2449 EXPECT_CALL(observer, |
| 2448 OnDelegatedFrameDamage(view_->window_, partial_view_rect)); | 2450 OnDelegatedFrameDamage(view_->window_, partial_view_rect)); |
| 2449 view_->SubmitCompositorFrame( | 2451 view_->SubmitCompositorFrame( |
| 2450 kArbitraryLocalSurfaceId, | 2452 local_surface_id, MakeDelegatedFrame(1.f, frame_size, partial_view_rect)); |
| 2451 MakeDelegatedFrame(1.f, frame_size, partial_view_rect)); | |
| 2452 testing::Mock::VerifyAndClearExpectations(&observer); | 2453 testing::Mock::VerifyAndClearExpectations(&observer); |
| 2453 view_->RunOnCompositingDidCommit(); | 2454 view_->RunOnCompositingDidCommit(); |
| 2454 | 2455 |
| 2455 EXPECT_FALSE(view_->resize_locked()); | 2456 EXPECT_FALSE(view_->resize_locked()); |
| 2456 EXPECT_FALSE(view_->compositor_locked()); | 2457 EXPECT_FALSE(view_->compositor_locked()); |
| 2457 | 2458 |
| 2458 // Lock the compositor. Now we should drop frames. | 2459 // Lock the compositor. Now we should drop frames. |
| 2459 view_rect = gfx::Rect(150, 150); | 2460 view_rect = gfx::Rect(150, 150); |
| 2460 view_->SetSize(view_rect.size()); | 2461 view_->SetSize(view_rect.size()); |
| 2461 EXPECT_TRUE(view_->resize_locked()); | 2462 EXPECT_TRUE(view_->resize_locked()); |
| 2462 EXPECT_TRUE(view_->compositor_locked()); | 2463 EXPECT_TRUE(view_->compositor_locked()); |
| 2463 | 2464 |
| 2464 // This frame is dropped. | 2465 // This frame is dropped. |
| 2465 gfx::Rect dropped_damage_rect_1(10, 20, 30, 40); | 2466 gfx::Rect dropped_damage_rect_1(10, 20, 30, 40); |
| 2466 EXPECT_CALL(observer, OnDelegatedFrameDamage(_, _)).Times(0); | 2467 EXPECT_CALL(observer, OnDelegatedFrameDamage(_, _)).Times(0); |
| 2467 view_->SubmitCompositorFrame( | 2468 view_->SubmitCompositorFrame( |
| 2468 kArbitraryLocalSurfaceId, | 2469 local_surface_id, |
| 2469 MakeDelegatedFrame(1.f, frame_size, dropped_damage_rect_1)); | 2470 MakeDelegatedFrame(1.f, frame_size, dropped_damage_rect_1)); |
| 2470 testing::Mock::VerifyAndClearExpectations(&observer); | 2471 testing::Mock::VerifyAndClearExpectations(&observer); |
| 2471 view_->RunOnCompositingDidCommit(); | 2472 view_->RunOnCompositingDidCommit(); |
| 2472 | 2473 |
| 2473 gfx::Rect dropped_damage_rect_2(40, 50, 10, 20); | 2474 gfx::Rect dropped_damage_rect_2(40, 50, 10, 20); |
| 2474 EXPECT_CALL(observer, OnDelegatedFrameDamage(_, _)).Times(0); | 2475 EXPECT_CALL(observer, OnDelegatedFrameDamage(_, _)).Times(0); |
| 2475 view_->SubmitCompositorFrame( | 2476 view_->SubmitCompositorFrame( |
| 2476 kArbitraryLocalSurfaceId, | 2477 local_surface_id, |
| 2477 MakeDelegatedFrame(1.f, frame_size, dropped_damage_rect_2)); | 2478 MakeDelegatedFrame(1.f, frame_size, dropped_damage_rect_2)); |
| 2478 testing::Mock::VerifyAndClearExpectations(&observer); | 2479 testing::Mock::VerifyAndClearExpectations(&observer); |
| 2479 view_->RunOnCompositingDidCommit(); | 2480 view_->RunOnCompositingDidCommit(); |
| 2480 | 2481 |
| 2481 EXPECT_TRUE(view_->resize_locked()); | 2482 EXPECT_TRUE(view_->resize_locked()); |
| 2482 EXPECT_TRUE(view_->compositor_locked()); | 2483 EXPECT_TRUE(view_->compositor_locked()); |
| 2483 | 2484 |
| 2484 // Unlock the compositor. This frame should damage everything. | 2485 // Unlock the compositor. This frame should damage everything. |
| 2485 frame_size = view_rect.size(); | 2486 frame_size = view_rect.size(); |
| 2487 local_surface_id = local_surface_id_allocator_.GenerateId(); |
| 2486 | 2488 |
| 2487 gfx::Rect new_damage_rect(5, 6, 10, 10); | 2489 gfx::Rect new_damage_rect(5, 6, 10, 10); |
| 2488 EXPECT_CALL(observer, | 2490 EXPECT_CALL(observer, |
| 2489 OnDelegatedFrameDamage(view_->window_, view_rect)); | 2491 OnDelegatedFrameDamage(view_->window_, view_rect)); |
| 2490 view_->SubmitCompositorFrame( | 2492 view_->SubmitCompositorFrame( |
| 2491 kArbitraryLocalSurfaceId, | 2493 local_surface_id, MakeDelegatedFrame(1.f, frame_size, new_damage_rect)); |
| 2492 MakeDelegatedFrame(1.f, frame_size, new_damage_rect)); | |
| 2493 // The swap unlocks the compositor. | 2494 // The swap unlocks the compositor. |
| 2494 EXPECT_TRUE(view_->resize_locked()); | 2495 EXPECT_TRUE(view_->resize_locked()); |
| 2495 EXPECT_FALSE(view_->compositor_locked()); | 2496 EXPECT_FALSE(view_->compositor_locked()); |
| 2496 testing::Mock::VerifyAndClearExpectations(&observer); | 2497 testing::Mock::VerifyAndClearExpectations(&observer); |
| 2497 // The UI commit unlocks for further resize. | 2498 // The UI commit unlocks for further resize. |
| 2498 view_->RunOnCompositingDidCommit(); | 2499 view_->RunOnCompositingDidCommit(); |
| 2499 EXPECT_FALSE(view_->resize_locked()); | 2500 EXPECT_FALSE(view_->resize_locked()); |
| 2500 EXPECT_FALSE(view_->compositor_locked()); | 2501 EXPECT_FALSE(view_->compositor_locked()); |
| 2501 | 2502 |
| 2502 // A partial damage frame, this should not be dropped. | 2503 // A partial damage frame, this should not be dropped. |
| 2503 EXPECT_CALL(observer, | 2504 EXPECT_CALL(observer, |
| 2504 OnDelegatedFrameDamage(view_->window_, partial_view_rect)); | 2505 OnDelegatedFrameDamage(view_->window_, partial_view_rect)); |
| 2505 view_->SubmitCompositorFrame( | 2506 view_->SubmitCompositorFrame( |
| 2506 kArbitraryLocalSurfaceId, | 2507 local_surface_id, MakeDelegatedFrame(1.f, frame_size, partial_view_rect)); |
| 2507 MakeDelegatedFrame(1.f, frame_size, partial_view_rect)); | |
| 2508 testing::Mock::VerifyAndClearExpectations(&observer); | 2508 testing::Mock::VerifyAndClearExpectations(&observer); |
| 2509 view_->RunOnCompositingDidCommit(); | 2509 view_->RunOnCompositingDidCommit(); |
| 2510 EXPECT_FALSE(view_->resize_locked()); | 2510 EXPECT_FALSE(view_->resize_locked()); |
| 2511 EXPECT_FALSE(view_->compositor_locked()); | 2511 EXPECT_FALSE(view_->compositor_locked()); |
| 2512 | 2512 |
| 2513 // Resize to something empty. This doesn't lock anything since it's not | 2513 // Resize to something empty. This doesn't lock anything since it's not |
| 2514 // visible anymore anyways. | 2514 // visible anymore anyways. |
| 2515 view_rect = gfx::Rect(100, 0); | 2515 view_rect = gfx::Rect(100, 0); |
| 2516 view_->SetSize(view_rect.size()); | 2516 view_->SetSize(view_rect.size()); |
| 2517 EXPECT_FALSE(view_->resize_locked()); | 2517 EXPECT_FALSE(view_->resize_locked()); |
| 2518 EXPECT_FALSE(view_->compositor_locked()); | 2518 EXPECT_FALSE(view_->compositor_locked()); |
| 2519 | 2519 |
| 2520 // We're never expecting empty frames, resize to something non-empty. | 2520 // We're never expecting empty frames, resize to something non-empty. |
| 2521 view_rect = gfx::Rect(100, 100); | 2521 view_rect = gfx::Rect(100, 100); |
| 2522 frame_size = view_rect.size(); |
| 2523 local_surface_id = local_surface_id_allocator_.GenerateId(); |
| 2522 view_->SetSize(view_rect.size()); | 2524 view_->SetSize(view_rect.size()); |
| 2523 EXPECT_TRUE(view_->resize_locked()); | 2525 EXPECT_TRUE(view_->resize_locked()); |
| 2524 EXPECT_TRUE(view_->compositor_locked()); | 2526 EXPECT_TRUE(view_->compositor_locked()); |
| 2525 | 2527 |
| 2526 // This frame should not be dropped. | 2528 // This frame should not be dropped. |
| 2527 EXPECT_CALL(observer, OnDelegatedFrameDamage(view_->window_, view_rect)); | 2529 EXPECT_CALL(observer, OnDelegatedFrameDamage(view_->window_, view_rect)); |
| 2528 view_->SubmitCompositorFrame( | 2530 view_->SubmitCompositorFrame(local_surface_id, |
| 2529 kArbitraryLocalSurfaceId, | 2531 MakeDelegatedFrame(1.f, frame_size, view_rect)); |
| 2530 MakeDelegatedFrame(1.f, view_rect.size(), view_rect)); | |
| 2531 testing::Mock::VerifyAndClearExpectations(&observer); | 2532 testing::Mock::VerifyAndClearExpectations(&observer); |
| 2532 EXPECT_TRUE(view_->resize_locked()); | 2533 EXPECT_TRUE(view_->resize_locked()); |
| 2533 EXPECT_FALSE(view_->compositor_locked()); | 2534 EXPECT_FALSE(view_->compositor_locked()); |
| 2534 view_->RunOnCompositingDidCommit(); | 2535 view_->RunOnCompositingDidCommit(); |
| 2535 EXPECT_FALSE(view_->resize_locked()); | 2536 EXPECT_FALSE(view_->resize_locked()); |
| 2536 EXPECT_FALSE(view_->compositor_locked()); | 2537 EXPECT_FALSE(view_->compositor_locked()); |
| 2537 | 2538 |
| 2538 view_->window_->RemoveObserver(&observer); | 2539 view_->window_->RemoveObserver(&observer); |
| 2539 } | 2540 } |
| 2540 | 2541 |
| 2541 // If resize races with a renderer frame, we should lock for the right size. | 2542 // If resize races with a renderer frame, we should lock for the right size. |
| 2542 TEST_F(RenderWidgetHostViewAuraTest, ResizeAfterReceivingFrame) { | 2543 TEST_F(RenderWidgetHostViewAuraTest, ResizeAfterReceivingFrame) { |
| 2543 gfx::Rect view_rect(100, 100); | 2544 gfx::Rect view_rect(100, 100); |
| 2544 gfx::Size frame_size = view_rect.size(); | 2545 gfx::Size frame_size = view_rect.size(); |
| 2546 cc::LocalSurfaceId local_surface_id = kArbitraryLocalSurfaceId; |
| 2545 | 2547 |
| 2546 view_->InitAsChild(nullptr); | 2548 view_->InitAsChild(nullptr); |
| 2547 aura::client::ParentWindowWithContext( | 2549 aura::client::ParentWindowWithContext( |
| 2548 view_->GetNativeView(), parent_view_->GetNativeView()->GetRootWindow(), | 2550 view_->GetNativeView(), parent_view_->GetNativeView()->GetRootWindow(), |
| 2549 gfx::Rect()); | 2551 gfx::Rect()); |
| 2550 view_->SetSize(view_rect.size()); | 2552 view_->SetSize(view_rect.size()); |
| 2551 | 2553 |
| 2552 MockWindowObserver observer; | 2554 MockWindowObserver observer; |
| 2553 view_->window_->AddObserver(&observer); | 2555 view_->window_->AddObserver(&observer); |
| 2554 | 2556 |
| 2555 // A frame of initial size. | 2557 // A frame of initial size. |
| 2556 EXPECT_CALL(observer, OnDelegatedFrameDamage(view_->window_, view_rect)); | 2558 EXPECT_CALL(observer, OnDelegatedFrameDamage(view_->window_, view_rect)); |
| 2557 view_->SubmitCompositorFrame( | 2559 view_->SubmitCompositorFrame( |
| 2558 kArbitraryLocalSurfaceId, | 2560 local_surface_id, |
| 2559 MakeDelegatedFrame(1.f, frame_size, gfx::Rect(frame_size))); | 2561 MakeDelegatedFrame(1.f, frame_size, gfx::Rect(frame_size))); |
| 2560 testing::Mock::VerifyAndClearExpectations(&observer); | 2562 testing::Mock::VerifyAndClearExpectations(&observer); |
| 2561 view_->RunOnCompositingDidCommit(); | 2563 view_->RunOnCompositingDidCommit(); |
| 2562 | 2564 |
| 2563 // A frame of initial size arrives, but we don't commit in the UI yet. | 2565 // A frame of initial size arrives, but we don't commit in the UI yet. |
| 2564 EXPECT_CALL(observer, OnDelegatedFrameDamage(view_->window_, _)); | 2566 EXPECT_CALL(observer, OnDelegatedFrameDamage(view_->window_, _)); |
| 2565 view_->SubmitCompositorFrame( | 2567 view_->SubmitCompositorFrame( |
| 2566 kArbitraryLocalSurfaceId, | 2568 local_surface_id, |
| 2567 MakeDelegatedFrame(1.f, frame_size, gfx::Rect(frame_size))); | 2569 MakeDelegatedFrame(1.f, frame_size, gfx::Rect(frame_size))); |
| 2568 testing::Mock::VerifyAndClearExpectations(&observer); | 2570 testing::Mock::VerifyAndClearExpectations(&observer); |
| 2569 | 2571 |
| 2570 EXPECT_FALSE(view_->resize_locked()); | 2572 EXPECT_FALSE(view_->resize_locked()); |
| 2571 EXPECT_FALSE(view_->compositor_locked()); | 2573 EXPECT_FALSE(view_->compositor_locked()); |
| 2572 | 2574 |
| 2573 // Resize, and lock the compositor. Now we should drop frames of the old size. | 2575 // Resize, and lock the compositor. Now we should drop frames of the old size. |
| 2574 view_rect = gfx::Rect(150, 150); | 2576 view_rect = gfx::Rect(150, 150); |
| 2575 view_->SetSize(view_rect.size()); | 2577 view_->SetSize(view_rect.size()); |
| 2576 EXPECT_TRUE(view_->resize_locked()); | 2578 EXPECT_TRUE(view_->resize_locked()); |
| 2577 EXPECT_TRUE(view_->compositor_locked()); | 2579 EXPECT_TRUE(view_->compositor_locked()); |
| 2578 | 2580 |
| 2579 EXPECT_CALL(observer, OnDelegatedFrameDamage(_, _)).Times(0); | 2581 EXPECT_CALL(observer, OnDelegatedFrameDamage(_, _)).Times(0); |
| 2580 view_->SubmitCompositorFrame( | 2582 view_->SubmitCompositorFrame( |
| 2581 kArbitraryLocalSurfaceId, | 2583 local_surface_id, |
| 2582 MakeDelegatedFrame(1.f, frame_size, gfx::Rect(frame_size))); | 2584 MakeDelegatedFrame(1.f, frame_size, gfx::Rect(frame_size))); |
| 2583 testing::Mock::VerifyAndClearExpectations(&observer); | 2585 testing::Mock::VerifyAndClearExpectations(&observer); |
| 2584 | 2586 |
| 2585 // If the CompositorLock times out in the meantime, a commit would happen. | 2587 // If the CompositorLock times out in the meantime, a commit would happen. |
| 2586 // Verify that if a commit occurs, the lock remains and we reject frames | 2588 // Verify that if a commit occurs, the lock remains and we reject frames |
| 2587 // of the wrong size still. | 2589 // of the wrong size still. |
| 2588 view_->RunOnCompositingDidCommit(); | 2590 view_->RunOnCompositingDidCommit(); |
| 2589 | 2591 |
| 2590 EXPECT_TRUE(view_->resize_locked()); | 2592 EXPECT_TRUE(view_->resize_locked()); |
| 2591 // In this case we lied about it and the CompositorLock is still active. | 2593 // In this case we lied about it and the CompositorLock is still active. |
| 2592 EXPECT_TRUE(view_->compositor_locked()); | 2594 EXPECT_TRUE(view_->compositor_locked()); |
| 2593 | 2595 |
| 2594 EXPECT_CALL(observer, OnDelegatedFrameDamage(_, _)).Times(0); | 2596 EXPECT_CALL(observer, OnDelegatedFrameDamage(_, _)).Times(0); |
| 2595 view_->SubmitCompositorFrame( | 2597 view_->SubmitCompositorFrame( |
| 2596 kArbitraryLocalSurfaceId, | 2598 local_surface_id, |
| 2597 MakeDelegatedFrame(1.f, frame_size, gfx::Rect(frame_size))); | 2599 MakeDelegatedFrame(1.f, frame_size, gfx::Rect(frame_size))); |
| 2598 testing::Mock::VerifyAndClearExpectations(&observer); | 2600 testing::Mock::VerifyAndClearExpectations(&observer); |
| 2599 | 2601 |
| 2600 // A frame arrives of the new size, which will be accepted. | 2602 // A frame arrives of the new size, which will be accepted. |
| 2601 frame_size = view_rect.size(); | 2603 frame_size = view_rect.size(); |
| 2604 local_surface_id = local_surface_id_allocator_.GenerateId(); |
| 2602 EXPECT_CALL(observer, OnDelegatedFrameDamage(view_->window_, _)); | 2605 EXPECT_CALL(observer, OnDelegatedFrameDamage(view_->window_, _)); |
| 2603 view_->SubmitCompositorFrame( | 2606 view_->SubmitCompositorFrame( |
| 2604 kArbitraryLocalSurfaceId, | 2607 local_surface_id, |
| 2605 MakeDelegatedFrame(1.f, frame_size, gfx::Rect(frame_size))); | 2608 MakeDelegatedFrame(1.f, frame_size, gfx::Rect(frame_size))); |
| 2606 // Receiving the frame unlocks the compositor so it can commit. | 2609 // Receiving the frame unlocks the compositor so it can commit. |
| 2607 EXPECT_TRUE(view_->resize_locked()); | 2610 EXPECT_TRUE(view_->resize_locked()); |
| 2608 EXPECT_FALSE(view_->compositor_locked()); | 2611 EXPECT_FALSE(view_->compositor_locked()); |
| 2609 testing::Mock::VerifyAndClearExpectations(&observer); | 2612 testing::Mock::VerifyAndClearExpectations(&observer); |
| 2610 | 2613 |
| 2611 // When the frame of the correct size is committed, the CompositorResizeLock | 2614 // When the frame of the correct size is committed, the CompositorResizeLock |
| 2612 // is released. | 2615 // is released. |
| 2613 view_->RunOnCompositingDidCommit(); | 2616 view_->RunOnCompositingDidCommit(); |
| 2614 EXPECT_FALSE(view_->resize_locked()); | 2617 EXPECT_FALSE(view_->resize_locked()); |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2685 view_->SubmitCompositorFrame(kArbitraryLocalSurfaceId, | 2688 view_->SubmitCompositorFrame(kArbitraryLocalSurfaceId, |
| 2686 MakeDelegatedFrame(1.f, frame_size, view_rect)); | 2689 MakeDelegatedFrame(1.f, frame_size, view_rect)); |
| 2687 testing::Mock::VerifyAndClearExpectations(&observer); | 2690 testing::Mock::VerifyAndClearExpectations(&observer); |
| 2688 view_->RunOnCompositingDidCommit(); | 2691 view_->RunOnCompositingDidCommit(); |
| 2689 | 2692 |
| 2690 // Signal that a new RendererCompositorFrameSink was created. | 2693 // Signal that a new RendererCompositorFrameSink was created. |
| 2691 view_->CreateNewRendererCompositorFrameSink(); | 2694 view_->CreateNewRendererCompositorFrameSink(); |
| 2692 | 2695 |
| 2693 // Submit a frame from the new RendererCompositorFrameSink. | 2696 // Submit a frame from the new RendererCompositorFrameSink. |
| 2694 EXPECT_CALL(observer, OnDelegatedFrameDamage(view_->window_, view_rect)); | 2697 EXPECT_CALL(observer, OnDelegatedFrameDamage(view_->window_, view_rect)); |
| 2695 view_->SubmitCompositorFrame(CreateLocalSurfaceId(), | 2698 view_->SubmitCompositorFrame(local_surface_id_allocator_.GenerateId(), |
| 2696 MakeDelegatedFrame(1.f, frame_size, view_rect)); | 2699 MakeDelegatedFrame(1.f, frame_size, view_rect)); |
| 2697 testing::Mock::VerifyAndClearExpectations(&observer); | 2700 testing::Mock::VerifyAndClearExpectations(&observer); |
| 2698 view_->RunOnCompositingDidCommit(); | 2701 view_->RunOnCompositingDidCommit(); |
| 2699 | 2702 |
| 2700 // Signal that a new RendererCompositorFrameSink was created. | 2703 // Signal that a new RendererCompositorFrameSink was created. |
| 2701 view_->CreateNewRendererCompositorFrameSink(); | 2704 view_->CreateNewRendererCompositorFrameSink(); |
| 2702 | 2705 |
| 2703 // Submit a frame from the new RendererCompositorFrameSink. | 2706 // Submit a frame from the new RendererCompositorFrameSink. |
| 2704 view_->SubmitCompositorFrame( | 2707 view_->SubmitCompositorFrame( |
| 2705 CreateLocalSurfaceId(), | 2708 local_surface_id_allocator_.GenerateId(), |
| 2706 MakeDelegatedFrame(1.f, gfx::Size(), gfx::Rect())); | 2709 MakeDelegatedFrame(1.f, gfx::Size(), gfx::Rect())); |
| 2707 testing::Mock::VerifyAndClearExpectations(&observer); | 2710 testing::Mock::VerifyAndClearExpectations(&observer); |
| 2708 view_->RunOnCompositingDidCommit(); | 2711 view_->RunOnCompositingDidCommit(); |
| 2709 | 2712 |
| 2710 // Signal that a new RendererCompositorFrameSink was created. | 2713 // Signal that a new RendererCompositorFrameSink was created. |
| 2711 view_->CreateNewRendererCompositorFrameSink(); | 2714 view_->CreateNewRendererCompositorFrameSink(); |
| 2712 | 2715 |
| 2713 // Swap another frame, with a different surface id. | 2716 // Swap another frame, with a different surface id. |
| 2714 EXPECT_CALL(observer, OnDelegatedFrameDamage(view_->window_, view_rect)); | 2717 EXPECT_CALL(observer, OnDelegatedFrameDamage(view_->window_, view_rect)); |
| 2715 view_->SubmitCompositorFrame(CreateLocalSurfaceId(), | 2718 view_->SubmitCompositorFrame(local_surface_id_allocator_.GenerateId(), |
| 2716 MakeDelegatedFrame(1.f, frame_size, view_rect)); | 2719 MakeDelegatedFrame(1.f, frame_size, view_rect)); |
| 2717 testing::Mock::VerifyAndClearExpectations(&observer); | 2720 testing::Mock::VerifyAndClearExpectations(&observer); |
| 2718 view_->RunOnCompositingDidCommit(); | 2721 view_->RunOnCompositingDidCommit(); |
| 2719 | 2722 |
| 2720 view_->window_->RemoveObserver(&observer); | 2723 view_->window_->RemoveObserver(&observer); |
| 2721 } | 2724 } |
| 2722 | 2725 |
| 2723 TEST_F(RenderWidgetHostViewAuraTest, DiscardDelegatedFrames) { | 2726 TEST_F(RenderWidgetHostViewAuraTest, DiscardDelegatedFrames) { |
| 2724 view_->InitAsChild(nullptr); | 2727 view_->InitAsChild(nullptr); |
| 2725 | 2728 |
| (...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2844 views[0]->Show(); | 2847 views[0]->Show(); |
| 2845 EXPECT_TRUE(views[0]->released_front_lock_active()); | 2848 EXPECT_TRUE(views[0]->released_front_lock_active()); |
| 2846 // Make [0] hidden, it should stop waiting. | 2849 // Make [0] hidden, it should stop waiting. |
| 2847 views[0]->Hide(); | 2850 views[0]->Hide(); |
| 2848 EXPECT_FALSE(views[0]->released_front_lock_active()); | 2851 EXPECT_FALSE(views[0]->released_front_lock_active()); |
| 2849 | 2852 |
| 2850 // Make [1] hidden, resize it. It should drop its frame. | 2853 // Make [1] hidden, resize it. It should drop its frame. |
| 2851 views[1]->Hide(); | 2854 views[1]->Hide(); |
| 2852 EXPECT_TRUE(views[1]->HasFrameData()); | 2855 EXPECT_TRUE(views[1]->HasFrameData()); |
| 2853 gfx::Size size2(200, 200); | 2856 gfx::Size size2(200, 200); |
| 2857 cc::LocalSurfaceId id2 = local_surface_id_allocator_.GenerateId(); |
| 2854 views[1]->SetSize(size2); | 2858 views[1]->SetSize(size2); |
| 2855 EXPECT_FALSE(views[1]->HasFrameData()); | 2859 EXPECT_FALSE(views[1]->HasFrameData()); |
| 2856 // Show it, it should block until we give it a frame. | 2860 // Show it, it should block until we give it a frame. |
| 2857 views[1]->Show(); | 2861 views[1]->Show(); |
| 2858 EXPECT_TRUE(views[1]->released_front_lock_active()); | 2862 EXPECT_TRUE(views[1]->released_front_lock_active()); |
| 2859 views[1]->SubmitCompositorFrame( | 2863 views[1]->SubmitCompositorFrame( |
| 2860 kArbitraryLocalSurfaceId, | 2864 id2, MakeDelegatedFrame(1.f, size2, gfx::Rect(size2))); |
| 2861 MakeDelegatedFrame(1.f, size2, gfx::Rect(size2))); | |
| 2862 EXPECT_FALSE(views[1]->released_front_lock_active()); | 2865 EXPECT_FALSE(views[1]->released_front_lock_active()); |
| 2863 | 2866 |
| 2864 for (size_t i = 0; i < renderer_count - 1; ++i) | 2867 for (size_t i = 0; i < renderer_count - 1; ++i) |
| 2865 views[i]->Hide(); | 2868 views[i]->Hide(); |
| 2866 | 2869 |
| 2867 // Allocate enough bitmaps so that two frames (proportionally) would be | 2870 // Allocate enough bitmaps so that two frames (proportionally) would be |
| 2868 // enough hit the handle limit. | 2871 // enough hit the handle limit. |
| 2869 int handles_per_frame = 5; | 2872 int handles_per_frame = 5; |
| 2870 FrameEvictionManager::GetInstance()->set_max_handles(handles_per_frame * 2); | 2873 FrameEvictionManager::GetInstance()->set_max_handles(handles_per_frame * 2); |
| 2871 | 2874 |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2926 parent_view_->GetNativeView()->GetRootWindow(), | 2929 parent_view_->GetNativeView()->GetRootWindow(), |
| 2927 gfx::Rect()); | 2930 gfx::Rect()); |
| 2928 views[i]->SetSize(view_rect.size()); | 2931 views[i]->SetSize(view_rect.size()); |
| 2929 } | 2932 } |
| 2930 | 2933 |
| 2931 // Make each renderer visible and swap a frame on it. No eviction should | 2934 // Make each renderer visible and swap a frame on it. No eviction should |
| 2932 // occur because all frames are visible. | 2935 // occur because all frames are visible. |
| 2933 for (size_t i = 0; i < renderer_count; ++i) { | 2936 for (size_t i = 0; i < renderer_count; ++i) { |
| 2934 views[i]->Show(); | 2937 views[i]->Show(); |
| 2935 views[i]->SubmitCompositorFrame( | 2938 views[i]->SubmitCompositorFrame( |
| 2936 i ? CreateLocalSurfaceId() : kArbitraryLocalSurfaceId, | 2939 i ? local_surface_id_allocator_.GenerateId() : kArbitraryLocalSurfaceId, |
| 2937 MakeDelegatedFrame(1.f, frame_size, view_rect)); | 2940 MakeDelegatedFrame(1.f, frame_size, view_rect)); |
| 2938 EXPECT_TRUE(views[i]->HasFrameData()); | 2941 EXPECT_TRUE(views[i]->HasFrameData()); |
| 2939 } | 2942 } |
| 2940 | 2943 |
| 2941 // If we hide [0], then [0] should be evicted. | 2944 // If we hide [0], then [0] should be evicted. |
| 2942 views[0]->Hide(); | 2945 views[0]->Hide(); |
| 2943 EXPECT_FALSE(views[0]->HasFrameData()); | 2946 EXPECT_FALSE(views[0]->HasFrameData()); |
| 2944 | 2947 |
| 2945 // If we lock [0] before hiding it, then [0] should not be evicted. | 2948 // If we lock [0] before hiding it, then [0] should not be evicted. |
| 2946 views[0]->Show(); | 2949 views[0]->Show(); |
| (...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3072 cc::BeginFrameObserver* last_observer_ = nullptr; | 3075 cc::BeginFrameObserver* last_observer_ = nullptr; |
| 3073 }; | 3076 }; |
| 3074 } // namespace | 3077 } // namespace |
| 3075 | 3078 |
| 3076 // Tests that BeginFrameAcks are forwarded correctly from the | 3079 // Tests that BeginFrameAcks are forwarded correctly from the |
| 3077 // SwapCompositorFrame and OnBeginFrameDidNotSwap IPCs through | 3080 // SwapCompositorFrame and OnBeginFrameDidNotSwap IPCs through |
| 3078 // DelegatedFrameHost and its CompositorFrameSinkSupport. | 3081 // DelegatedFrameHost and its CompositorFrameSinkSupport. |
| 3079 TEST_F(RenderWidgetHostViewAuraTest, ForwardsBeginFrameAcks) { | 3082 TEST_F(RenderWidgetHostViewAuraTest, ForwardsBeginFrameAcks) { |
| 3080 gfx::Rect view_rect(100, 100); | 3083 gfx::Rect view_rect(100, 100); |
| 3081 gfx::Size frame_size = view_rect.size(); | 3084 gfx::Size frame_size = view_rect.size(); |
| 3085 cc::LocalSurfaceId local_surface_id = kArbitraryLocalSurfaceId; |
| 3082 | 3086 |
| 3083 view_->InitAsChild(nullptr); | 3087 view_->InitAsChild(nullptr); |
| 3084 aura::client::ParentWindowWithContext( | 3088 aura::client::ParentWindowWithContext( |
| 3085 view_->GetNativeView(), parent_view_->GetNativeView()->GetRootWindow(), | 3089 view_->GetNativeView(), parent_view_->GetNativeView()->GetRootWindow(), |
| 3086 gfx::Rect()); | 3090 gfx::Rect()); |
| 3087 view_->SetSize(view_rect.size()); | 3091 view_->SetSize(view_rect.size()); |
| 3088 | 3092 |
| 3089 // Replace BeginFrameSource so that we can observe acknowledgments. Since the | 3093 // Replace BeginFrameSource so that we can observe acknowledgments. Since the |
| 3090 // DelegatedFrameHost doesn't directly observe our BeginFrameSource, | 3094 // DelegatedFrameHost doesn't directly observe our BeginFrameSource, |
| 3091 // |observer_tracker| grabs a pointer to the observer (the | 3095 // |observer_tracker| grabs a pointer to the observer (the |
| (...skipping 13 matching lines...) Expand all Loading... |
| 3105 | 3109 |
| 3106 { | 3110 { |
| 3107 cc::BeginFrameArgs args = | 3111 cc::BeginFrameArgs args = |
| 3108 cc::CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, source_id, 5u); | 3112 cc::CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, source_id, 5u); |
| 3109 source.TestOnBeginFrame(args); | 3113 source.TestOnBeginFrame(args); |
| 3110 | 3114 |
| 3111 // Ack from CompositorFrame is forwarded. | 3115 // Ack from CompositorFrame is forwarded. |
| 3112 cc::BeginFrameAck ack(source_id, 5, 4, true); | 3116 cc::BeginFrameAck ack(source_id, 5, 4, true); |
| 3113 cc::CompositorFrame frame = MakeDelegatedFrame(1.f, frame_size, view_rect); | 3117 cc::CompositorFrame frame = MakeDelegatedFrame(1.f, frame_size, view_rect); |
| 3114 frame.metadata.begin_frame_ack = ack; | 3118 frame.metadata.begin_frame_ack = ack; |
| 3115 view_->SubmitCompositorFrame(kArbitraryLocalSurfaceId, std::move(frame)); | 3119 view_->SubmitCompositorFrame(local_surface_id, std::move(frame)); |
| 3116 view_->RunOnCompositingDidCommit(); | 3120 view_->RunOnCompositingDidCommit(); |
| 3117 EXPECT_EQ(ack, source.LastAckForObserver(observer_tracker.last_observer_)); | 3121 EXPECT_EQ(ack, source.LastAckForObserver(observer_tracker.last_observer_)); |
| 3118 } | 3122 } |
| 3119 | 3123 |
| 3120 { | 3124 { |
| 3121 cc::BeginFrameArgs args = | 3125 cc::BeginFrameArgs args = |
| 3122 cc::CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, source_id, 6u); | 3126 cc::CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, source_id, 6u); |
| 3123 source.TestOnBeginFrame(args); | 3127 source.TestOnBeginFrame(args); |
| 3124 | 3128 |
| 3125 // Explicit ack through OnBeginFrameDidNotSwap is forwarded. | 3129 // Explicit ack through OnBeginFrameDidNotSwap is forwarded. |
| (...skipping 12 matching lines...) Expand all Loading... |
| 3138 cc::CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, source_id, 7u); | 3142 cc::CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, source_id, 7u); |
| 3139 source.TestOnBeginFrame(args); | 3143 source.TestOnBeginFrame(args); |
| 3140 | 3144 |
| 3141 // Ack from CompositorFrame is forwarded with old | 3145 // Ack from CompositorFrame is forwarded with old |
| 3142 // latest_confirmed_sequence_number and without damage. | 3146 // latest_confirmed_sequence_number and without damage. |
| 3143 cc::BeginFrameAck ack(source_id, 7, 7, true); | 3147 cc::BeginFrameAck ack(source_id, 7, 7, true); |
| 3144 gfx::Rect dropped_damage_rect(10, 20, 30, 40); | 3148 gfx::Rect dropped_damage_rect(10, 20, 30, 40); |
| 3145 cc::CompositorFrame frame = | 3149 cc::CompositorFrame frame = |
| 3146 MakeDelegatedFrame(1.f, frame_size, dropped_damage_rect); | 3150 MakeDelegatedFrame(1.f, frame_size, dropped_damage_rect); |
| 3147 frame.metadata.begin_frame_ack = ack; | 3151 frame.metadata.begin_frame_ack = ack; |
| 3148 view_->SubmitCompositorFrame(kArbitraryLocalSurfaceId, std::move(frame)); | 3152 view_->SubmitCompositorFrame(local_surface_id, std::move(frame)); |
| 3149 view_->RunOnCompositingDidCommit(); | 3153 view_->RunOnCompositingDidCommit(); |
| 3150 ack.latest_confirmed_sequence_number = 4; | 3154 ack.latest_confirmed_sequence_number = 4; |
| 3151 ack.has_damage = false; | 3155 ack.has_damage = false; |
| 3152 EXPECT_EQ(ack, source.LastAckForObserver(observer_tracker.last_observer_)); | 3156 EXPECT_EQ(ack, source.LastAckForObserver(observer_tracker.last_observer_)); |
| 3153 } | 3157 } |
| 3154 | 3158 |
| 3155 // Change source_id known to the view. This should reset the | 3159 // Change source_id known to the view. This should reset the |
| 3156 // latest_confirmed_sequence_number tracked by the view. | 3160 // latest_confirmed_sequence_number tracked by the view. |
| 3157 source_id = cc::BeginFrameArgs::kManualSourceId; | 3161 source_id = cc::BeginFrameArgs::kManualSourceId; |
| 3158 | 3162 |
| 3159 { | 3163 { |
| 3160 cc::BeginFrameArgs args = cc::CreateBeginFrameArgsForTesting( | 3164 cc::BeginFrameArgs args = cc::CreateBeginFrameArgsForTesting( |
| 3161 BEGINFRAME_FROM_HERE, source_id, 10u); | 3165 BEGINFRAME_FROM_HERE, source_id, 10u); |
| 3162 source.TestOnBeginFrame(args); | 3166 source.TestOnBeginFrame(args); |
| 3163 | 3167 |
| 3164 // Ack from CompositorFrame is forwarded with invalid | 3168 // Ack from CompositorFrame is forwarded with invalid |
| 3165 // latest_confirmed_sequence_number and without damage. | 3169 // latest_confirmed_sequence_number and without damage. |
| 3166 cc::BeginFrameAck ack(source_id, 10, 10, true); | 3170 cc::BeginFrameAck ack(source_id, 10, 10, true); |
| 3167 gfx::Rect dropped_damage_rect(10, 20, 30, 40); | 3171 gfx::Rect dropped_damage_rect(10, 20, 30, 40); |
| 3168 cc::CompositorFrame frame = | 3172 cc::CompositorFrame frame = |
| 3169 MakeDelegatedFrame(1.f, frame_size, dropped_damage_rect); | 3173 MakeDelegatedFrame(1.f, frame_size, dropped_damage_rect); |
| 3170 frame.metadata.begin_frame_ack = ack; | 3174 frame.metadata.begin_frame_ack = ack; |
| 3171 view_->SubmitCompositorFrame(kArbitraryLocalSurfaceId, std::move(frame)); | 3175 view_->SubmitCompositorFrame(local_surface_id, std::move(frame)); |
| 3172 view_->RunOnCompositingDidCommit(); | 3176 view_->RunOnCompositingDidCommit(); |
| 3173 ack.latest_confirmed_sequence_number = | 3177 ack.latest_confirmed_sequence_number = |
| 3174 cc::BeginFrameArgs::kInvalidFrameNumber; | 3178 cc::BeginFrameArgs::kInvalidFrameNumber; |
| 3175 ack.has_damage = false; | 3179 ack.has_damage = false; |
| 3176 EXPECT_EQ(ack, source.LastAckForObserver(observer_tracker.last_observer_)); | 3180 EXPECT_EQ(ack, source.LastAckForObserver(observer_tracker.last_observer_)); |
| 3177 } | 3181 } |
| 3178 | 3182 |
| 3179 { | 3183 { |
| 3180 cc::BeginFrameArgs args = cc::CreateBeginFrameArgsForTesting( | 3184 cc::BeginFrameArgs args = cc::CreateBeginFrameArgsForTesting( |
| 3181 BEGINFRAME_FROM_HERE, source_id, 11u); | 3185 BEGINFRAME_FROM_HERE, source_id, 11u); |
| 3182 source.TestOnBeginFrame(args); | 3186 source.TestOnBeginFrame(args); |
| 3183 | 3187 |
| 3184 // Explicit ack through OnBeginFrameDidNotSwap is forwarded with invalid | 3188 // Explicit ack through OnBeginFrameDidNotSwap is forwarded with invalid |
| 3185 // latest_confirmed_sequence_number. | 3189 // latest_confirmed_sequence_number. |
| 3186 cc::BeginFrameAck ack(source_id, 11, 11, false); | 3190 cc::BeginFrameAck ack(source_id, 11, 11, false); |
| 3187 view_->OnBeginFrameDidNotSwap(ack); | 3191 view_->OnBeginFrameDidNotSwap(ack); |
| 3188 ack.latest_confirmed_sequence_number = | 3192 ack.latest_confirmed_sequence_number = |
| 3189 cc::BeginFrameArgs::kInvalidFrameNumber; | 3193 cc::BeginFrameArgs::kInvalidFrameNumber; |
| 3190 EXPECT_EQ(ack, source.LastAckForObserver(observer_tracker.last_observer_)); | 3194 EXPECT_EQ(ack, source.LastAckForObserver(observer_tracker.last_observer_)); |
| 3191 } | 3195 } |
| 3192 | 3196 |
| 3193 // Unlock the compositor again with a new CompositorFrame of correct size. | 3197 // Unlock the compositor again with a new CompositorFrame of correct size. |
| 3194 frame_size = view_rect.size(); | 3198 frame_size = view_rect.size(); |
| 3199 local_surface_id = local_surface_id_allocator_.GenerateId(); |
| 3195 | 3200 |
| 3196 { | 3201 { |
| 3197 cc::BeginFrameArgs args = cc::CreateBeginFrameArgsForTesting( | 3202 cc::BeginFrameArgs args = cc::CreateBeginFrameArgsForTesting( |
| 3198 BEGINFRAME_FROM_HERE, source_id, 12u); | 3203 BEGINFRAME_FROM_HERE, source_id, 12u); |
| 3199 source.TestOnBeginFrame(args); | 3204 source.TestOnBeginFrame(args); |
| 3200 | 3205 |
| 3201 // Ack from CompositorFrame is forwarded. | 3206 // Ack from CompositorFrame is forwarded. |
| 3202 cc::BeginFrameAck ack(source_id, 12, 12, true); | 3207 cc::BeginFrameAck ack(source_id, 12, 12, true); |
| 3203 cc::CompositorFrame frame = MakeDelegatedFrame(1.f, frame_size, view_rect); | 3208 cc::CompositorFrame frame = MakeDelegatedFrame(1.f, frame_size, view_rect); |
| 3204 frame.metadata.begin_frame_ack = ack; | 3209 frame.metadata.begin_frame_ack = ack; |
| 3205 view_->SubmitCompositorFrame(kArbitraryLocalSurfaceId, std::move(frame)); | 3210 view_->SubmitCompositorFrame(local_surface_id, std::move(frame)); |
| 3206 view_->RunOnCompositingDidCommit(); | 3211 view_->RunOnCompositingDidCommit(); |
| 3207 EXPECT_EQ(ack, source.LastAckForObserver(observer_tracker.last_observer_)); | 3212 EXPECT_EQ(ack, source.LastAckForObserver(observer_tracker.last_observer_)); |
| 3208 } | 3213 } |
| 3209 | 3214 |
| 3210 { | 3215 { |
| 3211 cc::BeginFrameArgs args = cc::CreateBeginFrameArgsForTesting( | 3216 cc::BeginFrameArgs args = cc::CreateBeginFrameArgsForTesting( |
| 3212 BEGINFRAME_FROM_HERE, source_id, 13u); | 3217 BEGINFRAME_FROM_HERE, source_id, 13u); |
| 3213 source.TestOnBeginFrame(args); | 3218 source.TestOnBeginFrame(args); |
| 3214 | 3219 |
| 3215 // Explicit ack through OnBeginFrameDidNotSwap is forwarded. | 3220 // Explicit ack through OnBeginFrameDidNotSwap is forwarded. |
| (...skipping 2326 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5542 // There is no composition in the beginning. | 5547 // There is no composition in the beginning. |
| 5543 EXPECT_FALSE(has_composition_text()); | 5548 EXPECT_FALSE(has_composition_text()); |
| 5544 SetHasCompositionTextToTrue(); | 5549 SetHasCompositionTextToTrue(); |
| 5545 view->ImeCancelComposition(); | 5550 view->ImeCancelComposition(); |
| 5546 // The composition must have been canceled. | 5551 // The composition must have been canceled. |
| 5547 EXPECT_FALSE(has_composition_text()); | 5552 EXPECT_FALSE(has_composition_text()); |
| 5548 } | 5553 } |
| 5549 } | 5554 } |
| 5550 | 5555 |
| 5551 } // namespace content | 5556 } // namespace content |
| OLD | NEW |