blob: 222de6f762c292c5471233704b6ea529339432aa [file] [log] [blame]
// 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.
#ifndef EXTENSIONS_BROWSER_API_ASYNC_API_FUNCTION_H_
#define EXTENSIONS_BROWSER_API_ASYNC_API_FUNCTION_H_
#include "base/memory/ref_counted.h"
#include "base/sequenced_task_runner.h"
#include "extensions/browser/extension_function.h"
namespace extensions {
// 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 UIThreadExtensionFunction {
protected:
AsyncApiFunction();
~AsyncApiFunction() override;
// 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 task runner specified in
// |work_task_runner_| if non-null; or on the IO thread otherwise.
virtual void Work();
// Start the asynchronous work. Guraranteed to happen on work thread.
virtual void AsyncWorkStart();
// Respond. Guaranteed to happen on UI thread.
virtual bool Respond() = 0;
// UIThreadExtensionFunction:
ResponseAction Run() final;
protected:
// ValidationFailure override to match RunAsync().
static bool ValidationFailure(AsyncApiFunction* function);
scoped_refptr<base::SequencedTaskRunner> work_task_runner() const {
return work_task_runner_;
}
void set_work_task_runner(
scoped_refptr<base::SequencedTaskRunner> work_task_runner) {
work_task_runner_ = work_task_runner;
}
// Notify AsyncIOApiFunction that the work is completed
void AsyncWorkCompleted();
// Sets a single Value as the results of the function.
void SetResult(std::unique_ptr<base::Value> result);
// Sets multiple Values as the results of the function.
void SetResultList(std::unique_ptr<base::ListValue> results);
void SetError(const std::string& error);
const std::string& GetError() const override;
// Responds with success/failure. |results_| or |error_| should be set
// accordingly.
void SendResponse(bool success);
// Exposed versions of |results_| and |error_| which are curried into the
// ExtensionFunction response.
// These need to keep the same name to avoid breaking existing
// implementations, but this should be temporary with https://crbug.com/648275
// and https://crbug.com/634140.
std::unique_ptr<base::ListValue> results_;
std::string error_;
private:
void WorkOnWorkThread();
void RespondOnUIThread();
// Return true to indicate that nothing has gone wrong yet; SendResponse must
// be called later. Return false to respond immediately with an error.
bool RunAsync();
// If you don't want your Work() method to happen on the IO thread, then set
// this to the SequenceTaskRunner you do want to use, preferably in Prepare().
scoped_refptr<base::SequencedTaskRunner> work_task_runner_;
};
} // namespace extensions
#endif // EXTENSIONS_BROWSER_API_ASYNC_API_FUNCTION_H_