blob: 1959cfad89821fb7a2322ce3c742122dbcc93a22 [file] [log] [blame]
// Copyright 2025 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_UI_WEBUI_BROWSER_WEBUI_BROWSER_EXTENSIONS_CONTAINER_H_
#define CHROME_BROWSER_UI_WEBUI_BROWSER_WEBUI_BROWSER_EXTENSIONS_CONTAINER_H_
#include <map>
#include "base/scoped_observation.h"
#include "chrome/browser/ui/extensions/extensions_container.h"
#include "chrome/browser/ui/toolbar/toolbar_actions_model.h"
#include "chrome/browser/ui/views/extensions/extensions_menu_coordinator.h"
#include "chrome/browser/ui/webui_browser/extensions_bar.mojom.h"
#include "mojo/public/cpp/bindings/pending_receiver.h"
#include "mojo/public/cpp/bindings/pending_remote.h"
#include "mojo/public/cpp/bindings/receiver.h"
#include "mojo/public/cpp/bindings/remote.h"
#include "ui/views/interaction/element_tracker_views.h"
class Browser;
class WebUIBrowserWindow;
class WebUIBrowserExtensionsContainer
: public ExtensionsContainer,
public ToolbarActionsModel::Observer,
public extensions_bar::mojom::PageHandler {
public:
WebUIBrowserExtensionsContainer(Browser& browser, WebUIBrowserWindow& window);
~WebUIBrowserExtensionsContainer() override;
// ExtensionsContainer:
ToolbarActionViewController* GetActionForId(
const std::string& action_id) override;
std::optional<extensions::ExtensionId> GetPoppedOutActionId() const override;
void OnContextMenuShownFromToolbar(const std::string& action_id) override;
void OnContextMenuClosedFromToolbar() override;
bool IsActionVisibleOnToolbar(const std::string& action_id) const override;
void UndoPopOut() override;
void SetPopupOwner(ToolbarActionViewController* popup_owner) override;
void HideActivePopup() override;
bool CloseOverflowMenuIfOpen() override;
void PopOutAction(const extensions::ExtensionId& action_id,
base::OnceClosure closure) override;
bool ShowToolbarActionPopupForAPICall(const std::string& action_id,
ShowPopupCallback callback) override;
void ToggleExtensionsMenu() override;
bool HasAnyExtensions() const override;
void UpdateToolbarActionHoverCard(
ToolbarActionView* action_view,
ToolbarActionHoverCardUpdateType update_type) override;
void ShowContextMenuAsFallback(
const extensions::ExtensionId& action_id) override;
void OnPopupShown(const extensions::ExtensionId& action_id,
bool by_user) override;
void OnPopupClosed(const extensions::ExtensionId& action_id) override;
void CollapseConfirmation() override;
// ToolbarActionsModel::Observer:
void OnToolbarModelInitialized() override;
void OnToolbarActionAdded(const ToolbarActionsModel::ActionId& id) override;
void OnToolbarActionRemoved(const ToolbarActionsModel::ActionId& id) override;
void OnToolbarActionUpdated(const ToolbarActionsModel::ActionId& id) override;
void OnToolbarPinnedActionsChanged() override;
void Bind(mojo::PendingRemote<extensions_bar::mojom::Page> page,
mojo::PendingReceiver<extensions_bar::mojom::PageHandler> receiver);
void NotifyOfAllActions();
void NotifyOfOneAction(const ToolbarActionsModel::ActionId& action_id);
// extensions_bar::mojom::PageHandler:
void ExecuteUserAction(const std::string& id) override;
void ShowContextMenu(ui::mojom::MenuSourceType source,
const std::string& id) override;
void ToggleExtensionsMenuFromWebUI() override;
private:
class ActionInfo;
class ContextMenu;
void NotifyActionPoppedOut(base::OnceClosure closure);
void CreateActions();
void CreateActionForId(const ToolbarActionsModel::ActionId& action_id);
const raw_ref<Browser> browser_;
const raw_ref<WebUIBrowserWindow> window_;
const raw_ref<ToolbarActionsModel> model_;
base::ScopedObservation<ToolbarActionsModel, ToolbarActionsModel::Observer>
observe_actions_{this};
mojo::Receiver<extensions_bar::mojom::PageHandler> receiver_{this};
mojo::Remote<extensions_bar::mojom::Page> page_;
std::map<ToolbarActionsModel::ActionId, std::unique_ptr<ActionInfo>> actions_;
std::optional<std::string> popped_out_action_;
std::unique_ptr<ContextMenu> context_menu_;
// The action that triggered the current popup, if any.
raw_ptr<ToolbarActionViewController> popup_owner_ = nullptr;
// Coordinator to show and hide the ExtensionsMenuView.
const std::unique_ptr<ExtensionsMenuCoordinator> extensions_menu_coordinator_;
};
#endif // CHROME_BROWSER_UI_WEBUI_BROWSER_WEBUI_BROWSER_EXTENSIONS_CONTAINER_H_