| OLD | NEW |
| 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 "cc/tiles/checker_image_tracker.h" | 5 #include "cc/tiles/checker_image_tracker.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/memory/ptr_util.h" | 8 #include "base/memory/ptr_util.h" |
| 9 #include "base/run_loop.h" | 9 #include "base/run_loop.h" |
| 10 #include "base/threading/thread_task_runner_handle.h" | 10 #include "base/threading/thread_task_runner_handle.h" |
| (...skipping 30 matching lines...) Expand all Loading... |
| 41 void UnlockImageDecode(ImageDecodeRequestId id) override { | 41 void UnlockImageDecode(ImageDecodeRequestId id) override { |
| 42 DCHECK_EQ(locked_images_.count(id), 1U); | 42 DCHECK_EQ(locked_images_.count(id), 1U); |
| 43 locked_images_.erase(id); | 43 locked_images_.erase(id); |
| 44 } | 44 } |
| 45 | 45 |
| 46 ImageDecodeRequestId QueueImageDecode( | 46 ImageDecodeRequestId QueueImageDecode( |
| 47 sk_sp<const SkImage> image, | 47 sk_sp<const SkImage> image, |
| 48 const ImageDecodedCallback& callback) override { | 48 const ImageDecodedCallback& callback) override { |
| 49 ImageDecodeRequestId request_id = next_image_request_id_++; | 49 ImageDecodeRequestId request_id = next_image_request_id_++; |
| 50 | 50 |
| 51 // The tracker should request a decode only once. | |
| 52 EXPECT_EQ(decodes_requested_.count(image->uniqueID()), 0u); | |
| 53 decodes_requested_.insert(image->uniqueID()); | 51 decodes_requested_.insert(image->uniqueID()); |
| 54 | |
| 55 locked_images_.insert(request_id); | 52 locked_images_.insert(request_id); |
| 56 | 53 |
| 57 // Post the callback asynchronously to match the behaviour in | 54 // Post the callback asynchronously to match the behaviour in |
| 58 // ImageController. | 55 // ImageController. |
| 59 worker_task_runner_->PostTask( | 56 worker_task_runner_->PostTask( |
| 60 FROM_HERE, | 57 FROM_HERE, |
| 61 base::BindOnce(callback, request_id, ImageDecodeResult::SUCCESS)); | 58 base::BindOnce(callback, request_id, ImageDecodeResult::SUCCESS)); |
| 62 | 59 |
| 63 return request_id; | 60 return request_id; |
| 64 } | 61 } |
| (...skipping 260 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 325 // Trigger completion for all decodes. Only 2 images should have been decoded | 322 // Trigger completion for all decodes. Only 2 images should have been decoded |
| 326 // since the second image was cancelled. | 323 // since the second image was cancelled. |
| 327 base::RunLoop().RunUntilIdle(); | 324 base::RunLoop().RunUntilIdle(); |
| 328 EXPECT_EQ(image_controller_.decodes_requested().size(), 2U); | 325 EXPECT_EQ(image_controller_.decodes_requested().size(), 2U); |
| 329 EXPECT_EQ(image_controller_.decodes_requested().count( | 326 EXPECT_EQ(image_controller_.decodes_requested().count( |
| 330 checkerable_image3.image()->uniqueID()), | 327 checkerable_image3.image()->uniqueID()), |
| 331 1U); | 328 1U); |
| 332 EXPECT_EQ(image_controller_.num_of_locked_images(), 2); | 329 EXPECT_EQ(image_controller_.num_of_locked_images(), 2); |
| 333 } | 330 } |
| 334 | 331 |
| 332 TEST_F(CheckerImageTrackerTest, ClearsTracker) { |
| 333 SetUpTracker(true); |
| 334 |
| 335 DrawImage checkerable_image = CreateImage(ImageType::CHECKERABLE); |
| 336 CheckerImageTracker::ImageDecodeQueue image_decode_queue = |
| 337 BuildImageDecodeQueue({checkerable_image}, WhichTree::PENDING_TREE); |
| 338 EXPECT_EQ(image_decode_queue.size(), 1U); |
| 339 checker_image_tracker_->ScheduleImageDecodeQueue( |
| 340 std::move(image_decode_queue)); |
| 341 base::RunLoop().RunUntilIdle(); |
| 342 checker_image_tracker_->TakeImagesToInvalidateOnSyncTree(); |
| 343 |
| 344 // The image is no longer checkered on the pending tree. |
| 345 image_decode_queue = |
| 346 BuildImageDecodeQueue({checkerable_image}, WhichTree::PENDING_TREE); |
| 347 EXPECT_EQ(image_decode_queue.size(), 0U); |
| 348 EXPECT_EQ(image_controller_.num_of_locked_images(), 1); |
| 349 |
| 350 // Clear the tracker without clearing the async decode tracking. This should |
| 351 // drop the decode but the image should not be checkered. |
| 352 bool can_clear_decode_policy_tracking = false; |
| 353 checker_image_tracker_->ClearTracker(can_clear_decode_policy_tracking); |
| 354 EXPECT_EQ(image_controller_.num_of_locked_images(), 0); |
| 355 image_decode_queue = |
| 356 BuildImageDecodeQueue({checkerable_image}, WhichTree::PENDING_TREE); |
| 357 EXPECT_EQ(image_decode_queue.size(), 0U); |
| 358 checker_image_tracker_->DidActivateSyncTree(); |
| 359 |
| 360 // Now clear the decode tracking as well. The image will be re-checkered. |
| 361 can_clear_decode_policy_tracking = true; |
| 362 checker_image_tracker_->ClearTracker(can_clear_decode_policy_tracking); |
| 363 image_decode_queue = |
| 364 BuildImageDecodeQueue({checkerable_image}, WhichTree::PENDING_TREE); |
| 365 image_decode_queue = |
| 366 BuildImageDecodeQueue({checkerable_image}, WhichTree::PENDING_TREE); |
| 367 EXPECT_EQ(image_decode_queue.size(), 1U); |
| 368 |
| 369 // If an image had been decoded and tracker was cleared after it, we should |
| 370 // continue checkering it. |
| 371 DrawImage checkerable_image2 = CreateImage(ImageType::CHECKERABLE); |
| 372 image_decode_queue = |
| 373 BuildImageDecodeQueue({checkerable_image}, WhichTree::PENDING_TREE); |
| 374 EXPECT_EQ(image_decode_queue.size(), 1U); |
| 375 checker_image_tracker_->ScheduleImageDecodeQueue( |
| 376 std::move(image_decode_queue)); |
| 377 base::RunLoop().RunUntilIdle(); |
| 378 |
| 379 EXPECT_EQ(image_controller_.num_of_locked_images(), 1); |
| 380 can_clear_decode_policy_tracking = false; |
| 381 checker_image_tracker_->ClearTracker(can_clear_decode_policy_tracking); |
| 382 EXPECT_EQ(image_controller_.num_of_locked_images(), 0); |
| 383 image_decode_queue = |
| 384 BuildImageDecodeQueue({checkerable_image}, WhichTree::PENDING_TREE); |
| 385 EXPECT_EQ(image_decode_queue.size(), 1U); |
| 386 } |
| 387 |
| 335 } // namespace | 388 } // namespace |
| 336 } // namespace cc | 389 } // namespace cc |
| OLD | NEW |