OLD | NEW |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |