|  | // Copyright 2014 The Chromium Authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | #include "extensions/browser/api/async_api_function.h" | 
|  |  | 
|  | #include "base/bind.h" | 
|  | #include "extensions/browser/extension_system.h" | 
|  |  | 
|  | using content::BrowserThread; | 
|  |  | 
|  | namespace extensions { | 
|  |  | 
|  | // AsyncApiFunction | 
|  | AsyncApiFunction::AsyncApiFunction() : work_thread_id_(BrowserThread::IO) {} | 
|  |  | 
|  | AsyncApiFunction::~AsyncApiFunction() {} | 
|  |  | 
|  | bool AsyncApiFunction::RunAsync() { | 
|  | DCHECK_CURRENTLY_ON(BrowserThread::UI); | 
|  |  | 
|  | if (!PrePrepare() || !Prepare()) { | 
|  | return false; | 
|  | } | 
|  | bool rv = BrowserThread::PostTask( | 
|  | work_thread_id_, | 
|  | FROM_HERE, | 
|  | base::Bind(&AsyncApiFunction::WorkOnWorkThread, this)); | 
|  | DCHECK(rv); | 
|  | return true; | 
|  | } | 
|  |  | 
|  | bool AsyncApiFunction::PrePrepare() { return true; } | 
|  |  | 
|  | void AsyncApiFunction::Work() {} | 
|  |  | 
|  | void AsyncApiFunction::AsyncWorkStart() { | 
|  | Work(); | 
|  | AsyncWorkCompleted(); | 
|  | } | 
|  |  | 
|  | void AsyncApiFunction::AsyncWorkCompleted() { | 
|  | if (!BrowserThread::CurrentlyOn(BrowserThread::UI)) { | 
|  | bool rv = BrowserThread::PostTask( | 
|  | BrowserThread::UI, | 
|  | FROM_HERE, | 
|  | base::Bind(&AsyncApiFunction::RespondOnUIThread, this)); | 
|  | DCHECK(rv); | 
|  | } else { | 
|  | SendResponse(Respond()); | 
|  | } | 
|  | } | 
|  |  | 
|  | void AsyncApiFunction::WorkOnWorkThread() { | 
|  | DCHECK_CURRENTLY_ON(work_thread_id_); | 
|  | DLOG_IF(ERROR, (work_thread_id_ == BrowserThread::UI)) | 
|  | << "You have specified that AsyncApiFunction::Work() should happen on " | 
|  | "the UI thread. This nullifies the point of this class. Either " | 
|  | "specify a different thread or derive from a different class."; | 
|  | AsyncWorkStart(); | 
|  | } | 
|  |  | 
|  | void AsyncApiFunction::RespondOnUIThread() { | 
|  | DCHECK_CURRENTLY_ON(BrowserThread::UI); | 
|  | SendResponse(Respond()); | 
|  | } | 
|  |  | 
|  | }  // namespace extensions |