Chromium Code Reviews| Index: services/ui/ws/frame_generator_unittest.cc |
| diff --git a/services/ui/ws/frame_generator_unittest.cc b/services/ui/ws/frame_generator_unittest.cc |
| index 243269982d3566e7248d1b21db35ac4cbe113c0a..da583679bbfb67528daf3cae3972b21fa82808d7 100644 |
| --- a/services/ui/ws/frame_generator_unittest.cc |
| +++ b/services/ui/ws/frame_generator_unittest.cc |
| @@ -150,17 +150,32 @@ class FrameGeneratorTest : public testing::Test { |
| constexpr float kRefreshRate = 0.f; |
| constexpr bool kTickAutomatically = false; |
| + constexpr bool kVisibility = true; |
| + const gfx::Rect kArbitraryRect = gfx::Rect(1, 2); |
| begin_frame_source_ = base::MakeUnique<cc::FakeExternalBeginFrameSource>( |
| kRefreshRate, kTickAutomatically); |
| compositor_frame_sink_->SetBeginFrameSource(begin_frame_source_.get()); |
| server_window_delegate_ = base::MakeUnique<TestServerWindowDelegate>(); |
| - root_window_ = base::MakeUnique<ServerWindow>(server_window_delegate_.get(), |
| - WindowId()); |
| - root_window_->SetVisible(true); |
| - frame_generator_ = base::MakeUnique<FrameGenerator>( |
| - root_window_.get(), std::move(compositor_frame_sink)); |
| + frame_generator_ = |
| + base::MakeUnique<FrameGenerator>(std::move(compositor_frame_sink)); |
| + frame_generator_->OnWindowVisibilityChanged(kVisibility); |
|
Fady Samuel
2017/03/22 18:19:40
OnWindowVisibilityChanged(true); is more readable.
Alex Z.
2017/03/22 18:35:57
Done.
|
| + frame_generator_->OnWindowBoundsChanged(kArbitraryRect); |
|
Fady Samuel
2017/03/22 18:19:40
gfx::Rect(1, 2) is more readable.
Alex Z.
2017/03/22 18:35:57
Done.
|
| }; |
| + void InitWithSurfaceInfo() { |
| + // FrameGenerator requires a valid SurfaceInfo before generating |
| + // CompositorFrames. |
| + const cc::SurfaceId kArbitrarySurfaceId( |
| + cc::FrameSinkId(1, 1), |
| + cc::LocalSurfaceId(1, base::UnguessableToken::Create())); |
| + const cc::SurfaceInfo kArbitrarySurfaceInfo(kArbitrarySurfaceId, 1.0f, |
| + gfx::Size(100, 100)); |
| + |
| + frame_generator()->OnSurfaceCreated(kArbitrarySurfaceInfo); |
| + IssueBeginFrame(); |
| + EXPECT_EQ(1, NumberOfFramesReceived()); |
| + } |
| + |
| int NumberOfFramesReceived() { |
| return compositor_frame_sink_->number_frames_received(); |
| } |
| @@ -185,19 +200,25 @@ class FrameGeneratorTest : public testing::Test { |
| return begin_frame_source_->LastAckForObserver(compositor_frame_sink_); |
| } |
| - ServerWindow* root_window() { return root_window_.get(); } |
| - |
| private: |
| FakeCompositorFrameSink* compositor_frame_sink_ = nullptr; |
| std::unique_ptr<cc::FakeExternalBeginFrameSource> begin_frame_source_; |
| std::unique_ptr<TestServerWindowDelegate> server_window_delegate_; |
| - std::unique_ptr<ServerWindow> root_window_; |
| std::unique_ptr<FrameGenerator> frame_generator_; |
| int next_sequence_number_ = 1; |
| DISALLOW_COPY_AND_ASSIGN(FrameGeneratorTest); |
| }; |
| +TEST_F(FrameGeneratorTest, InvalidSurfaceInfo) { |
| + // After SetUP(), frame_generator() has its |is_window_visible_| set to true |
| + // and |bounds_| to an arbitrary non-empty gfx::Rect but not a valid |
| + // SurfaceInfo. frame_generator() should not request BeginFrames in this |
| + // state. |
| + IssueBeginFrame(); |
| + EXPECT_EQ(0, NumberOfFramesReceived()); |
| +} |
| + |
| TEST_F(FrameGeneratorTest, OnSurfaceCreated) { |
| EXPECT_EQ(0, NumberOfFramesReceived()); |
| @@ -249,13 +270,13 @@ TEST_F(FrameGeneratorTest, BeginFrameWhileInvisible) { |
| EXPECT_EQ(0, NumberOfFramesReceived()); |
| // No frames are produced while invisible but in need of BeginFrames. |
| - root_window()->SetVisible(false); |
| + frame_generator()->OnWindowVisibilityChanged(false); |
| IssueBeginFrame(); |
| EXPECT_EQ(0, NumberOfFramesReceived()); |
| - EXPECT_EQ(cc::BeginFrameAck(0, 1, 1, 0, false), LastBeginFrameAck()); |
| + EXPECT_EQ(cc::BeginFrameAck(), LastBeginFrameAck()); |
| // When visible again, a frame is produced. |
| - root_window()->SetVisible(true); |
| + frame_generator()->OnWindowVisibilityChanged(true); |
| IssueBeginFrame(); |
| EXPECT_EQ(1, NumberOfFramesReceived()); |
| cc::BeginFrameAck expected_ack(0, 2, 2, 0, true); |
| @@ -298,16 +319,7 @@ TEST_F(FrameGeneratorTest, SetDeviceScaleFactor) { |
| } |
| TEST_F(FrameGeneratorTest, SetHighContrastMode) { |
| - // FrameGenerator requires a valid SurfaceInfo before generating |
| - // CompositorFrames. |
| - const cc::SurfaceId kArbitrarySurfaceId( |
| - cc::FrameSinkId(1, 1), |
| - cc::LocalSurfaceId(1, base::UnguessableToken::Create())); |
| - const cc::SurfaceInfo kArbitrarySurfaceInfo(kArbitrarySurfaceId, 1.0f, |
| - gfx::Size(100, 100)); |
| - frame_generator()->OnSurfaceCreated(kArbitrarySurfaceInfo); |
| - IssueBeginFrame(); |
| - EXPECT_EQ(1, NumberOfFramesReceived()); |
| + InitWithSurfaceInfo(); |
| // Changing high contrast mode should trigger a BeginFrame. |
| frame_generator()->SetHighContrastMode(true); |
| @@ -321,6 +333,62 @@ TEST_F(FrameGeneratorTest, SetHighContrastMode) { |
| EXPECT_EQ(expected_filters, render_pass_list.front()->filters); |
| } |
| +TEST_F(FrameGeneratorTest, VisibilityChanged) { |
| + InitWithSurfaceInfo(); |
| + |
| + frame_generator()->OnWindowVisibilityChanged(false); |
| + IssueBeginFrame(); |
| + EXPECT_EQ(1, NumberOfFramesReceived()); |
| + |
| + frame_generator()->OnWindowVisibilityChanged(true); |
| + IssueBeginFrame(); |
| + EXPECT_EQ(2, NumberOfFramesReceived()); |
| +} |
| + |
| +TEST_F(FrameGeneratorTest, WindowBoundsChanged) { |
| + InitWithSurfaceInfo(); |
| + |
| + // Window bounds change triggers a BeginFrame. |
| + constexpr int expected_render_pass_id = 1; |
| + const gfx::Rect kArbitraryRect(3, 4); |
| + frame_generator()->OnWindowBoundsChanged(kArbitraryRect); |
| + IssueBeginFrame(); |
| + EXPECT_EQ(2, NumberOfFramesReceived()); |
| + cc::RenderPass* received_render_pass = LastRenderPassList().front().get(); |
| + EXPECT_EQ(expected_render_pass_id, received_render_pass->id); |
| + EXPECT_EQ(kArbitraryRect, received_render_pass->output_rect); |
| + EXPECT_EQ(kArbitraryRect, received_render_pass->damage_rect); |
| + EXPECT_EQ(gfx::Transform(), received_render_pass->transform_to_root_target); |
| +} |
| + |
| +// Change window bounds twice before issuing a BeginFrame. The CompositorFrame |
| +// submitted by frame_generator() should only has the second bounds. |
| +TEST_F(FrameGeneratorTest, WindowBoundsChangedTwice) { |
| + InitWithSurfaceInfo(); |
| + |
| + const gfx::Rect kArbitraryRect(3, 4); |
| + const gfx::Rect kAnotherArbitraryRect(5, 6); |
| + frame_generator()->OnWindowBoundsChanged(kArbitraryRect); |
| + frame_generator()->OnWindowBoundsChanged(kAnotherArbitraryRect); |
| + IssueBeginFrame(); |
| + EXPECT_EQ(2, NumberOfFramesReceived()); |
| + cc::RenderPass* received_render_pass = LastRenderPassList().front().get(); |
| + EXPECT_EQ(kAnotherArbitraryRect, received_render_pass->output_rect); |
| + EXPECT_EQ(kAnotherArbitraryRect, received_render_pass->damage_rect); |
| + |
| + // frame_generator() stops requesting BeginFrames after getting one. |
| + IssueBeginFrame(); |
| + EXPECT_EQ(2, NumberOfFramesReceived()); |
| +} |
| + |
| +TEST_F(FrameGeneratorTest, WindowDamaged) { |
| + InitWithSurfaceInfo(); |
| + |
| + frame_generator()->OnWindowDamaged(); |
| + IssueBeginFrame(); |
| + EXPECT_EQ(2, NumberOfFramesReceived()); |
| +} |
| + |
| } // namespace test |
| } // namespace ws |
| } // namespace ui |