#include "chrome/browser/ui/browser_command_controller.h"
#include <stddef.h>
#include <string>
#include "base/command_line.h"
#include "base/containers/contains.h"
#include "base/debug/debugging_buildflags.h"
#include "base/debug/profiler.h"
#include "base/feature_list.h"
#include "base/functional/bind.h"
#include "base/metrics/histogram_functions.h"
#include "base/metrics/user_metrics.h"
#include "base/time/time.h"
#include "build/branding_buildflags.h"
#include "build/build_config.h"
#include "build/chromeos_buildflags.h"
#include "chrome/app/chrome_command_ids.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/defaults.h"
#include "chrome/browser/devtools/devtools_window.h"
#include "chrome/browser/extensions/extension_service.h"
#include "chrome/browser/lifetime/application_lifetime.h"
#include "chrome/browser/prefs/incognito_mode_prefs.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/profiles/profile_window.h"
#include "chrome/browser/sessions/tab_restore_service_factory.h"
#include "chrome/browser/sharing_hub/sharing_hub_features.h"
#include "chrome/browser/shell_integration.h"
#include "chrome/browser/signin/identity_manager_factory.h"
#include "chrome/browser/signin/signin_promo.h"
#include "chrome/browser/signin/signin_ui_util.h"
#include "chrome/browser/ui/apps/app_info_dialog.h"
#include "chrome/browser/ui/bookmarks/bookmark_tab_helper.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/browser_actions.h"
#include "chrome/browser/ui/browser_commands.h"
#include "chrome/browser/ui/browser_dialogs.h"
#include "chrome/browser/ui/browser_finder.h"
#include "chrome/browser/ui/browser_list.h"
#include "chrome/browser/ui/browser_navigator.h"
#include "chrome/browser/ui/browser_window.h"
#include "chrome/browser/ui/browser_window/public/browser_window_features.h"
#include "chrome/browser/ui/chrome_pages.h"
#include "chrome/browser/ui/customize_chrome/side_panel_controller.h"
#include "chrome/browser/ui/lens/lens_overlay_controller.h"
#include "chrome/browser/ui/managed_ui.h"
#include "chrome/browser/ui/page_info/page_info_dialog.h"
#include "chrome/browser/ui/passwords/ui_utils.h"
#include "chrome/browser/ui/profiles/profile_picker.h"
#include "chrome/browser/ui/profiles/profile_view_utils.h"
#include "chrome/browser/ui/singleton_tabs.h"
#include "chrome/browser/ui/startup/default_browser_prompt/default_browser_prompt_manager.h"
#include "chrome/browser/ui/startup/default_browser_prompt/default_browser_prompt_prefs.h"
#include "chrome/browser/ui/tabs/public/tab_features.h"
#include "chrome/browser/ui/tabs/tab_model.h"
#include "chrome/browser/ui/tabs/tab_strip_model.h"
#include "chrome/browser/ui/tabs/tab_strip_user_gesture_details.h"
#include "chrome/browser/ui/toolbar/chrome_labs/chrome_labs_utils.h"
#include "chrome/browser/ui/ui_features.h"
#include "chrome/browser/ui/views/side_panel/companion/companion_utils.h"
#include "chrome/browser/ui/views/side_panel/side_panel_entry_id.h"
#include "chrome/browser/ui/views/side_panel/side_panel_enums.h"
#include "chrome/browser/ui/views/side_panel/side_panel_ui.h"
#include "chrome/browser/ui/web_applications/app_browser_controller.h"
#include "chrome/browser/ui/web_applications/web_app_dialog_utils.h"
#include "chrome/browser/ui/web_applications/web_app_launch_utils.h"
#include "chrome/browser/ui/web_applications/web_app_tabbed_utils.h"
#include "chrome/browser/ui/webui/inspect_ui.h"
#include "chrome/browser/ui/webui/side_panel/customize_chrome/customize_chrome_section.h"
#include "chrome/browser/web_applications/web_app_install_params.h"
#include "chrome/browser/web_applications/web_app_utils.h"
#include "chrome/common/chrome_features.h"
#include "chrome/common/content_restriction.h"
#include "chrome/common/pref_names.h"
#include "chrome/common/url_constants.h"
#include "chrome/common/webui_url_constants.h"
#include "components/bookmarks/common/bookmark_pref_names.h"
#include "components/dom_distiller/core/dom_distiller_features.h"
#include "components/input/native_web_keyboard_event.h"
#include "components/lens/buildflags.h"
#include "components/lens/lens_features.h"
#include "components/password_manager/core/browser/manage_passwords_referrer.h"
#include "components/policy/core/common/policy_pref_names.h"
#include "components/prefs/pref_service.h"
#include "components/sessions/content/session_tab_helper.h"
#include "components/sessions/core/tab_restore_service.h"
#include "components/signin/public/base/signin_buildflags.h"
#include "components/signin/public/base/signin_metrics.h"
#include "components/signin/public/base/signin_pref_names.h"
#include "components/signin/public/identity_manager/identity_manager.h"
#include "components/translate/core/browser/translate_manager.h"
#include "content/public/browser/navigation_controller.h"
#include "content/public/browser/navigation_entry.h"
#include "content/public/browser/render_frame_host.h"
#include "content/public/browser/web_contents.h"
#include "content/public/browser/web_contents_observer.h"
#include "content/public/common/profiling.h"
#include "content/public/common/url_constants.h"
#include "extensions/browser/extension_system.h"
#include "extensions/common/extension_urls.h"
#include "printing/buildflags/buildflags.h"
#include "ui/actions/actions.h"
#include "ui/base/ui_base_features.h"
#include "ui/base/window_open_disposition.h"
#include "ui/events/keycodes/keyboard_codes.h"
#if BUILDFLAG(IS_MAC)
#include "chrome/browser/ui/browser_commands_mac.h"
#endif
#if BUILDFLAG(IS_WIN)
#include "base/win/windows_version.h"
#include "content/public/browser/gpu_data_manager.h"
#endif
#if BUILDFLAG(IS_CHROMEOS_ASH)
#include "chrome/browser/ash/crosapi/browser_data_migrator.h"
#include "chrome/browser/platform_util.h"
#include "chrome/browser/ui/ash/browser_data_migration/browser_data_migration_error_dialog.h"
#include "chrome/browser/ui/ash/multi_user/multi_user_context_menu.h"
#include "chrome/browser/ui/browser_commands_chromeos.h"
#include "chromeos/ash/components/standalone_browser/migrator_util.h"
#include "components/session_manager/core/session_manager.h"
#include "components/user_manager/user_manager.h"
#endif
#if BUILDFLAG(IS_LINUX)
#include "ui/base/ime/text_input_flags.h"
#include "ui/linux/linux_ui.h"
#endif
#if BUILDFLAG(IS_OZONE)
#include "ui/ozone/public/ozone_platform.h"
#endif
#if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN)
#include "chrome/browser/ui/shortcuts/desktop_shortcuts_utils.h"
#endif
WebExposedIsolationLevel;
namespace chrome {
namespace {
void AppInfoDialogClosedCallback(SessionID session_id,
views::Widget::ClosedReason closed_reason,
bool reload_prompt) { … }
bool CanOpenFile(Browser* browser) { … }
void InvokeAction(actions::ActionId id, actions::ActionItem* scope) { … }
}
BrowserCommandController::BrowserCommandController(Browser* browser)
: … { … }
BrowserCommandController::~BrowserCommandController() { … }
bool BrowserCommandController::IsReservedCommandOrKey(
int command_id,
const input::NativeWebKeyboardEvent& event) { … }
void BrowserCommandController::TabStateChanged() { … }
void BrowserCommandController::ZoomStateChanged() { … }
void BrowserCommandController::ContentRestrictionsChanged() { … }
void BrowserCommandController::FullscreenStateChanged() { … }
#if BUILDFLAG(IS_CHROMEOS)
void BrowserCommandController::LockedFullscreenStateChanged() {
UpdateCommandsForLockedFullscreenMode();
}
#endif
void BrowserCommandController::PrintingStateChanged() { … }
void BrowserCommandController::LoadingStateChanged(bool is_loading,
bool force) { … }
void BrowserCommandController::FindBarVisibilityChanged() { … }
void BrowserCommandController::ExtensionStateChanged() { … }
void BrowserCommandController::TabKeyboardFocusChangedTo(
std::optional<int> index) { … }
void BrowserCommandController::WebContentsFocusChanged() { … }
bool BrowserCommandController::SupportsCommand(int id) const { … }
bool BrowserCommandController::IsCommandEnabled(int id) const { … }
bool BrowserCommandController::ExecuteCommand(int id,
base::TimeTicks time_stamp) { … }
bool BrowserCommandController::ExecuteCommandWithDisposition(
int id,
WindowOpenDisposition disposition,
base::TimeTicks time_stamp) { … }
void BrowserCommandController::AddCommandObserver(int id,
CommandObserver* observer) { … }
void BrowserCommandController::RemoveCommandObserver(
int id,
CommandObserver* observer) { … }
void BrowserCommandController::RemoveCommandObserver(
CommandObserver* observer) { … }
bool BrowserCommandController::UpdateCommandEnabled(int id, bool state) { … }
void BrowserCommandController::OnTabStripModelChanged(
TabStripModel* tab_strip_model,
const TabStripModelChange& change,
const TabStripSelectionChange& selection) { … }
void BrowserCommandController::TabBlockedStateChanged(
content::WebContents* contents,
int index) { … }
void BrowserCommandController::TabRestoreServiceChanged(
sessions::TabRestoreService* service) { … }
void BrowserCommandController::TabRestoreServiceDestroyed(
sessions::TabRestoreService* service) { … }
void BrowserCommandController::TabRestoreServiceLoaded(
sessions::TabRestoreService* service) { … }
bool BrowserCommandController::IsShowingMainUI() { … }
bool BrowserCommandController::IsShowingLocationBar() { … }
void BrowserCommandController::InitCommandState() { … }
void BrowserCommandController::UpdateSharedCommandsForIncognitoAvailability(
CommandUpdater* command_updater,
Profile* profile) { … }
void BrowserCommandController::UpdateCommandsForIncognitoAvailability() { … }
void BrowserCommandController::UpdateCommandsForExtensionsMenu() { … }
void BrowserCommandController::UpdateCommandsForTabState() { … }
void BrowserCommandController::UpdateCommandsForZoomState() { … }
void BrowserCommandController::UpdateCommandsForContentRestrictionState() { … }
void BrowserCommandController::UpdateCommandsForDevTools() { … }
void BrowserCommandController::UpdateCommandsForBookmarkEditing() { … }
void BrowserCommandController::UpdateCommandsForBookmarkBar() { … }
void BrowserCommandController::UpdateCommandsForFileSelectionDialogs() { … }
void BrowserCommandController::UpdateCommandsForFullscreenMode() { … }
void BrowserCommandController::UpdateCommandsForHostedAppAvailability() { … }
#if BUILDFLAG(IS_CHROMEOS)
namespace {
#if DCHECK_IS_ON()
void NonAllowlistedCommandsAreDisabled(CommandUpdaterImpl* command_updater) {
constexpr int kAllowlistedIds[] = {IDC_CUT, IDC_COPY, IDC_PASTE};
for (int id : command_updater->GetAllIds()) {
if (base::Contains(kAllowlistedIds, id)) {
continue;
}
DCHECK(!command_updater->IsCommandEnabled(id));
}
}
#endif
}
void BrowserCommandController::UpdateCommandsForLockedFullscreenMode() {
bool is_locked_fullscreen =
platform_util::IsBrowserLockedFullscreen(browser_);
DCHECK_NE(is_locked_fullscreen, is_locked_fullscreen_);
if (is_locked_fullscreen == is_locked_fullscreen_)
return;
is_locked_fullscreen_ = is_locked_fullscreen;
if (is_locked_fullscreen_) {
command_updater_.DisableAllCommands();
UpdateCommandsForContentRestrictionState();
#if DCHECK_IS_ON()
NonAllowlistedCommandsAreDisabled(&command_updater_);
#endif
} else {
InitCommandState();
}
}
#endif
void BrowserCommandController::UpdatePrintingState() { … }
void BrowserCommandController::UpdateSaveAsState() { … }
void BrowserCommandController::UpdateReloadStopState(bool is_loading,
bool force) { … }
void BrowserCommandController::UpdateTabRestoreCommandState() { … }
void BrowserCommandController::UpdateCommandsForFind() { … }
void BrowserCommandController::UpdateCloseFindOrStop() { … }
void BrowserCommandController::UpdateCommandsForMediaRouter() { … }
void BrowserCommandController::UpdateCommandsForTabKeyboardFocus(
std::optional<int> target_index) { … }
void BrowserCommandController::UpdateCommandsForWebContentsFocus() { … }
void BrowserCommandController::UpdateCommandsForTabStripStateChanged() { … }
actions::ActionItem* BrowserCommandController::FindAction(
actions::ActionId action_id) { … }
void BrowserCommandController::UpdateCommandAndActionEnabled(
int command_id,
actions::ActionId action_id,
bool enabled) { … }
BrowserWindow* BrowserCommandController::window() { … }
Profile* BrowserCommandController::profile() { … }
void BrowserCommandController::ShowCustomizeChromeSidePanel(
std::optional<CustomizeChromeSection> section) { … }
}