#ifndef CHROME_BROWSER_ACTOR_TOOLS_TOOL_CONTROLLER_H_
#define CHROME_BROWSER_ACTOR_TOOLS_TOOL_CONTROLLER_H_
#include <memory>
#include <optional>
#include "base/functional/callback.h"
#include "base/memory/raw_ptr.h"
#include "base/memory/raw_ref.h"
#include "base/memory/weak_ptr.h"
#include "chrome/browser/actor/aggregated_journal.h"
#include "chrome/browser/actor/tools/observation_delay_controller.h"
#include "chrome/browser/actor/tools/tool_delegate.h"
#include "chrome/common/actor.mojom-forward.h"
#include "chrome/common/actor/task_id.h"
#include "content/public/browser/weak_document_ptr.h"
namespace actor {
class ActorTask;
class AggregatedJournal;
class Tool;
class ToolRequest;
class ToolController {
public:
using ResultCallback = base::OnceCallback<void(mojom::ActionResultPtr)>;
enum class State {
kInit = 0,
kReady,
kCreating,
kValidating,
kPostValidate,
kInvokable,
kPreInvoke,
kInvoking,
kPostInvoke,
};
ToolController(ActorTask& actor_task, ToolDelegate& tool_delegate);
~ToolController();
ToolController(const ToolController&) = delete;
ToolController& operator=(const ToolController&) = delete;
void CreateToolAndValidate(
const ToolRequest& request,
ResultCallback callback);
void Invoke(ResultCallback result_callback);
void Cancel();
static std::string StateToString(State state);
private:
void SetState(State state);
void DidFinishToolInvoke(mojom::ActionResultPtr result);
void CompleteToolRequest(mojom::ActionResultPtr result);
void PostValidate(mojom::ActionResultPtr result);
void PostUpdateTask(mojom::ActionResultPtr result);
void PostInvokeTool(mojom::ActionResultPtr result);
void WaitForObservation(mojom::ActionResultPtr action_result);
void ObservationDelayComplete(
mojom::ActionResultPtr action_result,
ObservationDelayController::Result observation_result);
AggregatedJournal& journal() { return tool_delegate_->GetJournal(); }
State state_ = State::kInit;
struct ActiveState {
ActiveState(
std::unique_ptr<Tool> tool,
ResultCallback completion_callback,
std::unique_ptr<AggregatedJournal::PendingAsyncEntry> journal_entry);
~ActiveState();
ActiveState(const ActiveState&) = delete;
ActiveState& operator=(const ActiveState&) = delete;
std::unique_ptr<Tool> tool;
ResultCallback completion_callback;
std::unique_ptr<AggregatedJournal::PendingAsyncEntry> journal_entry;
};
std::optional<ActiveState> active_state_;
ObservationDelayController::PageStabilityConfig
observation_page_stability_config_;
std::unique_ptr<ObservationDelayController> observation_delayer_;
raw_ptr<ActorTask> task_;
raw_ref<ToolDelegate> tool_delegate_;
base::WeakPtrFactory<ToolController> weak_ptr_factory_{this};
};
}
#endif