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> |
(...skipping 11 matching lines...) Expand all Loading... |
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/surface.h" | 30 #include "cc/surfaces/surface.h" |
31 #include "cc/surfaces/surface_manager.h" | 31 #include "cc/surfaces/surface_manager.h" |
| 32 #include "cc/test/begin_frame_args_test.h" |
| 33 #include "cc/test/fake_external_begin_frame_source.h" |
32 #include "components/display_compositor/gl_helper.h" | 34 #include "components/display_compositor/gl_helper.h" |
33 #include "content/browser/browser_thread_impl.h" | 35 #include "content/browser/browser_thread_impl.h" |
34 #include "content/browser/compositor/test/no_transport_image_transport_factory.h
" | 36 #include "content/browser/compositor/test/no_transport_image_transport_factory.h
" |
35 #include "content/browser/frame_host/render_widget_host_view_guest.h" | 37 #include "content/browser/frame_host/render_widget_host_view_guest.h" |
36 #include "content/browser/gpu/compositor_util.h" | 38 #include "content/browser/gpu/compositor_util.h" |
37 #include "content/browser/renderer_host/delegated_frame_host.h" | 39 #include "content/browser/renderer_host/delegated_frame_host.h" |
38 #include "content/browser/renderer_host/delegated_frame_host_client_aura.h" | 40 #include "content/browser/renderer_host/delegated_frame_host_client_aura.h" |
39 #include "content/browser/renderer_host/input/input_router.h" | 41 #include "content/browser/renderer_host/input/input_router.h" |
40 #include "content/browser/renderer_host/input/mouse_wheel_event_queue.h" | 42 #include "content/browser/renderer_host/input/mouse_wheel_event_queue.h" |
41 #include "content/browser/renderer_host/overscroll_controller.h" | 43 #include "content/browser/renderer_host/overscroll_controller.h" |
(...skipping 1790 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1832 aura::Env::GetInstance()->set_last_mouse_location(gfx::Point(161, 161)); | 1834 aura::Env::GetInstance()->set_last_mouse_location(gfx::Point(161, 161)); |
1833 view_->UpdateCursorIfOverSelf(); | 1835 view_->UpdateCursorIfOverSelf(); |
1834 EXPECT_EQ(0, cursor_client.calls_to_set_cursor()); | 1836 EXPECT_EQ(0, cursor_client.calls_to_set_cursor()); |
1835 } | 1837 } |
1836 | 1838 |
1837 cc::CompositorFrame MakeDelegatedFrame(float scale_factor, | 1839 cc::CompositorFrame MakeDelegatedFrame(float scale_factor, |
1838 gfx::Size size, | 1840 gfx::Size size, |
1839 gfx::Rect damage) { | 1841 gfx::Rect damage) { |
1840 cc::CompositorFrame frame; | 1842 cc::CompositorFrame frame; |
1841 frame.metadata.device_scale_factor = scale_factor; | 1843 frame.metadata.device_scale_factor = scale_factor; |
| 1844 frame.metadata.begin_frame_ack = cc::BeginFrameAck(0, 1, 1, 0, true); |
1842 | 1845 |
1843 std::unique_ptr<cc::RenderPass> pass = cc::RenderPass::Create(); | 1846 std::unique_ptr<cc::RenderPass> pass = cc::RenderPass::Create(); |
1844 pass->SetNew(1, gfx::Rect(size), damage, gfx::Transform()); | 1847 pass->SetNew(1, gfx::Rect(size), damage, gfx::Transform()); |
1845 frame.render_pass_list.push_back(std::move(pass)); | 1848 frame.render_pass_list.push_back(std::move(pass)); |
1846 if (!size.IsEmpty()) { | 1849 if (!size.IsEmpty()) { |
1847 cc::TransferableResource resource; | 1850 cc::TransferableResource resource; |
1848 resource.id = 1; | 1851 resource.id = 1; |
1849 frame.resource_list.push_back(std::move(resource)); | 1852 frame.resource_list.push_back(std::move(resource)); |
1850 } | 1853 } |
1851 return frame; | 1854 return frame; |
(...skipping 850 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2702 ui::EventTimeForNow()); | 2705 ui::EventTimeForNow()); |
2703 ui::TouchEvent release(ui::ET_TOUCH_RELEASED, gfx::Point(20, 20), 0, | 2706 ui::TouchEvent release(ui::ET_TOUCH_RELEASED, gfx::Point(20, 20), 0, |
2704 ui::EventTimeForNow()); | 2707 ui::EventTimeForNow()); |
2705 view_->OnTouchEvent(&press); | 2708 view_->OnTouchEvent(&press); |
2706 view_->OnTouchEvent(&move); | 2709 view_->OnTouchEvent(&move); |
2707 EXPECT_EQ(widget_host_->lastWheelOrTouchEventLatencyInfo.source_event_type(), | 2710 EXPECT_EQ(widget_host_->lastWheelOrTouchEventLatencyInfo.source_event_type(), |
2708 ui::SourceEventType::TOUCH); | 2711 ui::SourceEventType::TOUCH); |
2709 view_->OnTouchEvent(&release); | 2712 view_->OnTouchEvent(&release); |
2710 } | 2713 } |
2711 | 2714 |
| 2715 namespace { |
| 2716 class LastObserverTracker : public cc::FakeExternalBeginFrameSource::Client { |
| 2717 public: |
| 2718 void OnAddObserver(cc::BeginFrameObserver* obs) override { |
| 2719 last_observer_ = obs; |
| 2720 } |
| 2721 void OnRemoveObserver(cc::BeginFrameObserver* obs) override {} |
| 2722 |
| 2723 cc::BeginFrameObserver* last_observer_ = nullptr; |
| 2724 }; |
| 2725 } // namespace |
| 2726 |
| 2727 // Tests that BeginFrameAcks are forwarded correctly from the |
| 2728 // SwapCompositorFrame and OnBeginFrameDidNotSwap IPCs through |
| 2729 // DelegatedFrameHost and its CompositorFrameSinkSupport. |
| 2730 TEST_F(RenderWidgetHostViewAuraTest, ForwardsBeginFrameAcks) { |
| 2731 gfx::Rect view_rect(100, 100); |
| 2732 gfx::Size frame_size = view_rect.size(); |
| 2733 |
| 2734 view_->InitAsChild(nullptr); |
| 2735 aura::client::ParentWindowWithContext( |
| 2736 view_->GetNativeView(), parent_view_->GetNativeView()->GetRootWindow(), |
| 2737 gfx::Rect()); |
| 2738 view_->SetSize(view_rect.size()); |
| 2739 |
| 2740 // Replace BeginFrameSource so that we can observe acknowledgments. Since the |
| 2741 // DelegatedFrameHost doesn't directly observe our BeginFrameSource, |
| 2742 // |observer_tracker| grabs a pointer to the observer (the |
| 2743 // DelegatedFrameHost's CompositorFrameSinkSupport). |
| 2744 LastObserverTracker observer_tracker; |
| 2745 cc::FakeExternalBeginFrameSource source(0.f, false); |
| 2746 uint32_t source_id = source.source_id(); |
| 2747 source.SetClient(&observer_tracker); |
| 2748 cc::FrameSinkId frame_sink_id = |
| 2749 view_->GetDelegatedFrameHost()->GetFrameSinkId(); |
| 2750 ImageTransportFactory* factory = ImageTransportFactory::GetInstance(); |
| 2751 cc::SurfaceManager* surface_manager = |
| 2752 factory->GetContextFactoryPrivate()->GetSurfaceManager(); |
| 2753 surface_manager->RegisterBeginFrameSource(&source, frame_sink_id); |
| 2754 view_->SetNeedsBeginFrames(true); |
| 2755 EXPECT_TRUE(observer_tracker.last_observer_); |
| 2756 |
| 2757 { |
| 2758 cc::BeginFrameArgs args = |
| 2759 cc::CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, source_id, 5u); |
| 2760 source.TestOnBeginFrame(args); |
| 2761 |
| 2762 // Ack from CompositorFrame is forwarded. |
| 2763 cc::BeginFrameAck ack(source_id, 5, 4, 0, true); |
| 2764 cc::CompositorFrame frame = MakeDelegatedFrame(1.f, frame_size, view_rect); |
| 2765 frame.metadata.begin_frame_ack = ack; |
| 2766 view_->OnSwapCompositorFrame(0, std::move(frame)); |
| 2767 view_->RunOnCompositingDidCommit(); |
| 2768 EXPECT_EQ(ack, source.LastAckForObserver(observer_tracker.last_observer_)); |
| 2769 } |
| 2770 |
| 2771 { |
| 2772 cc::BeginFrameArgs args = |
| 2773 cc::CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, source_id, 6u); |
| 2774 source.TestOnBeginFrame(args); |
| 2775 |
| 2776 // Explicit ack through OnBeginFrameDidNotSwap is forwarded. |
| 2777 cc::BeginFrameAck ack(source_id, 6, 4, 0, false); |
| 2778 view_->OnBeginFrameDidNotSwap(ack); |
| 2779 EXPECT_EQ(ack, source.LastAckForObserver(observer_tracker.last_observer_)); |
| 2780 } |
| 2781 |
| 2782 // Lock the compositor. Now we should drop frames and, thus, |
| 2783 // latest_confirmed_sequence_number should not change. |
| 2784 view_rect = gfx::Rect(150, 150); |
| 2785 view_->SetSize(view_rect.size()); |
| 2786 |
| 2787 { |
| 2788 cc::BeginFrameArgs args = |
| 2789 cc::CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, source_id, 7u); |
| 2790 source.TestOnBeginFrame(args); |
| 2791 |
| 2792 // Ack from CompositorFrame is forwarded with old |
| 2793 // latest_confirmed_sequence_number and without damage. |
| 2794 cc::BeginFrameAck ack(source_id, 7, 7, 0, true); |
| 2795 gfx::Rect dropped_damage_rect(10, 20, 30, 40); |
| 2796 cc::CompositorFrame frame = |
| 2797 MakeDelegatedFrame(1.f, frame_size, dropped_damage_rect); |
| 2798 frame.metadata.begin_frame_ack = ack; |
| 2799 view_->OnSwapCompositorFrame(0, std::move(frame)); |
| 2800 view_->RunOnCompositingDidCommit(); |
| 2801 ack.latest_confirmed_sequence_number = 4; |
| 2802 ack.has_damage = false; |
| 2803 EXPECT_EQ(ack, source.LastAckForObserver(observer_tracker.last_observer_)); |
| 2804 } |
| 2805 |
| 2806 // Change source_id known to the view. This should reset the |
| 2807 // latest_confirmed_sequence_number tracked by the view. |
| 2808 source_id = cc::BeginFrameArgs::kManualSourceId; |
| 2809 |
| 2810 { |
| 2811 cc::BeginFrameArgs args = cc::CreateBeginFrameArgsForTesting( |
| 2812 BEGINFRAME_FROM_HERE, source_id, 10u); |
| 2813 source.TestOnBeginFrame(args); |
| 2814 |
| 2815 // Ack from CompositorFrame is forwarded with invalid |
| 2816 // latest_confirmed_sequence_number and without damage. |
| 2817 cc::BeginFrameAck ack(source_id, 10, 10, 0, true); |
| 2818 gfx::Rect dropped_damage_rect(10, 20, 30, 40); |
| 2819 cc::CompositorFrame frame = |
| 2820 MakeDelegatedFrame(1.f, frame_size, dropped_damage_rect); |
| 2821 frame.metadata.begin_frame_ack = ack; |
| 2822 view_->OnSwapCompositorFrame(0, std::move(frame)); |
| 2823 view_->RunOnCompositingDidCommit(); |
| 2824 ack.latest_confirmed_sequence_number = |
| 2825 cc::BeginFrameArgs::kInvalidFrameNumber; |
| 2826 ack.has_damage = false; |
| 2827 EXPECT_EQ(ack, source.LastAckForObserver(observer_tracker.last_observer_)); |
| 2828 } |
| 2829 |
| 2830 { |
| 2831 cc::BeginFrameArgs args = cc::CreateBeginFrameArgsForTesting( |
| 2832 BEGINFRAME_FROM_HERE, source_id, 11u); |
| 2833 source.TestOnBeginFrame(args); |
| 2834 |
| 2835 // Explicit ack through OnBeginFrameDidNotSwap is forwarded with invalid |
| 2836 // latest_confirmed_sequence_number. |
| 2837 cc::BeginFrameAck ack(source_id, 11, 11, 0, false); |
| 2838 view_->OnBeginFrameDidNotSwap(ack); |
| 2839 ack.latest_confirmed_sequence_number = |
| 2840 cc::BeginFrameArgs::kInvalidFrameNumber; |
| 2841 EXPECT_EQ(ack, source.LastAckForObserver(observer_tracker.last_observer_)); |
| 2842 } |
| 2843 |
| 2844 // Unlock the compositor again with a new CompositorFrame of correct size. |
| 2845 frame_size = view_rect.size(); |
| 2846 |
| 2847 { |
| 2848 cc::BeginFrameArgs args = cc::CreateBeginFrameArgsForTesting( |
| 2849 BEGINFRAME_FROM_HERE, source_id, 12u); |
| 2850 source.TestOnBeginFrame(args); |
| 2851 |
| 2852 // Ack from CompositorFrame is forwarded. |
| 2853 cc::BeginFrameAck ack(source_id, 12, 12, 0, true); |
| 2854 cc::CompositorFrame frame = MakeDelegatedFrame(1.f, frame_size, view_rect); |
| 2855 frame.metadata.begin_frame_ack = ack; |
| 2856 view_->OnSwapCompositorFrame(0, std::move(frame)); |
| 2857 view_->RunOnCompositingDidCommit(); |
| 2858 EXPECT_EQ(ack, source.LastAckForObserver(observer_tracker.last_observer_)); |
| 2859 } |
| 2860 |
| 2861 { |
| 2862 cc::BeginFrameArgs args = cc::CreateBeginFrameArgsForTesting( |
| 2863 BEGINFRAME_FROM_HERE, source_id, 13u); |
| 2864 source.TestOnBeginFrame(args); |
| 2865 |
| 2866 // Explicit ack through OnBeginFrameDidNotSwap is forwarded. |
| 2867 cc::BeginFrameAck ack(source_id, 13, 13, 0, false); |
| 2868 view_->OnBeginFrameDidNotSwap(ack); |
| 2869 EXPECT_EQ(ack, source.LastAckForObserver(observer_tracker.last_observer_)); |
| 2870 } |
| 2871 |
| 2872 surface_manager->UnregisterBeginFrameSource(&source); |
| 2873 } |
| 2874 |
2712 class RenderWidgetHostViewAuraCopyRequestTest | 2875 class RenderWidgetHostViewAuraCopyRequestTest |
2713 : public RenderWidgetHostViewAuraShutdownTest { | 2876 : public RenderWidgetHostViewAuraShutdownTest { |
2714 public: | 2877 public: |
2715 RenderWidgetHostViewAuraCopyRequestTest() | 2878 RenderWidgetHostViewAuraCopyRequestTest() |
2716 : callback_count_(0), | 2879 : callback_count_(0), |
2717 result_(false), | 2880 result_(false), |
2718 frame_subscriber_(nullptr), | 2881 frame_subscriber_(nullptr), |
2719 tick_clock_(nullptr), | 2882 tick_clock_(nullptr), |
2720 view_rect_(100, 100) {} | 2883 view_rect_(100, 100) {} |
2721 | 2884 |
(...skipping 2091 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4813 // There is no composition in the beginning. | 4976 // There is no composition in the beginning. |
4814 EXPECT_FALSE(has_composition_text()); | 4977 EXPECT_FALSE(has_composition_text()); |
4815 SetHasCompositionTextToTrue(); | 4978 SetHasCompositionTextToTrue(); |
4816 view->ImeCancelComposition(); | 4979 view->ImeCancelComposition(); |
4817 // The composition must have been canceled. | 4980 // The composition must have been canceled. |
4818 EXPECT_FALSE(has_composition_text()); | 4981 EXPECT_FALSE(has_composition_text()); |
4819 } | 4982 } |
4820 } | 4983 } |
4821 | 4984 |
4822 } // namespace content | 4985 } // namespace content |
OLD | NEW |