| 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" | |
| 31 #include "cc/surfaces/surface.h" | 30 #include "cc/surfaces/surface.h" |
| 32 #include "cc/surfaces/surface_manager.h" | 31 #include "cc/surfaces/surface_manager.h" |
| 33 #include "cc/test/begin_frame_args_test.h" | 32 #include "cc/test/begin_frame_args_test.h" |
| 34 #include "cc/test/fake_external_begin_frame_source.h" | 33 #include "cc/test/fake_external_begin_frame_source.h" |
| 35 #include "components/viz/display_compositor/gl_helper.h" | 34 #include "components/viz/display_compositor/gl_helper.h" |
| 36 #include "components/viz/display_compositor/host_shared_bitmap_manager.h" | 35 #include "components/viz/display_compositor/host_shared_bitmap_manager.h" |
| 37 #include "content/browser/browser_thread_impl.h" | 36 #include "content/browser/browser_thread_impl.h" |
| 38 #include "content/browser/compositor/test/no_transport_image_transport_factory.h
" | 37 #include "content/browser/compositor/test/no_transport_image_transport_factory.h
" |
| 39 #include "content/browser/frame_host/render_widget_host_view_guest.h" | 38 #include "content/browser/frame_host/render_widget_host_view_guest.h" |
| 40 #include "content/browser/gpu/compositor_util.h" | 39 #include "content/browser/gpu/compositor_util.h" |
| (...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 124 void InstallDelegatedFrameHostClient( | 123 void InstallDelegatedFrameHostClient( |
| 125 RenderWidgetHostViewAura* render_widget_host_view, | 124 RenderWidgetHostViewAura* render_widget_host_view, |
| 126 std::unique_ptr<DelegatedFrameHostClient> delegated_frame_host_client); | 125 std::unique_ptr<DelegatedFrameHostClient> delegated_frame_host_client); |
| 127 | 126 |
| 128 namespace { | 127 namespace { |
| 129 | 128 |
| 130 const cc::LocalSurfaceId kArbitraryLocalSurfaceId( | 129 const cc::LocalSurfaceId kArbitraryLocalSurfaceId( |
| 131 1, | 130 1, |
| 132 base::UnguessableToken::Deserialize(2, 3)); | 131 base::UnguessableToken::Deserialize(2, 3)); |
| 133 | 132 |
| 133 cc::LocalSurfaceId CreateLocalSurfaceId() { |
| 134 return cc::LocalSurfaceId(1, base::UnguessableToken::Create()); |
| 135 } |
| 136 |
| 134 class TestOverscrollDelegate : public OverscrollControllerDelegate { | 137 class TestOverscrollDelegate : public OverscrollControllerDelegate { |
| 135 public: | 138 public: |
| 136 explicit TestOverscrollDelegate(RenderWidgetHostView* view) | 139 explicit TestOverscrollDelegate(RenderWidgetHostView* view) |
| 137 : view_(view), | 140 : view_(view), |
| 138 current_mode_(OVERSCROLL_NONE), | 141 current_mode_(OVERSCROLL_NONE), |
| 139 completed_mode_(OVERSCROLL_NONE), | 142 completed_mode_(OVERSCROLL_NONE), |
| 140 delta_x_(0.f), | 143 delta_x_(0.f), |
| 141 delta_y_(0.f) {} | 144 delta_y_(0.f) {} |
| 142 | 145 |
| 143 ~TestOverscrollDelegate() override {} | 146 ~TestOverscrollDelegate() override {} |
| (...skipping 681 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 825 RenderWidgetHostViewAura* parent_view_; | 828 RenderWidgetHostViewAura* parent_view_; |
| 826 | 829 |
| 827 // Tests should set these to nullptr if they've already triggered their | 830 // Tests should set these to nullptr if they've already triggered their |
| 828 // destruction. | 831 // destruction. |
| 829 MockRenderWidgetHostImpl* widget_host_; | 832 MockRenderWidgetHostImpl* widget_host_; |
| 830 FakeRenderWidgetHostViewAura* view_; | 833 FakeRenderWidgetHostViewAura* view_; |
| 831 | 834 |
| 832 IPC::TestSink* sink_; | 835 IPC::TestSink* sink_; |
| 833 base::test::ScopedFeatureList feature_list_; | 836 base::test::ScopedFeatureList feature_list_; |
| 834 | 837 |
| 835 cc::LocalSurfaceIdAllocator local_surface_id_allocator_; | |
| 836 | |
| 837 private: | 838 private: |
| 838 DISALLOW_COPY_AND_ASSIGN(RenderWidgetHostViewAuraTest); | 839 DISALLOW_COPY_AND_ASSIGN(RenderWidgetHostViewAuraTest); |
| 839 }; | 840 }; |
| 840 | 841 |
| 841 class RenderWidgetHostViewAuraRafAlignedTouchEnabledTest | 842 class RenderWidgetHostViewAuraRafAlignedTouchEnabledTest |
| 842 : public RenderWidgetHostViewAuraTest { | 843 : public RenderWidgetHostViewAuraTest { |
| 843 public: | 844 public: |
| 844 void SetUp() override { | 845 void SetUp() override { |
| 845 EnableRafAlignedTouchInput(); | 846 EnableRafAlignedTouchInput(); |
| 846 RenderWidgetHostViewAuraTest::SetUp(); | 847 RenderWidgetHostViewAuraTest::SetUp(); |
| (...skipping 1487 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2334 resource.id = 1; | 2335 resource.id = 1; |
| 2335 frame.resource_list.push_back(resource); | 2336 frame.resource_list.push_back(resource); |
| 2336 view_->SubmitCompositorFrame(kArbitraryLocalSurfaceId, std::move(frame)); | 2337 view_->SubmitCompositorFrame(kArbitraryLocalSurfaceId, std::move(frame)); |
| 2337 EXPECT_EQ(0u, sink_->message_count()); | 2338 EXPECT_EQ(0u, sink_->message_count()); |
| 2338 | 2339 |
| 2339 // Signal that a new RendererCompositorFrameSink was created by the renderer. | 2340 // Signal that a new RendererCompositorFrameSink was created by the renderer. |
| 2340 view_->CreateNewRendererCompositorFrameSink(); | 2341 view_->CreateNewRendererCompositorFrameSink(); |
| 2341 | 2342 |
| 2342 // Submit another frame. The resources for the previous frame belong to the | 2343 // Submit another frame. The resources for the previous frame belong to the |
| 2343 // old RendererCompositorFrameSink and should not be returned. | 2344 // old RendererCompositorFrameSink and should not be returned. |
| 2344 view_->SubmitCompositorFrame(local_surface_id_allocator_.GenerateId(), | 2345 view_->SubmitCompositorFrame(CreateLocalSurfaceId(), |
| 2345 MakeDelegatedFrame(1.f, view_size, view_rect)); | 2346 MakeDelegatedFrame(1.f, view_size, view_rect)); |
| 2346 EXPECT_EQ(0u, sink_->message_count()); | 2347 EXPECT_EQ(0u, sink_->message_count()); |
| 2347 | 2348 |
| 2348 // Report that the surface is drawn to trigger an ACK. | 2349 // Report that the surface is drawn to trigger an ACK. |
| 2349 view_->renderer_compositor_frame_sink_->Reset(); | 2350 view_->renderer_compositor_frame_sink_->Reset(); |
| 2350 cc::Surface* surface = manager->GetSurfaceForId(view_->surface_id()); | 2351 cc::Surface* surface = manager->GetSurfaceForId(view_->surface_id()); |
| 2351 EXPECT_TRUE(surface); | 2352 EXPECT_TRUE(surface); |
| 2352 surface->RunDrawCallback(); | 2353 surface->RunDrawCallback(); |
| 2353 view_->renderer_compositor_frame_sink_->Flush(); | 2354 view_->renderer_compositor_frame_sink_->Flush(); |
| 2354 EXPECT_TRUE(view_->renderer_compositor_frame_sink_->did_receive_ack()); | 2355 EXPECT_TRUE(view_->renderer_compositor_frame_sink_->did_receive_ack()); |
| (...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2480 root->layer()->Remove(mirror->root()); | 2481 root->layer()->Remove(mirror->root()); |
| 2481 } | 2482 } |
| 2482 } | 2483 } |
| 2483 | 2484 |
| 2484 // If the view size is larger than the compositor frame then extra layers | 2485 // If the view size is larger than the compositor frame then extra layers |
| 2485 // should be created to fill the gap. | 2486 // should be created to fill the gap. |
| 2486 TEST_F(RenderWidgetHostViewAuraTest, DelegatedFrameGutter) { | 2487 TEST_F(RenderWidgetHostViewAuraTest, DelegatedFrameGutter) { |
| 2487 gfx::Size large_size(100, 100); | 2488 gfx::Size large_size(100, 100); |
| 2488 gfx::Size small_size(40, 45); | 2489 gfx::Size small_size(40, 45); |
| 2489 gfx::Size medium_size(40, 95); | 2490 gfx::Size medium_size(40, 95); |
| 2490 cc::LocalSurfaceId small_id = local_surface_id_allocator_.GenerateId(); | |
| 2491 cc::LocalSurfaceId medium_id = local_surface_id_allocator_.GenerateId(); | |
| 2492 | 2491 |
| 2493 // Prevent the DelegatedFrameHost from skipping frames. | 2492 // Prevent the DelegatedFrameHost from skipping frames. |
| 2494 // XXX | 2493 // XXX |
| 2495 view_->DisableResizeLock(); | 2494 view_->DisableResizeLock(); |
| 2496 | 2495 |
| 2497 view_->InitAsChild(nullptr); | 2496 view_->InitAsChild(nullptr); |
| 2498 aura::client::ParentWindowWithContext( | 2497 aura::client::ParentWindowWithContext( |
| 2499 view_->GetNativeView(), parent_view_->GetNativeView()->GetRootWindow(), | 2498 view_->GetNativeView(), parent_view_->GetNativeView()->GetRootWindow(), |
| 2500 gfx::Rect()); | 2499 gfx::Rect()); |
| 2501 view_->SetSize(large_size); | 2500 view_->SetSize(large_size); |
| 2502 view_->Show(); | 2501 view_->Show(); |
| 2503 cc::CompositorFrame frame = | 2502 cc::CompositorFrame frame = |
| 2504 MakeDelegatedFrame(1.f, small_size, gfx::Rect(small_size)); | 2503 MakeDelegatedFrame(1.f, small_size, gfx::Rect(small_size)); |
| 2505 frame.metadata.root_background_color = SK_ColorRED; | 2504 frame.metadata.root_background_color = SK_ColorRED; |
| 2506 view_->SubmitCompositorFrame(small_id, std::move(frame)); | 2505 view_->SubmitCompositorFrame(kArbitraryLocalSurfaceId, std::move(frame)); |
| 2507 | 2506 |
| 2508 ui::Layer* parent_layer = view_->GetNativeView()->layer(); | 2507 ui::Layer* parent_layer = view_->GetNativeView()->layer(); |
| 2509 | 2508 |
| 2510 ASSERT_EQ(2u, parent_layer->children().size()); | 2509 ASSERT_EQ(2u, parent_layer->children().size()); |
| 2511 EXPECT_EQ(gfx::Rect(40, 0, 60, 100), parent_layer->children()[0]->bounds()); | 2510 EXPECT_EQ(gfx::Rect(40, 0, 60, 100), parent_layer->children()[0]->bounds()); |
| 2512 EXPECT_EQ(SK_ColorRED, parent_layer->children()[0]->background_color()); | 2511 EXPECT_EQ(SK_ColorRED, parent_layer->children()[0]->background_color()); |
| 2513 EXPECT_EQ(gfx::Rect(0, 45, 40, 55), parent_layer->children()[1]->bounds()); | 2512 EXPECT_EQ(gfx::Rect(0, 45, 40, 55), parent_layer->children()[1]->bounds()); |
| 2514 EXPECT_EQ(SK_ColorRED, parent_layer->children()[1]->background_color()); | 2513 EXPECT_EQ(SK_ColorRED, parent_layer->children()[1]->background_color()); |
| 2515 | 2514 |
| 2516 delegates_.back()->set_is_fullscreen(true); | 2515 delegates_.back()->set_is_fullscreen(true); |
| 2517 view_->SetSize(medium_size); | 2516 view_->SetSize(medium_size); |
| 2518 | 2517 |
| 2519 // Right gutter is unnecessary. | 2518 // Right gutter is unnecessary. |
| 2520 ASSERT_EQ(1u, parent_layer->children().size()); | 2519 ASSERT_EQ(1u, parent_layer->children().size()); |
| 2521 EXPECT_EQ(gfx::Rect(0, 45, 40, 50), parent_layer->children()[0]->bounds()); | 2520 EXPECT_EQ(gfx::Rect(0, 45, 40, 50), parent_layer->children()[0]->bounds()); |
| 2522 | 2521 |
| 2523 // RWH is fullscreen, so gutters should be black. | 2522 // RWH is fullscreen, so gutters should be black. |
| 2524 EXPECT_EQ(SK_ColorBLACK, parent_layer->children()[0]->background_color()); | 2523 EXPECT_EQ(SK_ColorBLACK, parent_layer->children()[0]->background_color()); |
| 2525 | 2524 |
| 2526 frame = MakeDelegatedFrame(1.f, medium_size, gfx::Rect(medium_size)); | 2525 frame = MakeDelegatedFrame(1.f, medium_size, gfx::Rect(medium_size)); |
| 2527 view_->SubmitCompositorFrame(medium_id, std::move(frame)); | 2526 view_->SubmitCompositorFrame(kArbitraryLocalSurfaceId, std::move(frame)); |
| 2528 EXPECT_EQ(0u, parent_layer->children().size()); | 2527 EXPECT_EQ(0u, parent_layer->children().size()); |
| 2529 | 2528 |
| 2530 view_->SetSize(large_size); | 2529 view_->SetSize(large_size); |
| 2531 ASSERT_EQ(2u, parent_layer->children().size()); | 2530 ASSERT_EQ(2u, parent_layer->children().size()); |
| 2532 | 2531 |
| 2533 // This should evict the frame and remove the gutter layers. | 2532 // This should evict the frame and remove the gutter layers. |
| 2534 view_->Hide(); | 2533 view_->Hide(); |
| 2535 view_->SetSize(small_size); | 2534 view_->SetSize(small_size); |
| 2536 ASSERT_EQ(0u, parent_layer->children().size()); | 2535 ASSERT_EQ(0u, parent_layer->children().size()); |
| 2537 } | 2536 } |
| 2538 | 2537 |
| 2539 TEST_F(RenderWidgetHostViewAuraTest, Resize) { | 2538 TEST_F(RenderWidgetHostViewAuraTest, Resize) { |
| 2540 gfx::Size size1(100, 100); | 2539 gfx::Size size1(100, 100); |
| 2541 gfx::Size size2(200, 200); | 2540 gfx::Size size2(200, 200); |
| 2542 gfx::Size size3(300, 300); | 2541 gfx::Size size3(300, 300); |
| 2543 cc::LocalSurfaceId id1 = local_surface_id_allocator_.GenerateId(); | |
| 2544 cc::LocalSurfaceId id2 = local_surface_id_allocator_.GenerateId(); | |
| 2545 cc::LocalSurfaceId id3 = local_surface_id_allocator_.GenerateId(); | |
| 2546 | 2542 |
| 2547 aura::Window* root_window = parent_view_->GetNativeView()->GetRootWindow(); | 2543 aura::Window* root_window = parent_view_->GetNativeView()->GetRootWindow(); |
| 2548 view_->InitAsChild(nullptr); | 2544 view_->InitAsChild(nullptr); |
| 2549 aura::client::ParentWindowWithContext( | 2545 aura::client::ParentWindowWithContext( |
| 2550 view_->GetNativeView(), root_window, gfx::Rect(size1)); | 2546 view_->GetNativeView(), root_window, gfx::Rect(size1)); |
| 2551 view_->Show(); | 2547 view_->Show(); |
| 2552 view_->SetSize(size1); | 2548 view_->SetSize(size1); |
| 2553 view_->SubmitCompositorFrame( | 2549 view_->SubmitCompositorFrame( |
| 2554 id1, MakeDelegatedFrame(1.f, size1, gfx::Rect(size1))); | 2550 kArbitraryLocalSurfaceId, |
| 2551 MakeDelegatedFrame(1.f, size1, gfx::Rect(size1))); |
| 2555 ui::DrawWaiterForTest::WaitForCommit( | 2552 ui::DrawWaiterForTest::WaitForCommit( |
| 2556 root_window->GetHost()->compositor()); | 2553 root_window->GetHost()->compositor()); |
| 2557 ViewHostMsg_UpdateRect_Params update_params; | 2554 ViewHostMsg_UpdateRect_Params update_params; |
| 2558 update_params.view_size = size1; | 2555 update_params.view_size = size1; |
| 2559 update_params.flags = ViewHostMsg_UpdateRect_Flags::IS_RESIZE_ACK; | 2556 update_params.flags = ViewHostMsg_UpdateRect_Flags::IS_RESIZE_ACK; |
| 2560 widget_host_->OnMessageReceived( | 2557 widget_host_->OnMessageReceived( |
| 2561 ViewHostMsg_UpdateRect(widget_host_->GetRoutingID(), update_params)); | 2558 ViewHostMsg_UpdateRect(widget_host_->GetRoutingID(), update_params)); |
| 2562 sink_->ClearMessages(); | 2559 sink_->ClearMessages(); |
| 2563 // Resize logic is idle (no pending resize, no pending commit). | 2560 // Resize logic is idle (no pending resize, no pending commit). |
| 2564 EXPECT_EQ(size1.ToString(), view_->GetRequestedRendererSize().ToString()); | 2561 EXPECT_EQ(size1.ToString(), view_->GetRequestedRendererSize().ToString()); |
| (...skipping 18 matching lines...) Expand all Loading... |
| 2583 // Resize renderer again, before receiving a frame. Should not produce a | 2580 // Resize renderer again, before receiving a frame. Should not produce a |
| 2584 // Resize message. | 2581 // Resize message. |
| 2585 view_->SetSize(size3); | 2582 view_->SetSize(size3); |
| 2586 EXPECT_EQ(size2.ToString(), view_->GetRequestedRendererSize().ToString()); | 2583 EXPECT_EQ(size2.ToString(), view_->GetRequestedRendererSize().ToString()); |
| 2587 EXPECT_EQ(0u, sink_->message_count()); | 2584 EXPECT_EQ(0u, sink_->message_count()); |
| 2588 | 2585 |
| 2589 // Receive a frame of the new size, should be skipped and not produce a Resize | 2586 // Receive a frame of the new size, should be skipped and not produce a Resize |
| 2590 // message. | 2587 // message. |
| 2591 view_->renderer_compositor_frame_sink_->Reset(); | 2588 view_->renderer_compositor_frame_sink_->Reset(); |
| 2592 view_->SubmitCompositorFrame( | 2589 view_->SubmitCompositorFrame( |
| 2593 id3, MakeDelegatedFrame(1.f, size3, gfx::Rect(size3))); | 2590 kArbitraryLocalSurfaceId, |
| 2591 MakeDelegatedFrame(1.f, size3, gfx::Rect(size3))); |
| 2594 view_->renderer_compositor_frame_sink_->Flush(); | 2592 view_->renderer_compositor_frame_sink_->Flush(); |
| 2595 // Expect the frame ack; | 2593 // Expect the frame ack; |
| 2596 EXPECT_TRUE(view_->renderer_compositor_frame_sink_->did_receive_ack()); | 2594 EXPECT_TRUE(view_->renderer_compositor_frame_sink_->did_receive_ack()); |
| 2597 EXPECT_EQ(size2.ToString(), view_->GetRequestedRendererSize().ToString()); | 2595 EXPECT_EQ(size2.ToString(), view_->GetRequestedRendererSize().ToString()); |
| 2598 | 2596 |
| 2599 // Receive a frame of the correct size, should not be skipped and, and should | 2597 // Receive a frame of the correct size, should not be skipped and, and should |
| 2600 // produce a Resize message after the commit. | 2598 // produce a Resize message after the commit. |
| 2601 view_->renderer_compositor_frame_sink_->Reset(); | 2599 view_->renderer_compositor_frame_sink_->Reset(); |
| 2602 view_->SubmitCompositorFrame( | 2600 view_->SubmitCompositorFrame( |
| 2603 id2, MakeDelegatedFrame(1.f, size2, gfx::Rect(size2))); | 2601 kArbitraryLocalSurfaceId, |
| 2602 MakeDelegatedFrame(1.f, size2, gfx::Rect(size2))); |
| 2604 view_->renderer_compositor_frame_sink_->Flush(); | 2603 view_->renderer_compositor_frame_sink_->Flush(); |
| 2605 cc::SurfaceId surface_id = view_->surface_id(); | 2604 cc::SurfaceId surface_id = view_->surface_id(); |
| 2606 if (!surface_id.is_valid()) { | 2605 if (!surface_id.is_valid()) { |
| 2607 // No frame ack yet. | 2606 // No frame ack yet. |
| 2608 EXPECT_FALSE(view_->renderer_compositor_frame_sink_->did_receive_ack()); | 2607 EXPECT_FALSE(view_->renderer_compositor_frame_sink_->did_receive_ack()); |
| 2609 } else { | 2608 } else { |
| 2610 // Frame isn't desired size, so early ack. | 2609 // Frame isn't desired size, so early ack. |
| 2611 EXPECT_TRUE(view_->renderer_compositor_frame_sink_->did_receive_ack()); | 2610 EXPECT_TRUE(view_->renderer_compositor_frame_sink_->did_receive_ack()); |
| 2612 } | 2611 } |
| 2613 EXPECT_EQ(size2.ToString(), view_->GetRequestedRendererSize().ToString()); | 2612 EXPECT_EQ(size2.ToString(), view_->GetRequestedRendererSize().ToString()); |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2650 update_params.view_size = size3; | 2649 update_params.view_size = size3; |
| 2651 widget_host_->OnMessageReceived( | 2650 widget_host_->OnMessageReceived( |
| 2652 ViewHostMsg_UpdateRect(widget_host_->GetRoutingID(), update_params)); | 2651 ViewHostMsg_UpdateRect(widget_host_->GetRoutingID(), update_params)); |
| 2653 sink_->ClearMessages(); | 2652 sink_->ClearMessages(); |
| 2654 } | 2653 } |
| 2655 | 2654 |
| 2656 // Skipped frames should not drop their damage. | 2655 // Skipped frames should not drop their damage. |
| 2657 TEST_F(RenderWidgetHostViewAuraTest, SkippedDelegatedFrames) { | 2656 TEST_F(RenderWidgetHostViewAuraTest, SkippedDelegatedFrames) { |
| 2658 gfx::Rect view_rect(100, 100); | 2657 gfx::Rect view_rect(100, 100); |
| 2659 gfx::Size frame_size = view_rect.size(); | 2658 gfx::Size frame_size = view_rect.size(); |
| 2660 cc::LocalSurfaceId local_surface_id = kArbitraryLocalSurfaceId; | |
| 2661 | 2659 |
| 2662 view_->InitAsChild(nullptr); | 2660 view_->InitAsChild(nullptr); |
| 2663 aura::client::ParentWindowWithContext( | 2661 aura::client::ParentWindowWithContext( |
| 2664 view_->GetNativeView(), | 2662 view_->GetNativeView(), |
| 2665 parent_view_->GetNativeView()->GetRootWindow(), | 2663 parent_view_->GetNativeView()->GetRootWindow(), |
| 2666 gfx::Rect()); | 2664 gfx::Rect()); |
| 2667 view_->SetSize(view_rect.size()); | 2665 view_->SetSize(view_rect.size()); |
| 2668 | 2666 |
| 2669 MockWindowObserver observer; | 2667 MockWindowObserver observer; |
| 2670 view_->window_->AddObserver(&observer); | 2668 view_->window_->AddObserver(&observer); |
| 2671 | 2669 |
| 2672 // A full frame of damage. | 2670 // A full frame of damage. |
| 2673 EXPECT_CALL(observer, OnDelegatedFrameDamage(view_->window_, view_rect)); | 2671 EXPECT_CALL(observer, OnDelegatedFrameDamage(view_->window_, view_rect)); |
| 2674 view_->SubmitCompositorFrame(local_surface_id, | 2672 view_->SubmitCompositorFrame(kArbitraryLocalSurfaceId, |
| 2675 MakeDelegatedFrame(1.f, frame_size, view_rect)); | 2673 MakeDelegatedFrame(1.f, frame_size, view_rect)); |
| 2676 testing::Mock::VerifyAndClearExpectations(&observer); | 2674 testing::Mock::VerifyAndClearExpectations(&observer); |
| 2677 view_->RunOnCompositingDidCommit(); | 2675 view_->RunOnCompositingDidCommit(); |
| 2678 | 2676 |
| 2679 // A partial damage frame. | 2677 // A partial damage frame. |
| 2680 gfx::Rect partial_view_rect(30, 30, 20, 20); | 2678 gfx::Rect partial_view_rect(30, 30, 20, 20); |
| 2681 EXPECT_CALL(observer, | 2679 EXPECT_CALL(observer, |
| 2682 OnDelegatedFrameDamage(view_->window_, partial_view_rect)); | 2680 OnDelegatedFrameDamage(view_->window_, partial_view_rect)); |
| 2683 view_->SubmitCompositorFrame( | 2681 view_->SubmitCompositorFrame( |
| 2684 local_surface_id, MakeDelegatedFrame(1.f, frame_size, partial_view_rect)); | 2682 kArbitraryLocalSurfaceId, |
| 2683 MakeDelegatedFrame(1.f, frame_size, partial_view_rect)); |
| 2685 testing::Mock::VerifyAndClearExpectations(&observer); | 2684 testing::Mock::VerifyAndClearExpectations(&observer); |
| 2686 view_->RunOnCompositingDidCommit(); | 2685 view_->RunOnCompositingDidCommit(); |
| 2687 | 2686 |
| 2688 EXPECT_FALSE(view_->resize_locked()); | 2687 EXPECT_FALSE(view_->resize_locked()); |
| 2689 EXPECT_FALSE(view_->compositor_locked()); | 2688 EXPECT_FALSE(view_->compositor_locked()); |
| 2690 | 2689 |
| 2691 // Lock the compositor. Now we should drop frames. | 2690 // Lock the compositor. Now we should drop frames. |
| 2692 view_rect = gfx::Rect(150, 150); | 2691 view_rect = gfx::Rect(150, 150); |
| 2693 view_->SetSize(view_rect.size()); | 2692 view_->SetSize(view_rect.size()); |
| 2694 EXPECT_TRUE(view_->resize_locked()); | 2693 EXPECT_TRUE(view_->resize_locked()); |
| 2695 EXPECT_TRUE(view_->compositor_locked()); | 2694 EXPECT_TRUE(view_->compositor_locked()); |
| 2696 | 2695 |
| 2697 // This frame is dropped. | 2696 // This frame is dropped. |
| 2698 gfx::Rect dropped_damage_rect_1(10, 20, 30, 40); | 2697 gfx::Rect dropped_damage_rect_1(10, 20, 30, 40); |
| 2699 EXPECT_CALL(observer, OnDelegatedFrameDamage(_, _)).Times(0); | 2698 EXPECT_CALL(observer, OnDelegatedFrameDamage(_, _)).Times(0); |
| 2700 view_->SubmitCompositorFrame( | 2699 view_->SubmitCompositorFrame( |
| 2701 local_surface_id, | 2700 kArbitraryLocalSurfaceId, |
| 2702 MakeDelegatedFrame(1.f, frame_size, dropped_damage_rect_1)); | 2701 MakeDelegatedFrame(1.f, frame_size, dropped_damage_rect_1)); |
| 2703 testing::Mock::VerifyAndClearExpectations(&observer); | 2702 testing::Mock::VerifyAndClearExpectations(&observer); |
| 2704 view_->RunOnCompositingDidCommit(); | 2703 view_->RunOnCompositingDidCommit(); |
| 2705 | 2704 |
| 2706 gfx::Rect dropped_damage_rect_2(40, 50, 10, 20); | 2705 gfx::Rect dropped_damage_rect_2(40, 50, 10, 20); |
| 2707 EXPECT_CALL(observer, OnDelegatedFrameDamage(_, _)).Times(0); | 2706 EXPECT_CALL(observer, OnDelegatedFrameDamage(_, _)).Times(0); |
| 2708 view_->SubmitCompositorFrame( | 2707 view_->SubmitCompositorFrame( |
| 2709 local_surface_id, | 2708 kArbitraryLocalSurfaceId, |
| 2710 MakeDelegatedFrame(1.f, frame_size, dropped_damage_rect_2)); | 2709 MakeDelegatedFrame(1.f, frame_size, dropped_damage_rect_2)); |
| 2711 testing::Mock::VerifyAndClearExpectations(&observer); | 2710 testing::Mock::VerifyAndClearExpectations(&observer); |
| 2712 view_->RunOnCompositingDidCommit(); | 2711 view_->RunOnCompositingDidCommit(); |
| 2713 | 2712 |
| 2714 EXPECT_TRUE(view_->resize_locked()); | 2713 EXPECT_TRUE(view_->resize_locked()); |
| 2715 EXPECT_TRUE(view_->compositor_locked()); | 2714 EXPECT_TRUE(view_->compositor_locked()); |
| 2716 | 2715 |
| 2717 // Unlock the compositor. This frame should damage everything. | 2716 // Unlock the compositor. This frame should damage everything. |
| 2718 frame_size = view_rect.size(); | 2717 frame_size = view_rect.size(); |
| 2719 local_surface_id = local_surface_id_allocator_.GenerateId(); | |
| 2720 | 2718 |
| 2721 gfx::Rect new_damage_rect(5, 6, 10, 10); | 2719 gfx::Rect new_damage_rect(5, 6, 10, 10); |
| 2722 EXPECT_CALL(observer, | 2720 EXPECT_CALL(observer, |
| 2723 OnDelegatedFrameDamage(view_->window_, view_rect)); | 2721 OnDelegatedFrameDamage(view_->window_, view_rect)); |
| 2724 view_->SubmitCompositorFrame( | 2722 view_->SubmitCompositorFrame( |
| 2725 local_surface_id, MakeDelegatedFrame(1.f, frame_size, new_damage_rect)); | 2723 kArbitraryLocalSurfaceId, |
| 2724 MakeDelegatedFrame(1.f, frame_size, new_damage_rect)); |
| 2726 // The swap unlocks the compositor. | 2725 // The swap unlocks the compositor. |
| 2727 EXPECT_TRUE(view_->resize_locked()); | 2726 EXPECT_TRUE(view_->resize_locked()); |
| 2728 EXPECT_FALSE(view_->compositor_locked()); | 2727 EXPECT_FALSE(view_->compositor_locked()); |
| 2729 testing::Mock::VerifyAndClearExpectations(&observer); | 2728 testing::Mock::VerifyAndClearExpectations(&observer); |
| 2730 // The UI commit unlocks for further resize. | 2729 // The UI commit unlocks for further resize. |
| 2731 view_->RunOnCompositingDidCommit(); | 2730 view_->RunOnCompositingDidCommit(); |
| 2732 EXPECT_FALSE(view_->resize_locked()); | 2731 EXPECT_FALSE(view_->resize_locked()); |
| 2733 EXPECT_FALSE(view_->compositor_locked()); | 2732 EXPECT_FALSE(view_->compositor_locked()); |
| 2734 | 2733 |
| 2735 // A partial damage frame, this should not be dropped. | 2734 // A partial damage frame, this should not be dropped. |
| 2736 EXPECT_CALL(observer, | 2735 EXPECT_CALL(observer, |
| 2737 OnDelegatedFrameDamage(view_->window_, partial_view_rect)); | 2736 OnDelegatedFrameDamage(view_->window_, partial_view_rect)); |
| 2738 view_->SubmitCompositorFrame( | 2737 view_->SubmitCompositorFrame( |
| 2739 local_surface_id, MakeDelegatedFrame(1.f, frame_size, partial_view_rect)); | 2738 kArbitraryLocalSurfaceId, |
| 2739 MakeDelegatedFrame(1.f, frame_size, partial_view_rect)); |
| 2740 testing::Mock::VerifyAndClearExpectations(&observer); | 2740 testing::Mock::VerifyAndClearExpectations(&observer); |
| 2741 view_->RunOnCompositingDidCommit(); | 2741 view_->RunOnCompositingDidCommit(); |
| 2742 EXPECT_FALSE(view_->resize_locked()); | 2742 EXPECT_FALSE(view_->resize_locked()); |
| 2743 EXPECT_FALSE(view_->compositor_locked()); | 2743 EXPECT_FALSE(view_->compositor_locked()); |
| 2744 | 2744 |
| 2745 // Resize to something empty. This doesn't lock anything since it's not | 2745 // Resize to something empty. This doesn't lock anything since it's not |
| 2746 // visible anymore anyways. | 2746 // visible anymore anyways. |
| 2747 view_rect = gfx::Rect(100, 0); | 2747 view_rect = gfx::Rect(100, 0); |
| 2748 view_->SetSize(view_rect.size()); | 2748 view_->SetSize(view_rect.size()); |
| 2749 EXPECT_FALSE(view_->resize_locked()); | 2749 EXPECT_FALSE(view_->resize_locked()); |
| 2750 EXPECT_FALSE(view_->compositor_locked()); | 2750 EXPECT_FALSE(view_->compositor_locked()); |
| 2751 | 2751 |
| 2752 // We're never expecting empty frames, resize to something non-empty. | 2752 // We're never expecting empty frames, resize to something non-empty. |
| 2753 view_rect = gfx::Rect(100, 100); | 2753 view_rect = gfx::Rect(100, 100); |
| 2754 frame_size = view_rect.size(); | |
| 2755 local_surface_id = local_surface_id_allocator_.GenerateId(); | |
| 2756 view_->SetSize(view_rect.size()); | 2754 view_->SetSize(view_rect.size()); |
| 2757 EXPECT_TRUE(view_->resize_locked()); | 2755 EXPECT_TRUE(view_->resize_locked()); |
| 2758 EXPECT_TRUE(view_->compositor_locked()); | 2756 EXPECT_TRUE(view_->compositor_locked()); |
| 2759 | 2757 |
| 2760 // This frame should not be dropped. | 2758 // This frame should not be dropped. |
| 2761 EXPECT_CALL(observer, OnDelegatedFrameDamage(view_->window_, view_rect)); | 2759 EXPECT_CALL(observer, OnDelegatedFrameDamage(view_->window_, view_rect)); |
| 2762 view_->SubmitCompositorFrame(local_surface_id, | 2760 view_->SubmitCompositorFrame( |
| 2763 MakeDelegatedFrame(1.f, frame_size, view_rect)); | 2761 kArbitraryLocalSurfaceId, |
| 2762 MakeDelegatedFrame(1.f, view_rect.size(), view_rect)); |
| 2764 testing::Mock::VerifyAndClearExpectations(&observer); | 2763 testing::Mock::VerifyAndClearExpectations(&observer); |
| 2765 EXPECT_TRUE(view_->resize_locked()); | 2764 EXPECT_TRUE(view_->resize_locked()); |
| 2766 EXPECT_FALSE(view_->compositor_locked()); | 2765 EXPECT_FALSE(view_->compositor_locked()); |
| 2767 view_->RunOnCompositingDidCommit(); | 2766 view_->RunOnCompositingDidCommit(); |
| 2768 EXPECT_FALSE(view_->resize_locked()); | 2767 EXPECT_FALSE(view_->resize_locked()); |
| 2769 EXPECT_FALSE(view_->compositor_locked()); | 2768 EXPECT_FALSE(view_->compositor_locked()); |
| 2770 | 2769 |
| 2771 view_->window_->RemoveObserver(&observer); | 2770 view_->window_->RemoveObserver(&observer); |
| 2772 } | 2771 } |
| 2773 | 2772 |
| 2774 // If resize races with a renderer frame, we should lock for the right size. | 2773 // If resize races with a renderer frame, we should lock for the right size. |
| 2775 TEST_F(RenderWidgetHostViewAuraTest, ResizeAfterReceivingFrame) { | 2774 TEST_F(RenderWidgetHostViewAuraTest, ResizeAfterReceivingFrame) { |
| 2776 gfx::Rect view_rect(100, 100); | 2775 gfx::Rect view_rect(100, 100); |
| 2777 gfx::Size frame_size = view_rect.size(); | 2776 gfx::Size frame_size = view_rect.size(); |
| 2778 cc::LocalSurfaceId local_surface_id = kArbitraryLocalSurfaceId; | |
| 2779 | 2777 |
| 2780 view_->InitAsChild(nullptr); | 2778 view_->InitAsChild(nullptr); |
| 2781 aura::client::ParentWindowWithContext( | 2779 aura::client::ParentWindowWithContext( |
| 2782 view_->GetNativeView(), parent_view_->GetNativeView()->GetRootWindow(), | 2780 view_->GetNativeView(), parent_view_->GetNativeView()->GetRootWindow(), |
| 2783 gfx::Rect()); | 2781 gfx::Rect()); |
| 2784 view_->SetSize(view_rect.size()); | 2782 view_->SetSize(view_rect.size()); |
| 2785 | 2783 |
| 2786 MockWindowObserver observer; | 2784 MockWindowObserver observer; |
| 2787 view_->window_->AddObserver(&observer); | 2785 view_->window_->AddObserver(&observer); |
| 2788 | 2786 |
| 2789 // A frame of initial size. | 2787 // A frame of initial size. |
| 2790 EXPECT_CALL(observer, OnDelegatedFrameDamage(view_->window_, view_rect)); | 2788 EXPECT_CALL(observer, OnDelegatedFrameDamage(view_->window_, view_rect)); |
| 2791 view_->SubmitCompositorFrame( | 2789 view_->SubmitCompositorFrame( |
| 2792 local_surface_id, | 2790 kArbitraryLocalSurfaceId, |
| 2793 MakeDelegatedFrame(1.f, frame_size, gfx::Rect(frame_size))); | 2791 MakeDelegatedFrame(1.f, frame_size, gfx::Rect(frame_size))); |
| 2794 testing::Mock::VerifyAndClearExpectations(&observer); | 2792 testing::Mock::VerifyAndClearExpectations(&observer); |
| 2795 view_->RunOnCompositingDidCommit(); | 2793 view_->RunOnCompositingDidCommit(); |
| 2796 | 2794 |
| 2797 // A frame of initial size arrives, but we don't commit in the UI yet. | 2795 // A frame of initial size arrives, but we don't commit in the UI yet. |
| 2798 EXPECT_CALL(observer, OnDelegatedFrameDamage(view_->window_, _)); | 2796 EXPECT_CALL(observer, OnDelegatedFrameDamage(view_->window_, _)); |
| 2799 view_->SubmitCompositorFrame( | 2797 view_->SubmitCompositorFrame( |
| 2800 local_surface_id, | 2798 kArbitraryLocalSurfaceId, |
| 2801 MakeDelegatedFrame(1.f, frame_size, gfx::Rect(frame_size))); | 2799 MakeDelegatedFrame(1.f, frame_size, gfx::Rect(frame_size))); |
| 2802 testing::Mock::VerifyAndClearExpectations(&observer); | 2800 testing::Mock::VerifyAndClearExpectations(&observer); |
| 2803 | 2801 |
| 2804 EXPECT_FALSE(view_->resize_locked()); | 2802 EXPECT_FALSE(view_->resize_locked()); |
| 2805 EXPECT_FALSE(view_->compositor_locked()); | 2803 EXPECT_FALSE(view_->compositor_locked()); |
| 2806 | 2804 |
| 2807 // Resize, and lock the compositor. Now we should drop frames of the old size. | 2805 // Resize, and lock the compositor. Now we should drop frames of the old size. |
| 2808 view_rect = gfx::Rect(150, 150); | 2806 view_rect = gfx::Rect(150, 150); |
| 2809 view_->SetSize(view_rect.size()); | 2807 view_->SetSize(view_rect.size()); |
| 2810 EXPECT_TRUE(view_->resize_locked()); | 2808 EXPECT_TRUE(view_->resize_locked()); |
| 2811 EXPECT_TRUE(view_->compositor_locked()); | 2809 EXPECT_TRUE(view_->compositor_locked()); |
| 2812 | 2810 |
| 2813 EXPECT_CALL(observer, OnDelegatedFrameDamage(_, _)).Times(0); | 2811 EXPECT_CALL(observer, OnDelegatedFrameDamage(_, _)).Times(0); |
| 2814 view_->SubmitCompositorFrame( | 2812 view_->SubmitCompositorFrame( |
| 2815 local_surface_id, | 2813 kArbitraryLocalSurfaceId, |
| 2816 MakeDelegatedFrame(1.f, frame_size, gfx::Rect(frame_size))); | 2814 MakeDelegatedFrame(1.f, frame_size, gfx::Rect(frame_size))); |
| 2817 testing::Mock::VerifyAndClearExpectations(&observer); | 2815 testing::Mock::VerifyAndClearExpectations(&observer); |
| 2818 | 2816 |
| 2819 // If the CompositorLock times out in the meantime, a commit would happen. | 2817 // If the CompositorLock times out in the meantime, a commit would happen. |
| 2820 // Verify that if a commit occurs, the lock remains and we reject frames | 2818 // Verify that if a commit occurs, the lock remains and we reject frames |
| 2821 // of the wrong size still. | 2819 // of the wrong size still. |
| 2822 view_->RunOnCompositingDidCommit(); | 2820 view_->RunOnCompositingDidCommit(); |
| 2823 | 2821 |
| 2824 EXPECT_TRUE(view_->resize_locked()); | 2822 EXPECT_TRUE(view_->resize_locked()); |
| 2825 // In this case we lied about it and the CompositorLock is still active. | 2823 // In this case we lied about it and the CompositorLock is still active. |
| 2826 EXPECT_TRUE(view_->compositor_locked()); | 2824 EXPECT_TRUE(view_->compositor_locked()); |
| 2827 | 2825 |
| 2828 EXPECT_CALL(observer, OnDelegatedFrameDamage(_, _)).Times(0); | 2826 EXPECT_CALL(observer, OnDelegatedFrameDamage(_, _)).Times(0); |
| 2829 view_->SubmitCompositorFrame( | 2827 view_->SubmitCompositorFrame( |
| 2830 local_surface_id, | 2828 kArbitraryLocalSurfaceId, |
| 2831 MakeDelegatedFrame(1.f, frame_size, gfx::Rect(frame_size))); | 2829 MakeDelegatedFrame(1.f, frame_size, gfx::Rect(frame_size))); |
| 2832 testing::Mock::VerifyAndClearExpectations(&observer); | 2830 testing::Mock::VerifyAndClearExpectations(&observer); |
| 2833 | 2831 |
| 2834 // A frame arrives of the new size, which will be accepted. | 2832 // A frame arrives of the new size, which will be accepted. |
| 2835 frame_size = view_rect.size(); | 2833 frame_size = view_rect.size(); |
| 2836 local_surface_id = local_surface_id_allocator_.GenerateId(); | |
| 2837 EXPECT_CALL(observer, OnDelegatedFrameDamage(view_->window_, _)); | 2834 EXPECT_CALL(observer, OnDelegatedFrameDamage(view_->window_, _)); |
| 2838 view_->SubmitCompositorFrame( | 2835 view_->SubmitCompositorFrame( |
| 2839 local_surface_id, | 2836 kArbitraryLocalSurfaceId, |
| 2840 MakeDelegatedFrame(1.f, frame_size, gfx::Rect(frame_size))); | 2837 MakeDelegatedFrame(1.f, frame_size, gfx::Rect(frame_size))); |
| 2841 // Receiving the frame unlocks the compositor so it can commit. | 2838 // Receiving the frame unlocks the compositor so it can commit. |
| 2842 EXPECT_TRUE(view_->resize_locked()); | 2839 EXPECT_TRUE(view_->resize_locked()); |
| 2843 EXPECT_FALSE(view_->compositor_locked()); | 2840 EXPECT_FALSE(view_->compositor_locked()); |
| 2844 testing::Mock::VerifyAndClearExpectations(&observer); | 2841 testing::Mock::VerifyAndClearExpectations(&observer); |
| 2845 | 2842 |
| 2846 // When the frame of the correct size is committed, the CompositorResizeLock | 2843 // When the frame of the correct size is committed, the CompositorResizeLock |
| 2847 // is released. | 2844 // is released. |
| 2848 view_->RunOnCompositingDidCommit(); | 2845 view_->RunOnCompositingDidCommit(); |
| 2849 EXPECT_FALSE(view_->resize_locked()); | 2846 EXPECT_FALSE(view_->resize_locked()); |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2920 view_->SubmitCompositorFrame(kArbitraryLocalSurfaceId, | 2917 view_->SubmitCompositorFrame(kArbitraryLocalSurfaceId, |
| 2921 MakeDelegatedFrame(1.f, frame_size, view_rect)); | 2918 MakeDelegatedFrame(1.f, frame_size, view_rect)); |
| 2922 testing::Mock::VerifyAndClearExpectations(&observer); | 2919 testing::Mock::VerifyAndClearExpectations(&observer); |
| 2923 view_->RunOnCompositingDidCommit(); | 2920 view_->RunOnCompositingDidCommit(); |
| 2924 | 2921 |
| 2925 // Signal that a new RendererCompositorFrameSink was created. | 2922 // Signal that a new RendererCompositorFrameSink was created. |
| 2926 view_->CreateNewRendererCompositorFrameSink(); | 2923 view_->CreateNewRendererCompositorFrameSink(); |
| 2927 | 2924 |
| 2928 // Submit a frame from the new RendererCompositorFrameSink. | 2925 // Submit a frame from the new RendererCompositorFrameSink. |
| 2929 EXPECT_CALL(observer, OnDelegatedFrameDamage(view_->window_, view_rect)); | 2926 EXPECT_CALL(observer, OnDelegatedFrameDamage(view_->window_, view_rect)); |
| 2930 view_->SubmitCompositorFrame(local_surface_id_allocator_.GenerateId(), | 2927 view_->SubmitCompositorFrame(CreateLocalSurfaceId(), |
| 2931 MakeDelegatedFrame(1.f, frame_size, view_rect)); | 2928 MakeDelegatedFrame(1.f, frame_size, view_rect)); |
| 2932 testing::Mock::VerifyAndClearExpectations(&observer); | 2929 testing::Mock::VerifyAndClearExpectations(&observer); |
| 2933 view_->RunOnCompositingDidCommit(); | 2930 view_->RunOnCompositingDidCommit(); |
| 2934 | 2931 |
| 2935 // Signal that a new RendererCompositorFrameSink was created. | 2932 // Signal that a new RendererCompositorFrameSink was created. |
| 2936 view_->CreateNewRendererCompositorFrameSink(); | 2933 view_->CreateNewRendererCompositorFrameSink(); |
| 2937 | 2934 |
| 2938 // Submit a frame from the new RendererCompositorFrameSink. | 2935 // Submit a frame from the new RendererCompositorFrameSink. |
| 2939 view_->SubmitCompositorFrame( | 2936 view_->SubmitCompositorFrame( |
| 2940 local_surface_id_allocator_.GenerateId(), | 2937 CreateLocalSurfaceId(), |
| 2941 MakeDelegatedFrame(1.f, gfx::Size(), gfx::Rect())); | 2938 MakeDelegatedFrame(1.f, gfx::Size(), gfx::Rect())); |
| 2942 testing::Mock::VerifyAndClearExpectations(&observer); | 2939 testing::Mock::VerifyAndClearExpectations(&observer); |
| 2943 view_->RunOnCompositingDidCommit(); | 2940 view_->RunOnCompositingDidCommit(); |
| 2944 | 2941 |
| 2945 // Signal that a new RendererCompositorFrameSink was created. | 2942 // Signal that a new RendererCompositorFrameSink was created. |
| 2946 view_->CreateNewRendererCompositorFrameSink(); | 2943 view_->CreateNewRendererCompositorFrameSink(); |
| 2947 | 2944 |
| 2948 // Swap another frame, with a different surface id. | 2945 // Swap another frame, with a different surface id. |
| 2949 EXPECT_CALL(observer, OnDelegatedFrameDamage(view_->window_, view_rect)); | 2946 EXPECT_CALL(observer, OnDelegatedFrameDamage(view_->window_, view_rect)); |
| 2950 view_->SubmitCompositorFrame(local_surface_id_allocator_.GenerateId(), | 2947 view_->SubmitCompositorFrame(CreateLocalSurfaceId(), |
| 2951 MakeDelegatedFrame(1.f, frame_size, view_rect)); | 2948 MakeDelegatedFrame(1.f, frame_size, view_rect)); |
| 2952 testing::Mock::VerifyAndClearExpectations(&observer); | 2949 testing::Mock::VerifyAndClearExpectations(&observer); |
| 2953 view_->RunOnCompositingDidCommit(); | 2950 view_->RunOnCompositingDidCommit(); |
| 2954 | 2951 |
| 2955 view_->window_->RemoveObserver(&observer); | 2952 view_->window_->RemoveObserver(&observer); |
| 2956 } | 2953 } |
| 2957 | 2954 |
| 2958 TEST_F(RenderWidgetHostViewAuraTest, DiscardDelegatedFrames) { | 2955 TEST_F(RenderWidgetHostViewAuraTest, DiscardDelegatedFrames) { |
| 2959 view_->InitAsChild(nullptr); | 2956 view_->InitAsChild(nullptr); |
| 2960 | 2957 |
| (...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3079 views[0]->Show(); | 3076 views[0]->Show(); |
| 3080 EXPECT_TRUE(views[0]->released_front_lock_active()); | 3077 EXPECT_TRUE(views[0]->released_front_lock_active()); |
| 3081 // Make [0] hidden, it should stop waiting. | 3078 // Make [0] hidden, it should stop waiting. |
| 3082 views[0]->Hide(); | 3079 views[0]->Hide(); |
| 3083 EXPECT_FALSE(views[0]->released_front_lock_active()); | 3080 EXPECT_FALSE(views[0]->released_front_lock_active()); |
| 3084 | 3081 |
| 3085 // Make [1] hidden, resize it. It should drop its frame. | 3082 // Make [1] hidden, resize it. It should drop its frame. |
| 3086 views[1]->Hide(); | 3083 views[1]->Hide(); |
| 3087 EXPECT_TRUE(views[1]->HasFrameData()); | 3084 EXPECT_TRUE(views[1]->HasFrameData()); |
| 3088 gfx::Size size2(200, 200); | 3085 gfx::Size size2(200, 200); |
| 3089 cc::LocalSurfaceId id2 = local_surface_id_allocator_.GenerateId(); | |
| 3090 views[1]->SetSize(size2); | 3086 views[1]->SetSize(size2); |
| 3091 EXPECT_FALSE(views[1]->HasFrameData()); | 3087 EXPECT_FALSE(views[1]->HasFrameData()); |
| 3092 // Show it, it should block until we give it a frame. | 3088 // Show it, it should block until we give it a frame. |
| 3093 views[1]->Show(); | 3089 views[1]->Show(); |
| 3094 EXPECT_TRUE(views[1]->released_front_lock_active()); | 3090 EXPECT_TRUE(views[1]->released_front_lock_active()); |
| 3095 views[1]->SubmitCompositorFrame( | 3091 views[1]->SubmitCompositorFrame( |
| 3096 id2, MakeDelegatedFrame(1.f, size2, gfx::Rect(size2))); | 3092 kArbitraryLocalSurfaceId, |
| 3093 MakeDelegatedFrame(1.f, size2, gfx::Rect(size2))); |
| 3097 EXPECT_FALSE(views[1]->released_front_lock_active()); | 3094 EXPECT_FALSE(views[1]->released_front_lock_active()); |
| 3098 | 3095 |
| 3099 for (size_t i = 0; i < renderer_count - 1; ++i) | 3096 for (size_t i = 0; i < renderer_count - 1; ++i) |
| 3100 views[i]->Hide(); | 3097 views[i]->Hide(); |
| 3101 | 3098 |
| 3102 // Allocate enough bitmaps so that two frames (proportionally) would be | 3099 // Allocate enough bitmaps so that two frames (proportionally) would be |
| 3103 // enough hit the handle limit. | 3100 // enough hit the handle limit. |
| 3104 int handles_per_frame = 5; | 3101 int handles_per_frame = 5; |
| 3105 FrameEvictionManager::GetInstance()->set_max_handles(handles_per_frame * 2); | 3102 FrameEvictionManager::GetInstance()->set_max_handles(handles_per_frame * 2); |
| 3106 | 3103 |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3161 parent_view_->GetNativeView()->GetRootWindow(), | 3158 parent_view_->GetNativeView()->GetRootWindow(), |
| 3162 gfx::Rect()); | 3159 gfx::Rect()); |
| 3163 views[i]->SetSize(view_rect.size()); | 3160 views[i]->SetSize(view_rect.size()); |
| 3164 } | 3161 } |
| 3165 | 3162 |
| 3166 // Make each renderer visible and swap a frame on it. No eviction should | 3163 // Make each renderer visible and swap a frame on it. No eviction should |
| 3167 // occur because all frames are visible. | 3164 // occur because all frames are visible. |
| 3168 for (size_t i = 0; i < renderer_count; ++i) { | 3165 for (size_t i = 0; i < renderer_count; ++i) { |
| 3169 views[i]->Show(); | 3166 views[i]->Show(); |
| 3170 views[i]->SubmitCompositorFrame( | 3167 views[i]->SubmitCompositorFrame( |
| 3171 i ? local_surface_id_allocator_.GenerateId() : kArbitraryLocalSurfaceId, | 3168 i ? CreateLocalSurfaceId() : kArbitraryLocalSurfaceId, |
| 3172 MakeDelegatedFrame(1.f, frame_size, view_rect)); | 3169 MakeDelegatedFrame(1.f, frame_size, view_rect)); |
| 3173 EXPECT_TRUE(views[i]->HasFrameData()); | 3170 EXPECT_TRUE(views[i]->HasFrameData()); |
| 3174 } | 3171 } |
| 3175 | 3172 |
| 3176 // If we hide [0], then [0] should be evicted. | 3173 // If we hide [0], then [0] should be evicted. |
| 3177 views[0]->Hide(); | 3174 views[0]->Hide(); |
| 3178 EXPECT_FALSE(views[0]->HasFrameData()); | 3175 EXPECT_FALSE(views[0]->HasFrameData()); |
| 3179 | 3176 |
| 3180 // If we lock [0] before hiding it, then [0] should not be evicted. | 3177 // If we lock [0] before hiding it, then [0] should not be evicted. |
| 3181 views[0]->Show(); | 3178 views[0]->Show(); |
| (...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3307 cc::BeginFrameObserver* last_observer_ = nullptr; | 3304 cc::BeginFrameObserver* last_observer_ = nullptr; |
| 3308 }; | 3305 }; |
| 3309 } // namespace | 3306 } // namespace |
| 3310 | 3307 |
| 3311 // Tests that BeginFrameAcks are forwarded correctly from the | 3308 // Tests that BeginFrameAcks are forwarded correctly from the |
| 3312 // SwapCompositorFrame and OnDidNotProduceFrame IPCs through DelegatedFrameHost | 3309 // SwapCompositorFrame and OnDidNotProduceFrame IPCs through DelegatedFrameHost |
| 3313 // and its CompositorFrameSinkSupport. | 3310 // and its CompositorFrameSinkSupport. |
| 3314 TEST_F(RenderWidgetHostViewAuraTest, ForwardsBeginFrameAcks) { | 3311 TEST_F(RenderWidgetHostViewAuraTest, ForwardsBeginFrameAcks) { |
| 3315 gfx::Rect view_rect(100, 100); | 3312 gfx::Rect view_rect(100, 100); |
| 3316 gfx::Size frame_size = view_rect.size(); | 3313 gfx::Size frame_size = view_rect.size(); |
| 3317 cc::LocalSurfaceId local_surface_id = kArbitraryLocalSurfaceId; | |
| 3318 | 3314 |
| 3319 view_->InitAsChild(nullptr); | 3315 view_->InitAsChild(nullptr); |
| 3320 aura::client::ParentWindowWithContext( | 3316 aura::client::ParentWindowWithContext( |
| 3321 view_->GetNativeView(), parent_view_->GetNativeView()->GetRootWindow(), | 3317 view_->GetNativeView(), parent_view_->GetNativeView()->GetRootWindow(), |
| 3322 gfx::Rect()); | 3318 gfx::Rect()); |
| 3323 view_->SetSize(view_rect.size()); | 3319 view_->SetSize(view_rect.size()); |
| 3324 | 3320 |
| 3325 // Replace BeginFrameSource so that we can observe acknowledgments. Since the | 3321 // Replace BeginFrameSource so that we can observe acknowledgments. Since the |
| 3326 // DelegatedFrameHost doesn't directly observe our BeginFrameSource, | 3322 // DelegatedFrameHost doesn't directly observe our BeginFrameSource, |
| 3327 // |observer_tracker| grabs a pointer to the observer (the | 3323 // |observer_tracker| grabs a pointer to the observer (the |
| (...skipping 13 matching lines...) Expand all Loading... |
| 3341 | 3337 |
| 3342 { | 3338 { |
| 3343 cc::BeginFrameArgs args = | 3339 cc::BeginFrameArgs args = |
| 3344 cc::CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, source_id, 5u); | 3340 cc::CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, source_id, 5u); |
| 3345 source.TestOnBeginFrame(args); | 3341 source.TestOnBeginFrame(args); |
| 3346 | 3342 |
| 3347 // Ack from CompositorFrame is forwarded. | 3343 // Ack from CompositorFrame is forwarded. |
| 3348 cc::BeginFrameAck ack(source_id, 5, 4, true); | 3344 cc::BeginFrameAck ack(source_id, 5, 4, true); |
| 3349 cc::CompositorFrame frame = MakeDelegatedFrame(1.f, frame_size, view_rect); | 3345 cc::CompositorFrame frame = MakeDelegatedFrame(1.f, frame_size, view_rect); |
| 3350 frame.metadata.begin_frame_ack = ack; | 3346 frame.metadata.begin_frame_ack = ack; |
| 3351 view_->SubmitCompositorFrame(local_surface_id, std::move(frame)); | 3347 view_->SubmitCompositorFrame(kArbitraryLocalSurfaceId, std::move(frame)); |
| 3352 view_->RunOnCompositingDidCommit(); | 3348 view_->RunOnCompositingDidCommit(); |
| 3353 EXPECT_EQ(ack, source.LastAckForObserver(observer_tracker.last_observer_)); | 3349 EXPECT_EQ(ack, source.LastAckForObserver(observer_tracker.last_observer_)); |
| 3354 } | 3350 } |
| 3355 | 3351 |
| 3356 { | 3352 { |
| 3357 cc::BeginFrameArgs args = | 3353 cc::BeginFrameArgs args = |
| 3358 cc::CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, source_id, 6u); | 3354 cc::CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, source_id, 6u); |
| 3359 source.TestOnBeginFrame(args); | 3355 source.TestOnBeginFrame(args); |
| 3360 | 3356 |
| 3361 // Explicit ack through OnDidNotProduceFrame is forwarded. | 3357 // Explicit ack through OnDidNotProduceFrame is forwarded. |
| (...skipping 12 matching lines...) Expand all Loading... |
| 3374 cc::CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, source_id, 7u); | 3370 cc::CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, source_id, 7u); |
| 3375 source.TestOnBeginFrame(args); | 3371 source.TestOnBeginFrame(args); |
| 3376 | 3372 |
| 3377 // Ack from CompositorFrame is forwarded with old | 3373 // Ack from CompositorFrame is forwarded with old |
| 3378 // latest_confirmed_sequence_number and without damage. | 3374 // latest_confirmed_sequence_number and without damage. |
| 3379 cc::BeginFrameAck ack(source_id, 7, 7, true); | 3375 cc::BeginFrameAck ack(source_id, 7, 7, true); |
| 3380 gfx::Rect dropped_damage_rect(10, 20, 30, 40); | 3376 gfx::Rect dropped_damage_rect(10, 20, 30, 40); |
| 3381 cc::CompositorFrame frame = | 3377 cc::CompositorFrame frame = |
| 3382 MakeDelegatedFrame(1.f, frame_size, dropped_damage_rect); | 3378 MakeDelegatedFrame(1.f, frame_size, dropped_damage_rect); |
| 3383 frame.metadata.begin_frame_ack = ack; | 3379 frame.metadata.begin_frame_ack = ack; |
| 3384 view_->SubmitCompositorFrame(local_surface_id, std::move(frame)); | 3380 view_->SubmitCompositorFrame(kArbitraryLocalSurfaceId, std::move(frame)); |
| 3385 view_->RunOnCompositingDidCommit(); | 3381 view_->RunOnCompositingDidCommit(); |
| 3386 ack.latest_confirmed_sequence_number = 4; | 3382 ack.latest_confirmed_sequence_number = 4; |
| 3387 ack.has_damage = false; | 3383 ack.has_damage = false; |
| 3388 EXPECT_EQ(ack, source.LastAckForObserver(observer_tracker.last_observer_)); | 3384 EXPECT_EQ(ack, source.LastAckForObserver(observer_tracker.last_observer_)); |
| 3389 } | 3385 } |
| 3390 | 3386 |
| 3391 // Change source_id known to the view. This should reset the | 3387 // Change source_id known to the view. This should reset the |
| 3392 // latest_confirmed_sequence_number tracked by the view. | 3388 // latest_confirmed_sequence_number tracked by the view. |
| 3393 source_id = cc::BeginFrameArgs::kManualSourceId; | 3389 source_id = cc::BeginFrameArgs::kManualSourceId; |
| 3394 | 3390 |
| 3395 { | 3391 { |
| 3396 cc::BeginFrameArgs args = cc::CreateBeginFrameArgsForTesting( | 3392 cc::BeginFrameArgs args = cc::CreateBeginFrameArgsForTesting( |
| 3397 BEGINFRAME_FROM_HERE, source_id, 10u); | 3393 BEGINFRAME_FROM_HERE, source_id, 10u); |
| 3398 source.TestOnBeginFrame(args); | 3394 source.TestOnBeginFrame(args); |
| 3399 | 3395 |
| 3400 // Ack from CompositorFrame is forwarded with invalid | 3396 // Ack from CompositorFrame is forwarded with invalid |
| 3401 // latest_confirmed_sequence_number and without damage. | 3397 // latest_confirmed_sequence_number and without damage. |
| 3402 cc::BeginFrameAck ack(source_id, 10, 10, true); | 3398 cc::BeginFrameAck ack(source_id, 10, 10, true); |
| 3403 gfx::Rect dropped_damage_rect(10, 20, 30, 40); | 3399 gfx::Rect dropped_damage_rect(10, 20, 30, 40); |
| 3404 cc::CompositorFrame frame = | 3400 cc::CompositorFrame frame = |
| 3405 MakeDelegatedFrame(1.f, frame_size, dropped_damage_rect); | 3401 MakeDelegatedFrame(1.f, frame_size, dropped_damage_rect); |
| 3406 frame.metadata.begin_frame_ack = ack; | 3402 frame.metadata.begin_frame_ack = ack; |
| 3407 view_->SubmitCompositorFrame(local_surface_id, std::move(frame)); | 3403 view_->SubmitCompositorFrame(kArbitraryLocalSurfaceId, std::move(frame)); |
| 3408 view_->RunOnCompositingDidCommit(); | 3404 view_->RunOnCompositingDidCommit(); |
| 3409 ack.latest_confirmed_sequence_number = | 3405 ack.latest_confirmed_sequence_number = |
| 3410 cc::BeginFrameArgs::kInvalidFrameNumber; | 3406 cc::BeginFrameArgs::kInvalidFrameNumber; |
| 3411 ack.has_damage = false; | 3407 ack.has_damage = false; |
| 3412 EXPECT_EQ(ack, source.LastAckForObserver(observer_tracker.last_observer_)); | 3408 EXPECT_EQ(ack, source.LastAckForObserver(observer_tracker.last_observer_)); |
| 3413 } | 3409 } |
| 3414 | 3410 |
| 3415 { | 3411 { |
| 3416 cc::BeginFrameArgs args = cc::CreateBeginFrameArgsForTesting( | 3412 cc::BeginFrameArgs args = cc::CreateBeginFrameArgsForTesting( |
| 3417 BEGINFRAME_FROM_HERE, source_id, 11u); | 3413 BEGINFRAME_FROM_HERE, source_id, 11u); |
| 3418 source.TestOnBeginFrame(args); | 3414 source.TestOnBeginFrame(args); |
| 3419 | 3415 |
| 3420 // Explicit ack through OnDidNotProduceFrame is forwarded with invalid | 3416 // Explicit ack through OnDidNotProduceFrame is forwarded with invalid |
| 3421 // latest_confirmed_sequence_number. | 3417 // latest_confirmed_sequence_number. |
| 3422 cc::BeginFrameAck ack(source_id, 11, 11, false); | 3418 cc::BeginFrameAck ack(source_id, 11, 11, false); |
| 3423 view_->OnDidNotProduceFrame(ack); | 3419 view_->OnDidNotProduceFrame(ack); |
| 3424 ack.latest_confirmed_sequence_number = | 3420 ack.latest_confirmed_sequence_number = |
| 3425 cc::BeginFrameArgs::kInvalidFrameNumber; | 3421 cc::BeginFrameArgs::kInvalidFrameNumber; |
| 3426 EXPECT_EQ(ack, source.LastAckForObserver(observer_tracker.last_observer_)); | 3422 EXPECT_EQ(ack, source.LastAckForObserver(observer_tracker.last_observer_)); |
| 3427 } | 3423 } |
| 3428 | 3424 |
| 3429 // Unlock the compositor again with a new CompositorFrame of correct size. | 3425 // Unlock the compositor again with a new CompositorFrame of correct size. |
| 3430 frame_size = view_rect.size(); | 3426 frame_size = view_rect.size(); |
| 3431 local_surface_id = local_surface_id_allocator_.GenerateId(); | |
| 3432 | 3427 |
| 3433 { | 3428 { |
| 3434 cc::BeginFrameArgs args = cc::CreateBeginFrameArgsForTesting( | 3429 cc::BeginFrameArgs args = cc::CreateBeginFrameArgsForTesting( |
| 3435 BEGINFRAME_FROM_HERE, source_id, 12u); | 3430 BEGINFRAME_FROM_HERE, source_id, 12u); |
| 3436 source.TestOnBeginFrame(args); | 3431 source.TestOnBeginFrame(args); |
| 3437 | 3432 |
| 3438 // Ack from CompositorFrame is forwarded. | 3433 // Ack from CompositorFrame is forwarded. |
| 3439 cc::BeginFrameAck ack(source_id, 12, 12, true); | 3434 cc::BeginFrameAck ack(source_id, 12, 12, true); |
| 3440 cc::CompositorFrame frame = MakeDelegatedFrame(1.f, frame_size, view_rect); | 3435 cc::CompositorFrame frame = MakeDelegatedFrame(1.f, frame_size, view_rect); |
| 3441 frame.metadata.begin_frame_ack = ack; | 3436 frame.metadata.begin_frame_ack = ack; |
| 3442 view_->SubmitCompositorFrame(local_surface_id, std::move(frame)); | 3437 view_->SubmitCompositorFrame(kArbitraryLocalSurfaceId, std::move(frame)); |
| 3443 view_->RunOnCompositingDidCommit(); | 3438 view_->RunOnCompositingDidCommit(); |
| 3444 EXPECT_EQ(ack, source.LastAckForObserver(observer_tracker.last_observer_)); | 3439 EXPECT_EQ(ack, source.LastAckForObserver(observer_tracker.last_observer_)); |
| 3445 } | 3440 } |
| 3446 | 3441 |
| 3447 { | 3442 { |
| 3448 cc::BeginFrameArgs args = cc::CreateBeginFrameArgsForTesting( | 3443 cc::BeginFrameArgs args = cc::CreateBeginFrameArgsForTesting( |
| 3449 BEGINFRAME_FROM_HERE, source_id, 13u); | 3444 BEGINFRAME_FROM_HERE, source_id, 13u); |
| 3450 source.TestOnBeginFrame(args); | 3445 source.TestOnBeginFrame(args); |
| 3451 | 3446 |
| 3452 // Explicit ack through OnDidNotProduceFrame is forwarded. | 3447 // Explicit ack through OnDidNotProduceFrame is forwarded. |
| (...skipping 2437 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5890 // There is no composition in the beginning. | 5885 // There is no composition in the beginning. |
| 5891 EXPECT_FALSE(has_composition_text()); | 5886 EXPECT_FALSE(has_composition_text()); |
| 5892 SetHasCompositionTextToTrue(); | 5887 SetHasCompositionTextToTrue(); |
| 5893 view->ImeCancelComposition(); | 5888 view->ImeCancelComposition(); |
| 5894 // The composition must have been canceled. | 5889 // The composition must have been canceled. |
| 5895 EXPECT_FALSE(has_composition_text()); | 5890 EXPECT_FALSE(has_composition_text()); |
| 5896 } | 5891 } |
| 5897 } | 5892 } |
| 5898 | 5893 |
| 5899 } // namespace content | 5894 } // namespace content |
| OLD | NEW |