blob: b828dfa530d0e0f61796512ae1e557991806957d [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.
#include "chrome/browser/ui/views/omnibox/omnibox_context_menu.h"
#include <memory>
#include "base/memory/raw_ptr.h"
#include "chrome/browser/ui/browser_window/public/browser_window_interface.h"
#include "chrome/browser/ui/omnibox/omnibox_context_menu_controller.h"
#include "chrome/browser/ui/webui/top_chrome/top_chrome_web_ui_controller.h"
#include "ui/menus/simple_menu_model.h"
#include "ui/views/controls/menu/menu_item_view.h"
#include "ui/views/controls/menu/menu_model_adapter.h"
#include "ui/views/controls/menu/menu_runner.h"
#include "ui/views/controls/menu/submenu_view.h"
OmniboxContextMenu::OmniboxContextMenu(
views::Widget* parent_widget,
BrowserWindowInterface* browser_window_interface)
: parent_widget_(parent_widget),
controller_(std::make_unique<OmniboxContextMenuController>(
browser_window_interface)) {
std::unique_ptr<views::MenuItemView> menu =
std::make_unique<views::MenuItemView>(this);
menu_ = menu.get();
menu_runner_ = std::make_unique<views::MenuRunner>(
std::move(menu), views::MenuRunner::HAS_MNEMONICS |
views::MenuRunner::MENU_ITEM_CONTEXT_MENU);
ui::SimpleMenuModel* menu_model = controller_->menu_model();
for (size_t i = 0; i < menu_model->GetItemCount(); ++i) {
views::MenuModelAdapter::AppendMenuItemFromModel(
menu_model, i, menu_, menu_model->GetCommandIdAt(i));
}
}
OmniboxContextMenu::~OmniboxContextMenu() = default;
void OmniboxContextMenu::RunMenuAt(const gfx::Point& point,
ui::mojom::MenuSourceType source_type) {
menu_runner_->RunMenuAt(parent_widget_, nullptr,
gfx::Rect(point, gfx::Size()),
views::MenuAnchorPosition::kTopLeft, source_type);
}
void OmniboxContextMenu::ExecuteCommand(int command_id, int event_flags) {
controller_->ExecuteCommand(command_id, event_flags);
}
// Needed so that titles display correctly.
const gfx::FontList* OmniboxContextMenu::GetLabelFontList(
int command_id) const {
ui::MenuModel* model = controller_->menu_model();
size_t index = 0;
ui::MenuModel::GetModelAndIndexForCommandId(command_id, &model, &index);
return model->GetLabelFontListAt(index);
}
std::optional<SkColor> OmniboxContextMenu::GetLabelColor(int command_id) const {
// Use STYLE_PRIMARY for title item. This aligns with 3-dot menu title style.
return command_id == ui::MenuModel::kTitleId
? std::make_optional(
menu_->GetSubmenu()->GetColorProvider()->GetColor(
views::TypographyProvider::Get().GetColorId(
views::style::CONTEXT_MENU,
views::style::STYLE_PRIMARY)))
: std::nullopt;
}
bool OmniboxContextMenu::IsCommandEnabled(int command_id) const {
return command_id != ui::MenuModel::kTitleId;
}