#ifndef CHROME_BROWSER_ACTOR_TOOLS_TAB_MANAGEMENT_TOOL_H_
#define CHROME_BROWSER_ACTOR_TOOLS_TAB_MANAGEMENT_TOOL_H_
#include "base/callback_list.h"
#include "base/memory/weak_ptr.h"
#include "base/scoped_observation.h"
#include "chrome/browser/actor/tools/tool.h"
#include "chrome/browser/actor/tools/tool_callbacks.h"
#include "chrome/browser/actor/tools/tool_request.h"
#include "chrome/browser/ui/tabs/tab_strip_model_observer.h"
#include "ui/base/window_open_disposition.h"
namespace actor {
class ObservationDelayController;
class TabManagementTool : public Tool, public TabStripModelObserver {
public:
enum Action { kCreate, kActivate, kClose };
TabManagementTool(TaskId task_id,
ToolDelegate& tool_delegate,
int32_t window,
WindowOpenDisposition create_disposition);
TabManagementTool(TaskId task_id,
ToolDelegate& tool_delegate,
Action action,
tabs::TabHandle target_tab);
~TabManagementTool() override;
void Validate(ToolCallback callback) override;
void Invoke(ToolCallback callback) override;
std::string DebugString() const override;
std::string JournalEvent() const override;
std::unique_ptr<ObservationDelayController> GetObservationDelayer(
ObservationDelayController::PageStabilityConfig page_stability_config)
override;
void UpdateTaskAfterInvoke(ActorTask& task,
mojom::ActionResultPtr result,
ToolCallback callback) const override;
tabs::TabHandle GetTargetTab() const override;
void OnTabStripModelChanged(TabStripModel* tab_strip_model,
const TabStripModelChange& change,
const TabStripSelectionChange& selection) final;
private:
void OnBrowserDidClose(BrowserWindowInterface* browser);
Action action_;
ToolCallback callback_;
std::optional<tabs::TabHandle> target_tab_;
std::optional<WindowOpenDisposition> create_disposition_;
std::optional<int32_t> window_id_;
base::CallbackListSubscription browser_did_close_subscription_;
base::WeakPtrFactory<TabManagementTool> weak_ptr_factory_{this};
};
}
#endif