| Index: cc/tiles/image_controller.cc
|
| diff --git a/cc/tiles/image_controller.cc b/cc/tiles/image_controller.cc
|
| index f0d1bb9666c9cde5de93e7879041193d1e74851f..d118c996ceef19a787ec386843653d01bf8369f1 100644
|
| --- a/cc/tiles/image_controller.cc
|
| +++ b/cc/tiles/image_controller.cc
|
| @@ -20,8 +20,8 @@ ImageController::ImageDecodeRequestId
|
| ImageController::ImageController(
|
| base::SequencedTaskRunner* origin_task_runner,
|
| scoped_refptr<base::SequencedTaskRunner> worker_task_runner)
|
| - : origin_task_runner_(origin_task_runner),
|
| - worker_task_runner_(std::move(worker_task_runner)),
|
| + : worker_task_runner_(std::move(worker_task_runner)),
|
| + origin_task_runner_(origin_task_runner),
|
| weak_ptr_factory_(this) {}
|
|
|
| ImageController::~ImageController() {
|
| @@ -77,9 +77,10 @@ void ImageController::StopWorkerTasks() {
|
| ImageDecodeRequestId id = request_to_complete.first;
|
| ImageDecodeRequest& request = request_to_complete.second;
|
|
|
| - // The task (if one exists) would have run already, so we just need to
|
| - // complete it.
|
| - if (request.task)
|
| + // The task (if one exists) would have run already, we just need to make
|
| + // sure it was completed. Multiple requests for the same image use the same
|
| + // task so it could have already been completed.
|
| + if (request.task && !request.task->HasCompleted())
|
| request.task->DidComplete();
|
|
|
| // Issue the callback, and unref the image immediately. This is so that any
|
| @@ -106,7 +107,9 @@ void ImageController::StopWorkerTasks() {
|
| // several different image deque requests for the same image.
|
| if (request.task->state().IsNew())
|
| request.task->state().DidCancel();
|
| - request.task->DidComplete();
|
| +
|
| + if (!request.task->HasCompleted())
|
| + request.task->DidComplete();
|
| }
|
| // Run the callback and unref the image.
|
| request.callback.Run(id);
|
| @@ -120,7 +123,10 @@ void ImageController::SetImageDecodeCache(ImageDecodeCache* cache) {
|
| SetPredecodeImages(std::vector<DrawImage>(),
|
| ImageDecodeCache::TracingInfo());
|
| StopWorkerTasks();
|
| + } else if (cache_ && cache_ != cache) {
|
| + StopWorkerTasks();
|
| }
|
| +
|
| cache_ = cache;
|
| }
|
|
|
|
|