Index: chrome/browser/ui/toolbar/wrench_menu_model.cc |
diff --git a/chrome/browser/ui/toolbar/wrench_menu_model.cc b/chrome/browser/ui/toolbar/wrench_menu_model.cc |
deleted file mode 100644 |
index 81eed59c4f6ed576949b1e5c56e7de6d7fe15c3c..0000000000000000000000000000000000000000 |
--- a/chrome/browser/ui/toolbar/wrench_menu_model.cc |
+++ /dev/null |
@@ -1,1036 +0,0 @@ |
-// Copyright (c) 2012 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/toolbar/wrench_menu_model.h" |
- |
-#include <algorithm> |
-#include <cmath> |
- |
-#include "base/command_line.h" |
-#include "base/metrics/histogram.h" |
-#include "base/prefs/pref_service.h" |
-#include "base/strings/string_number_conversions.h" |
-#include "base/strings/string_util.h" |
-#include "base/strings/utf_string_conversions.h" |
-#include "chrome/app/chrome_command_ids.h" |
-#include "chrome/browser/browser_process.h" |
-#include "chrome/browser/defaults.h" |
-#include "chrome/browser/extensions/extension_util.h" |
-#include "chrome/browser/prefs/incognito_mode_prefs.h" |
-#include "chrome/browser/profiles/profile.h" |
-#include "chrome/browser/profiles/profile_manager.h" |
-#include "chrome/browser/search/search.h" |
-#include "chrome/browser/signin/signin_manager_factory.h" |
-#include "chrome/browser/signin/signin_ui_util.h" |
-#include "chrome/browser/task_manager/task_manager.h" |
-#include "chrome/browser/ui/bookmarks/bookmark_utils.h" |
-#include "chrome/browser/ui/browser.h" |
-#include "chrome/browser/ui/browser_commands.h" |
-#include "chrome/browser/ui/browser_finder.h" |
-#include "chrome/browser/ui/browser_window.h" |
-#include "chrome/browser/ui/global_error/global_error.h" |
-#include "chrome/browser/ui/global_error/global_error_service.h" |
-#include "chrome/browser/ui/global_error/global_error_service_factory.h" |
-#include "chrome/browser/ui/tabs/tab_strip_model.h" |
-#include "chrome/browser/ui/toolbar/bookmark_sub_menu_model.h" |
-#include "chrome/browser/ui/toolbar/encoding_menu_controller.h" |
-#include "chrome/browser/ui/toolbar/recent_tabs_sub_menu_model.h" |
-#include "chrome/browser/ui/toolbar/toolbar_actions_bar.h" |
-#include "chrome/browser/upgrade_detector.h" |
-#include "chrome/common/chrome_paths.h" |
-#include "chrome/common/chrome_switches.h" |
-#include "chrome/common/profiling.h" |
-#include "chrome/grit/chromium_strings.h" |
-#include "chrome/grit/generated_resources.h" |
-#include "components/bookmarks/common/bookmark_pref_names.h" |
-#include "components/dom_distiller/core/dom_distiller_switches.h" |
-#include "components/signin/core/browser/signin_manager.h" |
-#include "components/signin/core/common/profile_management_switches.h" |
-#include "components/ui/zoom/zoom_controller.h" |
-#include "components/ui/zoom/zoom_event_manager.h" |
-#include "content/public/browser/host_zoom_map.h" |
-#include "content/public/browser/navigation_entry.h" |
-#include "content/public/browser/notification_service.h" |
-#include "content/public/browser/notification_source.h" |
-#include "content/public/browser/notification_types.h" |
-#include "content/public/browser/user_metrics.h" |
-#include "content/public/browser/web_contents.h" |
-#include "extensions/common/feature_switch.h" |
-#include "grit/theme_resources.h" |
-#include "ui/base/l10n/l10n_util.h" |
-#include "ui/base/layout.h" |
-#include "ui/base/models/button_menu_item_model.h" |
-#include "ui/base/resource/resource_bundle.h" |
-#include "ui/gfx/image/image.h" |
-#include "ui/gfx/image/image_skia.h" |
- |
-#if defined(OS_CHROMEOS) |
-#include "chromeos/chromeos_switches.h" |
-#endif |
- |
-#if defined(OS_WIN) |
-#include "base/win/metro.h" |
-#include "base/win/windows_version.h" |
-#include "chrome/browser/enumerate_modules_model_win.h" |
-#include "chrome/browser/ui/metro_pin_tab_helper_win.h" |
-#include "content/public/browser/gpu_data_manager.h" |
-#endif |
- |
-#if defined(USE_ASH) |
-#include "ash/shell.h" |
-#endif |
- |
-using base::UserMetricsAction; |
-using content::WebContents; |
- |
-namespace { |
- |
-#if defined(OS_MACOSX) |
-// An empty command used because of a bug in AppKit menus. |
-// See comment in CreateActionToolbarOverflowMenu(). |
-const int kEmptyMenuItemCommand = 0; |
-#endif |
- |
-// Conditionally return the update app menu item title based on upgrade detector |
-// state. |
-base::string16 GetUpgradeDialogMenuItemName() { |
- if (UpgradeDetector::GetInstance()->is_outdated_install() || |
- UpgradeDetector::GetInstance()->is_outdated_install_no_au()) { |
- return l10n_util::GetStringUTF16(IDS_UPGRADE_BUBBLE_MENU_ITEM); |
- } else { |
- return l10n_util::GetStringUTF16(IDS_UPDATE_NOW); |
- } |
-} |
- |
-#if defined(OS_WIN) |
-bool GetRestartMenuItemIfRequired(const chrome::HostDesktopType& desktop_type, |
- int* command_id, |
- int* string_id) { |
- if (base::win::GetVersion() == base::win::VERSION_WIN8 || |
- base::win::GetVersion() == base::win::VERSION_WIN8_1) { |
- if (desktop_type != chrome::HOST_DESKTOP_TYPE_ASH) { |
- *command_id = IDC_WIN8_METRO_RESTART; |
- *string_id = IDS_WIN8_METRO_RESTART; |
- } else { |
- *command_id = IDC_WIN_DESKTOP_RESTART; |
- *string_id = IDS_WIN_DESKTOP_RESTART; |
- } |
- return true; |
- } |
- |
- // Windows 7 ASH mode is only supported in DEBUG for now. |
-#if !defined(NDEBUG) |
- // Windows 8 can support ASH mode using WARP, but Windows 7 requires a working |
- // GPU compositor. |
- if (base::win::GetVersion() == base::win::VERSION_WIN7 && |
- content::GpuDataManager::GetInstance()->CanUseGpuBrowserCompositor()) { |
- if (desktop_type != chrome::HOST_DESKTOP_TYPE_ASH) { |
- *command_id = IDC_WIN_CHROMEOS_RESTART; |
- *string_id = IDS_WIN_CHROMEOS_RESTART; |
- } else { |
- *command_id = IDC_WIN_DESKTOP_RESTART; |
- *string_id = IDS_WIN_DESKTOP_RESTART; |
- } |
- return true; |
- } |
-#endif |
- return false; |
-} |
-#endif |
- |
-} // namespace |
- |
-//////////////////////////////////////////////////////////////////////////////// |
-// EncodingMenuModel |
- |
-EncodingMenuModel::EncodingMenuModel(Browser* browser) |
- : ui::SimpleMenuModel(this), |
- browser_(browser) { |
- Build(); |
-} |
- |
-EncodingMenuModel::~EncodingMenuModel() { |
-} |
- |
-void EncodingMenuModel::Build() { |
- EncodingMenuController::EncodingMenuItemList encoding_menu_items; |
- EncodingMenuController encoding_menu_controller; |
- encoding_menu_controller.GetEncodingMenuItems(browser_->profile(), |
- &encoding_menu_items); |
- |
- int group_id = 0; |
- EncodingMenuController::EncodingMenuItemList::iterator it = |
- encoding_menu_items.begin(); |
- for (; it != encoding_menu_items.end(); ++it) { |
- int id = it->first; |
- base::string16& label = it->second; |
- if (id == 0) { |
- AddSeparator(ui::NORMAL_SEPARATOR); |
- } else { |
- if (id == IDC_ENCODING_AUTO_DETECT) { |
- AddCheckItem(id, label); |
- } else { |
- // Use the id of the first radio command as the id of the group. |
- if (group_id <= 0) |
- group_id = id; |
- AddRadioItem(id, label, group_id); |
- } |
- } |
- } |
-} |
- |
-bool EncodingMenuModel::IsCommandIdChecked(int command_id) const { |
- WebContents* current_tab = |
- browser_->tab_strip_model()->GetActiveWebContents(); |
- if (!current_tab) |
- return false; |
- EncodingMenuController controller; |
- return controller.IsItemChecked(browser_->profile(), |
- current_tab->GetEncoding(), command_id); |
-} |
- |
-bool EncodingMenuModel::IsCommandIdEnabled(int command_id) const { |
- bool enabled = chrome::IsCommandEnabled(browser_, command_id); |
- // Special handling for the contents of the Encoding submenu. On Mac OS, |
- // instead of enabling/disabling the top-level menu item, the submenu's |
- // contents get disabled, per Apple's HIG. |
-#if defined(OS_MACOSX) |
- enabled &= chrome::IsCommandEnabled(browser_, IDC_ENCODING_MENU); |
-#endif |
- return enabled; |
-} |
- |
-bool EncodingMenuModel::GetAcceleratorForCommandId( |
- int command_id, |
- ui::Accelerator* accelerator) { |
- return false; |
-} |
- |
-void EncodingMenuModel::ExecuteCommand(int command_id, int event_flags) { |
- chrome::ExecuteCommand(browser_, command_id); |
-} |
- |
-//////////////////////////////////////////////////////////////////////////////// |
-// ZoomMenuModel |
- |
-ZoomMenuModel::ZoomMenuModel(ui::SimpleMenuModel::Delegate* delegate) |
- : SimpleMenuModel(delegate) { |
- Build(); |
-} |
- |
-ZoomMenuModel::~ZoomMenuModel() { |
-} |
- |
-void ZoomMenuModel::Build() { |
- AddItemWithStringId(IDC_ZOOM_PLUS, IDS_ZOOM_PLUS); |
- AddItemWithStringId(IDC_ZOOM_NORMAL, IDS_ZOOM_NORMAL); |
- AddItemWithStringId(IDC_ZOOM_MINUS, IDS_ZOOM_MINUS); |
-} |
- |
-//////////////////////////////////////////////////////////////////////////////// |
-// HelpMenuModel |
- |
-#if defined(GOOGLE_CHROME_BUILD) |
- |
-class WrenchMenuModel::HelpMenuModel : public ui::SimpleMenuModel { |
- public: |
- HelpMenuModel(ui::SimpleMenuModel::Delegate* delegate, |
- Browser* browser) |
- : SimpleMenuModel(delegate) { |
- Build(browser); |
- } |
- |
- private: |
- void Build(Browser* browser) { |
-#if defined(OS_CHROMEOS) && defined(OFFICIAL_BUILD) |
- int help_string_id = IDS_GET_HELP; |
-#else |
- int help_string_id = IDS_HELP_PAGE; |
-#endif |
- AddItem(IDC_ABOUT, l10n_util::GetStringUTF16(IDS_ABOUT)); |
- AddItemWithStringId(IDC_HELP_PAGE_VIA_MENU, help_string_id); |
- if (browser_defaults::kShowHelpMenuItemIcon) { |
- ui::ResourceBundle& rb = ResourceBundle::GetSharedInstance(); |
- SetIcon(GetIndexOfCommandId(IDC_HELP_PAGE_VIA_MENU), |
- rb.GetNativeImageNamed(IDR_HELP_MENU)); |
- } |
- AddItemWithStringId(IDC_FEEDBACK, IDS_FEEDBACK); |
- } |
- |
- DISALLOW_COPY_AND_ASSIGN(HelpMenuModel); |
-}; |
- |
-#endif // defined(GOOGLE_CHROME_BUILD) |
- |
-//////////////////////////////////////////////////////////////////////////////// |
-// ToolsMenuModel |
- |
-ToolsMenuModel::ToolsMenuModel(ui::SimpleMenuModel::Delegate* delegate, |
- Browser* browser) |
- : SimpleMenuModel(delegate) { |
- Build(browser); |
-} |
- |
-ToolsMenuModel::~ToolsMenuModel() {} |
- |
-// More tools submenu is constructed as follows: |
-// - Page specific actions overflow (save page, adding to taskbar). |
-// - Browser / OS level tools (extensions, task manager). |
-// - Developer tools. |
-// - Option to enable profiling. |
-void ToolsMenuModel::Build(Browser* browser) { |
- bool show_create_shortcuts = true; |
-#if defined(OS_CHROMEOS) || defined(OS_MACOSX) |
- show_create_shortcuts = false; |
-#elif defined(USE_ASH) |
- if (browser->host_desktop_type() == chrome::HOST_DESKTOP_TYPE_ASH) |
- show_create_shortcuts = false; |
-#endif |
- AddItemWithStringId(IDC_SAVE_PAGE, IDS_SAVE_PAGE); |
- if (extensions::util::IsNewBookmarkAppsEnabled()) { |
-#if defined(OS_MACOSX) |
- int string_id = IDS_ADD_TO_APPLICATIONS; |
-#elif defined(OS_WIN) |
- int string_id = IDS_ADD_TO_TASKBAR; |
- if (base::win::GetVersion() >= base::win::VERSION_WIN10) { |
- // This is currently non-functional on Win10 and above so change it to be |
- // a link to the generic "create shortcuts" dialog which will allow for |
- // a desktop shortcut. |
- AddItemWithStringId(IDC_CREATE_SHORTCUTS, IDS_CREATE_SHORTCUTS); |
- string_id = 0; // Avoids AddItemWithStringId below. |
- } |
-#else |
- int string_id = IDS_ADD_TO_DESKTOP; |
-#endif |
-#if defined(USE_ASH) |
- if (browser->host_desktop_type() == chrome::HOST_DESKTOP_TYPE_ASH) |
- string_id = IDS_ADD_TO_SHELF; |
-#endif |
- if (string_id) |
- AddItemWithStringId(IDC_CREATE_HOSTED_APP, string_id); |
- } else if (show_create_shortcuts) { |
- AddItemWithStringId(IDC_CREATE_SHORTCUTS, IDS_CREATE_SHORTCUTS); |
- } |
- |
- AddSeparator(ui::NORMAL_SEPARATOR); |
- AddItemWithStringId(IDC_CLEAR_BROWSING_DATA, IDS_CLEAR_BROWSING_DATA); |
- AddItemWithStringId(IDC_MANAGE_EXTENSIONS, IDS_SHOW_EXTENSIONS); |
- if (chrome::CanOpenTaskManager()) |
- AddItemWithStringId(IDC_TASK_MANAGER, IDS_TASK_MANAGER); |
-#if defined(OS_CHROMEOS) |
- AddItemWithStringId(IDC_TAKE_SCREENSHOT, IDS_TAKE_SCREENSHOT); |
-#endif |
- encoding_menu_model_.reset(new EncodingMenuModel(browser)); |
- AddSubMenuWithStringId(IDC_ENCODING_MENU, IDS_ENCODING_MENU, |
- encoding_menu_model_.get()); |
- |
- AddSeparator(ui::NORMAL_SEPARATOR); |
- AddItemWithStringId(IDC_DEV_TOOLS, IDS_DEV_TOOLS); |
- |
-#if defined(ENABLE_PROFILING) && !defined(NO_TCMALLOC) |
- AddSeparator(ui::NORMAL_SEPARATOR); |
- AddCheckItemWithStringId(IDC_PROFILING_ENABLED, IDS_PROFILING_ENABLED); |
-#endif |
-} |
- |
-//////////////////////////////////////////////////////////////////////////////// |
-// WrenchMenuModel |
- |
-WrenchMenuModel::WrenchMenuModel(ui::AcceleratorProvider* provider, |
- Browser* browser) |
- : ui::SimpleMenuModel(this), |
- uma_action_recorded_(false), |
- provider_(provider), |
- browser_(browser) { |
- Build(); |
- UpdateZoomControls(); |
- |
- browser_zoom_subscription_ = |
- ui_zoom::ZoomEventManager::GetForBrowserContext(browser->profile()) |
- ->AddZoomLevelChangedCallback(base::Bind( |
- &WrenchMenuModel::OnZoomLevelChanged, base::Unretained(this))); |
- |
- browser_->tab_strip_model()->AddObserver(this); |
- |
- registrar_.Add(this, content::NOTIFICATION_NAV_ENTRY_COMMITTED, |
- content::NotificationService::AllSources()); |
-} |
- |
-WrenchMenuModel::~WrenchMenuModel() { |
- if (browser_) // Null in tests. |
- browser_->tab_strip_model()->RemoveObserver(this); |
-} |
- |
-bool WrenchMenuModel::DoesCommandIdDismissMenu(int command_id) const { |
- return command_id != IDC_ZOOM_MINUS && command_id != IDC_ZOOM_PLUS; |
-} |
- |
-bool WrenchMenuModel::IsItemForCommandIdDynamic(int command_id) const { |
- return command_id == IDC_ZOOM_PERCENT_DISPLAY || |
-#if defined(OS_MACOSX) |
- command_id == IDC_FULLSCREEN || |
-#elif defined(OS_WIN) |
- command_id == IDC_PIN_TO_START_SCREEN || |
-#endif |
- command_id == IDC_UPGRADE_DIALOG; |
-} |
- |
-base::string16 WrenchMenuModel::GetLabelForCommandId(int command_id) const { |
- switch (command_id) { |
- case IDC_ZOOM_PERCENT_DISPLAY: |
- return zoom_label_; |
-#if defined(OS_MACOSX) |
- case IDC_FULLSCREEN: { |
- int string_id = IDS_ENTER_FULLSCREEN_MAC; // Default to Enter. |
- // Note: On startup, |window()| may be NULL. |
- if (browser_->window() && browser_->window()->IsFullscreen()) |
- string_id = IDS_EXIT_FULLSCREEN_MAC; |
- return l10n_util::GetStringUTF16(string_id); |
- } |
-#elif defined(OS_WIN) |
- case IDC_PIN_TO_START_SCREEN: { |
- int string_id = IDS_PIN_TO_START_SCREEN; |
- WebContents* web_contents = |
- browser_->tab_strip_model()->GetActiveWebContents(); |
- MetroPinTabHelper* tab_helper = |
- web_contents ? MetroPinTabHelper::FromWebContents(web_contents) |
- : NULL; |
- if (tab_helper && tab_helper->IsPinned()) |
- string_id = IDS_UNPIN_FROM_START_SCREEN; |
- return l10n_util::GetStringUTF16(string_id); |
- } |
-#endif |
- case IDC_UPGRADE_DIALOG: |
- return GetUpgradeDialogMenuItemName(); |
- default: |
- NOTREACHED(); |
- return base::string16(); |
- } |
-} |
- |
-bool WrenchMenuModel::GetIconForCommandId(int command_id, |
- gfx::Image* icon) const { |
- ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); |
- switch (command_id) { |
- case IDC_UPGRADE_DIALOG: { |
- if (UpgradeDetector::GetInstance()->notify_upgrade()) { |
- *icon = rb.GetNativeImageNamed( |
- UpgradeDetector::GetInstance()->GetIconResourceID()); |
- return true; |
- } |
- return false; |
- } |
- default: |
- break; |
- } |
- return false; |
-} |
- |
-void WrenchMenuModel::ExecuteCommand(int command_id, int event_flags) { |
- GlobalError* error = GlobalErrorServiceFactory::GetForProfile( |
- browser_->profile())->GetGlobalErrorByMenuItemCommandID(command_id); |
- if (error) { |
- error->ExecuteMenuItem(browser_); |
- return; |
- } |
- |
- LogMenuMetrics(command_id); |
- chrome::ExecuteCommand(browser_, command_id); |
-} |
- |
-void WrenchMenuModel::LogMenuMetrics(int command_id) { |
- base::TimeDelta delta = timer_.Elapsed(); |
- |
- switch (command_id) { |
- case IDC_NEW_TAB: |
- if (!uma_action_recorded_) |
- UMA_HISTOGRAM_MEDIUM_TIMES("WrenchMenu.TimeToAction.NewTab", delta); |
- LogMenuAction(MENU_ACTION_NEW_TAB); |
- break; |
- case IDC_NEW_WINDOW: |
- if (!uma_action_recorded_) |
- UMA_HISTOGRAM_MEDIUM_TIMES("WrenchMenu.TimeToAction.NewWindow", delta); |
- LogMenuAction(MENU_ACTION_NEW_WINDOW); |
- break; |
- case IDC_NEW_INCOGNITO_WINDOW: |
- if (!uma_action_recorded_) { |
- UMA_HISTOGRAM_MEDIUM_TIMES("WrenchMenu.TimeToAction.NewIncognitoWindow", |
- delta); |
- } |
- LogMenuAction(MENU_ACTION_NEW_INCOGNITO_WINDOW); |
- break; |
- |
- // Bookmarks sub menu. |
- case IDC_SHOW_BOOKMARK_BAR: |
- if (!uma_action_recorded_) { |
- UMA_HISTOGRAM_MEDIUM_TIMES("WrenchMenu.TimeToAction.ShowBookmarkBar", |
- delta); |
- } |
- LogMenuAction(MENU_ACTION_SHOW_BOOKMARK_BAR); |
- break; |
- case IDC_SHOW_BOOKMARK_MANAGER: |
- if (!uma_action_recorded_) { |
- UMA_HISTOGRAM_MEDIUM_TIMES("WrenchMenu.TimeToAction.ShowBookmarkMgr", |
- delta); |
- } |
- LogMenuAction(MENU_ACTION_SHOW_BOOKMARK_MANAGER); |
- break; |
- case IDC_IMPORT_SETTINGS: |
- if (!uma_action_recorded_) { |
- UMA_HISTOGRAM_MEDIUM_TIMES("WrenchMenu.TimeToAction.ImportSettings", |
- delta); |
- } |
- LogMenuAction(MENU_ACTION_IMPORT_SETTINGS); |
- break; |
- case IDC_BOOKMARK_PAGE: |
- if (!uma_action_recorded_) { |
- UMA_HISTOGRAM_MEDIUM_TIMES("WrenchMenu.TimeToAction.BookmarkPage", |
- delta); |
- } |
- LogMenuAction(MENU_ACTION_BOOKMARK_PAGE); |
- break; |
- case IDC_BOOKMARK_ALL_TABS: |
- if (!uma_action_recorded_) { |
- UMA_HISTOGRAM_MEDIUM_TIMES("WrenchMenu.TimeToAction.BookmarkAllTabs", |
- delta); |
- } |
- LogMenuAction(MENU_ACTION_BOOKMARK_ALL_TABS); |
- break; |
- case IDC_PIN_TO_START_SCREEN: |
- if (!uma_action_recorded_) { |
- UMA_HISTOGRAM_MEDIUM_TIMES("WrenchMenu.TimeToAction.PinToStartScreen", |
- delta); |
- } |
- LogMenuAction(MENU_ACTION_PIN_TO_START_SCREEN); |
- break; |
- |
- // Recent tabs menu. |
- case IDC_RESTORE_TAB: |
- if (!uma_action_recorded_) |
- UMA_HISTOGRAM_MEDIUM_TIMES("WrenchMenu.TimeToAction.RestoreTab", delta); |
- LogMenuAction(MENU_ACTION_RESTORE_TAB); |
- break; |
- |
- // Windows. |
- case IDC_WIN_DESKTOP_RESTART: |
- if (!uma_action_recorded_) { |
- UMA_HISTOGRAM_MEDIUM_TIMES("WrenchMenu.TimeToAction.WinDesktopRestart", |
- delta); |
- } |
- LogMenuAction(MENU_ACTION_WIN_DESKTOP_RESTART); |
- break; |
- case IDC_WIN8_METRO_RESTART: |
- if (!uma_action_recorded_) { |
- UMA_HISTOGRAM_MEDIUM_TIMES("WrenchMenu.TimeToAction.Win8MetroRestart", |
- delta); |
- } |
- LogMenuAction(MENU_ACTION_WIN8_METRO_RESTART); |
- break; |
- |
- case IDC_WIN_CHROMEOS_RESTART: |
- if (!uma_action_recorded_) { |
- UMA_HISTOGRAM_MEDIUM_TIMES("WrenchMenu.TimeToAction.ChromeOSRestart", |
- delta); |
- } |
- LogMenuAction(MENU_ACTION_WIN_CHROMEOS_RESTART); |
- break; |
- case IDC_DISTILL_PAGE: |
- if (!uma_action_recorded_) { |
- UMA_HISTOGRAM_MEDIUM_TIMES("WrenchMenu.TimeToAction.DistillPage", |
- delta); |
- } |
- LogMenuAction(MENU_ACTION_DISTILL_PAGE); |
- break; |
- case IDC_SAVE_PAGE: |
- if (!uma_action_recorded_) |
- UMA_HISTOGRAM_MEDIUM_TIMES("WrenchMenu.TimeToAction.SavePage", delta); |
- LogMenuAction(MENU_ACTION_SAVE_PAGE); |
- break; |
- case IDC_FIND: |
- if (!uma_action_recorded_) |
- UMA_HISTOGRAM_MEDIUM_TIMES("WrenchMenu.TimeToAction.Find", delta); |
- LogMenuAction(MENU_ACTION_FIND); |
- break; |
- case IDC_PRINT: |
- if (!uma_action_recorded_) |
- UMA_HISTOGRAM_MEDIUM_TIMES("WrenchMenu.TimeToAction.Print", delta); |
- LogMenuAction(MENU_ACTION_PRINT); |
- break; |
- |
- // Edit menu. |
- case IDC_CUT: |
- if (!uma_action_recorded_) |
- UMA_HISTOGRAM_MEDIUM_TIMES("WrenchMenu.TimeToAction.Cut", delta); |
- LogMenuAction(MENU_ACTION_CUT); |
- break; |
- case IDC_COPY: |
- if (!uma_action_recorded_) |
- UMA_HISTOGRAM_MEDIUM_TIMES("WrenchMenu.TimeToAction.Copy", delta); |
- LogMenuAction(MENU_ACTION_COPY); |
- break; |
- case IDC_PASTE: |
- if (!uma_action_recorded_) |
- UMA_HISTOGRAM_MEDIUM_TIMES("WrenchMenu.TimeToAction.Paste", delta); |
- LogMenuAction(MENU_ACTION_PASTE); |
- break; |
- |
- // Tools menu. |
- case IDC_CREATE_HOSTED_APP: |
- if (!uma_action_recorded_) { |
- UMA_HISTOGRAM_MEDIUM_TIMES("WrenchMenu.TimeToAction.CreateHostedApp", |
- delta); |
- } |
- LogMenuAction(MENU_ACTION_CREATE_HOSTED_APP); |
- break; |
- case IDC_CREATE_SHORTCUTS: |
- if (!uma_action_recorded_) |
- UMA_HISTOGRAM_MEDIUM_TIMES("WrenchMenu.TimeToAction.CreateShortcuts", |
- delta); |
- LogMenuAction(MENU_ACTION_CREATE_SHORTCUTS); |
- break; |
- case IDC_MANAGE_EXTENSIONS: |
- if (!uma_action_recorded_) { |
- UMA_HISTOGRAM_MEDIUM_TIMES("WrenchMenu.TimeToAction.ManageExtensions", |
- delta); |
- } |
- LogMenuAction(MENU_ACTION_MANAGE_EXTENSIONS); |
- break; |
- case IDC_TASK_MANAGER: |
- if (!uma_action_recorded_) { |
- UMA_HISTOGRAM_MEDIUM_TIMES("WrenchMenu.TimeToAction.TaskManager", |
- delta); |
- } |
- LogMenuAction(MENU_ACTION_TASK_MANAGER); |
- break; |
- case IDC_CLEAR_BROWSING_DATA: |
- if (!uma_action_recorded_) { |
- UMA_HISTOGRAM_MEDIUM_TIMES("WrenchMenu.TimeToAction.ClearBrowsingData", |
- delta); |
- } |
- LogMenuAction(MENU_ACTION_CLEAR_BROWSING_DATA); |
- break; |
- case IDC_VIEW_SOURCE: |
- if (!uma_action_recorded_) |
- UMA_HISTOGRAM_MEDIUM_TIMES("WrenchMenu.TimeToAction.ViewSource", delta); |
- LogMenuAction(MENU_ACTION_VIEW_SOURCE); |
- break; |
- case IDC_DEV_TOOLS: |
- if (!uma_action_recorded_) |
- UMA_HISTOGRAM_MEDIUM_TIMES("WrenchMenu.TimeToAction.DevTools", delta); |
- LogMenuAction(MENU_ACTION_DEV_TOOLS); |
- break; |
- case IDC_DEV_TOOLS_CONSOLE: |
- if (!uma_action_recorded_) { |
- UMA_HISTOGRAM_MEDIUM_TIMES("WrenchMenu.TimeToAction.DevToolsConsole", |
- delta); |
- } |
- LogMenuAction(MENU_ACTION_DEV_TOOLS_CONSOLE); |
- break; |
- case IDC_DEV_TOOLS_DEVICES: |
- if (!uma_action_recorded_) { |
- UMA_HISTOGRAM_MEDIUM_TIMES("WrenchMenu.TimeToAction.DevToolsDevices", |
- delta); |
- } |
- LogMenuAction(MENU_ACTION_DEV_TOOLS_DEVICES); |
- break; |
- case IDC_PROFILING_ENABLED: |
- if (!uma_action_recorded_) { |
- UMA_HISTOGRAM_MEDIUM_TIMES("WrenchMenu.TimeToAction.ProfilingEnabled", |
- delta); |
- } |
- LogMenuAction(MENU_ACTION_PROFILING_ENABLED); |
- break; |
- |
- // Zoom menu |
- case IDC_ZOOM_MINUS: |
- if (!uma_action_recorded_) { |
- UMA_HISTOGRAM_MEDIUM_TIMES("WrenchMenu.TimeToAction.ZoomMinus", delta); |
- LogMenuAction(MENU_ACTION_ZOOM_MINUS); |
- } |
- break; |
- case IDC_ZOOM_PLUS: |
- if (!uma_action_recorded_) { |
- UMA_HISTOGRAM_MEDIUM_TIMES("WrenchMenu.TimeToAction.ZoomPlus", delta); |
- LogMenuAction(MENU_ACTION_ZOOM_PLUS); |
- } |
- break; |
- case IDC_FULLSCREEN: |
- content::RecordAction(UserMetricsAction("EnterFullScreenWithWrenchMenu")); |
- |
- if (!uma_action_recorded_) { |
- UMA_HISTOGRAM_MEDIUM_TIMES("WrenchMenu.TimeToAction.EnterFullScreen", |
- delta); |
- } |
- LogMenuAction(MENU_ACTION_FULLSCREEN); |
- break; |
- |
- case IDC_SHOW_HISTORY: |
- if (!uma_action_recorded_) { |
- UMA_HISTOGRAM_MEDIUM_TIMES("WrenchMenu.TimeToAction.ShowHistory", |
- delta); |
- } |
- LogMenuAction(MENU_ACTION_SHOW_HISTORY); |
- break; |
- case IDC_SHOW_DOWNLOADS: |
- if (!uma_action_recorded_) { |
- UMA_HISTOGRAM_MEDIUM_TIMES("WrenchMenu.TimeToAction.ShowDownloads", |
- delta); |
- } |
- LogMenuAction(MENU_ACTION_SHOW_DOWNLOADS); |
- break; |
- case IDC_SHOW_SYNC_SETUP: |
- if (!uma_action_recorded_) { |
- UMA_HISTOGRAM_MEDIUM_TIMES("WrenchMenu.TimeToAction.ShowSyncSetup", |
- delta); |
- } |
- LogMenuAction(MENU_ACTION_SHOW_SYNC_SETUP); |
- break; |
- case IDC_OPTIONS: |
- if (!uma_action_recorded_) |
- UMA_HISTOGRAM_MEDIUM_TIMES("WrenchMenu.TimeToAction.Settings", delta); |
- LogMenuAction(MENU_ACTION_OPTIONS); |
- break; |
- case IDC_ABOUT: |
- if (!uma_action_recorded_) |
- UMA_HISTOGRAM_MEDIUM_TIMES("WrenchMenu.TimeToAction.About", delta); |
- LogMenuAction(MENU_ACTION_ABOUT); |
- break; |
- |
- // Help menu. |
- case IDC_HELP_PAGE_VIA_MENU: |
- content::RecordAction(UserMetricsAction("ShowHelpTabViaWrenchMenu")); |
- |
- if (!uma_action_recorded_) |
- UMA_HISTOGRAM_MEDIUM_TIMES("WrenchMenu.TimeToAction.HelpPage", delta); |
- LogMenuAction(MENU_ACTION_HELP_PAGE_VIA_MENU); |
- break; |
- #if defined(GOOGLE_CHROME_BUILD) |
- case IDC_FEEDBACK: |
- if (!uma_action_recorded_) |
- UMA_HISTOGRAM_MEDIUM_TIMES("WrenchMenu.TimeToAction.Feedback", delta); |
- LogMenuAction(MENU_ACTION_FEEDBACK); |
- break; |
- #endif |
- |
- case IDC_TOGGLE_REQUEST_TABLET_SITE: |
- if (!uma_action_recorded_) { |
- UMA_HISTOGRAM_MEDIUM_TIMES("WrenchMenu.TimeToAction.RequestTabletSite", |
- delta); |
- } |
- LogMenuAction(MENU_ACTION_TOGGLE_REQUEST_TABLET_SITE); |
- break; |
- case IDC_EXIT: |
- if (!uma_action_recorded_) |
- UMA_HISTOGRAM_MEDIUM_TIMES("WrenchMenu.TimeToAction.Exit", delta); |
- LogMenuAction(MENU_ACTION_EXIT); |
- break; |
- } |
- |
- if (!uma_action_recorded_) { |
- UMA_HISTOGRAM_MEDIUM_TIMES("WrenchMenu.TimeToAction", delta); |
- uma_action_recorded_ = true; |
- } |
-} |
- |
-void WrenchMenuModel::LogMenuAction(int action_id) { |
- UMA_HISTOGRAM_ENUMERATION("WrenchMenu.MenuAction", action_id, |
- LIMIT_MENU_ACTION); |
-} |
- |
-bool WrenchMenuModel::IsCommandIdChecked(int command_id) const { |
- if (command_id == IDC_SHOW_BOOKMARK_BAR) { |
- return browser_->profile()->GetPrefs()->GetBoolean( |
- bookmarks::prefs::kShowBookmarkBar); |
- } else if (command_id == IDC_PROFILING_ENABLED) { |
- return Profiling::BeingProfiled(); |
- } else if (command_id == IDC_TOGGLE_REQUEST_TABLET_SITE) { |
- return chrome::IsRequestingTabletSite(browser_); |
- } |
- |
- return false; |
-} |
- |
-bool WrenchMenuModel::IsCommandIdEnabled(int command_id) const { |
- GlobalError* error = GlobalErrorServiceFactory::GetForProfile( |
- browser_->profile())->GetGlobalErrorByMenuItemCommandID(command_id); |
- if (error) |
- return true; |
- |
- return chrome::IsCommandEnabled(browser_, command_id); |
-} |
- |
-bool WrenchMenuModel::IsCommandIdVisible(int command_id) const { |
- switch (command_id) { |
-#if defined(OS_MACOSX) |
- case kEmptyMenuItemCommand: |
- return false; // Always hidden (see CreateActionToolbarOverflowMenu). |
-#endif |
-#if defined(OS_WIN) |
- case IDC_VIEW_INCOMPATIBILITIES: { |
- EnumerateModulesModel* loaded_modules = |
- EnumerateModulesModel::GetInstance(); |
- if (loaded_modules->confirmed_bad_modules_detected() <= 0) |
- return false; |
- // We'll leave the wrench adornment on until the user clicks the link. |
- if (loaded_modules->modules_to_notify_about() <= 0) |
- loaded_modules->AcknowledgeConflictNotification(); |
- return true; |
- } |
- case IDC_PIN_TO_START_SCREEN: |
- return base::win::IsMetroProcess(); |
-#else |
- case IDC_VIEW_INCOMPATIBILITIES: |
- case IDC_PIN_TO_START_SCREEN: |
- return false; |
-#endif |
- case IDC_UPGRADE_DIALOG: |
- return browser_defaults::kShowUpgradeMenuItem && |
- UpgradeDetector::GetInstance()->notify_upgrade(); |
-#if !defined(OS_LINUX) || defined(USE_AURA) |
- case IDC_BOOKMARK_PAGE: |
- return !chrome::ShouldRemoveBookmarkThisPageUI(browser_->profile()); |
- case IDC_BOOKMARK_ALL_TABS: |
- return !chrome::ShouldRemoveBookmarkOpenPagesUI(browser_->profile()); |
-#endif |
- default: |
- return true; |
- } |
-} |
- |
-bool WrenchMenuModel::GetAcceleratorForCommandId( |
- int command_id, |
- ui::Accelerator* accelerator) { |
- return provider_->GetAcceleratorForCommandId(command_id, accelerator); |
-} |
- |
-void WrenchMenuModel::ActiveTabChanged(WebContents* old_contents, |
- WebContents* new_contents, |
- int index, |
- int reason) { |
- // The user has switched between tabs and the new tab may have a different |
- // zoom setting. |
- UpdateZoomControls(); |
-} |
- |
-void WrenchMenuModel::TabReplacedAt(TabStripModel* tab_strip_model, |
- WebContents* old_contents, |
- WebContents* new_contents, |
- int index) { |
- UpdateZoomControls(); |
-} |
- |
-void WrenchMenuModel::Observe(int type, |
- const content::NotificationSource& source, |
- const content::NotificationDetails& details) { |
- DCHECK(type == content::NOTIFICATION_NAV_ENTRY_COMMITTED); |
- UpdateZoomControls(); |
-} |
- |
-// For testing. |
-WrenchMenuModel::WrenchMenuModel() |
- : ui::SimpleMenuModel(this), |
- uma_action_recorded_(false), |
- provider_(nullptr), |
- browser_(nullptr) {} |
- |
-bool WrenchMenuModel::ShouldShowNewIncognitoWindowMenuItem() { |
- if (browser_->profile()->IsGuestSession()) |
- return false; |
- |
- return IncognitoModePrefs::GetAvailability(browser_->profile()->GetPrefs()) != |
- IncognitoModePrefs::DISABLED; |
-} |
- |
-// Note: When adding new menu items please place under an appropriate section. |
-// Menu is organised as follows: |
-// - Extension toolbar overflow. |
-// - Global browser errors and warnings. |
-// - Tabs and windows. |
-// - Places previously been e.g. History, bookmarks, recent tabs. |
-// - Page actions e.g. zoom, edit, find, print. |
-// - Learn about the browser and global customisation e.g. settings, help. |
-// - Browser relaunch, quit. |
-void WrenchMenuModel::Build() { |
- if (extensions::FeatureSwitch::extension_action_redesign()->IsEnabled()) |
- CreateActionToolbarOverflowMenu(); |
- |
- AddItem(IDC_VIEW_INCOMPATIBILITIES, |
- l10n_util::GetStringUTF16(IDS_VIEW_INCOMPATIBILITIES)); |
- SetIcon(GetIndexOfCommandId(IDC_VIEW_INCOMPATIBILITIES), |
- ui::ResourceBundle::GetSharedInstance(). |
- GetNativeImageNamed(IDR_INPUT_ALERT_MENU)); |
- if (IsCommandIdVisible(IDC_UPGRADE_DIALOG)) |
- AddItem(IDC_UPGRADE_DIALOG, GetUpgradeDialogMenuItemName()); |
- if (AddGlobalErrorMenuItems() || |
- IsCommandIdVisible(IDC_VIEW_INCOMPATIBILITIES) || |
- IsCommandIdVisible(IDC_UPGRADE_DIALOG)) |
- AddSeparator(ui::NORMAL_SEPARATOR); |
- |
- AddItemWithStringId(IDC_NEW_TAB, IDS_NEW_TAB); |
- AddItemWithStringId(IDC_NEW_WINDOW, IDS_NEW_WINDOW); |
- if (ShouldShowNewIncognitoWindowMenuItem()) |
- AddItemWithStringId(IDC_NEW_INCOGNITO_WINDOW, IDS_NEW_INCOGNITO_WINDOW); |
- AddSeparator(ui::NORMAL_SEPARATOR); |
- |
- if (!browser_->profile()->IsOffTheRecord()) { |
- recent_tabs_sub_menu_model_.reset(new RecentTabsSubMenuModel(provider_, |
- browser_, |
- NULL)); |
- AddSubMenuWithStringId(IDC_RECENT_TABS_MENU, IDS_HISTORY_MENU, |
- recent_tabs_sub_menu_model_.get()); |
- } |
- AddItemWithStringId(IDC_SHOW_DOWNLOADS, IDS_SHOW_DOWNLOADS); |
- if (!browser_->profile()->IsGuestSession()) { |
- bookmark_sub_menu_model_.reset(new BookmarkSubMenuModel(this, browser_)); |
- AddSubMenuWithStringId(IDC_BOOKMARKS_MENU, IDS_BOOKMARKS_MENU, |
- bookmark_sub_menu_model_.get()); |
- } |
- |
- CreateZoomMenu(); |
- AddItemWithStringId(IDC_PRINT, IDS_PRINT); |
- if (switches::MediaRouterEnabled() && !browser()->profile()->IsOffTheRecord()) |
- AddItemWithStringId(IDC_ROUTE_MEDIA, IDS_MEDIA_ROUTER_MENU_ITEM_TITLE); |
- AddItemWithStringId(IDC_FIND, IDS_FIND); |
- if (base::CommandLine::ForCurrentProcess()->HasSwitch( |
- switches::kEnableDomDistiller)) |
- AddItemWithStringId(IDC_DISTILL_PAGE, IDS_DISTILL_PAGE); |
- tools_menu_model_.reset(new ToolsMenuModel(this, browser_)); |
- AddSubMenuWithStringId( |
- IDC_MORE_TOOLS_MENU, IDS_MORE_TOOLS_MENU, tools_menu_model_.get()); |
- // Append the full menu including separators. The final separator only gets |
- // appended when this is a touch menu - otherwise it would get added twice. |
- CreateCutCopyPasteMenu(); |
- |
- AddItemWithStringId(IDC_OPTIONS, IDS_SETTINGS); |
-// The help submenu is only displayed on official Chrome builds. As the |
-// 'About' item has been moved to this submenu, it's reinstated here for |
-// Chromium builds. |
-#if defined(GOOGLE_CHROME_BUILD) |
- help_menu_model_.reset(new HelpMenuModel(this, browser_)); |
- AddSubMenuWithStringId(IDC_HELP_MENU, IDS_HELP_MENU, |
- help_menu_model_.get()); |
-#else |
- AddItem(IDC_ABOUT, l10n_util::GetStringUTF16(IDS_ABOUT)); |
-#endif |
-#if defined(OS_CHROMEOS) |
- if (base::CommandLine::ForCurrentProcess()->HasSwitch( |
- chromeos::switches::kEnableRequestTabletSite)) |
- AddCheckItemWithStringId(IDC_TOGGLE_REQUEST_TABLET_SITE, |
- IDS_TOGGLE_REQUEST_TABLET_SITE); |
-#endif |
- |
-#if defined(OS_WIN) |
- int command_id = IDC_WIN_DESKTOP_RESTART; |
- int string_id = IDS_WIN_DESKTOP_RESTART; |
- if (GetRestartMenuItemIfRequired(browser_->host_desktop_type(), |
- &command_id, |
- &string_id)) { |
- AddSeparator(ui::NORMAL_SEPARATOR); |
- AddItemWithStringId(command_id, string_id); |
- } |
-#endif |
- bool show_exit_menu = browser_defaults::kShowExitMenuItem; |
-#if defined(OS_WIN) |
- if (browser_->host_desktop_type() == chrome::HOST_DESKTOP_TYPE_ASH) |
- show_exit_menu = false; |
-#endif |
- if (show_exit_menu) { |
- AddSeparator(ui::NORMAL_SEPARATOR); |
- AddItemWithStringId(IDC_EXIT, IDS_EXIT); |
- } |
- uma_action_recorded_ = false; |
-} |
- |
-bool WrenchMenuModel::AddGlobalErrorMenuItems() { |
- // TODO(sail): Currently we only build the wrench menu once per browser |
- // window. This means that if a new error is added after the menu is built |
- // it won't show in the existing wrench menu. To fix this we need to some |
- // how update the menu if new errors are added. |
- const GlobalErrorService::GlobalErrorList& errors = |
- GlobalErrorServiceFactory::GetForProfile(browser_->profile())->errors(); |
- bool menu_items_added = false; |
- for (GlobalErrorService::GlobalErrorList::const_iterator |
- it = errors.begin(); it != errors.end(); ++it) { |
- GlobalError* error = *it; |
- DCHECK(error); |
- if (error->HasMenuItem()) { |
- AddItem(error->MenuItemCommandID(), error->MenuItemLabel()); |
- SetIcon(GetIndexOfCommandId(error->MenuItemCommandID()), |
- error->MenuItemIcon()); |
- menu_items_added = true; |
- } |
- } |
- return menu_items_added; |
-} |
- |
-void WrenchMenuModel::CreateActionToolbarOverflowMenu() { |
- // We only add the extensions overflow container if there are any icons that |
- // aren't shown in the main container. |
- // browser_->window() can return null during startup. |
- if (browser_->window() && |
- browser_->window()->GetToolbarActionsBar()->NeedsOverflow()) { |
-#if defined(OS_MACOSX) |
- // There's a bug in AppKit menus, where if a menu item with a custom view |
- // (like the extensions overflow menu) is the first menu item, it is not |
- // highlightable or keyboard-selectable. |
- // Adding any menu item before it (even one which is never visible) prevents |
- // it, so add a bogus item here that will always be hidden. |
- AddItem(kEmptyMenuItemCommand, base::string16()); |
-#endif |
- AddItem(IDC_EXTENSIONS_OVERFLOW_MENU, base::string16()); |
- AddSeparator(ui::UPPER_SEPARATOR); |
- } |
-} |
- |
-void WrenchMenuModel::CreateCutCopyPasteMenu() { |
- AddSeparator(ui::LOWER_SEPARATOR); |
- |
- // WARNING: Mac does not use the ButtonMenuItemModel, but instead defines the |
- // layout for this menu item in WrenchMenu.xib. It does, however, use the |
- // command_id value from AddButtonItem() to identify this special item. |
- edit_menu_item_model_.reset(new ui::ButtonMenuItemModel(IDS_EDIT, this)); |
- edit_menu_item_model_->AddGroupItemWithStringId(IDC_CUT, IDS_CUT); |
- edit_menu_item_model_->AddGroupItemWithStringId(IDC_COPY, IDS_COPY); |
- edit_menu_item_model_->AddGroupItemWithStringId(IDC_PASTE, IDS_PASTE); |
- AddButtonItem(IDC_EDIT_MENU, edit_menu_item_model_.get()); |
- |
- AddSeparator(ui::UPPER_SEPARATOR); |
-} |
- |
-void WrenchMenuModel::CreateZoomMenu() { |
- // This menu needs to be enclosed by separators. |
- AddSeparator(ui::LOWER_SEPARATOR); |
- |
- // WARNING: Mac does not use the ButtonMenuItemModel, but instead defines the |
- // layout for this menu item in WrenchMenu.xib. It does, however, use the |
- // command_id value from AddButtonItem() to identify this special item. |
- zoom_menu_item_model_.reset( |
- new ui::ButtonMenuItemModel(IDS_ZOOM_MENU, this)); |
- zoom_menu_item_model_->AddGroupItemWithStringId(IDC_ZOOM_MINUS, |
- IDS_ZOOM_MINUS2); |
- zoom_menu_item_model_->AddGroupItemWithStringId(IDC_ZOOM_PLUS, |
- IDS_ZOOM_PLUS2); |
- zoom_menu_item_model_->AddItemWithImage(IDC_FULLSCREEN, |
- IDR_FULLSCREEN_MENU_BUTTON); |
- AddButtonItem(IDC_ZOOM_MENU, zoom_menu_item_model_.get()); |
- |
- AddSeparator(ui::UPPER_SEPARATOR); |
-} |
- |
-void WrenchMenuModel::UpdateZoomControls() { |
- int zoom_percent = 100; |
- if (browser_->tab_strip_model() && |
- browser_->tab_strip_model()->GetActiveWebContents()) { |
- zoom_percent = ui_zoom::ZoomController::FromWebContents( |
- browser_->tab_strip_model()->GetActiveWebContents()) |
- ->GetZoomPercent(); |
- } |
- zoom_label_ = l10n_util::GetStringFUTF16( |
- IDS_ZOOM_PERCENT, base::IntToString16(zoom_percent)); |
-} |
- |
-void WrenchMenuModel::OnZoomLevelChanged( |
- const content::HostZoomMap::ZoomLevelChange& change) { |
- UpdateZoomControls(); |
-} |