diff --git a/CefSharp.Core.Runtime.RefAssembly/CefSharp.Core.Runtime.netcore.cs b/CefSharp.Core.Runtime.RefAssembly/CefSharp.Core.Runtime.netcore.cs index e4bb6a3f6..19aaf6146 100644 --- a/CefSharp.Core.Runtime.RefAssembly/CefSharp.Core.Runtime.netcore.cs +++ b/CefSharp.Core.Runtime.RefAssembly/CefSharp.Core.Runtime.netcore.cs @@ -1,4 +1,4 @@ -//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ // // This code was generated by a tool. // GenAPI Version: 5.0.2.37403 @@ -85,6 +85,7 @@ public static void EnableWaitForBrowsersToClose() { } public static bool Initialize(CefSharp.Core.CefSettingsBase cefSettings, bool performDependencyCheck, CefSharp.IApp cefApp) { throw null; } public static bool Initialize(CefSharp.Core.CefSettingsBase cefSettings, bool performDependencyCheck, CefSharp.IBrowserProcessHandler browserProcessHandler) { throw null; } public static bool IsWindows10OrGreaterEx() { throw null; } + public static int GetCefIdForCommandIdName(string name) { throw null; } public static CefSharp.UrlParts ParseUrl(string url) { throw null; } public static bool PostAction(CefSharp.CefThreadIds threadId, System.Action action) { throw null; } public static bool PostDelayedAction(CefSharp.CefThreadIds threadId, System.Action action, int delayInMs) { throw null; } diff --git a/CefSharp.Core.Runtime/Cef.h b/CefSharp.Core.Runtime/Cef.h index c0a087ae8..e9a9c2ef0 100644 --- a/CefSharp.Core.Runtime/Cef.h +++ b/CefSharp.Core.Runtime/Cef.h @@ -12,12 +12,14 @@ #include "versionhelpers.h"; #include #include +#include #include #include #include #include #include #include +#include #include "Internals/CefSharpApp.h" #include "Internals/CefTaskScheduler.h" @@ -973,6 +975,18 @@ namespace CefSharp { return IsWindows10OrGreater(); } + + static int GetCefIdForCommandIdName(String^ name) + { + if (String::IsNullOrEmpty(name)) + { + return -1; + } + + std::string nativeString = marshal_as(name); + + return cef_id_for_command_id_name(nativeString.c_str()); + } }; } } diff --git a/CefSharp.Core.Runtime/CefIdMappers.cpp b/CefSharp.Core.Runtime/CefIdMappers.cpp new file mode 100644 index 000000000..b65e70cfa --- /dev/null +++ b/CefSharp.Core.Runtime/CefIdMappers.cpp @@ -0,0 +1,29 @@ +// Copyright © 2026 The CefSharp 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 "Stdafx.h" + +#include "CefIdMappers.h" +#include "include\cef_id_mappers.h" +#include + +using namespace msclr::interop; + +namespace CefSharp +{ + namespace Core + { + int CefIdMappers::CefIdForCommandIdName(String^ name) + { + if (String::IsNullOrEmpty(name)) + { + return -1; + } + + std::string nativeString = marshal_as(name); + + return cef_id_for_command_id_name(nativeString.c_str()); + } + }; +} diff --git a/CefSharp.Core.Runtime/CefIdMappers.h b/CefSharp.Core.Runtime/CefIdMappers.h new file mode 100644 index 000000000..e3522e238 --- /dev/null +++ b/CefSharp.Core.Runtime/CefIdMappers.h @@ -0,0 +1,21 @@ +// Copyright © 2026 The CefSharp Authors. All rights reserved. +// +// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file. + +#pragma once + +#include "Stdafx.h" + +namespace CefSharp +{ + namespace Core + { + /// + [System::ComponentModel::EditorBrowsableAttribute(System::ComponentModel::EditorBrowsableState::Never)] + public ref class CefIdMappers sealed + { + public: + static int CefIdForCommandIdName(String^ name); + }; + } +} diff --git a/CefSharp.Core.Runtime/Internals/CefBrowserHostWrapper.cpp b/CefSharp.Core.Runtime/Internals/CefBrowserHostWrapper.cpp index 5b8da2a87..a077ccfa7 100644 --- a/CefSharp.Core.Runtime/Internals/CefBrowserHostWrapper.cpp +++ b/CefSharp.Core.Runtime/Internals/CefBrowserHostWrapper.cpp @@ -639,6 +639,25 @@ void CefBrowserHostWrapper::SetAudioMuted(bool mute) _browserHost->SetAudioMuted(mute); } +bool CefBrowserHostWrapper::CanExecuteChromeCommand(int commandId) +{ + ThrowIfDisposed(); + + if (CefCurrentlyOn(TID_UI)) + { + return _browserHost->CanExecuteChromeCommand(commandId); + } + + throw gcnew InvalidOperationException("This method can only be called directly on the CEF UI Thread. Use CanExecuteChromeCommandAsync or use Cef.UIThreadTaskFactory to marshal the call onto the CEF UI Thread."); +} + +void CefBrowserHostWrapper::ExecuteChromeCommand(int commandId, WindowOpenDisposition disposition) +{ + ThrowIfDisposed(); + + _browserHost->ExecuteChromeCommand(commandId, (cef_window_open_disposition_t)disposition); +} + IntPtr CefBrowserHostWrapper::GetOpenerWindowHandle() { ThrowIfDisposed(); diff --git a/CefSharp.Core.Runtime/Internals/CefBrowserHostWrapper.h b/CefSharp.Core.Runtime/Internals/CefBrowserHostWrapper.h index 4db8861ca..68e855041 100644 --- a/CefSharp.Core.Runtime/Internals/CefBrowserHostWrapper.h +++ b/CefSharp.Core.Runtime/Internals/CefBrowserHostWrapper.h @@ -140,6 +140,10 @@ namespace CefSharp virtual void SetAudioMuted(bool mute); + virtual bool CanExecuteChromeCommand(int commandId); + + virtual void ExecuteChromeCommand(int commandId, WindowOpenDisposition disposition); + virtual IntPtr GetOpenerWindowHandle(); virtual void SendExternalBeginFrame(); diff --git a/CefSharp.Core/Cef.cs b/CefSharp.Core/Cef.cs index e95b42b80..d6e81ad00 100644 --- a/CefSharp.Core/Cef.cs +++ b/CefSharp.Core/Cef.cs @@ -769,5 +769,21 @@ public static void AssertIsWindows10OrGreater() if (!IsWindows10OrGreater()) throw new ApplicationException("Current OS version is less than Windows 10. Applications not manifested for Windows 10 throw this exception, even if the current operating system version is Windows 10. To manifest your applications for Windows 10, see https://learn.microsoft.com/en-us/windows/win32/sysinfo/targeting-your-application-at-windows-8-1."); } + + /// + /// Returns the numeric ID value for an IDC from cef_command_ids.h or -1 + /// if is unrecognized by the current CEF/Chromium build. + /// + /// + /// This function provides version-safe mapping of command IDC names to version-specific + /// numeric ID values. Numeric ID values are likely to change across + /// CEF/Chromium versions but names generally remain the same. + /// + /// String identifier of the Chromium command. + /// version-specific numeric ID value for the command if recognized; otherwise, -1. + public static int GetCefIdForCommandIdName(string name) + { + return Core.Cef.GetCefIdForCommandIdName(name); + } } } diff --git a/CefSharp.Core/WebBrowserExtensionsEx.cs b/CefSharp.Core/WebBrowserExtensionsEx.cs index d6d770f18..f7917ded1 100644 --- a/CefSharp.Core/WebBrowserExtensionsEx.cs +++ b/CefSharp.Core/WebBrowserExtensionsEx.cs @@ -265,5 +265,54 @@ public static Task EvaluateScriptAsync(this IChromiumWebBrowserBase chromi return chromiumWebBrowser.BrowserCore.EvaluateScriptAsync(script, timeout); } + + /// + /// Asynchronously returns true if a Chrome command is supported and enabled. Only used with Chrome style. + /// + /// The instance this method extends. + /// The command id. + /// + /// that can be awaited to obtain the availability of the Chrome command. + /// + public static Task CanExecuteChromeCommandAsync(this IBrowser browser, int commandId) + { + WebBrowserExtensions.ThrowExceptionIfBrowserNull(browser); + + var host = browser.GetHost(); + WebBrowserExtensions.ThrowExceptionIfBrowserHostNull(host); + + if (Cef.CurrentlyOnThread(CefThreadIds.TID_UI)) + { + var availability = host.CanExecuteChromeCommand(commandId); + + return Task.FromResult(availability); + } + + var tcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); + + Cef.UIThreadTaskFactory.StartNew(delegate + { + var availability = host.CanExecuteChromeCommand(commandId); + + tcs.TrySetResult(availability); + }); + + return tcs.Task; + } + + /// + /// Asynchronously returns true if a Chrome command is supported and enabled. Only used with Chrome style. + /// + /// The ChromiumWebBrowser instance this method extends. + /// The command id. + /// + /// that can be awaited to obtain the availability of the Chrome command. + /// + public static Task CanExecuteChromeCommandAsync(this IChromiumWebBrowserBase browser, int commandId) + { + WebBrowserExtensions.ThrowExceptionIfChromiumWebBrowserDisposed(browser); + + return browser.BrowserCore.CanExecuteChromeCommandAsync(commandId); + } } } diff --git a/CefSharp/Enums/ChromeCommandIds.cs b/CefSharp/Enums/ChromeCommandIds.cs new file mode 100644 index 000000000..14d5b4a60 --- /dev/null +++ b/CefSharp/Enums/ChromeCommandIds.cs @@ -0,0 +1,485 @@ +// Copyright © 2015 The CefSharp Authors. All rights reserved. +// +// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file. + +namespace CefSharp +{ + public enum ChromeCommandIds : int + { + IDC_BACK = 33000, + IDC_FORWARD = 33001, + IDC_RELOAD = 33002, + IDC_HOME = 33003, + IDC_OPEN_CURRENT_URL = 33004, + IDC_STOP = 33006, + IDC_RELOAD_BYPASSING_CACHE = 33007, + IDC_RELOAD_CLEARING_CACHE = 33009, + IDC_NEW_WINDOW = 34000, + IDC_NEW_INCOGNITO_WINDOW = 34001, + IDC_CLOSE_WINDOW = 34012, + IDC_ALWAYS_ON_TOP = 34013, + IDC_NEW_TAB = 34014, + IDC_CLOSE_TAB = 34015, + IDC_SELECT_NEXT_TAB = 34016, + IDC_SELECT_PREVIOUS_TAB = 34017, + IDC_SELECT_TAB_0 = 34018, + IDC_SELECT_TAB_1 = 34019, + IDC_SELECT_TAB_2 = 34020, + IDC_SELECT_TAB_3 = 34021, + IDC_SELECT_TAB_4 = 34022, + IDC_SELECT_TAB_5 = 34023, + IDC_SELECT_TAB_6 = 34024, + IDC_SELECT_TAB_7 = 34025, + IDC_SELECT_LAST_TAB = 34026, + IDC_DUPLICATE_TAB = 34027, + IDC_RESTORE_TAB = 34028, + IDC_SHOW_AS_TAB = 34029, + IDC_FULLSCREEN = 34030, + IDC_EXIT = 34031, + IDC_MOVE_TAB_NEXT = 34032, + IDC_MOVE_TAB_PREVIOUS = 34033, + IDC_SEARCH = 34035, + IDC_WINDOW_MENU = 34045, + IDC_MINIMIZE_WINDOW = 34046, + IDC_MAXIMIZE_WINDOW = 34047, + IDC_ALL_WINDOWS_FRONT = 34048, + IDC_NAME_WINDOW = 34049, + IDC_TOGGLE_MULTITASK_MENU = 34050, + IDC_USE_SYSTEM_TITLE_BAR = 34051, + IDC_RESTORE_WINDOW = 34052, + IDC_MOVE_WINDOW = 34053, + IDC_SIZE_WINDOW = 34054, + IDC_OPEN_IN_PWA_WINDOW = 34055, + IDC_MOVE_TAB_TO_NEW_WINDOW = 34056, + IDC_NEW_SPLIT_TAB = 34057, + IDC_TOGGLE_VERTICAL_TABS = 34058, + IDC_VERTICAL_TABS_SEND_FEEDBACK = 34059, + IDC_TOGGLE_VERTICAL_TABS_EXPAND_ON_HOVER = 34060, + IDC_COPY_URL = 34061, + IDC_OPEN_IN_CHROME = 34062, + IDC_WEB_APP_SETTINGS = 34063, + IDC_WEB_APP_MENU_APP_INFO = 34064, + IDC_WEB_APP_UPGRADE_DIALOG = 34065, + IDC_VISIT_DESKTOP_OF_LRU_USER_2 = 34080, + IDC_VISIT_DESKTOP_OF_LRU_USER_3 = 34081, + IDC_VISIT_DESKTOP_OF_LRU_USER_4 = 34082, + IDC_VISIT_DESKTOP_OF_LRU_USER_5 = 34083, + IDC_VISIT_DESKTOP_OF_LRU_USER_NEXT = 34080, + IDC_VISIT_DESKTOP_OF_LRU_USER_LAST = 34083, + IDC_ADD_NEW_TAB_TO_GROUP = 34100, + IDC_CREATE_NEW_TAB_GROUP = 34101, + IDC_FOCUS_NEXT_TAB_GROUP = 34102, + IDC_FOCUS_PREV_TAB_GROUP = 34103, + IDC_CLOSE_TAB_GROUP = 34104, + IDC_GROUP_UNGROUPED_TABS = 34105, + IDC_CREATE_NEW_TAB_GROUP_TOP_LEVEL = 34106, + IDC_ADD_NEW_TAB_RECENT_GROUP = 34107, + IDC_UNFOCUS_TAB_GROUP = 34108, + IDC_BOOKMARK_THIS_TAB = 35000, + IDC_BOOKMARK_ALL_TABS = 35001, + IDC_VIEW_SOURCE = 35002, + IDC_PRINT = 35003, + IDC_SAVE_PAGE = 35004, + IDC_EMAIL_PAGE_LOCATION = 35006, + IDC_BASIC_PRINT = 35007, + IDC_SAVE_CREDIT_CARD_FOR_PAGE = 35008, + IDC_SHOW_TRANSLATE = 35009, + IDC_MANAGE_PASSWORDS_FOR_PAGE = 35010, + IDC_ROUTE_MEDIA = 35011, + IDC_WINDOW_MUTE_SITE = 35012, + IDC_WINDOW_PIN_TAB = 35013, + IDC_WINDOW_GROUP_TAB = 35014, + IDC_MIGRATE_LOCAL_CREDIT_CARD_FOR_PAGE = 35015, + IDC_SEND_TAB_TO_SELF = 35016, + IDC_FOCUS_THIS_TAB = 35017, + IDC_QRCODE_GENERATOR = 35021, + IDC_WINDOW_CLOSE_TABS_TO_RIGHT = 35022, + IDC_WINDOW_CLOSE_OTHER_TABS = 35023, + IDC_NEW_TAB_TO_RIGHT = 35024, + IDC_SAVE_AUTOFILL_ADDRESS = 35025, + IDC_OFFERS_AND_REWARDS_FOR_PAGE = 35026, + IDC_WEBAUTHN = 35027, + IDC_SHARING_HUB = 35028, + IDC_SHARING_HUB_MENU = 35029, + IDC_FILLED_CARD_INFORMATION = 35030, + IDC_SHARING_HUB_SCREENSHOT = 35031, + IDC_VIRTUAL_CARD_ENROLL = 35032, + IDC_SAVE_IBAN_FOR_PAGE = 35035, + IDC_AUTOFILL_MANDATORY_REAUTH = 35036, + IDC_PROFILE_MENU_IN_APP_MENU = 35039, + IDC_PASSWORDS_AND_AUTOFILL_MENU = 35040, + IDC_SHOW_PASSWORD_MANAGER = 35041, + IDC_SHOW_PAYMENT_METHODS = 35042, + IDC_SHOW_ADDRESSES = 35043, + IDC_ORGANIZE_TABS = 35044, + IDC_SEND_SHARED_TAB_GROUP_FEEDBACK = 35046, + IDC_SHOW_IDENTITY_DOCS = 35047, + IDC_SHOW_TRAVEL = 35048, + IDC_SHOW_CONTACT_INFO = 35049, + IDC_MUTE_TARGET_SITE = 35050, + IDC_PIN_TARGET_TAB = 35051, + IDC_GROUP_TARGET_TAB = 35052, + IDC_DUPLICATE_TARGET_TAB = 35053, + IDC_CUT = 36000, + IDC_COPY = 36001, + IDC_PASTE = 36003, + IDC_EDIT_MENU = 36004, + IDC_FIND = 37000, + IDC_FIND_NEXT = 37001, + IDC_FIND_PREVIOUS = 37002, + IDC_CLOSE_FIND_OR_STOP = 37003, + IDC_FIND_MENU = 37100, + IDC_FIND_AND_EDIT_MENU = 37200, + IDC_SAVE_AND_SHARE_MENU = 37300, + IDC_CUSTOMIZE_CHROME = 37350, + IDC_CLOSE_PROFILE = 35351, + IDC_MANAGE_GOOGLE_ACCOUNT = 35352, + IDC_SHOW_SYNC_SETTINGS = 35353, + IDC_TURN_ON_SYNC = 35354, + IDC_SHOW_SIGNIN_WHEN_PAUSED = 35355, + IDC_OPEN_GUEST_PROFILE = 35356, + IDC_ADD_NEW_PROFILE = 35357, + IDC_MANAGE_CHROME_PROFILES = 35358, + IDC_SHOW_SIGNIN = 35359, + IDC_SHOW_SYNC_PASSPHRASE_DIALOG = 35360, + IDC_ZOOM_MENU = 38000, + IDC_ZOOM_PLUS = 38001, + IDC_ZOOM_NORMAL = 38002, + IDC_ZOOM_MINUS = 38003, + IDC_FOCUS_TOOLBAR = 39000, + IDC_FOCUS_LOCATION = 39001, + IDC_FOCUS_SEARCH = 39002, + IDC_FOCUS_MENU_BAR = 39003, + IDC_FOCUS_NEXT_PANE = 39004, + IDC_FOCUS_PREVIOUS_PANE = 39005, + IDC_FOCUS_BOOKMARKS = 39006, + IDC_FOCUS_INACTIVE_POPUP_FOR_ACCESSIBILITY = 39007, + IDC_FOCUS_WEB_CONTENTS_PANE = 39009, + IDC_OPEN_FILE = 40000, + IDC_CREATE_SHORTCUT = 40002, + IDC_DEVELOPER_MENU = 40003, + IDC_DEV_TOOLS = 40004, + IDC_DEV_TOOLS_CONSOLE = 40005, + IDC_TASK_MANAGER = 40006, + IDC_DEV_TOOLS_DEVICES = 40007, + IDC_FEEDBACK = 40008, + IDC_SHOW_BOOKMARK_BAR = 40009, + IDC_SHOW_HISTORY = 40010, + IDC_SHOW_BOOKMARK_MANAGER = 40011, + IDC_SHOW_DOWNLOADS = 40012, + IDC_CLEAR_BROWSING_DATA = 40013, + IDC_IMPORT_SETTINGS = 40014, + IDC_OPTIONS = 40015, + IDC_EDIT_SEARCH_ENGINES = 40016, + IDC_VIEW_PASSWORDS = 40017, + IDC_ABOUT = 40018, + IDC_HELP_PAGE_VIA_KEYBOARD = 40019, + IDC_HELP_PAGE_VIA_MENU = 40020, + IDC_SHOW_APP_MENU = 40021, + IDC_MANAGE_EXTENSIONS = 40022, + IDC_DEV_TOOLS_INSPECT = 40023, + IDC_UPGRADE_DIALOG = 40024, + IDC_SHOW_HISTORY_CLUSTERS_SIDE_PANEL = 40025, + IDC_PROFILING_ENABLED = 40028, + IDC_BOOKMARKS_MENU = 40029, + IDC_SAVED_TAB_GROUPS_MENU = 40030, + IDC_EXTENSION_ERRORS = 40031, + IDC_SHOW_SETTINGS_CHANGE_FIRST = 40033, + IDC_SHOW_SETTINGS_CHANGE_LAST = 40133, + IDC_SHOW_AVATAR_MENU = 40134, + IDC_EXTENSION_INSTALL_ERROR_FIRST = 40135, + IDC_EXTENSION_INSTALL_ERROR_LAST = 40235, + IDC_TOGGLE_REQUEST_TABLET_SITE = 40236, + IDC_DEV_TOOLS_TOGGLE = 40237, + IDC_RECENT_TABS_MENU = 40239, + IDC_RECENT_TABS_NO_DEVICE_TABS = 40240, + IDC_SHOW_SETTINGS_RESET_BUBBLE = 40241, + IDC_DISTILL_PAGE = 40243, + IDC_HELP_MENU = 40244, + IDC_SHOW_SRT_BUBBLE = 40246, + IDC_ELEVATED_RECOVERY_DIALOG = 40247, + IDC_TAKE_SCREENSHOT = 40248, + IDC_MORE_TOOLS_MENU = 40249, + IDC_TOGGLE_FULLSCREEN_TOOLBAR = 40250, + IDC_CUSTOMIZE_TOUCH_BAR = 40251, + IDC_SHOW_BETA_FORUM = 40252, + IDC_TOGGLE_JAVASCRIPT_APPLE_EVENTS = 40253, + IDC_INSTALL_PWA = 40254, + IDC_SHOW_MANAGEMENT_PAGE = 40255, + IDC_PASTE_AND_GO = 40256, + IDC_SHOW_SAVE_LOCAL_CARD_SIGN_IN_PROMO_IF_APPLICABLE = 40257, + IDC_CLOSE_SIGN_IN_PROMO = 40258, + IDC_SHOW_FULL_URLS = 40259, + IDC_CARET_BROWSING_TOGGLE = 40260, + IDC_CHROME_TIPS = 40263, + IDC_CHROME_WHATS_NEW = 40264, + IDC_PERFORMANCE = 40266, + IDC_EXTENSIONS_SUBMENU = 40267, + IDC_EXTENSIONS_SUBMENU_MANAGE_EXTENSIONS = 40268, + IDC_EXTENSIONS_SUBMENU_VISIT_CHROME_WEB_STORE = 40269, + IDC_READING_LIST_MENU = 40270, + IDC_READING_LIST_MENU_ADD_TAB = 40271, + IDC_READING_LIST_MENU_SHOW_UI = 40272, + IDC_SHOW_READING_MODE_SIDE_PANEL = 40273, + IDC_SHOW_BOOKMARK_SIDE_PANEL = 40274, + IDC_SHOW_CHROME_LABS = 40276, + IDC_RECENT_TABS_LOGIN_FOR_DEVICE_TABS = 40277, + IDC_OPEN_RECENT_TAB = 40278, + IDC_OPEN_SAFETY_HUB = 40279, + IDC_SAFETY_HUB_SHOW_PASSWORD_CHECKUP = 40280, + IDC_SAFETY_HUB_MANAGE_EXTENSIONS = 40281, + IDC_SHOW_GOOGLE_LENS_SHORTCUT = 40282, + IDC_SHOW_CUSTOMIZE_CHROME_SIDE_PANEL = 40283, + IDC_SHOW_CUSTOMIZE_CHROME_TOOLBAR = 40284, + IDC_TASK_MANAGER_APP_MENU = 40285, + IDC_TASK_MANAGER_SHORTCUT = 40286, + IDC_TASK_MANAGER_CONTEXT_MENU = 40287, + IDC_TASK_MANAGER_MAIN_MENU = 40288, + IDC_SHOW_HISTORY_SIDE_PANEL = 40293, + IDC_OPEN_GLIC = 40294, + IDC_FIND_EXTENSIONS = 40295, + IDC_SHOW_SEARCH_TOOLS = 40296, + IDC_SHOW_COMMENTS_SIDE_PANEL = 40297, + IDC_RECENT_TABS_SEE_DEVICE_TABS = 40298, + IDC_SHOW_AI_MODE_OMNIBOX_BUTTON = 40299, + IDC_CONTENT_CONTEXT_INSPECTELEMENT_WITH_GEMINI = 40300, + IDC_CONTENT_CONTEXT_INSPECTELEMENT_WITH_DEVTOOLS = 40301, + IDC_REPORT_UNSAFE_SITE = 40302, + IDC_SHOW_READING_MODE_KEYBOARD = 40303, + IDC_SHOW_TABS_FROM_OTHER_DEVICES_SIDE_PANEL = 40304, + IDC_SPELLCHECK_SUGGESTION_0 = 41000, + IDC_SPELLCHECK_SUGGESTION_1 = 41001, + IDC_SPELLCHECK_SUGGESTION_2 = 41002, + IDC_SPELLCHECK_SUGGESTION_3 = 41003, + IDC_SPELLCHECK_SUGGESTION_4 = 41004, + IDC_SPELLCHECK_SUGGESTION_LAST = 41004, + IDC_SPELLCHECK_MENU = 41005, + IDC_SPELLCHECK_LANGUAGES_FIRST = 41006, + IDC_SPELLCHECK_LANGUAGES_LAST = 41106, + IDC_CHECK_SPELLING_WHILE_TYPING = 41107, + IDC_SPELLPANEL_TOGGLE = 41109, + IDC_SPELLCHECK_ADD_TO_DICTIONARY = 41110, + IDC_SPELLCHECK_MULTI_LINGUAL = 41111, + IDC_WRITING_DIRECTION_MENU = 41120, + IDC_WRITING_DIRECTION_DEFAULT = 41121, + IDC_WRITING_DIRECTION_LTR = 41122, + IDC_WRITING_DIRECTION_RTL = 41123, + IDC_TRANSLATE_ORIGINAL_LANGUAGE_BASE = 42100, + IDC_TRANSLATE_TARGET_LANGUAGE_BASE = 42400, + IDC_VIEW_MENU = 44000, + IDC_FILE_MENU = 44001, + IDC_CHROME_MENU = 44002, + IDC_HIDE_APP = 44003, + IDC_HISTORY_MENU = 46000, + IDC_TAB_MENU = 46001, + IDC_PROFILE_MAIN_MENU = 46100, + IDC_INPUT_METHODS_MENU = 46300, + IDC_CONTENT_CONTEXT_CUSTOM_FIRST = 47000, + IDC_CONTENT_CONTEXT_CUSTOM_LAST = 48000, + IDC_EXTENSIONS_CONTEXT_CUSTOM_FIRST = 49000, + IDC_EXTENSIONS_CONTEXT_CUSTOM_LAST = 50000, + IDC_CONTENT_CONTEXT_OPENLINKNEWTAB = 50100, + IDC_CONTENT_CONTEXT_OPENLINKNEWWINDOW = 50101, + IDC_CONTENT_CONTEXT_OPENLINKOFFTHERECORD = 50102, + IDC_CONTENT_CONTEXT_SAVELINKAS = 50103, + IDC_CONTENT_CONTEXT_COPYLINKLOCATION = 50104, + IDC_CONTENT_CONTEXT_COPYEMAILADDRESS = 50105, + IDC_CONTENT_CONTEXT_OPENLINKWITH = 50106, + IDC_CONTENT_CONTEXT_COPYLINKTEXT = 50107, + IDC_CONTENT_CONTEXT_OPENLINKINPROFILE = 50108, + IDC_CONTENT_CONTEXT_OPENLINKBOOKMARKAPP = 50109, + IDC_CONTENT_CONTEXT_OPENLINKSPLITVIEW = 50111, + IDC_CONTENT_CONTEXT_ADD_LINK_TO_READING_LIST = 50112, + IDC_CONTENT_CONTEXT_SAVEIMAGEAS = 50120, + IDC_CONTENT_CONTEXT_COPYIMAGELOCATION = 50121, + IDC_CONTENT_CONTEXT_COPYIMAGE = 50122, + IDC_CONTENT_CONTEXT_OPENIMAGENEWTAB = 50123, + IDC_CONTENT_CONTEXT_SEARCHWEBFORIMAGE = 50124, + IDC_CONTENT_CONTEXT_OPEN_ORIGINAL_IMAGE_NEW_TAB = 50125, + IDC_CONTENT_CONTEXT_LOAD_IMAGE = 50126, + IDC_CONTENT_CONTEXT_SEARCHLENSFORIMAGE = 50127, + IDC_CONTENT_CONTEXT_GLICSHAREIMAGE = 50128, + IDC_CONTENT_CONTEXT_VIDEO_FRAME = 50129, + IDC_CONTENT_CONTEXT_SAVEVIDEOFRAMEAS = 50130, + IDC_CONTENT_CONTEXT_SAVEAVAS = 50131, + IDC_CONTENT_CONTEXT_COPYAVLOCATION = 50132, + IDC_CONTENT_CONTEXT_COPYVIDEOFRAME = 50133, + IDC_CONTENT_CONTEXT_SEARCHLENSFORVIDEOFRAME = 50134, + IDC_CONTENT_CONTEXT_SEARCHWEBFORVIDEOFRAME = 50135, + IDC_CONTENT_CONTEXT_OPENAVNEWTAB = 50136, + IDC_CONTENT_CONTEXT_PICTUREINPICTURE = 50137, + IDC_CONTENT_CONTEXT_LOOP = 50140, + IDC_CONTENT_CONTEXT_CONTROLS = 50141, + IDC_CONTENT_CONTEXT_ROTATECW = 50142, + IDC_CONTENT_CONTEXT_ROTATECCW = 50143, + IDC_CONTENT_CONTEXT_COPY = 50150, + IDC_CONTENT_CONTEXT_CUT = 50151, + IDC_CONTENT_CONTEXT_PASTE = 50152, + IDC_CONTENT_CONTEXT_DELETE = 50153, + IDC_CONTENT_CONTEXT_UNDO = 50154, + IDC_CONTENT_CONTEXT_REDO = 50155, + IDC_CONTENT_CONTEXT_SELECTALL = 50156, + IDC_CONTENT_CONTEXT_PASTE_AND_MATCH_STYLE = 50157, + IDC_CONTENT_CONTEXT_COPYLINKTOTEXT = 50158, + IDC_CONTENT_CONTEXT_RESHARELINKTOTEXT = 50159, + IDC_CONTENT_CONTEXT_REMOVELINKTOTEXT = 50160, + IDC_CONTENT_CONTEXT_TRANSLATE = 50161, + IDC_CONTENT_CONTEXT_INSPECTELEMENT = 50162, + IDC_CONTENT_CONTEXT_VIEWPAGEINFO = 50163, + IDC_CONTENT_CONTEXT_LANGUAGE_SETTINGS = 50164, + IDC_CONTENT_CONTEXT_LOOK_UP = 50165, + IDC_CONTENT_CONTEXT_NO_SPELLING_SUGGESTIONS = 50166, + IDC_CONTENT_CONTEXT_SPELLING_SUGGESTION = 50167, + IDC_CONTENT_CONTEXT_SPELLING_TOGGLE = 50168, + IDC_CONTENT_CONTEXT_OPEN_IN_READING_MODE = 50169, + IDC_CONTENT_CONTEXT_SAVEPLUGINAS = 50170, + IDC_CONTENT_CONTEXT_INSPECTBACKGROUNDPAGE = 50171, + IDC_CONTENT_CONTEXT_RELOAD_PACKAGED_APP = 50172, + IDC_CONTENT_CONTEXT_RESTART_PACKAGED_APP = 50173, + IDC_CONTENT_CONTEXT_LENS_REGION_SEARCH = 50174, + IDC_CONTENT_CONTEXT_WEB_REGION_SEARCH = 50175, + IDC_CONTENT_CONTEXT_GENERATEPASSWORD = 50176, + IDC_CONTENT_CONTEXT_EXIT_FULLSCREEN = 50177, + IDC_CONTENT_CONTEXT_SHOWALLSAVEDPASSWORDS = 50178, + IDC_CONTENT_CONTEXT_PARTIAL_TRANSLATE = 50179, + IDC_CONTENT_CONTEXT_RELOADFRAME = 50180, + IDC_CONTENT_CONTEXT_VIEWFRAMESOURCE = 50181, + IDC_CONTENT_CONTEXT_VIEWFRAMEINFO = 50182, + IDC_CONTENT_CONTEXT_ADD_A_NOTE = 50185, + IDC_CONTENT_CONTEXT_GOTOURL = 50190, + IDC_CONTENT_CONTEXT_SEARCHWEBFOR = 50191, + IDC_CONTENT_CONTEXT_SEARCHWEBFORNEWTAB = 50192, + IDC_CONTENT_CONTEXT_LENS_OVERLAY = 50193, + IDC_CONTENT_CONTEXT_USE_PASSKEY_FROM_ANOTHER_DEVICE = 50194, + IDC_CONTENT_CONTEXT_LISTEN_TO_THIS_PAGE = 50195, + IDC_CONTENT_CONTEXT_OPEN_WITH1 = 50200, + IDC_CONTENT_CONTEXT_OPEN_WITH2 = 50201, + IDC_CONTENT_CONTEXT_OPEN_WITH3 = 50202, + IDC_CONTENT_CONTEXT_OPEN_WITH4 = 50203, + IDC_CONTENT_CONTEXT_OPEN_WITH5 = 50204, + IDC_CONTENT_CONTEXT_OPEN_WITH6 = 50205, + IDC_CONTENT_CONTEXT_OPEN_WITH7 = 50206, + IDC_CONTENT_CONTEXT_OPEN_WITH8 = 50207, + IDC_CONTENT_CONTEXT_OPEN_WITH9 = 50208, + IDC_CONTENT_CONTEXT_OPEN_WITH10 = 50209, + IDC_CONTENT_CONTEXT_OPEN_WITH11 = 50210, + IDC_CONTENT_CONTEXT_OPEN_WITH12 = 50211, + IDC_CONTENT_CONTEXT_OPEN_WITH13 = 50212, + IDC_CONTENT_CONTEXT_OPEN_WITH14 = 50213, + IDC_CONTENT_CONTEXT_OPEN_WITH_LAST = 50213, + IDC_CONTENT_CONTEXT_EMOJI = 50220, + IDC_CONTENT_CONTEXT_DICTATION = 50229, + IDC_CONTEXT_COMPOSE = 50230, + IDC_CONTENT_CONTEXT_RELOAD_GLIC = 50232, + IDC_CONTENT_CONTEXT_ARCHIVE_GLIC = 50233, + IDC_CONTENT_CONTEXT_GLIC = 50234, + IDC_BOOKMARK_BAR_OPEN_ALL = 51000, + IDC_BOOKMARK_BAR_OPEN_ALL_NEW_WINDOW = 51001, + IDC_BOOKMARK_BAR_OPEN_ALL_INCOGNITO = 51002, + IDC_BOOKMARK_BAR_OPEN_INCOGNITO = 51003, + IDC_BOOKMARK_BAR_OPEN_ALL_NEW_TAB_GROUP = 51004, + IDC_BOOKMARK_BAR_RENAME_FOLDER = 51005, + IDC_BOOKMARK_BAR_EDIT = 51006, + IDC_BOOKMARK_BAR_REMOVE = 51007, + IDC_BOOKMARK_BAR_UNDO = 51008, + IDC_BOOKMARK_BAR_REDO = 51009, + IDC_BOOKMARK_BAR_ADD_NEW_BOOKMARK = 51010, + IDC_BOOKMARK_BAR_NEW_FOLDER = 51011, + IDC_BOOKMARK_MANAGER = 51012, + IDC_BOOKMARK_BAR_ALWAYS_SHOW = 51013, + IDC_BOOKMARK_BAR_SHOW_APPS_SHORTCUT = 51014, + IDC_BOOKMARK_BAR_SHOW_READING_LIST = 51015, + IDC_BOOKMARK_BAR_SHOW_MANAGED_BOOKMARKS = 51016, + IDC_BOOKMARK_BAR_TRACK_PRICE_FOR_SHOPPING_BOOKMARK = 51017, + IDC_BOOKMARK_BAR_UNTRACK_PRICE_FOR_SHOPPING_BOOKMARK = 51018, + IDC_BOOKMARK_BAR_ADD_TO_BOOKMARKS_BAR = 51019, + IDC_BOOKMARK_BAR_REMOVE_FROM_BOOKMARKS_BAR = 51020, + IDC_BOOKMARK_BAR_TOGGLE_SHOW_TAB_GROUPS = 51021, + IDC_BOOKMARK_BAR_MOVE = 51022, + IDC_BOOKMARK_BAR_OPEN_SPLIT_VIEW = 51023, + IDC_CONTENT_CONTEXT_SHARING_CLICK_TO_CALL_SINGLE_DEVICE = 51030, + IDC_CONTENT_CONTEXT_SHARING_CLICK_TO_CALL_MULTIPLE_DEVICES = 51031, + IDC_CONTENT_CONTEXT_SHARING_SHARED_CLIPBOARD_SINGLE_DEVICE = 51032, + IDC_CONTENT_CONTEXT_SHARING_SHARED_CLIPBOARD_MULTIPLE_DEVICES = 51033, + IDC_CONTENT_CONTEXT_GENERATE_QR_CODE = 51034, + IDC_CONTENT_CONTEXT_SHARING_SUBMENU = 51035, + IDC_CONTENT_CONTEXT_SEND_TAB_TO_SELF_DEVICE1 = 51040, + IDC_CONTENT_CONTEXT_SEND_TAB_TO_SELF_DEVICE2 = 51041, + IDC_CONTENT_CONTEXT_SEND_TAB_TO_SELF_DEVICE3 = 51042, + IDC_CONTENT_CONTEXT_SEND_TAB_TO_SELF_DEVICE4 = 51043, + IDC_CONTENT_CONTEXT_SEND_TAB_TO_SELF_DEVICE5 = 51044, + IDC_CONTENT_CONTEXT_SEND_TAB_TO_SELF_DEVICE_LAST = 51044, + IDC_CONTENT_CONTEXT_SEND_TAB_TO_SELF_MANAGE_DEVICES = 51045, + IDC_CONTENT_PASTE_FROM_CLIPBOARD = 51037, + IDC_STATUS_TRAY_KEEP_CHROME_RUNNING_IN_BACKGROUND = 51100, + IDC_STATUS_TRAY_KEEP_CHROME_RUNNING_IN_BACKGROUND_SETTING = 51101, + IDC_MEDIA_ROUTER_ABOUT = 51200, + IDC_MEDIA_ROUTER_HELP = 51201, + IDC_MEDIA_ROUTER_LEARN_MORE = 51202, + IDC_MEDIA_ROUTER_ALWAYS_SHOW_TOOLBAR_ACTION = 51204, + IDC_MEDIA_ROUTER_SHOWN_BY_POLICY = 51206, + IDC_MEDIA_ROUTER_SHOW_IN_TOOLBAR = 51207, + IDC_MEDIA_ROUTER_TOGGLE_MEDIA_REMOTING = 51208, + IDC_MEDIA_TOOLBAR_CONTEXT_REPORT_CAST_ISSUE = 51209, + IDC_MEDIA_TOOLBAR_CONTEXT_SHOW_OTHER_SESSIONS = 51210, + IDC_UPDATE_SIDE_PANEL_PIN_STATE = 51211, + IDC_MEDIA_STREAM_DEVICE_STATUS_TRAY = 51300, + IDC_MEDIA_CONTEXT_MEDIA_STREAM_CAPTURE_LIST_FIRST = 51301, + IDC_MEDIA_CONTEXT_MEDIA_STREAM_CAPTURE_LIST_LAST = 51399, + IDC_MEDIA_STREAM_DEVICE_ALWAYS_ALLOW = 51400, + IDC_CONTENT_CONTEXT_PROTOCOL_HANDLER_FIRST = 52000, + IDC_CONTENT_CONTEXT_PROTOCOL_HANDLER_LAST = 52199, + IDC_CONTENT_CONTEXT_PROTOCOL_HANDLER_SETTINGS = 52200, + IDC_OPEN_LINK_IN_PROFILE_FIRST = 52300, + IDC_OPEN_LINK_IN_PROFILE_LAST = 52399, + IDC_CONTENT_CONTEXT_START_SMART_SELECTION_ACTION1 = 52400, + IDC_CONTENT_CONTEXT_START_SMART_SELECTION_ACTION2 = 52401, + IDC_CONTENT_CONTEXT_START_SMART_SELECTION_ACTION3 = 52402, + IDC_CONTENT_CONTEXT_START_SMART_SELECTION_ACTION4 = 52403, + IDC_CONTENT_CONTEXT_START_SMART_SELECTION_ACTION5 = 52404, + IDC_CONTENT_CONTEXT_START_SMART_SELECTION_ACTION_LAST = 52404, + IDC_CONTENT_CONTEXT_ACCESSIBILITY_LABELS_TOGGLE = 52410, + IDC_CONTENT_CONTEXT_ACCESSIBILITY_LABELS = 52411, + IDC_CONTENT_CONTEXT_ACCESSIBILITY_LABELS_TOGGLE_ONCE = 52412, + + IDC_CONTENT_CONTEXT_QUICK_ANSWERS_INLINE_ANSWER = 52413, + IDC_CONTENT_CONTEXT_QUICK_ANSWERS_INLINE_QUERY = 52414, + IDC_TAB_SEARCH = 52500, + IDC_TAB_SEARCH_CLOSE = 52501, + IDC_DEBUG_TOGGLE_TABLET_MODE = 52510, + IDC_DEBUG_PRINT_VIEW_TREE = 52511, + IDC_DEBUG_PRINT_VIEW_TREE_DETAILS = 52512, + IDC_CONTENT_CONTEXT_AUTOFILL_FEEDBACK = 52990, + IDC_CONTENT_CONTEXT_AUTOFILL_FALLBACK_PLUS_ADDRESS = 52994, + IDC_CONTENT_CONTEXT_AUTOFILL_FALLBACK_PASSWORDS_SELECT_PASSWORD = 52998, + IDC_CONTENT_CONTEXT_AUTOFILL_FALLBACK_PASSWORDS_IMPORT_PASSWORDS = 52999, + IDC_CONTENT_CONTEXT_AUTOFILL_FALLBACK_PASSWORDS_SUGGEST_PASSWORD = 53000, + IDC_CONTENT_CONTEXT_AUTOFILL_FALLBACK_PASSWORDS_USE_PASSKEY_FROM_ANOTHER_DEVICE = 53002, + IDC_CONTENT_CONTEXT_AUTOFILL_FALLBACK_AT_MEMORY = 53003, + IDC_LIVE_CAPTION = 53251, + IDC_DEVICE_SYSTEM_TRAY_ICON_FIRST = 53260, + IDC_DEVICE_SYSTEM_TRAY_ICON_LAST = 53299, + IDC_SET_BROWSER_AS_DEFAULT = 53300, + IDC_GLIC_STATUS_ICON_MENU_CUSTOMIZE_KEYBOARD_SHORTCUT = 53311, + IDC_GLIC_STATUS_ICON_MENU_REMOVE_ICON = 53312, + IDC_GLIC_STATUS_ICON_MENU_SETTINGS = 53313, + IDC_GLIC_STATUS_ICON_MENU_EXIT = 53314, + IDC_GLIC_STATUS_ICON_MENU_TOGGLE = 53316, + IDC_GLIC_TOGGLE_PIN = 53320, + IDC_TAB_SEARCH_TOGGLE_PIN = 53321, + IDC_PROJECTS_PANEL_TOGGLE_PIN = 53322, + IDC_EVERYTHING_MENU_TOGGLE_PIN = 53323, + IDC_SHOW_CONTEXTUAL_TASKS_SIDE_PANEL = 54000, + IDC_OMNIBOX_CONTEXT_ADD_IMAGE = 54010, + IDC_OMNIBOX_CONTEXT_ADD_FILE = 54011, + IDC_OMNIBOX_CONTEXT_CREATE_IMAGES = 54012, + IDC_OMNIBOX_CONTEXT_DEEP_RESEARCH = 54013, + IDC_OMNIBOX_CONTEXT_CANVAS = 54014, + IDC_OMNIBOX_CONTEXT_SET_MODEL_AUTO = 54015, + IDC_OMNIBOX_CONTEXT_SET_MODEL_THINKING = 54016, + IDC_OMNIBOX_CONTEXT_SET_MODEL_REGULAR = 54017, + IDC_OMNIBOX_CONTEXT_SET_MODEL_PRO_NO_GEN_UI = 54018, + IDC_OMNIBOX_CONTEXT_SHARED_TABS_SUBMENU = 54019, + IDC_FIRST_UNBOUNDED_MENU = 54021, + } +} diff --git a/CefSharp/IBrowserHost.cs b/CefSharp/IBrowserHost.cs index 51d103277..f2b31a5a6 100644 --- a/CefSharp/IBrowserHost.cs +++ b/CefSharp/IBrowserHost.cs @@ -502,6 +502,21 @@ public interface IBrowserHost : IDisposable /// true or false void SetAudioMuted(bool mute); + /// + /// Returns true if a Chrome command is supported and enabled. This method can only be called on the CEF UI thread. Only + /// used with Chrome style. + /// + /// command id + /// availability of the Chrome command. + bool CanExecuteChromeCommand(int commandId); + + /// + /// Execute a Chrome command. Only used with Chrome style. + /// + /// command id + /// command target + void ExecuteChromeCommand(int commandId, WindowOpenDisposition disposition); + /// /// Returns true if the browser's audio is muted. /// This method can only be called on the CEF UI thread. diff --git a/CefSharp/WebBrowserExtensions.cs b/CefSharp/WebBrowserExtensions.cs index 855ec7f0f..dbfd09810 100644 --- a/CefSharp/WebBrowserExtensions.cs +++ b/CefSharp/WebBrowserExtensions.cs @@ -1491,6 +1491,35 @@ public static void AddWordToDictionary(this IChromiumWebBrowserBase browser, str browser.BrowserCore.AddWordToDictionary(word); } + /// + /// Execute a Chrome command. Only used with Chrome style. + /// + /// The instance this method extends. + /// The command id. + /// The command target. + public static void ExecuteChromeCommand(this IBrowser browser, int commandId, WindowOpenDisposition disposition) + { + ThrowExceptionIfBrowserNull(browser); + + var host = browser.GetHost(); + ThrowExceptionIfBrowserHostNull(host); + + host.ExecuteChromeCommand(commandId, disposition); + } + + /// + /// Execute a Chrome command. Only used with Chrome style. + /// + /// The ChromiumWebBrowser instance this method extends. + /// The command id. + /// The command target. + public static void ExecuteChromeCommand(this IChromiumWebBrowserBase browser, int commandId, WindowOpenDisposition disposition) + { + ThrowExceptionIfChromiumWebBrowserDisposed(browser); + + browser.BrowserCore.ExecuteChromeCommand(commandId, disposition); + } + /// /// Shortcut method to get the browser IBrowserHost. ///