blob: 0e00a559f35a4d5fb90c33fe28e5d3dff4fa9a11 [file] [log] [blame]
// Copyright 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/ui/web_applications/web_app_menu_model.h"
#include "base/feature_list.h"
#include "base/metrics/histogram_macros.h"
#include "base/strings/utf_string_conversions.h"
#include "build/chromeos_buildflags.h"
#include "chrome/app/chrome_command_ids.h"
#include "chrome/browser/media/router/media_router_feature.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/browser_window.h"
#include "chrome/browser/ui/extensions/extensions_container.h"
#include "chrome/browser/ui/ui_features.h"
#include "chrome/browser/ui/web_applications/app_browser_controller.h"
#include "chrome/common/chrome_features.h"
#include "chrome/grit/chromium_strings.h"
#include "chrome/grit/generated_resources.h"
#include "components/strings/grit/components_strings.h"
#include "ui/base/accelerators/menu_label_accelerator_util.h"
#include "ui/base/l10n/l10n_util.h"
#include "ui/base/models/image_model.h"
#include "url/gurl.h"
#if BUILDFLAG(IS_CHROMEOS_ASH)
#include "ash/public/cpp/ash_features.h"
#include "chrome/browser/ui/toolbar/assign_to_desks_menu_model.h"
#include "ui/views/widget/widget.h"
#endif
constexpr int WebAppMenuModel::kUninstallAppCommandId;
constexpr int WebAppMenuModel::kExtensionsMenuCommandId;
WebAppMenuModel::WebAppMenuModel(ui::AcceleratorProvider* provider,
Browser* browser)
: AppMenuModel(provider, browser) {}
WebAppMenuModel::~WebAppMenuModel() {}
bool WebAppMenuModel::IsCommandIdEnabled(int command_id) const {
switch (command_id) {
case kUninstallAppCommandId:
return browser()->app_controller()->CanUninstall();
case kExtensionsMenuCommandId:
return base::FeatureList::IsEnabled(features::kExtensionsToolbarMenu) &&
base::FeatureList::IsEnabled(
features::kDesktopPWAsElidedExtensionsMenu);
default:
return AppMenuModel::IsCommandIdEnabled(command_id);
}
}
void WebAppMenuModel::ExecuteCommand(int command_id, int event_flags) {
switch (command_id) {
case kUninstallAppCommandId:
LogMenuAction(MENU_ACTION_UNINSTALL_APP);
browser()->app_controller()->Uninstall();
break;
case kExtensionsMenuCommandId:
browser()->window()->GetExtensionsContainer()->ToggleExtensionsMenu();
break;
default:
AppMenuModel::ExecuteCommand(command_id, event_flags);
break;
}
}
void WebAppMenuModel::Build() {
// TODO(crbug.com/897302): Expose UI for user opt out and reenable for the Run
// on OS Login feature.
if (CreateActionToolbarOverflowMenu())
AddSeparator(ui::UPPER_SEPARATOR);
AddItemWithStringId(IDC_WEB_APP_MENU_APP_INFO,
IDS_APP_CONTEXT_MENU_SHOW_INFO);
int app_info_index = GetItemCount() - 1;
content::WebContents* web_contents =
browser()->tab_strip_model()->GetActiveWebContents();
if (web_contents) {
SetMinorText(app_info_index, web_app::AppBrowserController::FormatUrlOrigin(
web_contents->GetVisibleURL()));
}
SetMinorIcon(app_info_index,
ui::ImageModel::FromVectorIcon(
browser()->location_bar_model()->GetVectorIcon()));
AddSeparator(ui::NORMAL_SEPARATOR);
if (IsCommandIdEnabled(kExtensionsMenuCommandId))
AddItemWithStringId(kExtensionsMenuCommandId, IDS_SHOW_EXTENSIONS);
AddItemWithStringId(IDC_COPY_URL, IDS_COPY_URL);
AddItemWithStringId(IDC_OPEN_IN_CHROME, IDS_OPEN_IN_CHROME);
#if BUILDFLAG(IS_CHROMEOS_ASH)
if (ash::features::IsBentoEnabled()) {
AddSeparator(ui::NORMAL_SEPARATOR);
assign_to_desks_submenu_ = std::make_unique<AssignToDesksMenuModel>(
this, views::Widget::GetWidgetForNativeWindow(
browser()->window()->GetNativeWindow()));
AddSubMenuWithStringId(IDC_ASSIGN_TO_DESKS_MENU, IDS_ASSIGN_TO_DESKS_MENU,
assign_to_desks_submenu_.get());
}
#endif
// Chrome OS's app list is prominent enough to not need a separate uninstall
// option in the app menu.
#if !BUILDFLAG(IS_CHROMEOS_ASH)
DCHECK(browser()->app_controller());
if (browser()->app_controller()->IsInstalled()) {
AddSeparator(ui::NORMAL_SEPARATOR);
AddItem(kUninstallAppCommandId,
l10n_util::GetStringFUTF16(
IDS_UNINSTALL_FROM_OS_LAUNCH_SURFACE,
ui::EscapeMenuLabelAmpersands(
browser()->app_controller()->GetAppShortName())));
}
#endif // !BUILDFLAG(IS_CHROMEOS_ASH)
AddSeparator(ui::LOWER_SEPARATOR);
CreateZoomMenu();
AddSeparator(ui::UPPER_SEPARATOR);
AddItemWithStringId(IDC_PRINT, IDS_PRINT);
AddItemWithStringId(IDC_FIND, IDS_FIND);
if (media_router::MediaRouterEnabled(browser()->profile()))
AddItemWithStringId(IDC_ROUTE_MEDIA, IDS_MEDIA_ROUTER_MENU_ITEM_TITLE);
AddSeparator(ui::LOWER_SEPARATOR);
CreateCutCopyPasteMenu();
}
void WebAppMenuModel::LogMenuAction(AppMenuAction action_id) {
AppMenuModel::LogMenuAction(action_id);
UMA_HISTOGRAM_ENUMERATION("HostedAppFrame.WrenchMenu.MenuAction", action_id,
LIMIT_MENU_ACTION);
}