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

Side by Side Diff: services/ui/ws/frame_generator_unittest.cc

Issue 2763143002: Remove FrameGenerator::root_window_ (Closed)
Patch Set: Addressed 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 2017 The Chromium Authors. All rights reserved. 1 // Copyright 2017 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 "services/ui/ws/frame_generator.h" 5 #include "services/ui/ws/frame_generator.h"
6 6
7 #include "base/macros.h" 7 #include "base/macros.h"
8 #include "cc/output/compositor_frame_sink.h" 8 #include "cc/output/compositor_frame_sink.h"
9 #include "cc/scheduler/begin_frame_source.h" 9 #include "cc/scheduler/begin_frame_source.h"
10 #include "cc/test/begin_frame_args_test.cc" 10 #include "cc/test/begin_frame_args_test.cc"
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after
143 // testing::Test overrides: 143 // testing::Test overrides:
144 void SetUp() override { 144 void SetUp() override {
145 testing::Test::SetUp(); 145 testing::Test::SetUp();
146 146
147 std::unique_ptr<FakeCompositorFrameSink> compositor_frame_sink = 147 std::unique_ptr<FakeCompositorFrameSink> compositor_frame_sink =
148 base::MakeUnique<FakeCompositorFrameSink>(); 148 base::MakeUnique<FakeCompositorFrameSink>();
149 compositor_frame_sink_ = compositor_frame_sink.get(); 149 compositor_frame_sink_ = compositor_frame_sink.get();
150 150
151 constexpr float kRefreshRate = 0.f; 151 constexpr float kRefreshRate = 0.f;
152 constexpr bool kTickAutomatically = false; 152 constexpr bool kTickAutomatically = false;
153 constexpr bool kVisibility = true;
154 const gfx::Rect kArbitraryRect = gfx::Rect(1, 2);
153 begin_frame_source_ = base::MakeUnique<cc::FakeExternalBeginFrameSource>( 155 begin_frame_source_ = base::MakeUnique<cc::FakeExternalBeginFrameSource>(
154 kRefreshRate, kTickAutomatically); 156 kRefreshRate, kTickAutomatically);
155 compositor_frame_sink_->SetBeginFrameSource(begin_frame_source_.get()); 157 compositor_frame_sink_->SetBeginFrameSource(begin_frame_source_.get());
156 server_window_delegate_ = base::MakeUnique<TestServerWindowDelegate>(); 158 server_window_delegate_ = base::MakeUnique<TestServerWindowDelegate>();
157 root_window_ = base::MakeUnique<ServerWindow>(server_window_delegate_.get(), 159 frame_generator_ =
158 WindowId()); 160 base::MakeUnique<FrameGenerator>(std::move(compositor_frame_sink));
159 root_window_->SetVisible(true); 161 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.
160 frame_generator_ = base::MakeUnique<FrameGenerator>( 162 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.
161 root_window_.get(), std::move(compositor_frame_sink));
162 }; 163 };
163 164
165 void InitWithSurfaceInfo() {
166 // FrameGenerator requires a valid SurfaceInfo before generating
167 // CompositorFrames.
168 const cc::SurfaceId kArbitrarySurfaceId(
169 cc::FrameSinkId(1, 1),
170 cc::LocalSurfaceId(1, base::UnguessableToken::Create()));
171 const cc::SurfaceInfo kArbitrarySurfaceInfo(kArbitrarySurfaceId, 1.0f,
172 gfx::Size(100, 100));
173
174 frame_generator()->OnSurfaceCreated(kArbitrarySurfaceInfo);
175 IssueBeginFrame();
176 EXPECT_EQ(1, NumberOfFramesReceived());
177 }
178
164 int NumberOfFramesReceived() { 179 int NumberOfFramesReceived() {
165 return compositor_frame_sink_->number_frames_received(); 180 return compositor_frame_sink_->number_frames_received();
166 } 181 }
167 182
168 void IssueBeginFrame() { 183 void IssueBeginFrame() {
169 begin_frame_source_->TestOnBeginFrame(cc::CreateBeginFrameArgsForTesting( 184 begin_frame_source_->TestOnBeginFrame(cc::CreateBeginFrameArgsForTesting(
170 BEGINFRAME_FROM_HERE, 0, next_sequence_number_)); 185 BEGINFRAME_FROM_HERE, 0, next_sequence_number_));
171 ++next_sequence_number_; 186 ++next_sequence_number_;
172 } 187 }
173 188
174 FrameGenerator* frame_generator() { return frame_generator_.get(); } 189 FrameGenerator* frame_generator() { return frame_generator_.get(); }
175 190
176 const cc::CompositorFrameMetadata& LastMetadata() const { 191 const cc::CompositorFrameMetadata& LastMetadata() const {
177 return compositor_frame_sink_->last_metadata(); 192 return compositor_frame_sink_->last_metadata();
178 } 193 }
179 194
180 const cc::RenderPassList& LastRenderPassList() const { 195 const cc::RenderPassList& LastRenderPassList() const {
181 return compositor_frame_sink_->last_render_pass_list(); 196 return compositor_frame_sink_->last_render_pass_list();
182 } 197 }
183 198
184 const cc::BeginFrameAck& LastBeginFrameAck() { 199 const cc::BeginFrameAck& LastBeginFrameAck() {
185 return begin_frame_source_->LastAckForObserver(compositor_frame_sink_); 200 return begin_frame_source_->LastAckForObserver(compositor_frame_sink_);
186 } 201 }
187 202
188 ServerWindow* root_window() { return root_window_.get(); }
189
190 private: 203 private:
191 FakeCompositorFrameSink* compositor_frame_sink_ = nullptr; 204 FakeCompositorFrameSink* compositor_frame_sink_ = nullptr;
192 std::unique_ptr<cc::FakeExternalBeginFrameSource> begin_frame_source_; 205 std::unique_ptr<cc::FakeExternalBeginFrameSource> begin_frame_source_;
193 std::unique_ptr<TestServerWindowDelegate> server_window_delegate_; 206 std::unique_ptr<TestServerWindowDelegate> server_window_delegate_;
194 std::unique_ptr<ServerWindow> root_window_;
195 std::unique_ptr<FrameGenerator> frame_generator_; 207 std::unique_ptr<FrameGenerator> frame_generator_;
196 int next_sequence_number_ = 1; 208 int next_sequence_number_ = 1;
197 209
198 DISALLOW_COPY_AND_ASSIGN(FrameGeneratorTest); 210 DISALLOW_COPY_AND_ASSIGN(FrameGeneratorTest);
199 }; 211 };
200 212
213 TEST_F(FrameGeneratorTest, InvalidSurfaceInfo) {
214 // After SetUP(), frame_generator() has its |is_window_visible_| set to true
215 // and |bounds_| to an arbitrary non-empty gfx::Rect but not a valid
216 // SurfaceInfo. frame_generator() should not request BeginFrames in this
217 // state.
218 IssueBeginFrame();
219 EXPECT_EQ(0, NumberOfFramesReceived());
220 }
221
201 TEST_F(FrameGeneratorTest, OnSurfaceCreated) { 222 TEST_F(FrameGeneratorTest, OnSurfaceCreated) {
202 EXPECT_EQ(0, NumberOfFramesReceived()); 223 EXPECT_EQ(0, NumberOfFramesReceived());
203 224
204 // FrameGenerator does not request BeginFrames upon creation. 225 // FrameGenerator does not request BeginFrames upon creation.
205 IssueBeginFrame(); 226 IssueBeginFrame();
206 EXPECT_EQ(0, NumberOfFramesReceived()); 227 EXPECT_EQ(0, NumberOfFramesReceived());
207 EXPECT_EQ(cc::BeginFrameAck(), LastBeginFrameAck()); 228 EXPECT_EQ(cc::BeginFrameAck(), LastBeginFrameAck());
208 229
209 const cc::SurfaceId kArbitrarySurfaceId( 230 const cc::SurfaceId kArbitrarySurfaceId(
210 cc::FrameSinkId(1, 1), 231 cc::FrameSinkId(1, 1),
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
242 // A valid SurfaceInfo is required for BeginFrame processing. 263 // A valid SurfaceInfo is required for BeginFrame processing.
243 const cc::SurfaceId kArbitrarySurfaceId( 264 const cc::SurfaceId kArbitrarySurfaceId(
244 cc::FrameSinkId(1, 1), 265 cc::FrameSinkId(1, 1),
245 cc::LocalSurfaceId(1, base::UnguessableToken::Create())); 266 cc::LocalSurfaceId(1, base::UnguessableToken::Create()));
246 const cc::SurfaceInfo kArbitrarySurfaceInfo(kArbitrarySurfaceId, 1.0f, 267 const cc::SurfaceInfo kArbitrarySurfaceInfo(kArbitrarySurfaceId, 1.0f,
247 gfx::Size(100, 100)); 268 gfx::Size(100, 100));
248 frame_generator()->OnSurfaceCreated(kArbitrarySurfaceInfo); 269 frame_generator()->OnSurfaceCreated(kArbitrarySurfaceInfo);
249 EXPECT_EQ(0, NumberOfFramesReceived()); 270 EXPECT_EQ(0, NumberOfFramesReceived());
250 271
251 // No frames are produced while invisible but in need of BeginFrames. 272 // No frames are produced while invisible but in need of BeginFrames.
252 root_window()->SetVisible(false); 273 frame_generator()->OnWindowVisibilityChanged(false);
253 IssueBeginFrame(); 274 IssueBeginFrame();
254 EXPECT_EQ(0, NumberOfFramesReceived()); 275 EXPECT_EQ(0, NumberOfFramesReceived());
255 EXPECT_EQ(cc::BeginFrameAck(0, 1, 1, 0, false), LastBeginFrameAck()); 276 EXPECT_EQ(cc::BeginFrameAck(), LastBeginFrameAck());
256 277
257 // When visible again, a frame is produced. 278 // When visible again, a frame is produced.
258 root_window()->SetVisible(true); 279 frame_generator()->OnWindowVisibilityChanged(true);
259 IssueBeginFrame(); 280 IssueBeginFrame();
260 EXPECT_EQ(1, NumberOfFramesReceived()); 281 EXPECT_EQ(1, NumberOfFramesReceived());
261 cc::BeginFrameAck expected_ack(0, 2, 2, 0, true); 282 cc::BeginFrameAck expected_ack(0, 2, 2, 0, true);
262 EXPECT_EQ(expected_ack, LastBeginFrameAck()); 283 EXPECT_EQ(expected_ack, LastBeginFrameAck());
263 EXPECT_EQ(expected_ack, LastMetadata().begin_frame_ack); 284 EXPECT_EQ(expected_ack, LastMetadata().begin_frame_ack);
264 } 285 }
265 286
266 TEST_F(FrameGeneratorTest, SetDeviceScaleFactor) { 287 TEST_F(FrameGeneratorTest, SetDeviceScaleFactor) {
267 EXPECT_EQ(0, NumberOfFramesReceived()); 288 EXPECT_EQ(0, NumberOfFramesReceived());
268 const cc::SurfaceId kArbitrarySurfaceId( 289 const cc::SurfaceId kArbitrarySurfaceId(
(...skipping 22 matching lines...) Expand all
291 EXPECT_EQ(kDefaultScaleFactor, last_metadata.device_scale_factor); 312 EXPECT_EQ(kDefaultScaleFactor, last_metadata.device_scale_factor);
292 313
293 frame_generator()->SetDeviceScaleFactor(kArbitraryScaleFactor); 314 frame_generator()->SetDeviceScaleFactor(kArbitraryScaleFactor);
294 IssueBeginFrame(); 315 IssueBeginFrame();
295 EXPECT_EQ(2, NumberOfFramesReceived()); 316 EXPECT_EQ(2, NumberOfFramesReceived());
296 const cc::CompositorFrameMetadata& second_last_metadata = LastMetadata(); 317 const cc::CompositorFrameMetadata& second_last_metadata = LastMetadata();
297 EXPECT_EQ(kArbitraryScaleFactor, second_last_metadata.device_scale_factor); 318 EXPECT_EQ(kArbitraryScaleFactor, second_last_metadata.device_scale_factor);
298 } 319 }
299 320
300 TEST_F(FrameGeneratorTest, SetHighContrastMode) { 321 TEST_F(FrameGeneratorTest, SetHighContrastMode) {
301 // FrameGenerator requires a valid SurfaceInfo before generating 322 InitWithSurfaceInfo();
302 // CompositorFrames.
303 const cc::SurfaceId kArbitrarySurfaceId(
304 cc::FrameSinkId(1, 1),
305 cc::LocalSurfaceId(1, base::UnguessableToken::Create()));
306 const cc::SurfaceInfo kArbitrarySurfaceInfo(kArbitrarySurfaceId, 1.0f,
307 gfx::Size(100, 100));
308 frame_generator()->OnSurfaceCreated(kArbitrarySurfaceInfo);
309 IssueBeginFrame();
310 EXPECT_EQ(1, NumberOfFramesReceived());
311 323
312 // Changing high contrast mode should trigger a BeginFrame. 324 // Changing high contrast mode should trigger a BeginFrame.
313 frame_generator()->SetHighContrastMode(true); 325 frame_generator()->SetHighContrastMode(true);
314 IssueBeginFrame(); 326 IssueBeginFrame();
315 EXPECT_EQ(2, NumberOfFramesReceived()); 327 EXPECT_EQ(2, NumberOfFramesReceived());
316 328
317 // Verify that the last frame has an invert filter. 329 // Verify that the last frame has an invert filter.
318 const cc::RenderPassList& render_pass_list = LastRenderPassList(); 330 const cc::RenderPassList& render_pass_list = LastRenderPassList();
319 const cc::FilterOperations expected_filters( 331 const cc::FilterOperations expected_filters(
320 {cc::FilterOperation::CreateInvertFilter(1.f)}); 332 {cc::FilterOperation::CreateInvertFilter(1.f)});
321 EXPECT_EQ(expected_filters, render_pass_list.front()->filters); 333 EXPECT_EQ(expected_filters, render_pass_list.front()->filters);
322 } 334 }
323 335
336 TEST_F(FrameGeneratorTest, VisibilityChanged) {
337 InitWithSurfaceInfo();
338
339 frame_generator()->OnWindowVisibilityChanged(false);
340 IssueBeginFrame();
341 EXPECT_EQ(1, NumberOfFramesReceived());
342
343 frame_generator()->OnWindowVisibilityChanged(true);
344 IssueBeginFrame();
345 EXPECT_EQ(2, NumberOfFramesReceived());
346 }
347
348 TEST_F(FrameGeneratorTest, WindowBoundsChanged) {
349 InitWithSurfaceInfo();
350
351 // Window bounds change triggers a BeginFrame.
352 constexpr int expected_render_pass_id = 1;
353 const gfx::Rect kArbitraryRect(3, 4);
354 frame_generator()->OnWindowBoundsChanged(kArbitraryRect);
355 IssueBeginFrame();
356 EXPECT_EQ(2, NumberOfFramesReceived());
357 cc::RenderPass* received_render_pass = LastRenderPassList().front().get();
358 EXPECT_EQ(expected_render_pass_id, received_render_pass->id);
359 EXPECT_EQ(kArbitraryRect, received_render_pass->output_rect);
360 EXPECT_EQ(kArbitraryRect, received_render_pass->damage_rect);
361 EXPECT_EQ(gfx::Transform(), received_render_pass->transform_to_root_target);
362 }
363
364 // Change window bounds twice before issuing a BeginFrame. The CompositorFrame
365 // submitted by frame_generator() should only has the second bounds.
366 TEST_F(FrameGeneratorTest, WindowBoundsChangedTwice) {
367 InitWithSurfaceInfo();
368
369 const gfx::Rect kArbitraryRect(3, 4);
370 const gfx::Rect kAnotherArbitraryRect(5, 6);
371 frame_generator()->OnWindowBoundsChanged(kArbitraryRect);
372 frame_generator()->OnWindowBoundsChanged(kAnotherArbitraryRect);
373 IssueBeginFrame();
374 EXPECT_EQ(2, NumberOfFramesReceived());
375 cc::RenderPass* received_render_pass = LastRenderPassList().front().get();
376 EXPECT_EQ(kAnotherArbitraryRect, received_render_pass->output_rect);
377 EXPECT_EQ(kAnotherArbitraryRect, received_render_pass->damage_rect);
378
379 // frame_generator() stops requesting BeginFrames after getting one.
380 IssueBeginFrame();
381 EXPECT_EQ(2, NumberOfFramesReceived());
382 }
383
384 TEST_F(FrameGeneratorTest, WindowDamaged) {
385 InitWithSurfaceInfo();
386
387 frame_generator()->OnWindowDamaged();
388 IssueBeginFrame();
389 EXPECT_EQ(2, NumberOfFramesReceived());
390 }
391
324 } // namespace test 392 } // namespace test
325 } // namespace ws 393 } // namespace ws
326 } // namespace ui 394 } // namespace ui
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698