blob: 8d8065f273b0d5f44e890fa51140a79cdc353390 [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_COCOA_TAB_GROUP_MENU_BRIDGE_H_
#define CHROME_BROWSER_UI_COCOA_TAB_GROUP_MENU_BRIDGE_H_
#import <Cocoa/Cocoa.h>
#include "base/memory/raw_ptr.h"
#include "base/scoped_observation.h"
#include "base/task/cancelable_task_tracker.h"
#include "chrome/app/chrome_command_ids.h"
#import "chrome/browser/ui/cocoa/main_menu_item.h"
#include "chrome/browser/ui/tabs/saved_tab_groups/tab_group_menu_utils.h"
#include "components/saved_tab_groups/public/tab_group_sync_service.h"
using TabGroupMenuAction = tab_groups::TabGroupMenuAction;
@class MenuItemListener;
class Browser;
class Profile;
namespace favicon {
class FaviconService;
}
namespace favicon_base {
struct FaviconImageResult;
}
namespace tab_groups {
class TabGroupSyncService;
} // namespace tab_groups
class TabGroupMenuBridge : public MainMenuItem,
public tab_groups::TabGroupSyncService::Observer {
public:
explicit TabGroupMenuBridge(
Profile* profile,
tab_groups::TabGroupSyncService* tab_group_service);
~TabGroupMenuBridge() override;
// MainMenuItem:
void ResetMenu() override;
void BuildMenu() override;
// tab_groups::TabGroupSyncService::Observer:
void OnInitialized() override;
void OnTabGroupAdded(const tab_groups::SavedTabGroup& group,
tab_groups::TriggerSource source) override;
void OnTabGroupUpdated(const tab_groups::SavedTabGroup& group,
tab_groups::TriggerSource source) override;
void OnTabGroupRemoved(const base::Uuid& sync_id,
tab_groups::TriggerSource source) override;
void SetActiveBrowser(Browser* browser);
protected:
virtual NSMenu* TabGroupsMenu();
private:
// Callback to invoke when favicon is loaded.
void OnFaviconReady(NSMenuItem* menu_item,
const favicon_base::FaviconImageResult& result);
// Helper function to create a static submenu item for a tab group.
NSMenuItem* CreateStaticSubmenuItem(int string_id,
TabGroupMenuAction::Type type,
const base::Uuid& uuid);
// Callback to invoke when menu item is clicked.
void OnMenuItem(NSMenuItem* item);
const raw_ptr<Profile> profile_;
const raw_ptr<tab_groups::TabGroupSyncService> tab_group_service_;
const raw_ptr<favicon::FaviconService> favicon_service_;
// Active browser. Used to open/delete tab groups.
raw_ptr<Browser> browser_;
// Make sure favicon requests are cancelled when the menu is recreated or the
// class is destroyed.
base::CancelableTaskTracker favicon_tracker_;
// Observer to listen for tab group change.
base::ScopedObservation<tab_groups::TabGroupSyncService,
tab_groups::TabGroupSyncService::Observer>
observation_{this};
// Menu listener to handle click action.
MenuItemListener* __strong menu_listener_;
// Map menu item to action.
std::map<NSMenuItem*, TabGroupMenuAction> menu_item_map_;
};
#endif // CHROME_BROWSER_UI_COCOA_TAB_GROUP_MENU_BRIDGE_H_