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 1810 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1852 aura::Env::GetInstance()->set_last_mouse_location(gfx::Point(161, 161)); | 1854 aura::Env::GetInstance()->set_last_mouse_location(gfx::Point(161, 161)); |
1853 view_->UpdateCursorIfOverSelf(); | 1855 view_->UpdateCursorIfOverSelf(); |
1854 EXPECT_EQ(0, cursor_client.calls_to_set_cursor()); | 1856 EXPECT_EQ(0, cursor_client.calls_to_set_cursor()); |
1855 } | 1857 } |
1856 | 1858 |
1857 cc::CompositorFrame MakeDelegatedFrame(float scale_factor, | 1859 cc::CompositorFrame MakeDelegatedFrame(float scale_factor, |
1858 gfx::Size size, | 1860 gfx::Size size, |
1859 gfx::Rect damage) { | 1861 gfx::Rect damage) { |
1860 cc::CompositorFrame frame; | 1862 cc::CompositorFrame frame; |
1861 frame.metadata.device_scale_factor = scale_factor; | 1863 frame.metadata.device_scale_factor = scale_factor; |
| 1864 frame.metadata.begin_frame_ack = cc::BeginFrameAck(0, 1, 1, 0, true); |
1862 | 1865 |
1863 std::unique_ptr<cc::RenderPass> pass = cc::RenderPass::Create(); | 1866 std::unique_ptr<cc::RenderPass> pass = cc::RenderPass::Create(); |
1864 pass->SetNew(1, gfx::Rect(size), damage, gfx::Transform()); | 1867 pass->SetNew(1, gfx::Rect(size), damage, gfx::Transform()); |
1865 frame.render_pass_list.push_back(std::move(pass)); | 1868 frame.render_pass_list.push_back(std::move(pass)); |
1866 if (!size.IsEmpty()) { | 1869 if (!size.IsEmpty()) { |
1867 cc::TransferableResource resource; | 1870 cc::TransferableResource resource; |
1868 resource.id = 1; | 1871 resource.id = 1; |
1869 frame.resource_list.push_back(std::move(resource)); | 1872 frame.resource_list.push_back(std::move(resource)); |
1870 } | 1873 } |
1871 return frame; | 1874 return frame; |
(...skipping 853 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2725 ui::TouchEvent release( | 2728 ui::TouchEvent release( |
2726 ui::ET_TOUCH_RELEASED, gfx::Point(20, 20), ui::EventTimeForNow(), | 2729 ui::ET_TOUCH_RELEASED, gfx::Point(20, 20), ui::EventTimeForNow(), |
2727 ui::PointerDetails(ui::EventPointerType::POINTER_TYPE_TOUCH, 0)); | 2730 ui::PointerDetails(ui::EventPointerType::POINTER_TYPE_TOUCH, 0)); |
2728 view_->OnTouchEvent(&press); | 2731 view_->OnTouchEvent(&press); |
2729 view_->OnTouchEvent(&move); | 2732 view_->OnTouchEvent(&move); |
2730 EXPECT_EQ(widget_host_->lastWheelOrTouchEventLatencyInfo.source_event_type(), | 2733 EXPECT_EQ(widget_host_->lastWheelOrTouchEventLatencyInfo.source_event_type(), |
2731 ui::SourceEventType::TOUCH); | 2734 ui::SourceEventType::TOUCH); |
2732 view_->OnTouchEvent(&release); | 2735 view_->OnTouchEvent(&release); |
2733 } | 2736 } |
2734 | 2737 |
| 2738 namespace { |
| 2739 class LastObserverTracker : public cc::FakeExternalBeginFrameSource::Client { |
| 2740 public: |
| 2741 void OnAddObserver(cc::BeginFrameObserver* obs) override { |
| 2742 last_observer_ = obs; |
| 2743 } |
| 2744 void OnRemoveObserver(cc::BeginFrameObserver* obs) override {} |
| 2745 |
| 2746 cc::BeginFrameObserver* last_observer_ = nullptr; |
| 2747 }; |
| 2748 } // namespace |
| 2749 |
| 2750 // Tests that BeginFrameAcks are forwarded correctly from the |
| 2751 // SwapCompositorFrame and OnBeginFrameDidNotSwap IPCs through |
| 2752 // DelegatedFrameHost and its CompositorFrameSinkSupport. |
| 2753 TEST_F(RenderWidgetHostViewAuraTest, ForwardsBeginFrameAcks) { |
| 2754 gfx::Rect view_rect(100, 100); |
| 2755 gfx::Size frame_size = view_rect.size(); |
| 2756 |
| 2757 view_->InitAsChild(nullptr); |
| 2758 aura::client::ParentWindowWithContext( |
| 2759 view_->GetNativeView(), parent_view_->GetNativeView()->GetRootWindow(), |
| 2760 gfx::Rect()); |
| 2761 view_->SetSize(view_rect.size()); |
| 2762 |
| 2763 // Replace BeginFrameSource so that we can observe acknowledgments. Since the |
| 2764 // DelegatedFrameHost doesn't directly observe our BeginFrameSource, |
| 2765 // |observer_tracker| grabs a pointer to the observer (the |
| 2766 // DelegatedFrameHost's CompositorFrameSinkSupport). |
| 2767 LastObserverTracker observer_tracker; |
| 2768 cc::FakeExternalBeginFrameSource source(0.f, false); |
| 2769 uint32_t source_id = source.source_id(); |
| 2770 source.SetClient(&observer_tracker); |
| 2771 cc::FrameSinkId frame_sink_id = |
| 2772 view_->GetDelegatedFrameHost()->GetFrameSinkId(); |
| 2773 ImageTransportFactory* factory = ImageTransportFactory::GetInstance(); |
| 2774 cc::SurfaceManager* surface_manager = |
| 2775 factory->GetContextFactoryPrivate()->GetSurfaceManager(); |
| 2776 surface_manager->RegisterBeginFrameSource(&source, frame_sink_id); |
| 2777 view_->SetNeedsBeginFrames(true); |
| 2778 EXPECT_TRUE(observer_tracker.last_observer_); |
| 2779 |
| 2780 { |
| 2781 cc::BeginFrameArgs args = |
| 2782 cc::CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, source_id, 5u); |
| 2783 source.TestOnBeginFrame(args); |
| 2784 |
| 2785 // Ack from CompositorFrame is forwarded. |
| 2786 cc::BeginFrameAck ack(source_id, 5, 4, 0, true); |
| 2787 cc::CompositorFrame frame = MakeDelegatedFrame(1.f, frame_size, view_rect); |
| 2788 frame.metadata.begin_frame_ack = ack; |
| 2789 view_->OnSwapCompositorFrame(0, std::move(frame)); |
| 2790 view_->RunOnCompositingDidCommit(); |
| 2791 EXPECT_EQ(ack, source.LastAckForObserver(observer_tracker.last_observer_)); |
| 2792 } |
| 2793 |
| 2794 { |
| 2795 cc::BeginFrameArgs args = |
| 2796 cc::CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, source_id, 6u); |
| 2797 source.TestOnBeginFrame(args); |
| 2798 |
| 2799 // Explicit ack through OnBeginFrameDidNotSwap is forwarded. |
| 2800 cc::BeginFrameAck ack(source_id, 6, 4, 0, false); |
| 2801 view_->OnBeginFrameDidNotSwap(ack); |
| 2802 EXPECT_EQ(ack, source.LastAckForObserver(observer_tracker.last_observer_)); |
| 2803 } |
| 2804 |
| 2805 // Lock the compositor. Now we should drop frames and, thus, |
| 2806 // latest_confirmed_sequence_number should not change. |
| 2807 view_rect = gfx::Rect(150, 150); |
| 2808 view_->SetSize(view_rect.size()); |
| 2809 |
| 2810 { |
| 2811 cc::BeginFrameArgs args = |
| 2812 cc::CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, source_id, 7u); |
| 2813 source.TestOnBeginFrame(args); |
| 2814 |
| 2815 // Ack from CompositorFrame is forwarded with old |
| 2816 // latest_confirmed_sequence_number and without damage. |
| 2817 cc::BeginFrameAck ack(source_id, 7, 7, 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 = 4; |
| 2825 ack.has_damage = false; |
| 2826 EXPECT_EQ(ack, source.LastAckForObserver(observer_tracker.last_observer_)); |
| 2827 } |
| 2828 |
| 2829 // Change source_id known to the view. This should reset the |
| 2830 // latest_confirmed_sequence_number tracked by the view. |
| 2831 source_id = cc::BeginFrameArgs::kManualSourceId; |
| 2832 |
| 2833 { |
| 2834 cc::BeginFrameArgs args = cc::CreateBeginFrameArgsForTesting( |
| 2835 BEGINFRAME_FROM_HERE, source_id, 10u); |
| 2836 source.TestOnBeginFrame(args); |
| 2837 |
| 2838 // Ack from CompositorFrame is forwarded with invalid |
| 2839 // latest_confirmed_sequence_number and without damage. |
| 2840 cc::BeginFrameAck ack(source_id, 10, 10, 0, true); |
| 2841 gfx::Rect dropped_damage_rect(10, 20, 30, 40); |
| 2842 cc::CompositorFrame frame = |
| 2843 MakeDelegatedFrame(1.f, frame_size, dropped_damage_rect); |
| 2844 frame.metadata.begin_frame_ack = ack; |
| 2845 view_->OnSwapCompositorFrame(0, std::move(frame)); |
| 2846 view_->RunOnCompositingDidCommit(); |
| 2847 ack.latest_confirmed_sequence_number = |
| 2848 cc::BeginFrameArgs::kInvalidFrameNumber; |
| 2849 ack.has_damage = false; |
| 2850 EXPECT_EQ(ack, source.LastAckForObserver(observer_tracker.last_observer_)); |
| 2851 } |
| 2852 |
| 2853 { |
| 2854 cc::BeginFrameArgs args = cc::CreateBeginFrameArgsForTesting( |
| 2855 BEGINFRAME_FROM_HERE, source_id, 11u); |
| 2856 source.TestOnBeginFrame(args); |
| 2857 |
| 2858 // Explicit ack through OnBeginFrameDidNotSwap is forwarded with invalid |
| 2859 // latest_confirmed_sequence_number. |
| 2860 cc::BeginFrameAck ack(source_id, 11, 11, 0, false); |
| 2861 view_->OnBeginFrameDidNotSwap(ack); |
| 2862 ack.latest_confirmed_sequence_number = |
| 2863 cc::BeginFrameArgs::kInvalidFrameNumber; |
| 2864 EXPECT_EQ(ack, source.LastAckForObserver(observer_tracker.last_observer_)); |
| 2865 } |
| 2866 |
| 2867 // Unlock the compositor again with a new CompositorFrame of correct size. |
| 2868 frame_size = view_rect.size(); |
| 2869 |
| 2870 { |
| 2871 cc::BeginFrameArgs args = cc::CreateBeginFrameArgsForTesting( |
| 2872 BEGINFRAME_FROM_HERE, source_id, 12u); |
| 2873 source.TestOnBeginFrame(args); |
| 2874 |
| 2875 // Ack from CompositorFrame is forwarded. |
| 2876 cc::BeginFrameAck ack(source_id, 12, 12, 0, true); |
| 2877 cc::CompositorFrame frame = MakeDelegatedFrame(1.f, frame_size, view_rect); |
| 2878 frame.metadata.begin_frame_ack = ack; |
| 2879 view_->OnSwapCompositorFrame(0, std::move(frame)); |
| 2880 view_->RunOnCompositingDidCommit(); |
| 2881 EXPECT_EQ(ack, source.LastAckForObserver(observer_tracker.last_observer_)); |
| 2882 } |
| 2883 |
| 2884 { |
| 2885 cc::BeginFrameArgs args = cc::CreateBeginFrameArgsForTesting( |
| 2886 BEGINFRAME_FROM_HERE, source_id, 13u); |
| 2887 source.TestOnBeginFrame(args); |
| 2888 |
| 2889 // Explicit ack through OnBeginFrameDidNotSwap is forwarded. |
| 2890 cc::BeginFrameAck ack(source_id, 13, 13, 0, false); |
| 2891 view_->OnBeginFrameDidNotSwap(ack); |
| 2892 EXPECT_EQ(ack, source.LastAckForObserver(observer_tracker.last_observer_)); |
| 2893 } |
| 2894 |
| 2895 surface_manager->UnregisterBeginFrameSource(&source); |
| 2896 } |
| 2897 |
2735 class RenderWidgetHostViewAuraCopyRequestTest | 2898 class RenderWidgetHostViewAuraCopyRequestTest |
2736 : public RenderWidgetHostViewAuraShutdownTest { | 2899 : public RenderWidgetHostViewAuraShutdownTest { |
2737 public: | 2900 public: |
2738 RenderWidgetHostViewAuraCopyRequestTest() | 2901 RenderWidgetHostViewAuraCopyRequestTest() |
2739 : callback_count_(0), | 2902 : callback_count_(0), |
2740 result_(false), | 2903 result_(false), |
2741 frame_subscriber_(nullptr), | 2904 frame_subscriber_(nullptr), |
2742 tick_clock_(nullptr), | 2905 tick_clock_(nullptr), |
2743 view_rect_(100, 100) {} | 2906 view_rect_(100, 100) {} |
2744 | 2907 |
(...skipping 2096 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4841 // There is no composition in the beginning. | 5004 // There is no composition in the beginning. |
4842 EXPECT_FALSE(has_composition_text()); | 5005 EXPECT_FALSE(has_composition_text()); |
4843 SetHasCompositionTextToTrue(); | 5006 SetHasCompositionTextToTrue(); |
4844 view->ImeCancelComposition(); | 5007 view->ImeCancelComposition(); |
4845 // The composition must have been canceled. | 5008 // The composition must have been canceled. |
4846 EXPECT_FALSE(has_composition_text()); | 5009 EXPECT_FALSE(has_composition_text()); |
4847 } | 5010 } |
4848 } | 5011 } |
4849 | 5012 |
4850 } // namespace content | 5013 } // namespace content |
OLD | NEW |