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

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: address security comments 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 1810 matching lines...) Expand 10 before | Expand all | Expand 10 after
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698