| Index: chrome/browser/image_decoder.cc
|
| diff --git a/chrome/browser/image_decoder.cc b/chrome/browser/image_decoder.cc
|
| index 6d7b948aa7f63a79dc817fc41088aec47cd588d3..682789f9c6af128183a5d1c9b6b7bc16f84268ca 100644
|
| --- a/chrome/browser/image_decoder.cc
|
| +++ b/chrome/browser/image_decoder.cc
|
| @@ -5,6 +5,7 @@
|
| #include "chrome/browser/image_decoder.h"
|
|
|
| #include "base/bind.h"
|
| +#include "base/threading/sequenced_worker_pool.h"
|
| #include "chrome/browser/browser_process.h"
|
| #include "chrome/common/chrome_utility_messages.h"
|
| #include "content/public/browser/browser_thread.h"
|
| @@ -34,6 +35,17 @@ void ImageDecoder::Start() {
|
| base::Bind(&ImageDecoder::DecodeImageInSandbox, this, image_data_));
|
| }
|
|
|
| +void ImageDecoder::Start(std::string sequence_token_name) {
|
| + if (sequence_token_name.empty()) {
|
| + NOTREACHED();
|
| + return;
|
| + }
|
| + sequence_token_name_ = sequence_token_name;
|
| + BrowserThread::PostTask(
|
| + BrowserThread::IO, FROM_HERE,
|
| + base::Bind(&ImageDecoder::DecodeImageInSandbox, this, image_data_));
|
| +}
|
| +
|
| bool ImageDecoder::OnMessageReceived(const IPC::Message& message) {
|
| bool handled = true;
|
| IPC_BEGIN_MESSAGE_MAP(ImageDecoder, message)
|
| @@ -46,14 +58,25 @@ bool ImageDecoder::OnMessageReceived(const IPC::Message& message) {
|
| return handled;
|
| }
|
|
|
| +bool ImageDecoder::CalledOnValidThreadOrWorkerThread() {
|
| + if (sequence_token_name_.empty()) {
|
| + return BrowserThread::CurrentlyOn(target_thread_id_);
|
| + } else {
|
| + base::SequencedWorkerPool* pool = BrowserThread::GetBlockingPool();
|
| + base::SequencedWorkerPool::SequenceToken sequence_token = pool->
|
| + GetNamedSequenceToken(sequence_token_name_);
|
| + return pool->IsRunningSequenceOnCurrentThread(sequence_token);
|
| + }
|
| +}
|
| +
|
| void ImageDecoder::OnDecodeImageSucceeded(const SkBitmap& decoded_image) {
|
| - DCHECK(BrowserThread::CurrentlyOn(target_thread_id_));
|
| + DCHECK(CalledOnValidThreadOrWorkerThread());
|
| if (delegate_)
|
| delegate_->OnImageDecoded(this, decoded_image);
|
| }
|
|
|
| void ImageDecoder::OnDecodeImageFailed() {
|
| - DCHECK(BrowserThread::CurrentlyOn(target_thread_id_));
|
| + DCHECK(CalledOnValidThreadOrWorkerThread());
|
| if (delegate_)
|
| delegate_->OnDecodeImageFailed(this);
|
| }
|
| @@ -61,8 +84,17 @@ void ImageDecoder::OnDecodeImageFailed() {
|
| void ImageDecoder::DecodeImageInSandbox(
|
| const std::vector<unsigned char>& image_data) {
|
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
|
| - UtilityProcessHost* utility_process_host = UtilityProcessHost::Create(
|
| - this, BrowserThread::GetMessageLoopProxyForThread(target_thread_id_));
|
| + UtilityProcessHost* utility_process_host;
|
| + if (sequence_token_name_.empty()) {
|
| + utility_process_host = UtilityProcessHost::Create(
|
| + this, BrowserThread::GetMessageLoopProxyForThread(target_thread_id_));
|
| + } else {
|
| + base::SequencedWorkerPool* pool = BrowserThread::GetBlockingPool();
|
| + base::SequencedWorkerPool::SequenceToken sequence_token = pool->
|
| + GetNamedSequenceToken(sequence_token_name_);
|
| + utility_process_host = UtilityProcessHost::Create(
|
| + this, pool->GetSequencedTaskRunner(sequence_token).get());
|
| + }
|
| utility_process_host->EnableZygote();
|
| if (image_codec_ == ROBUST_JPEG_CODEC) {
|
| utility_process_host->Send(
|
|
|