1a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#ifndef EXTENSIONS_BROWSER_API_ASYNC_API_FUCTION_H_
6a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#define EXTENSIONS_BROWSER_API_ASYNC_API_FUCTION_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_thread.h"
9a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "extensions/browser/extension_function.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace extensions {
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// AsyncApiFunction provides convenient thread management for APIs that need to
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// do essentially all their work on a thread other than the UI thread.
15010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)class AsyncApiFunction : public AsyncExtensionFunction {
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AsyncApiFunction();
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~AsyncApiFunction();
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Like Prepare(). A useful place to put common work in an ApiFunction
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // superclass that multiple API functions want to share.
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool PrePrepare();
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set up for work (e.g., validate arguments). Guaranteed to happen on UI
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // thread.
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool Prepare() = 0;
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Do actual work. Guaranteed to happen on the thread specified in
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // work_thread_id_.
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Work();
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Start the asynchronous work. Guraranteed to happen on requested thread.
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void AsyncWorkStart();
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Notify AsyncIOApiFunction that the work is completed
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AsyncWorkCompleted();
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Respond. Guaranteed to happen on UI thread.
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool Respond() = 0;
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
41010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // ExtensionFunction::RunAsync()
42010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  virtual bool RunAsync() OVERRIDE;
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
45c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  content::BrowserThread::ID work_thread_id() const { return work_thread_id_; }
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_work_thread_id(content::BrowserThread::ID work_thread_id) {
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    work_thread_id_ = work_thread_id;
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void WorkOnWorkThread();
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RespondOnUIThread();
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If you don't want your Work() method to happen on the IO thread, then set
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // this to the thread that you do want, preferably in Prepare().
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::BrowserThread::ID work_thread_id_;
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace extensions
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
61a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#endif  // EXTENSIONS_BROWSER_API_ASYNC_API_FUCTION_H_
62