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; |
} |