From 4f69f215d66081152e71f41024f53acd3bbd33a1 Mon Sep 17 00:00:00 2001 From: SLT World Date: Sun, 31 May 2026 19:47:20 +0800 Subject: [PATCH 1/3] Core - Support Chrome command execution. --- .../Internals/CefBrowserHostWrapper.cpp | 48 ++++++++++++++ .../Internals/CefBrowserHostWrapper.h | 7 +++ CefSharp/IBrowserHost.cs | 23 +++++++ CefSharp/WebBrowserExtensions.cs | 62 +++++++++++++++++++ 4 files changed, 140 insertions(+) diff --git a/CefSharp.Core.Runtime/Internals/CefBrowserHostWrapper.cpp b/CefSharp.Core.Runtime/Internals/CefBrowserHostWrapper.cpp index 5b8da2a87..e87f548b7 100644 --- a/CefSharp.Core.Runtime/Internals/CefBrowserHostWrapper.cpp +++ b/CefSharp.Core.Runtime/Internals/CefBrowserHostWrapper.cpp @@ -639,6 +639,54 @@ 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."); +} + +Task^ CefBrowserHostWrapper::CanExecuteChromeCommandAsync(int commandId) +{ + ThrowIfDisposed(); + + if (CefCurrentlyOn(TID_UI)) + { + return Task::FromResult(CanExecuteChromeCommandOnUI(commandId)); + } + return Cef::UIThreadTaskFactory->StartNew(gcnew Func(this, &CefBrowserHostWrapper::CanExecuteChromeCommandOnUI), commandId); +} + +bool CefBrowserHostWrapper::CanExecuteChromeCommandOnUI(Object^ commandObject) +{ + if (_disposed) + { + return false; + } + + CefTaskScheduler::EnsureOn(TID_UI, "CefBrowserHostWrapper::CanExecuteChromeCommand"); + + if (_browserHost.get()) + { + int commandId = (int)commandObject; + return _browserHost->CanExecuteChromeCommand(commandId); + } + + return false; +} + +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..3a3300047 100644 --- a/CefSharp.Core.Runtime/Internals/CefBrowserHostWrapper.h +++ b/CefSharp.Core.Runtime/Internals/CefBrowserHostWrapper.h @@ -24,6 +24,7 @@ namespace CefSharp int _lastDevToolsMessageId = 0; double GetZoomLevelOnUI(); + bool CanExecuteChromeCommandOnUI(Object^ commandObject); internal: CefBrowserHostWrapper(const CefRefPtr &browserHost) : _browserHost(browserHost) @@ -140,6 +141,12 @@ namespace CefSharp virtual void SetAudioMuted(bool mute); + virtual bool CanExecuteChromeCommand(int commandId); + + virtual Task^ CanExecuteChromeCommandAsync(int commandId); + + virtual void ExecuteChromeCommand(int commandId, WindowOpenDisposition disposition); + virtual IntPtr GetOpenerWindowHandle(); virtual void SendExternalBeginFrame(); diff --git a/CefSharp/IBrowserHost.cs b/CefSharp/IBrowserHost.cs index 51d103277..606d1a847 100644 --- a/CefSharp/IBrowserHost.cs +++ b/CefSharp/IBrowserHost.cs @@ -502,6 +502,29 @@ 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); + + /// + /// Returns true if a Chrome command is supported and enabled. This method executes CanExecuteChromeCommand on the CEF UI thread + /// in an async fashion. Only used with Chrome style. + /// + /// command id + /// a that when executed returns the availability of the Chrome command as a boolean. + Task CanExecuteChromeCommandAsync(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..7e30a6d6a 100644 --- a/CefSharp/WebBrowserExtensions.cs +++ b/CefSharp/WebBrowserExtensions.cs @@ -1491,6 +1491,68 @@ public static void AddWordToDictionary(this IChromiumWebBrowserBase browser, str browser.BrowserCore.AddWordToDictionary(word); } + /// + /// Asynchronously returns true if a Chrome command is supported and enabled. Only used with Chrome style. + /// + /// The instance this method extends. + /// The command id. + /// + /// An asynchronous result that yields the availability of the Chrome command. + /// + public static Task CanExecuteChromeCommandAsync(this IBrowser browser, int commandId) + { + ThrowExceptionIfBrowserNull(browser); + + var host = browser.GetHost(); + ThrowExceptionIfBrowserHostNull(host); + + return host.CanExecuteChromeCommandAsync(commandId); + } + + /// + /// 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. + /// + /// An asynchronous result that yields the availability of the Chrome command. + /// + public static Task CanExecuteChromeCommandAsync(this IChromiumWebBrowserBase browser, int commandId) + { + ThrowExceptionIfChromiumWebBrowserDisposed(browser); + + return browser.BrowserCore.CanExecuteChromeCommandAsync(commandId); + } + + /// + /// 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. /// From fc4d1d529f4bd14d235893892e7553db60f34199 Mon Sep 17 00:00:00 2001 From: SLT World Date: Tue, 2 Jun 2026 11:01:38 +0800 Subject: [PATCH 2/3] Core - Expose `cef_id_for_command_id_name` with CefIdMappers. --- CefSharp.Core.Runtime/CefIdMappers.cpp | 29 +++++++++++++++++++ CefSharp.Core.Runtime/CefIdMappers.h | 21 ++++++++++++++ .../CefSharp.Core.Runtime.netcore.vcxproj | 2 ++ ...Sharp.Core.Runtime.netcore.vcxproj.filters | 6 ++++ .../CefSharp.Core.Runtime.vcxproj | 2 ++ .../CefSharp.Core.Runtime.vcxproj.filters | 6 ++++ CefSharp.Core/CefIdMappers.cs | 28 ++++++++++++++++++ 7 files changed, 94 insertions(+) create mode 100644 CefSharp.Core.Runtime/CefIdMappers.cpp create mode 100644 CefSharp.Core.Runtime/CefIdMappers.h create mode 100644 CefSharp.Core/CefIdMappers.cs 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/CefSharp.Core.Runtime.netcore.vcxproj b/CefSharp.Core.Runtime/CefSharp.Core.Runtime.netcore.vcxproj index 5a34dc0a1..c931ff055 100644 --- a/CefSharp.Core.Runtime/CefSharp.Core.Runtime.netcore.vcxproj +++ b/CefSharp.Core.Runtime/CefSharp.Core.Runtime.netcore.vcxproj @@ -339,6 +339,7 @@ + @@ -373,6 +374,7 @@ + diff --git a/CefSharp.Core.Runtime/CefSharp.Core.Runtime.netcore.vcxproj.filters b/CefSharp.Core.Runtime/CefSharp.Core.Runtime.netcore.vcxproj.filters index f225404bd..9c851384c 100644 --- a/CefSharp.Core.Runtime/CefSharp.Core.Runtime.netcore.vcxproj.filters +++ b/CefSharp.Core.Runtime/CefSharp.Core.Runtime.netcore.vcxproj.filters @@ -83,6 +83,9 @@ Source Files + + Source Files + @@ -325,6 +328,9 @@ Header Files + + Header Files + diff --git a/CefSharp.Core.Runtime/CefSharp.Core.Runtime.vcxproj b/CefSharp.Core.Runtime/CefSharp.Core.Runtime.vcxproj index 247ec8f6e..d08dc4193 100644 --- a/CefSharp.Core.Runtime/CefSharp.Core.Runtime.vcxproj +++ b/CefSharp.Core.Runtime/CefSharp.Core.Runtime.vcxproj @@ -240,6 +240,7 @@ + @@ -272,6 +273,7 @@ + diff --git a/CefSharp.Core.Runtime/CefSharp.Core.Runtime.vcxproj.filters b/CefSharp.Core.Runtime/CefSharp.Core.Runtime.vcxproj.filters index 203ef5239..9b61c1808 100644 --- a/CefSharp.Core.Runtime/CefSharp.Core.Runtime.vcxproj.filters +++ b/CefSharp.Core.Runtime/CefSharp.Core.Runtime.vcxproj.filters @@ -83,6 +83,9 @@ Source Files + + Source Files + @@ -325,6 +328,9 @@ Header Files + + Header Files + diff --git a/CefSharp.Core/CefIdMappers.cs b/CefSharp.Core/CefIdMappers.cs new file mode 100644 index 000000000..2a7316289 --- /dev/null +++ b/CefSharp.Core/CefIdMappers.cs @@ -0,0 +1,28 @@ +// 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. + +namespace CefSharp +{ + /// + /// Provides version-safe mapping of Chromium string identifiers to their version-specific numeric ID values. + /// + public static class CefIdMappers + { + /// + /// 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 CefIdForCommandIdName(string name) + { + return CefSharp.Core.CefIdMappers.CefIdForCommandIdName(name); + } + } +} From acf337e2b00fa1ebc2d65cac4a632093b2f41b07 Mon Sep 17 00:00:00 2001 From: SLT World Date: Wed, 3 Jun 2026 21:47:20 +0800 Subject: [PATCH 3/3] Core - Applied changes to Chrome command execution implementation. --- .../CefSharp.Core.Runtime.netcore.cs | 3 +- CefSharp.Core.Runtime/Cef.h | 14 + .../CefSharp.Core.Runtime.netcore.vcxproj | 2 - ...Sharp.Core.Runtime.netcore.vcxproj.filters | 6 - .../CefSharp.Core.Runtime.vcxproj | 2 - .../CefSharp.Core.Runtime.vcxproj.filters | 6 - .../Internals/CefBrowserHostWrapper.cpp | 29 -- .../Internals/CefBrowserHostWrapper.h | 3 - CefSharp.Core/Cef.cs | 16 + CefSharp.Core/CefIdMappers.cs | 28 - CefSharp.Core/WebBrowserExtensionsEx.cs | 49 ++ CefSharp/Enums/ChromeCommandIds.cs | 485 ++++++++++++++++++ CefSharp/IBrowserHost.cs | 8 - CefSharp/WebBrowserExtensions.cs | 33 -- 14 files changed, 566 insertions(+), 118 deletions(-) delete mode 100644 CefSharp.Core/CefIdMappers.cs create mode 100644 CefSharp/Enums/ChromeCommandIds.cs 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/CefSharp.Core.Runtime.netcore.vcxproj b/CefSharp.Core.Runtime/CefSharp.Core.Runtime.netcore.vcxproj index c931ff055..5a34dc0a1 100644 --- a/CefSharp.Core.Runtime/CefSharp.Core.Runtime.netcore.vcxproj +++ b/CefSharp.Core.Runtime/CefSharp.Core.Runtime.netcore.vcxproj @@ -339,7 +339,6 @@ - @@ -374,7 +373,6 @@ - diff --git a/CefSharp.Core.Runtime/CefSharp.Core.Runtime.netcore.vcxproj.filters b/CefSharp.Core.Runtime/CefSharp.Core.Runtime.netcore.vcxproj.filters index 9c851384c..f225404bd 100644 --- a/CefSharp.Core.Runtime/CefSharp.Core.Runtime.netcore.vcxproj.filters +++ b/CefSharp.Core.Runtime/CefSharp.Core.Runtime.netcore.vcxproj.filters @@ -83,9 +83,6 @@ Source Files - - Source Files - @@ -328,9 +325,6 @@ Header Files - - Header Files - diff --git a/CefSharp.Core.Runtime/CefSharp.Core.Runtime.vcxproj b/CefSharp.Core.Runtime/CefSharp.Core.Runtime.vcxproj index d08dc4193..247ec8f6e 100644 --- a/CefSharp.Core.Runtime/CefSharp.Core.Runtime.vcxproj +++ b/CefSharp.Core.Runtime/CefSharp.Core.Runtime.vcxproj @@ -240,7 +240,6 @@ - @@ -273,7 +272,6 @@ - diff --git a/CefSharp.Core.Runtime/CefSharp.Core.Runtime.vcxproj.filters b/CefSharp.Core.Runtime/CefSharp.Core.Runtime.vcxproj.filters index 9b61c1808..203ef5239 100644 --- a/CefSharp.Core.Runtime/CefSharp.Core.Runtime.vcxproj.filters +++ b/CefSharp.Core.Runtime/CefSharp.Core.Runtime.vcxproj.filters @@ -83,9 +83,6 @@ Source Files - - Source Files - @@ -328,9 +325,6 @@ Header Files - - Header Files - diff --git a/CefSharp.Core.Runtime/Internals/CefBrowserHostWrapper.cpp b/CefSharp.Core.Runtime/Internals/CefBrowserHostWrapper.cpp index e87f548b7..a077ccfa7 100644 --- a/CefSharp.Core.Runtime/Internals/CefBrowserHostWrapper.cpp +++ b/CefSharp.Core.Runtime/Internals/CefBrowserHostWrapper.cpp @@ -651,35 +651,6 @@ bool CefBrowserHostWrapper::CanExecuteChromeCommand(int 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."); } -Task^ CefBrowserHostWrapper::CanExecuteChromeCommandAsync(int commandId) -{ - ThrowIfDisposed(); - - if (CefCurrentlyOn(TID_UI)) - { - return Task::FromResult(CanExecuteChromeCommandOnUI(commandId)); - } - return Cef::UIThreadTaskFactory->StartNew(gcnew Func(this, &CefBrowserHostWrapper::CanExecuteChromeCommandOnUI), commandId); -} - -bool CefBrowserHostWrapper::CanExecuteChromeCommandOnUI(Object^ commandObject) -{ - if (_disposed) - { - return false; - } - - CefTaskScheduler::EnsureOn(TID_UI, "CefBrowserHostWrapper::CanExecuteChromeCommand"); - - if (_browserHost.get()) - { - int commandId = (int)commandObject; - return _browserHost->CanExecuteChromeCommand(commandId); - } - - return false; -} - void CefBrowserHostWrapper::ExecuteChromeCommand(int commandId, WindowOpenDisposition disposition) { ThrowIfDisposed(); diff --git a/CefSharp.Core.Runtime/Internals/CefBrowserHostWrapper.h b/CefSharp.Core.Runtime/Internals/CefBrowserHostWrapper.h index 3a3300047..68e855041 100644 --- a/CefSharp.Core.Runtime/Internals/CefBrowserHostWrapper.h +++ b/CefSharp.Core.Runtime/Internals/CefBrowserHostWrapper.h @@ -24,7 +24,6 @@ namespace CefSharp int _lastDevToolsMessageId = 0; double GetZoomLevelOnUI(); - bool CanExecuteChromeCommandOnUI(Object^ commandObject); internal: CefBrowserHostWrapper(const CefRefPtr &browserHost) : _browserHost(browserHost) @@ -143,8 +142,6 @@ namespace CefSharp virtual bool CanExecuteChromeCommand(int commandId); - virtual Task^ CanExecuteChromeCommandAsync(int commandId); - virtual void ExecuteChromeCommand(int commandId, WindowOpenDisposition disposition); virtual IntPtr GetOpenerWindowHandle(); 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/CefIdMappers.cs b/CefSharp.Core/CefIdMappers.cs deleted file mode 100644 index 2a7316289..000000000 --- a/CefSharp.Core/CefIdMappers.cs +++ /dev/null @@ -1,28 +0,0 @@ -// 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. - -namespace CefSharp -{ - /// - /// Provides version-safe mapping of Chromium string identifiers to their version-specific numeric ID values. - /// - public static class CefIdMappers - { - /// - /// 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 CefIdForCommandIdName(string name) - { - return CefSharp.Core.CefIdMappers.CefIdForCommandIdName(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 606d1a847..f2b31a5a6 100644 --- a/CefSharp/IBrowserHost.cs +++ b/CefSharp/IBrowserHost.cs @@ -510,14 +510,6 @@ public interface IBrowserHost : IDisposable /// availability of the Chrome command. bool CanExecuteChromeCommand(int commandId); - /// - /// Returns true if a Chrome command is supported and enabled. This method executes CanExecuteChromeCommand on the CEF UI thread - /// in an async fashion. Only used with Chrome style. - /// - /// command id - /// a that when executed returns the availability of the Chrome command as a boolean. - Task CanExecuteChromeCommandAsync(int commandId); - /// /// Execute a Chrome command. Only used with Chrome style. /// diff --git a/CefSharp/WebBrowserExtensions.cs b/CefSharp/WebBrowserExtensions.cs index 7e30a6d6a..dbfd09810 100644 --- a/CefSharp/WebBrowserExtensions.cs +++ b/CefSharp/WebBrowserExtensions.cs @@ -1491,39 +1491,6 @@ public static void AddWordToDictionary(this IChromiumWebBrowserBase browser, str browser.BrowserCore.AddWordToDictionary(word); } - /// - /// Asynchronously returns true if a Chrome command is supported and enabled. Only used with Chrome style. - /// - /// The instance this method extends. - /// The command id. - /// - /// An asynchronous result that yields the availability of the Chrome command. - /// - public static Task CanExecuteChromeCommandAsync(this IBrowser browser, int commandId) - { - ThrowExceptionIfBrowserNull(browser); - - var host = browser.GetHost(); - ThrowExceptionIfBrowserHostNull(host); - - return host.CanExecuteChromeCommandAsync(commandId); - } - - /// - /// 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. - /// - /// An asynchronous result that yields the availability of the Chrome command. - /// - public static Task CanExecuteChromeCommandAsync(this IChromiumWebBrowserBase browser, int commandId) - { - ThrowExceptionIfChromiumWebBrowserDisposed(browser); - - return browser.BrowserCore.CanExecuteChromeCommandAsync(commandId); - } - /// /// Execute a Chrome command. Only used with Chrome style. ///