| Index: content/browser/renderer_host/render_widget_host_view_aura_unittest.cc
|
| diff --git a/content/browser/renderer_host/render_widget_host_view_aura_unittest.cc b/content/browser/renderer_host/render_widget_host_view_aura_unittest.cc
|
| index 3bbc617245152047df8e1be9c181df80bf8e1434..70dd0dc4e109756f7e471a7e42eb7b5934a1ef3c 100644
|
| --- a/content/browser/renderer_host/render_widget_host_view_aura_unittest.cc
|
| +++ b/content/browser/renderer_host/render_widget_host_view_aura_unittest.cc
|
| @@ -32,6 +32,7 @@
|
| #include "cc/surfaces/surface_manager.h"
|
| #include "cc/test/begin_frame_args_test.h"
|
| #include "cc/test/fake_external_begin_frame_source.h"
|
| +#include "cc/test/fake_surface_observer.h"
|
| #include "components/viz/display_compositor/gl_helper.h"
|
| #include "components/viz/display_compositor/host_shared_bitmap_manager.h"
|
| #include "content/browser/browser_thread_impl.h"
|
| @@ -280,17 +281,6 @@ class TestWindowObserver : public aura::WindowObserver {
|
| DISALLOW_COPY_AND_ASSIGN(TestWindowObserver);
|
| };
|
|
|
| -class FakeSurfaceObserver : public cc::SurfaceObserver {
|
| - public:
|
| - void OnSurfaceCreated(const cc::SurfaceInfo& surface_info) override {}
|
| -
|
| - void OnSurfaceDamaged(const cc::SurfaceId& id, bool* changed) override {
|
| - *changed = true;
|
| - }
|
| -
|
| - void OnSurfaceDiscarded(const cc::SurfaceId& id) override {}
|
| -};
|
| -
|
| class FakeFrameSubscriber : public RenderWidgetHostViewFrameSubscriber {
|
| public:
|
| FakeFrameSubscriber(gfx::Size size, base::Callback<void(bool)> callback)
|
| @@ -2313,7 +2303,7 @@ TEST_F(RenderWidgetHostViewAuraTest, ReturnedResources) {
|
| // This test verifies that when the compositor_frame_sink_id changes, the old
|
| // resources are not returned.
|
| TEST_F(RenderWidgetHostViewAuraTest, TwoOutputSurfaces) {
|
| - FakeSurfaceObserver manager_observer;
|
| + cc::FakeSurfaceObserver manager_observer;
|
| ImageTransportFactory* factory = ImageTransportFactory::GetInstance();
|
| cc::SurfaceManager* manager =
|
| factory->GetContextFactoryPrivate()->GetSurfaceManager();
|
| @@ -3298,21 +3288,120 @@ TEST_F(RenderWidgetHostViewAuraTest, SourceEventTypeExistsInLatencyInfo) {
|
| view_->OnTouchEvent(&release);
|
| }
|
|
|
| -namespace {
|
| -class LastObserverTracker : public cc::FakeExternalBeginFrameSource::Client {
|
| - public:
|
| - void OnAddObserver(cc::BeginFrameObserver* obs) override {
|
| - last_observer_ = obs;
|
| +// Tests that BeginFrameAcks are forwarded correctly from the
|
| +// SwapCompositorFrame and OnDidNotProduceFrame IPCs through DelegatedFrameHost
|
| +// and its CompositorFrameSinkSupport.
|
| +TEST_F(RenderWidgetHostViewAuraTest, ForwardsBeginFrameAcks) {
|
| + gfx::Rect view_rect(100, 100);
|
| + gfx::Size frame_size = view_rect.size();
|
| + cc::LocalSurfaceId local_surface_id = kArbitraryLocalSurfaceId;
|
| +
|
| + view_->InitAsChild(nullptr);
|
| + aura::client::ParentWindowWithContext(
|
| + view_->GetNativeView(), parent_view_->GetNativeView()->GetRootWindow(),
|
| + gfx::Rect());
|
| + view_->SetSize(view_rect.size());
|
| +
|
| + cc::FakeSurfaceObserver observer;
|
| + ImageTransportFactory* factory = ImageTransportFactory::GetInstance();
|
| + cc::SurfaceManager* surface_manager =
|
| + factory->GetContextFactoryPrivate()->GetSurfaceManager();
|
| + surface_manager->AddObserver(&observer);
|
| +
|
| + view_->SetNeedsBeginFrames(true);
|
| + uint32_t source_id = 10;
|
| +
|
| + {
|
| + // Ack from CompositorFrame is forwarded.
|
| + cc::BeginFrameAck ack(source_id, 5, 4, true);
|
| + cc::CompositorFrame frame = MakeDelegatedFrame(1.f, frame_size, view_rect);
|
| + frame.metadata.begin_frame_ack = ack;
|
| + view_->SubmitCompositorFrame(local_surface_id, std::move(frame));
|
| + view_->RunOnCompositingDidCommit();
|
| + EXPECT_EQ(ack, observer.last_ack());
|
| }
|
| - void OnRemoveObserver(cc::BeginFrameObserver* obs) override {}
|
|
|
| - cc::BeginFrameObserver* last_observer_ = nullptr;
|
| -};
|
| -} // namespace
|
| + {
|
| + // Explicit ack through OnDidNotProduceFrame is forwarded.
|
| + cc::BeginFrameAck ack(source_id, 6, 4, false);
|
| + view_->OnDidNotProduceFrame(ack);
|
| + EXPECT_EQ(ack, observer.last_ack());
|
| + }
|
| +
|
| + // Lock the compositor. Now we should drop frames and, thus,
|
| + // latest_confirmed_sequence_number should not change.
|
| + view_rect = gfx::Rect(150, 150);
|
| + view_->SetSize(view_rect.size());
|
| +
|
| + {
|
| + // Ack from CompositorFrame is forwarded with old
|
| + // latest_confirmed_sequence_number and without damage.
|
| + cc::BeginFrameAck ack(source_id, 7, 7, true);
|
| + gfx::Rect dropped_damage_rect(10, 20, 30, 40);
|
| + cc::CompositorFrame frame =
|
| + MakeDelegatedFrame(1.f, frame_size, dropped_damage_rect);
|
| + frame.metadata.begin_frame_ack = ack;
|
| + view_->SubmitCompositorFrame(local_surface_id, std::move(frame));
|
| + view_->RunOnCompositingDidCommit();
|
| + ack.latest_confirmed_sequence_number = 4;
|
| + ack.has_damage = false;
|
| + EXPECT_EQ(ack, observer.last_ack());
|
| + }
|
| +
|
| + // Change source_id known to the view. This should reset the
|
| + // latest_confirmed_sequence_number tracked by the view.
|
| + source_id = 20;
|
|
|
| -// TODO(eseckler): Add back tests for BeginFrameAck forwarding through
|
| -// RenderWidgetHostViewAura and CompositorFrameSinkSupport when we add plumbing
|
| -// of BeginFrameAcks through SurfaceObservers.
|
| + {
|
| + // Ack from CompositorFrame is forwarded with invalid
|
| + // latest_confirmed_sequence_number and without damage.
|
| + cc::BeginFrameAck ack(source_id, 10, 10, true);
|
| + gfx::Rect dropped_damage_rect(10, 20, 30, 40);
|
| + cc::CompositorFrame frame =
|
| + MakeDelegatedFrame(1.f, frame_size, dropped_damage_rect);
|
| + frame.metadata.begin_frame_ack = ack;
|
| + view_->SubmitCompositorFrame(local_surface_id, std::move(frame));
|
| + view_->RunOnCompositingDidCommit();
|
| + ack.latest_confirmed_sequence_number =
|
| + cc::BeginFrameArgs::kInvalidFrameNumber;
|
| + ack.has_damage = false;
|
| + EXPECT_EQ(ack, observer.last_ack());
|
| + }
|
| +
|
| + {
|
| + // Explicit ack through OnDidNotProduceFrame is forwarded with invalid
|
| + // latest_confirmed_sequence_number.
|
| + cc::BeginFrameAck ack(source_id, 11, 11, false);
|
| + view_->OnDidNotProduceFrame(ack);
|
| + ack.latest_confirmed_sequence_number =
|
| + cc::BeginFrameArgs::kInvalidFrameNumber;
|
| + EXPECT_EQ(ack, observer.last_ack());
|
| + }
|
| +
|
| + // Unlock the compositor again with a new CompositorFrame of correct size.
|
| + frame_size = view_rect.size();
|
| + local_surface_id = local_surface_id_allocator_.GenerateId();
|
| +
|
| + {
|
| + // Ack from CompositorFrame is forwarded.
|
| + cc::BeginFrameAck ack(source_id, 12, 12, true);
|
| + cc::CompositorFrame frame = MakeDelegatedFrame(1.f, frame_size, view_rect);
|
| + frame.metadata.begin_frame_ack = ack;
|
| + view_->SubmitCompositorFrame(local_surface_id, std::move(frame));
|
| + view_->RunOnCompositingDidCommit();
|
| + EXPECT_EQ(ack, observer.last_ack());
|
| + }
|
| +
|
| + {
|
| + // Explicit ack through OnDidNotProduceFrame is forwarded.
|
| + cc::BeginFrameAck ack(source_id, 13, 13, false);
|
| + view_->OnDidNotProduceFrame(ack);
|
| + EXPECT_EQ(ack, observer.last_ack());
|
| + }
|
| +
|
| + surface_manager->RemoveObserver(&observer);
|
| + view_->SetNeedsBeginFrames(false);
|
| +}
|
|
|
| class RenderWidgetHostViewAuraCopyRequestTest
|
| : public RenderWidgetHostViewAuraShutdownTest {
|
|
|