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

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

Powered by Google App Engine
This is Rietveld 408576698