1 // Copyright 2014 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef EXTENSIONS_BROWSER_API_ASYNC_API_FUCTION_H_ 6 #define EXTENSIONS_BROWSER_API_ASYNC_API_FUCTION_H_ 7 8 #include "content/public/browser/browser_thread.h" 9 #include "extensions/browser/extension_function.h" 10 11 namespace extensions { 12 13 // AsyncApiFunction provides convenient thread management for APIs that need to 14 // do essentially all their work on a thread other than the UI thread. 15 class AsyncApiFunction : public AsyncExtensionFunction { 16 protected: 17 AsyncApiFunction(); 18 virtual ~AsyncApiFunction(); 19 20 // Like Prepare(). A useful place to put common work in an ApiFunction 21 // superclass that multiple API functions want to share. 22 virtual bool PrePrepare(); 23 24 // Set up for work (e.g., validate arguments). Guaranteed to happen on UI 25 // thread. 26 virtual bool Prepare() = 0; 27 28 // Do actual work. Guaranteed to happen on the thread specified in 29 // work_thread_id_. 30 virtual void Work(); 31 32 // Start the asynchronous work. Guraranteed to happen on requested thread. 33 virtual void AsyncWorkStart(); 34 35 // Notify AsyncIOApiFunction that the work is completed 36 void AsyncWorkCompleted(); 37 38 // Respond. Guaranteed to happen on UI thread. 39 virtual bool Respond() = 0; 40 41 // ExtensionFunction::RunAsync() 42 virtual bool RunAsync() OVERRIDE; 43 44 protected: work_thread_id()45 content::BrowserThread::ID work_thread_id() const { return work_thread_id_; } set_work_thread_id(content::BrowserThread::ID work_thread_id)46 void set_work_thread_id(content::BrowserThread::ID work_thread_id) { 47 work_thread_id_ = work_thread_id; 48 } 49 50 private: 51 void WorkOnWorkThread(); 52 void RespondOnUIThread(); 53 54 // If you don't want your Work() method to happen on the IO thread, then set 55 // this to the thread that you do want, preferably in Prepare(). 56 content::BrowserThread::ID work_thread_id_; 57 }; 58 59 } // namespace extensions 60 61 #endif // EXTENSIONS_BROWSER_API_ASYNC_API_FUCTION_H_ 62