Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(770)

Side by Side Diff: content/browser/renderer_host/render_widget_host_view_aura_unittest.cc

Issue 2740833005: [cc] Pass on BeginFrameAcks from CompositorEBFS through RWHVAura, DFH. (Closed)
Patch Set: Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698