async_api_function.h revision c5cede9ae108bb15f6b7a8aea21c7e1fefa2834c
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
11namespace 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.
15class AsyncApiFunction : public UIThreadExtensionFunction {
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::RunImpl()
42  virtual bool RunImpl() OVERRIDE;
43
44 protected:
45  content::BrowserThread::ID work_thread_id() const { return 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