// Copyright (c) 2012 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.
#ifndef CHROME_BROWSER_EXTENSIONS_API_API_FUNCTION_H_
#define CHROME_BROWSER_EXTENSIONS_API_API_FUNCTION_H_
#include "chrome/browser/extensions/chrome_extension_function.h"
#include "content/public/browser/browser_thread.h"
namespace extensions {
// Base class for API functions. TODO(miket): there isn't much here anymore
// since the removal of ApiResourceEventRouter. Should we promote all its
// subclasses to UIThreadExtensionFunctions?
class ApiFunction : public ChromeAsyncExtensionFunction {
protected:
ApiFunction();
virtual ~ApiFunction();
};
// AsyncApiFunction provides convenient thread management for APIs that need to
// do essentially all their work on a thread other than the UI thread.
class AsyncApiFunction : public ApiFunction {
protected:
AsyncApiFunction();
virtual ~AsyncApiFunction();
// Like Prepare(). A useful place to put common work in an ApiFunction
// superclass that multiple API functions want to share.
virtual bool PrePrepare();
// Set up for work (e.g., validate arguments). Guaranteed to happen on UI
// thread.
virtual bool Prepare() = 0;
// Do actual work. Guaranteed to happen on the thread specified in
// work_thread_id_.
virtual void Work();
// Start the asynchronous work. Guraranteed to happen on requested thread.
virtual void AsyncWorkStart();
// Notify AsyncIOApiFunction that the work is completed
void AsyncWorkCompleted();
// Respond. Guaranteed to happen on UI thread.
virtual bool Respond() = 0;
// ExtensionFunction::RunImpl()
virtual bool RunImpl() OVERRIDE;
protected:
void set_work_thread_id(content::BrowserThread::ID work_thread_id) {
work_thread_id_ = work_thread_id;
}
private:
void WorkOnWorkThread();
void RespondOnUIThread();
// If you don't want your Work() method to happen on the IO thread, then set
// this to the thread that you do want, preferably in Prepare().
content::BrowserThread::ID work_thread_id_;
};
} // namespace extensions
#endif // CHROME_BROWSER_EXTENSIONS_API_API_FUNCTION_H_