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