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

Side by Side Diff: cc/tiles/image_controller_unittest.cc

Issue 2904743002: cc: Add UMA for tracking decode duration for out of raster decodes. (Closed)
Patch Set: .. Created 3 years, 7 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 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 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 "cc/tiles/image_controller.h" 5 #include "cc/tiles/image_controller.h"
6 6
7 #include <utility> 7 #include <utility>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/optional.h" 10 #include "base/optional.h"
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after
105 image.image()->width() * image.image()->height() >= 1000 * 1000) { 105 image.image()->width() * image.image()->height() >= 1000 * 1000) {
106 return false; 106 return false;
107 } 107 }
108 108
109 *task = task_to_use_; 109 *task = task_to_use_;
110 ++number_of_refs_; 110 ++number_of_refs_;
111 return true; 111 return true;
112 } 112 }
113 bool GetOutOfRasterDecodeTaskForImageAndRef( 113 bool GetOutOfRasterDecodeTaskForImageAndRef(
114 const DrawImage& image, 114 const DrawImage& image,
115 ImageDecodeType type,
115 scoped_refptr<TileTask>* task) override { 116 scoped_refptr<TileTask>* task) override {
116 return GetTaskForImageAndRef(image, TracingInfo(), task); 117 return GetTaskForImageAndRef(image, TracingInfo(), task);
117 } 118 }
118 119
119 void UnrefImage(const DrawImage& image) override { 120 void UnrefImage(const DrawImage& image) override {
120 ASSERT_GT(number_of_refs_, 0); 121 ASSERT_GT(number_of_refs_, 0);
121 --number_of_refs_; 122 --number_of_refs_;
122 } 123 }
123 DecodedDrawImage GetDecodedImageForDraw(const DrawImage& image) override { 124 DecodedDrawImage GetDecodedImageForDraw(const DrawImage& image) override {
124 return DecodedDrawImage(nullptr, kNone_SkFilterQuality); 125 return DecodedDrawImage(nullptr, kNone_SkFilterQuality);
(...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after
300 } 301 }
301 302
302 TEST_F(ImageControllerTest, QueueImageDecode) { 303 TEST_F(ImageControllerTest, QueueImageDecode) {
303 base::RunLoop run_loop; 304 base::RunLoop run_loop;
304 DecodeClient decode_client; 305 DecodeClient decode_client;
305 EXPECT_EQ(image()->bounds().width(), 1); 306 EXPECT_EQ(image()->bounds().width(), 1);
306 ImageController::ImageDecodeRequestId expected_id = 307 ImageController::ImageDecodeRequestId expected_id =
307 controller()->QueueImageDecode( 308 controller()->QueueImageDecode(
308 image(), 309 image(),
309 base::Bind(&DecodeClient::Callback, base::Unretained(&decode_client), 310 base::Bind(&DecodeClient::Callback, base::Unretained(&decode_client),
310 run_loop.QuitClosure())); 311 run_loop.QuitClosure()),
312 ImageDecodeCache::ImageDecodeType::kCheckerImaging);
311 RunOrTimeout(&run_loop); 313 RunOrTimeout(&run_loop);
312 EXPECT_EQ(expected_id, decode_client.id()); 314 EXPECT_EQ(expected_id, decode_client.id());
313 EXPECT_EQ(ImageController::ImageDecodeResult::SUCCESS, 315 EXPECT_EQ(ImageController::ImageDecodeResult::SUCCESS,
314 decode_client.result()); 316 decode_client.result());
315 } 317 }
316 318
317 TEST_F(ImageControllerTest, QueueImageDecodeNonLazy) { 319 TEST_F(ImageControllerTest, QueueImageDecodeNonLazy) {
318 base::RunLoop run_loop; 320 base::RunLoop run_loop;
319 DecodeClient decode_client; 321 DecodeClient decode_client;
320 322
321 SkBitmap bitmap; 323 SkBitmap bitmap;
322 bitmap.allocN32Pixels(1, 1); 324 bitmap.allocN32Pixels(1, 1);
323 sk_sp<const SkImage> image = SkImage::MakeFromBitmap(bitmap); 325 sk_sp<const SkImage> image = SkImage::MakeFromBitmap(bitmap);
324 326
325 ImageController::ImageDecodeRequestId expected_id = 327 ImageController::ImageDecodeRequestId expected_id =
326 controller()->QueueImageDecode( 328 controller()->QueueImageDecode(
327 image, 329 image,
328 base::Bind(&DecodeClient::Callback, base::Unretained(&decode_client), 330 base::Bind(&DecodeClient::Callback, base::Unretained(&decode_client),
329 run_loop.QuitClosure())); 331 run_loop.QuitClosure()),
332 ImageDecodeCache::ImageDecodeType::kCheckerImaging);
330 RunOrTimeout(&run_loop); 333 RunOrTimeout(&run_loop);
331 EXPECT_EQ(expected_id, decode_client.id()); 334 EXPECT_EQ(expected_id, decode_client.id());
332 EXPECT_EQ(ImageController::ImageDecodeResult::DECODE_NOT_REQUIRED, 335 EXPECT_EQ(ImageController::ImageDecodeResult::DECODE_NOT_REQUIRED,
333 decode_client.result()); 336 decode_client.result());
334 } 337 }
335 338
336 TEST_F(ImageControllerTest, QueueImageDecodeTooLarge) { 339 TEST_F(ImageControllerTest, QueueImageDecodeTooLarge) {
337 base::RunLoop run_loop; 340 base::RunLoop run_loop;
338 DecodeClient decode_client; 341 DecodeClient decode_client;
339 342
340 sk_sp<const SkImage> image = CreateDiscardableImage(gfx::Size(2000, 2000)); 343 sk_sp<const SkImage> image = CreateDiscardableImage(gfx::Size(2000, 2000));
341 ImageController::ImageDecodeRequestId expected_id = 344 ImageController::ImageDecodeRequestId expected_id =
342 controller()->QueueImageDecode( 345 controller()->QueueImageDecode(
343 image, 346 image,
344 base::Bind(&DecodeClient::Callback, base::Unretained(&decode_client), 347 base::Bind(&DecodeClient::Callback, base::Unretained(&decode_client),
345 run_loop.QuitClosure())); 348 run_loop.QuitClosure()),
349 ImageDecodeCache::ImageDecodeType::kCheckerImaging);
346 RunOrTimeout(&run_loop); 350 RunOrTimeout(&run_loop);
347 EXPECT_EQ(expected_id, decode_client.id()); 351 EXPECT_EQ(expected_id, decode_client.id());
348 EXPECT_EQ(ImageController::ImageDecodeResult::FAILURE, 352 EXPECT_EQ(ImageController::ImageDecodeResult::FAILURE,
349 decode_client.result()); 353 decode_client.result());
350 } 354 }
351 355
352 TEST_F(ImageControllerTest, QueueImageDecodeMultipleImages) { 356 TEST_F(ImageControllerTest, QueueImageDecodeMultipleImages) {
353 base::RunLoop run_loop; 357 base::RunLoop run_loop;
354 DecodeClient decode_client1; 358 DecodeClient decode_client1;
355 ImageController::ImageDecodeRequestId expected_id1 = 359 ImageController::ImageDecodeRequestId expected_id1 =
356 controller()->QueueImageDecode( 360 controller()->QueueImageDecode(
357 image(), 361 image(),
358 base::Bind(&DecodeClient::Callback, base::Unretained(&decode_client1), 362 base::Bind(&DecodeClient::Callback, base::Unretained(&decode_client1),
359 base::Bind([] {}))); 363 base::Bind([] {})),
364 ImageDecodeCache::ImageDecodeType::kCheckerImaging);
360 DecodeClient decode_client2; 365 DecodeClient decode_client2;
361 ImageController::ImageDecodeRequestId expected_id2 = 366 ImageController::ImageDecodeRequestId expected_id2 =
362 controller()->QueueImageDecode( 367 controller()->QueueImageDecode(
363 image(), 368 image(),
364 base::Bind(&DecodeClient::Callback, base::Unretained(&decode_client2), 369 base::Bind(&DecodeClient::Callback, base::Unretained(&decode_client2),
365 base::Bind([] {}))); 370 base::Bind([] {})),
371 ImageDecodeCache::ImageDecodeType::kCheckerImaging);
366 DecodeClient decode_client3; 372 DecodeClient decode_client3;
367 ImageController::ImageDecodeRequestId expected_id3 = 373 ImageController::ImageDecodeRequestId expected_id3 =
368 controller()->QueueImageDecode( 374 controller()->QueueImageDecode(
369 image(), 375 image(),
370 base::Bind(&DecodeClient::Callback, base::Unretained(&decode_client3), 376 base::Bind(&DecodeClient::Callback, base::Unretained(&decode_client3),
371 run_loop.QuitClosure())); 377 run_loop.QuitClosure()),
378 ImageDecodeCache::ImageDecodeType::kCheckerImaging);
372 RunOrTimeout(&run_loop); 379 RunOrTimeout(&run_loop);
373 EXPECT_EQ(expected_id1, decode_client1.id()); 380 EXPECT_EQ(expected_id1, decode_client1.id());
374 EXPECT_EQ(ImageController::ImageDecodeResult::SUCCESS, 381 EXPECT_EQ(ImageController::ImageDecodeResult::SUCCESS,
375 decode_client1.result()); 382 decode_client1.result());
376 EXPECT_EQ(expected_id2, decode_client2.id()); 383 EXPECT_EQ(expected_id2, decode_client2.id());
377 EXPECT_EQ(ImageController::ImageDecodeResult::SUCCESS, 384 EXPECT_EQ(ImageController::ImageDecodeResult::SUCCESS,
378 decode_client2.result()); 385 decode_client2.result());
379 EXPECT_EQ(expected_id3, decode_client3.id()); 386 EXPECT_EQ(expected_id3, decode_client3.id());
380 EXPECT_EQ(ImageController::ImageDecodeResult::SUCCESS, 387 EXPECT_EQ(ImageController::ImageDecodeResult::SUCCESS,
381 decode_client3.result()); 388 decode_client3.result());
382 } 389 }
383 390
384 TEST_F(ImageControllerTest, QueueImageDecodeWithTask) { 391 TEST_F(ImageControllerTest, QueueImageDecodeWithTask) {
385 scoped_refptr<SimpleTask> task(new SimpleTask); 392 scoped_refptr<SimpleTask> task(new SimpleTask);
386 cache()->SetTaskToUse(task); 393 cache()->SetTaskToUse(task);
387 394
388 base::RunLoop run_loop; 395 base::RunLoop run_loop;
389 DecodeClient decode_client; 396 DecodeClient decode_client;
390 ImageController::ImageDecodeRequestId expected_id = 397 ImageController::ImageDecodeRequestId expected_id =
391 controller()->QueueImageDecode( 398 controller()->QueueImageDecode(
392 image(), 399 image(),
393 base::Bind(&DecodeClient::Callback, base::Unretained(&decode_client), 400 base::Bind(&DecodeClient::Callback, base::Unretained(&decode_client),
394 run_loop.QuitClosure())); 401 run_loop.QuitClosure()),
402 ImageDecodeCache::ImageDecodeType::kCheckerImaging);
395 RunOrTimeout(&run_loop); 403 RunOrTimeout(&run_loop);
396 EXPECT_EQ(expected_id, decode_client.id()); 404 EXPECT_EQ(expected_id, decode_client.id());
397 EXPECT_TRUE(task->has_run()); 405 EXPECT_TRUE(task->has_run());
398 EXPECT_TRUE(task->HasCompleted()); 406 EXPECT_TRUE(task->HasCompleted());
399 } 407 }
400 408
401 TEST_F(ImageControllerTest, QueueImageDecodeMultipleImagesSameTask) { 409 TEST_F(ImageControllerTest, QueueImageDecodeMultipleImagesSameTask) {
402 scoped_refptr<SimpleTask> task(new SimpleTask); 410 scoped_refptr<SimpleTask> task(new SimpleTask);
403 cache()->SetTaskToUse(task); 411 cache()->SetTaskToUse(task);
404 412
405 base::RunLoop run_loop; 413 base::RunLoop run_loop;
406 DecodeClient decode_client1; 414 DecodeClient decode_client1;
407 ImageController::ImageDecodeRequestId expected_id1 = 415 ImageController::ImageDecodeRequestId expected_id1 =
408 controller()->QueueImageDecode( 416 controller()->QueueImageDecode(
409 image(), 417 image(),
410 base::Bind(&DecodeClient::Callback, base::Unretained(&decode_client1), 418 base::Bind(&DecodeClient::Callback, base::Unretained(&decode_client1),
411 base::Bind([] {}))); 419 base::Bind([] {})),
420 ImageDecodeCache::ImageDecodeType::kCheckerImaging);
412 DecodeClient decode_client2; 421 DecodeClient decode_client2;
413 ImageController::ImageDecodeRequestId expected_id2 = 422 ImageController::ImageDecodeRequestId expected_id2 =
414 controller()->QueueImageDecode( 423 controller()->QueueImageDecode(
415 image(), 424 image(),
416 base::Bind(&DecodeClient::Callback, base::Unretained(&decode_client2), 425 base::Bind(&DecodeClient::Callback, base::Unretained(&decode_client2),
417 base::Bind([] {}))); 426 base::Bind([] {})),
427 ImageDecodeCache::ImageDecodeType::kCheckerImaging);
418 DecodeClient decode_client3; 428 DecodeClient decode_client3;
419 ImageController::ImageDecodeRequestId expected_id3 = 429 ImageController::ImageDecodeRequestId expected_id3 =
420 controller()->QueueImageDecode( 430 controller()->QueueImageDecode(
421 image(), 431 image(),
422 base::Bind(&DecodeClient::Callback, base::Unretained(&decode_client3), 432 base::Bind(&DecodeClient::Callback, base::Unretained(&decode_client3),
423 run_loop.QuitClosure())); 433 run_loop.QuitClosure()),
434 ImageDecodeCache::ImageDecodeType::kCheckerImaging);
424 RunOrTimeout(&run_loop); 435 RunOrTimeout(&run_loop);
425 EXPECT_EQ(expected_id1, decode_client1.id()); 436 EXPECT_EQ(expected_id1, decode_client1.id());
426 EXPECT_EQ(ImageController::ImageDecodeResult::SUCCESS, 437 EXPECT_EQ(ImageController::ImageDecodeResult::SUCCESS,
427 decode_client1.result()); 438 decode_client1.result());
428 EXPECT_EQ(expected_id2, decode_client2.id()); 439 EXPECT_EQ(expected_id2, decode_client2.id());
429 EXPECT_EQ(ImageController::ImageDecodeResult::SUCCESS, 440 EXPECT_EQ(ImageController::ImageDecodeResult::SUCCESS,
430 decode_client2.result()); 441 decode_client2.result());
431 EXPECT_EQ(expected_id3, decode_client3.id()); 442 EXPECT_EQ(expected_id3, decode_client3.id());
432 EXPECT_EQ(ImageController::ImageDecodeResult::SUCCESS, 443 EXPECT_EQ(ImageController::ImageDecodeResult::SUCCESS,
433 decode_client3.result()); 444 decode_client3.result());
434 EXPECT_TRUE(task->has_run()); 445 EXPECT_TRUE(task->has_run());
435 EXPECT_TRUE(task->HasCompleted()); 446 EXPECT_TRUE(task->HasCompleted());
436 } 447 }
437 448
438 TEST_F(ImageControllerTest, QueueImageDecodeChangeControllerWithTaskQueued) { 449 TEST_F(ImageControllerTest, QueueImageDecodeChangeControllerWithTaskQueued) {
439 scoped_refptr<BlockingTask> task_one(new BlockingTask); 450 scoped_refptr<BlockingTask> task_one(new BlockingTask);
440 cache()->SetTaskToUse(task_one); 451 cache()->SetTaskToUse(task_one);
441 452
442 DecodeClient decode_client1; 453 DecodeClient decode_client1;
443 ImageController::ImageDecodeRequestId expected_id1 = 454 ImageController::ImageDecodeRequestId expected_id1 =
444 controller()->QueueImageDecode( 455 controller()->QueueImageDecode(
445 image(), 456 image(),
446 base::Bind(&DecodeClient::Callback, base::Unretained(&decode_client1), 457 base::Bind(&DecodeClient::Callback, base::Unretained(&decode_client1),
447 base::Bind([] {}))); 458 base::Bind([] {})),
459 ImageDecodeCache::ImageDecodeType::kCheckerImaging);
448 460
449 scoped_refptr<BlockingTask> task_two(new BlockingTask); 461 scoped_refptr<BlockingTask> task_two(new BlockingTask);
450 cache()->SetTaskToUse(task_two); 462 cache()->SetTaskToUse(task_two);
451 463
452 base::RunLoop run_loop; 464 base::RunLoop run_loop;
453 DecodeClient decode_client2; 465 DecodeClient decode_client2;
454 ImageController::ImageDecodeRequestId expected_id2 = 466 ImageController::ImageDecodeRequestId expected_id2 =
455 controller()->QueueImageDecode( 467 controller()->QueueImageDecode(
456 image(), 468 image(),
457 base::Bind(&DecodeClient::Callback, base::Unretained(&decode_client2), 469 base::Bind(&DecodeClient::Callback, base::Unretained(&decode_client2),
458 run_loop.QuitClosure())); 470 run_loop.QuitClosure()),
471 ImageDecodeCache::ImageDecodeType::kCheckerImaging);
459 472
460 task_one->AllowToRun(); 473 task_one->AllowToRun();
461 task_two->AllowToRun(); 474 task_two->AllowToRun();
462 controller()->SetImageDecodeCache(nullptr); 475 controller()->SetImageDecodeCache(nullptr);
463 ResetController(); 476 ResetController();
464 477
465 RunOrTimeout(&run_loop); 478 RunOrTimeout(&run_loop);
466 479
467 EXPECT_TRUE(task_one->state().IsCanceled() || task_one->HasCompleted()); 480 EXPECT_TRUE(task_one->state().IsCanceled() || task_one->HasCompleted());
468 EXPECT_TRUE(task_two->state().IsCanceled() || task_two->HasCompleted()); 481 EXPECT_TRUE(task_two->state().IsCanceled() || task_two->HasCompleted());
469 EXPECT_EQ(expected_id1, decode_client1.id()); 482 EXPECT_EQ(expected_id1, decode_client1.id());
470 EXPECT_EQ(expected_id2, decode_client2.id()); 483 EXPECT_EQ(expected_id2, decode_client2.id());
471 } 484 }
472 485
473 TEST_F(ImageControllerTest, QueueImageDecodeImageAlreadyLocked) { 486 TEST_F(ImageControllerTest, QueueImageDecodeImageAlreadyLocked) {
474 scoped_refptr<SimpleTask> task(new SimpleTask); 487 scoped_refptr<SimpleTask> task(new SimpleTask);
475 cache()->SetTaskToUse(task); 488 cache()->SetTaskToUse(task);
476 489
477 base::RunLoop run_loop1; 490 base::RunLoop run_loop1;
478 DecodeClient decode_client1; 491 DecodeClient decode_client1;
479 ImageController::ImageDecodeRequestId expected_id1 = 492 ImageController::ImageDecodeRequestId expected_id1 =
480 controller()->QueueImageDecode( 493 controller()->QueueImageDecode(
481 image(), 494 image(),
482 base::Bind(&DecodeClient::Callback, base::Unretained(&decode_client1), 495 base::Bind(&DecodeClient::Callback, base::Unretained(&decode_client1),
483 run_loop1.QuitClosure())); 496 run_loop1.QuitClosure()),
497 ImageDecodeCache::ImageDecodeType::kCheckerImaging);
484 RunOrTimeout(&run_loop1); 498 RunOrTimeout(&run_loop1);
485 EXPECT_EQ(expected_id1, decode_client1.id()); 499 EXPECT_EQ(expected_id1, decode_client1.id());
486 EXPECT_TRUE(task->has_run()); 500 EXPECT_TRUE(task->has_run());
487 501
488 cache()->SetTaskToUse(nullptr); 502 cache()->SetTaskToUse(nullptr);
489 base::RunLoop run_loop2; 503 base::RunLoop run_loop2;
490 DecodeClient decode_client2; 504 DecodeClient decode_client2;
491 ImageController::ImageDecodeRequestId expected_id2 = 505 ImageController::ImageDecodeRequestId expected_id2 =
492 controller()->QueueImageDecode( 506 controller()->QueueImageDecode(
493 image(), 507 image(),
494 base::Bind(&DecodeClient::Callback, base::Unretained(&decode_client2), 508 base::Bind(&DecodeClient::Callback, base::Unretained(&decode_client2),
495 run_loop2.QuitClosure())); 509 run_loop2.QuitClosure()),
510 ImageDecodeCache::ImageDecodeType::kCheckerImaging);
496 RunOrTimeout(&run_loop2); 511 RunOrTimeout(&run_loop2);
497 EXPECT_EQ(expected_id2, decode_client2.id()); 512 EXPECT_EQ(expected_id2, decode_client2.id());
498 EXPECT_EQ(ImageController::ImageDecodeResult::SUCCESS, 513 EXPECT_EQ(ImageController::ImageDecodeResult::SUCCESS,
499 decode_client2.result()); 514 decode_client2.result());
500 } 515 }
501 516
502 TEST_F(ImageControllerTest, QueueImageDecodeLockedImageControllerChange) { 517 TEST_F(ImageControllerTest, QueueImageDecodeLockedImageControllerChange) {
503 scoped_refptr<SimpleTask> task(new SimpleTask); 518 scoped_refptr<SimpleTask> task(new SimpleTask);
504 cache()->SetTaskToUse(task); 519 cache()->SetTaskToUse(task);
505 520
506 base::RunLoop run_loop1; 521 base::RunLoop run_loop1;
507 DecodeClient decode_client1; 522 DecodeClient decode_client1;
508 ImageController::ImageDecodeRequestId expected_id1 = 523 ImageController::ImageDecodeRequestId expected_id1 =
509 controller()->QueueImageDecode( 524 controller()->QueueImageDecode(
510 image(), 525 image(),
511 base::Bind(&DecodeClient::Callback, base::Unretained(&decode_client1), 526 base::Bind(&DecodeClient::Callback, base::Unretained(&decode_client1),
512 run_loop1.QuitClosure())); 527 run_loop1.QuitClosure()),
528 ImageDecodeCache::ImageDecodeType::kCheckerImaging);
513 RunOrTimeout(&run_loop1); 529 RunOrTimeout(&run_loop1);
514 EXPECT_EQ(expected_id1, decode_client1.id()); 530 EXPECT_EQ(expected_id1, decode_client1.id());
515 EXPECT_TRUE(task->has_run()); 531 EXPECT_TRUE(task->has_run());
516 EXPECT_EQ(1, cache()->number_of_refs()); 532 EXPECT_EQ(1, cache()->number_of_refs());
517 533
518 controller()->SetImageDecodeCache(nullptr); 534 controller()->SetImageDecodeCache(nullptr);
519 EXPECT_EQ(0, cache()->number_of_refs()); 535 EXPECT_EQ(0, cache()->number_of_refs());
520 } 536 }
521 537
522 TEST_F(ImageControllerTest, DispatchesDecodeCallbacksAfterCacheReset) { 538 TEST_F(ImageControllerTest, DispatchesDecodeCallbacksAfterCacheReset) {
523 scoped_refptr<SimpleTask> task(new SimpleTask); 539 scoped_refptr<SimpleTask> task(new SimpleTask);
524 cache()->SetTaskToUse(task); 540 cache()->SetTaskToUse(task);
525 541
526 base::RunLoop run_loop1; 542 base::RunLoop run_loop1;
527 DecodeClient decode_client1; 543 DecodeClient decode_client1;
528 base::RunLoop run_loop2; 544 base::RunLoop run_loop2;
529 DecodeClient decode_client2; 545 DecodeClient decode_client2;
530 546
531 controller()->QueueImageDecode( 547 controller()->QueueImageDecode(
532 image(), 548 image(),
533 base::Bind(&DecodeClient::Callback, base::Unretained(&decode_client1), 549 base::Bind(&DecodeClient::Callback, base::Unretained(&decode_client1),
534 run_loop1.QuitClosure())); 550 run_loop1.QuitClosure()),
551 ImageDecodeCache::ImageDecodeType::kCheckerImaging);
535 controller()->QueueImageDecode( 552 controller()->QueueImageDecode(
536 image(), 553 image(),
537 base::Bind(&DecodeClient::Callback, base::Unretained(&decode_client2), 554 base::Bind(&DecodeClient::Callback, base::Unretained(&decode_client2),
538 run_loop2.QuitClosure())); 555 run_loop2.QuitClosure()),
556 ImageDecodeCache::ImageDecodeType::kCheckerImaging);
539 557
540 // Now reset the image cache before decode completed callbacks are posted to 558 // Now reset the image cache before decode completed callbacks are posted to
541 // the compositor thread. Ensure that the completion callbacks for the decode 559 // the compositor thread. Ensure that the completion callbacks for the decode
542 // is still run. 560 // is still run.
543 controller()->SetImageDecodeCache(nullptr); 561 controller()->SetImageDecodeCache(nullptr);
544 ResetController(); 562 ResetController();
545 563
546 RunOrTimeout(&run_loop1); 564 RunOrTimeout(&run_loop1);
547 RunOrTimeout(&run_loop2); 565 RunOrTimeout(&run_loop2);
548 566
549 EXPECT_EQ(ImageController::ImageDecodeResult::FAILURE, 567 EXPECT_EQ(ImageController::ImageDecodeResult::FAILURE,
550 decode_client1.result()); 568 decode_client1.result());
551 EXPECT_EQ(ImageController::ImageDecodeResult::FAILURE, 569 EXPECT_EQ(ImageController::ImageDecodeResult::FAILURE,
552 decode_client2.result()); 570 decode_client2.result());
553 } 571 }
554 572
555 TEST_F(ImageControllerTest, DispatchesDecodeCallbacksAfterCacheChanged) { 573 TEST_F(ImageControllerTest, DispatchesDecodeCallbacksAfterCacheChanged) {
556 scoped_refptr<SimpleTask> task(new SimpleTask); 574 scoped_refptr<SimpleTask> task(new SimpleTask);
557 cache()->SetTaskToUse(task); 575 cache()->SetTaskToUse(task);
558 576
559 base::RunLoop run_loop1; 577 base::RunLoop run_loop1;
560 DecodeClient decode_client1; 578 DecodeClient decode_client1;
561 base::RunLoop run_loop2; 579 base::RunLoop run_loop2;
562 DecodeClient decode_client2; 580 DecodeClient decode_client2;
563 581
564 controller()->QueueImageDecode( 582 controller()->QueueImageDecode(
565 image(), 583 image(),
566 base::Bind(&DecodeClient::Callback, base::Unretained(&decode_client1), 584 base::Bind(&DecodeClient::Callback, base::Unretained(&decode_client1),
567 run_loop1.QuitClosure())); 585 run_loop1.QuitClosure()),
586 ImageDecodeCache::ImageDecodeType::kCheckerImaging);
568 controller()->QueueImageDecode( 587 controller()->QueueImageDecode(
569 image(), 588 image(),
570 base::Bind(&DecodeClient::Callback, base::Unretained(&decode_client2), 589 base::Bind(&DecodeClient::Callback, base::Unretained(&decode_client2),
571 run_loop2.QuitClosure())); 590 run_loop2.QuitClosure()),
591 ImageDecodeCache::ImageDecodeType::kCheckerImaging);
572 592
573 // Now reset the image cache before decode completed callbacks are posted to 593 // Now reset the image cache before decode completed callbacks are posted to
574 // the compositor thread. This should orphan the requests. 594 // the compositor thread. This should orphan the requests.
575 controller()->SetImageDecodeCache(nullptr); 595 controller()->SetImageDecodeCache(nullptr);
576 596
577 EXPECT_EQ(0, cache()->number_of_refs()); 597 EXPECT_EQ(0, cache()->number_of_refs());
578 598
579 TestableCache other_cache; 599 TestableCache other_cache;
580 other_cache.SetTaskToUse(task); 600 other_cache.SetTaskToUse(task);
581 601
582 controller()->SetImageDecodeCache(&other_cache); 602 controller()->SetImageDecodeCache(&other_cache);
583 603
584 RunOrTimeout(&run_loop1); 604 RunOrTimeout(&run_loop1);
585 RunOrTimeout(&run_loop2); 605 RunOrTimeout(&run_loop2);
586 606
587 EXPECT_EQ(2, other_cache.number_of_refs()); 607 EXPECT_EQ(2, other_cache.number_of_refs());
588 EXPECT_EQ(ImageController::ImageDecodeResult::SUCCESS, 608 EXPECT_EQ(ImageController::ImageDecodeResult::SUCCESS,
589 decode_client1.result()); 609 decode_client1.result());
590 EXPECT_EQ(ImageController::ImageDecodeResult::SUCCESS, 610 EXPECT_EQ(ImageController::ImageDecodeResult::SUCCESS,
591 decode_client2.result()); 611 decode_client2.result());
592 612
593 // Reset the controller since the order of destruction is wrong in this test 613 // Reset the controller since the order of destruction is wrong in this test
594 // (|other_cache| should outlive the controller. This is normally done via 614 // (|other_cache| should outlive the controller. This is normally done via
595 // SetImageDecodeCache(nullptr) or it can be done in the dtor of the cache.) 615 // SetImageDecodeCache(nullptr) or it can be done in the dtor of the cache.)
596 ResetController(); 616 ResetController();
597 } 617 }
598 618
599 } // namespace 619 } // namespace
600 } // namespace cc 620 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698