From 29a02f6530180abff65bb08b62a85f8a3e271b2a Mon Sep 17 00:00:00 2001 From: yy-2020 Date: Tue, 24 Jan 2023 09:45:09 +0100 Subject: [PATCH 1/5] file dialog handler --- .../BrowserProcessHandler.cs | 14 ++++++ .../CallbackProxies/CallbackProxyBase.cs | 45 +++++++++++++++++++ .../CallbackProxies/DialogHandlerProxy.cs | 38 ++++++++++++++++ .../CallbackProxies/CallbackProxyBase.cs | 44 ++++++++++++++++++ .../FileDialogCallbackProxy.cs | 35 +++++++++++++++ .../CefSharp.OutOfProcess.Core.csproj | 5 ++- .../Handler/IDialogHandler.cs | 43 ++++++++++++++++++ .../IChromiumWebBrowser.cs | 2 + .../OutOfProcessConnectionTransport.cs | 1 + .../OutOfProcessHost.cs | 20 ++++++++- .../Callbacks/CallbackDetails.cs | 9 ++++ .../Callbacks/FileDialogCallbackDetails.cs | 9 ++++ .../IOutOfProcessHostRpc.cs | 9 +++- .../CefSharp.OutOfProcess.WinForms.csproj | 1 + .../ChromiumWebBrowser.cs | 2 + .../CefSharp.OutOfProcess.Wpf.HwndHost.csproj | 1 + .../ChromiumWebBrowser.cs | 2 + 17 files changed, 276 insertions(+), 4 deletions(-) create mode 100644 CefSharp.OutOfProcess.BrowserProcess/CallbackProxies/CallbackProxyBase.cs create mode 100644 CefSharp.OutOfProcess.BrowserProcess/CallbackProxies/DialogHandlerProxy.cs create mode 100644 CefSharp.OutOfProcess.Core/CallbackProxies/CallbackProxyBase.cs create mode 100644 CefSharp.OutOfProcess.Core/CallbackProxies/FileDialogCallbackProxy.cs create mode 100644 CefSharp.OutOfProcess.Core/Handler/IDialogHandler.cs create mode 100644 CefSharp.OutOfProcess.Interface/Callbacks/CallbackDetails.cs create mode 100644 CefSharp.OutOfProcess.Interface/Callbacks/FileDialogCallbackDetails.cs diff --git a/CefSharp.OutOfProcess.BrowserProcess/BrowserProcessHandler.cs b/CefSharp.OutOfProcess.BrowserProcess/BrowserProcessHandler.cs index eb35359..37a5425 100644 --- a/CefSharp.OutOfProcess.BrowserProcess/BrowserProcessHandler.cs +++ b/CefSharp.OutOfProcess.BrowserProcess/BrowserProcessHandler.cs @@ -7,6 +7,8 @@ using System.Diagnostics; using CefSharp.OutOfProcess.Interface; using System.Threading.Tasks; +using CefSharp.OutOfProcess.BrowserProcess.CallbackProxies; +using CefSharp.OutOfProcess.Interface.Callbacks; namespace CefSharp.OutOfProcess.BrowserProcess { @@ -38,6 +40,7 @@ protected override void OnContextInitialized() var threadId = Kernel32.GetCurrentThreadId(); _outOfProcessServer.NotifyContextInitialized(threadId, Cef.CefSharpVersion, Cef.CefVersion, Cef.ChromiumVersion); + _outOfProcessServer.FileDialogCallback += _outOfProcessServer_FileDialogCallback; } protected override void Dispose(bool disposing) @@ -65,6 +68,17 @@ Task IOutOfProcessClientRpc.CloseBrowser(int browserId) }); } + private OutOfProcessChromiumWebBrowser GetBrowser(int id) => _browsers.FirstOrDefault(x => x.Id == id); + + private void _outOfProcessServer_FileDialogCallback(object sender, FileDialogCallbackDetails e) + { + _ = CefThread.ExecuteOnUiThread(() => + { + ((DialogHandlerProxy)GetBrowser(e.BrowserId).DialogHandler).Callback(e); + return true; + }); + } + Task IOutOfProcessClientRpc.SendDevToolsMessage(int browserId, string message) { return CefThread.ExecuteOnUiThread(() => diff --git a/CefSharp.OutOfProcess.BrowserProcess/CallbackProxies/CallbackProxyBase.cs b/CefSharp.OutOfProcess.BrowserProcess/CallbackProxies/CallbackProxyBase.cs new file mode 100644 index 0000000..f76cb16 --- /dev/null +++ b/CefSharp.OutOfProcess.BrowserProcess/CallbackProxies/CallbackProxyBase.cs @@ -0,0 +1,45 @@ +using System; +using System.Collections.Generic; +using CefSharp.OutOfProcess.Interface; + +namespace CefSharp.OutOfProcess.BrowserProcess.CallbackProxies +{ + internal class CallbackProxyBase : IDisposable + { + private int id = 0; + private readonly Dictionary callbacks = new Dictionary(); + private protected readonly IOutOfProcessHostRpc host; + + public CallbackProxyBase(IOutOfProcessHostRpc host) + { + this.host = host ?? throw new ArgumentNullException(nameof(host)); + } + + protected int CreateCallback(T callback) + { + int lid = id++; + callbacks.Add(lid, callback); + return lid; + } + + protected T GetCallback(int id) + { + T cb = callbacks[id]; + callbacks.Remove(id); + return cb; + } + + public void Dispose() + { + foreach (var cbs in callbacks) + { + if (cbs.Value is IDisposable d) + { + d.Dispose(); + } + } + + callbacks.Clear(); + } + } +} diff --git a/CefSharp.OutOfProcess.BrowserProcess/CallbackProxies/DialogHandlerProxy.cs b/CefSharp.OutOfProcess.BrowserProcess/CallbackProxies/DialogHandlerProxy.cs new file mode 100644 index 0000000..a0e30ab --- /dev/null +++ b/CefSharp.OutOfProcess.BrowserProcess/CallbackProxies/DialogHandlerProxy.cs @@ -0,0 +1,38 @@ +using System.Collections.Generic; +using CefSharp.OutOfProcess.Interface; +using CefSharp.Handler; +using System.Linq; +using CefSharp.OutOfProcess.Interface.Callbacks; + +namespace CefSharp.OutOfProcess.BrowserProcess.CallbackProxies +{ + + internal sealed class DialogHandlerProxy : CallbackProxyBase, IDialogHandler + { + public DialogHandlerProxy(IOutOfProcessHostRpc host) + : base(host) + { + + } + + public void Callback(FileDialogCallbackDetails details) + { + var cb = GetCallback(details.CallbackId); + + if (details.Continue) + { + cb.Continue(details.Files.ToList()); + } + else + { + cb.Cancel(); + } + } + + bool IDialogHandler.OnFileDialog(IWebBrowser chromiumWebBrowser, IBrowser browser, CefFileDialogMode mode, string title, string defaultFilePath, List acceptFilters, IFileDialogCallback callback) + { + var result = host.OnFileDialog(((OutOfProcessChromiumWebBrowser)chromiumWebBrowser).Id, mode.ToString(), title, defaultFilePath, acceptFilters.ToArray(), CreateCallback(callback)); + return result.Result; + } + } +} diff --git a/CefSharp.OutOfProcess.Core/CallbackProxies/CallbackProxyBase.cs b/CefSharp.OutOfProcess.Core/CallbackProxies/CallbackProxyBase.cs new file mode 100644 index 0000000..2d43475 --- /dev/null +++ b/CefSharp.OutOfProcess.Core/CallbackProxies/CallbackProxyBase.cs @@ -0,0 +1,44 @@ +namespace CefSharp.OutOfProcess +{ + using System; + using CefSharp.OutOfProcess.Internal; + + internal class CallbackProxyBase : IDisposable + { + private protected readonly OutOfProcessHost outOfProcessHost; + private protected readonly int callback; + private protected readonly IChromiumWebBrowserInternal chromiumWebBrowser; + private bool disposedValue; + + public CallbackProxyBase(OutOfProcessHost outOfProcessHost, int callback, IChromiumWebBrowserInternal chromiumWebBrowser) + { + this.chromiumWebBrowser = chromiumWebBrowser; + this.outOfProcessHost = outOfProcessHost; + this.callback = callback; + } + + public bool IsDisposed => disposedValue; + + protected virtual void Dispose(bool disposing) + { + if (!disposedValue) + { + if (disposing) + { + // TODO: dispose managed state (managed objects) + } + + // TODO: free unmanaged resources (unmanaged objects) and override finalizer + // TODO: set large fields to null + disposedValue = true; + } + } + + void IDisposable.Dispose() + { + // Do not change this code. Put cleanup code in 'Dispose(bool disposing)' method + Dispose(disposing: true); + GC.SuppressFinalize(this); + } + } +} diff --git a/CefSharp.OutOfProcess.Core/CallbackProxies/FileDialogCallbackProxy.cs b/CefSharp.OutOfProcess.Core/CallbackProxies/FileDialogCallbackProxy.cs new file mode 100644 index 0000000..79242eb --- /dev/null +++ b/CefSharp.OutOfProcess.Core/CallbackProxies/FileDialogCallbackProxy.cs @@ -0,0 +1,35 @@ +namespace CefSharp.OutOfProcess +{ + using System.Collections.Generic; + using CefSharp.OutOfProcess.Interface.Callbacks; + using CefSharp.OutOfProcess.Internal; + + internal sealed class FileDialogCallbackProxy : CallbackProxyBase, IFileDialogCallback + { + public FileDialogCallbackProxy(OutOfProcessHost outOfProcessHost, int callback, IChromiumWebBrowserInternal chromiumWebBrowser) + : base(outOfProcessHost, callback, chromiumWebBrowser) + { + } + + public void Cancel() + { + outOfProcessHost.InvokeFileDialogCallback(new FileDialogCallbackDetails() + { + CallbackId = callback, + BrowserId = chromiumWebBrowser.Id, + Continue = false, + }); + } + + public void Continue(List filePaths) + { + outOfProcessHost.InvokeFileDialogCallback(new FileDialogCallbackDetails() + { + CallbackId = callback, + BrowserId = chromiumWebBrowser.Id, + Continue = true, + Files = filePaths.ToArray(), + }); + } + } +} diff --git a/CefSharp.OutOfProcess.Core/CefSharp.OutOfProcess.Core.csproj b/CefSharp.OutOfProcess.Core/CefSharp.OutOfProcess.Core.csproj index 59e3902..129b32a 100644 --- a/CefSharp.OutOfProcess.Core/CefSharp.OutOfProcess.Core.csproj +++ b/CefSharp.OutOfProcess.Core/CefSharp.OutOfProcess.Core.csproj @@ -1,16 +1,17 @@  - netstandard2.0 + net462 + AnyCPU CefSharp.OutOfProcess + - diff --git a/CefSharp.OutOfProcess.Core/Handler/IDialogHandler.cs b/CefSharp.OutOfProcess.Core/Handler/IDialogHandler.cs new file mode 100644 index 0000000..3f7f49a --- /dev/null +++ b/CefSharp.OutOfProcess.Core/Handler/IDialogHandler.cs @@ -0,0 +1,43 @@ +namespace CefSharp.OutOfProcess.Handler +{ + using System.Collections.Generic; + + public interface IDialogHandler + { + // + // Summary: + // Runs a file chooser dialog. + // + // Parameters: + // chromiumWebBrowser: + // the ChromiumWebBrowser control + // + // browser: + // the browser object + // + // mode: + // represents the type of dialog to display + // + // title: + // the title to be used for the dialog. It may be empty to show the default title + // ("Open" or "Save" depending on the mode). + // + // defaultFilePath: + // is the path with optional directory and/or file name component that should be + // initially selected in the dialog. + // + // acceptFilters: + // are used to restrict the selectable file types and may any combination of (a) + // valid lower-cased MIME types (e.g. "text/*" or "image/*"), (b) individual file + // extensions (e.g. ".txt" or ".png"), (c) combined description and file extension + // delimited using "|" and ";" (e.g. "Image Types|.png;.gif;.jpg"). + // + // callback: + // Callback interface for asynchronous continuation of file dialog requests. + // + // Returns: + // To display a custom dialog return true. To display the default dialog return + // false. + bool OnFileDialog(IChromiumWebBrowser chromiumWebBrowser, CefFileDialogMode mode, string title, string defaultFilePath, IEnumerable acceptFilters, IFileDialogCallback callback); + } +} \ No newline at end of file diff --git a/CefSharp.OutOfProcess.Core/IChromiumWebBrowser.cs b/CefSharp.OutOfProcess.Core/IChromiumWebBrowser.cs index 9704d7b..2546b4a 100644 --- a/CefSharp.OutOfProcess.Core/IChromiumWebBrowser.cs +++ b/CefSharp.OutOfProcess.Core/IChromiumWebBrowser.cs @@ -203,5 +203,7 @@ public interface IChromiumWebBrowser : IDisposable /// the navigation will resolve with the response of the last redirect. If can not go forward, resolves to null. /// Navigation parameters. Task GoForwardAsync(NavigationOptions options = null); + + Handler.IDialogHandler DialogHandler { get; set; } } } diff --git a/CefSharp.OutOfProcess.Core/OutOfProcessConnectionTransport.cs b/CefSharp.OutOfProcess.Core/OutOfProcessConnectionTransport.cs index a08309f..733e7a7 100644 --- a/CefSharp.OutOfProcess.Core/OutOfProcessConnectionTransport.cs +++ b/CefSharp.OutOfProcess.Core/OutOfProcessConnectionTransport.cs @@ -12,6 +12,7 @@ public class OutOfProcessConnectionTransport : IConnectionTransport public event EventHandler MessageReceived; public event EventHandler MessageError; + public event EventHandler Disconnected; public OutOfProcessConnectionTransport(int browserId, OutOfProcessHost outOfProcessHost) { diff --git a/CefSharp.OutOfProcess.Core/OutOfProcessHost.cs b/CefSharp.OutOfProcess.Core/OutOfProcessHost.cs index 1fec5c4..a144da0 100644 --- a/CefSharp.OutOfProcess.Core/OutOfProcessHost.cs +++ b/CefSharp.OutOfProcess.Core/OutOfProcessHost.cs @@ -1,4 +1,5 @@ using CefSharp.OutOfProcess.Interface; +using CefSharp.OutOfProcess.Interface.Callbacks; using CefSharp.OutOfProcess.Internal; using PInvoke; using StreamJsonRpc; @@ -6,6 +7,7 @@ using System.Collections.Concurrent; using System.Diagnostics; using System.IO; +using System.Linq; using System.Threading.Tasks; namespace CefSharp.OutOfProcess @@ -37,6 +39,8 @@ private OutOfProcessHost(string outOfProcessHostExePath, string cachePath = null _cachePath = cachePath; } + public event EventHandler FileDialogCallback; + /// /// UI Thread assocuated with this /// @@ -253,6 +257,20 @@ public static Task CreateAsync(string path = HostExeName, stri host.Init(); return host.InitializedTask; - } + } + + Task IOutOfProcessHostRpc.OnFileDialog(int browserId, string mode, string title, string defaultFilePath, string[] acceptFilters, int callback) + { + if (_browsers.TryGetValue(browserId, out var chromiumWebBrowser) && chromiumWebBrowser.DialogHandler != null) + { + + var result = chromiumWebBrowser.DialogHandler.OnFileDialog(chromiumWebBrowser, (CefFileDialogMode)Enum.Parse(typeof(CefFileDialogMode), mode), title, defaultFilePath, acceptFilters.ToList(), new FileDialogCallbackProxy(this, callback, chromiumWebBrowser)); + return Task.FromResult(result); + } + + return Task.FromResult(false); + } + + internal void InvokeFileDialogCallback(FileDialogCallbackDetails callbackDetails) => FileDialogCallback.Invoke(this, callbackDetails); } } diff --git a/CefSharp.OutOfProcess.Interface/Callbacks/CallbackDetails.cs b/CefSharp.OutOfProcess.Interface/Callbacks/CallbackDetails.cs new file mode 100644 index 0000000..a21bee1 --- /dev/null +++ b/CefSharp.OutOfProcess.Interface/Callbacks/CallbackDetails.cs @@ -0,0 +1,9 @@ +namespace CefSharp.OutOfProcess.Interface.Callbacks +{ + public class CallbackDetails + { + public int BrowserId { get; set; } + + public int CallbackId { get; set; } + } +} diff --git a/CefSharp.OutOfProcess.Interface/Callbacks/FileDialogCallbackDetails.cs b/CefSharp.OutOfProcess.Interface/Callbacks/FileDialogCallbackDetails.cs new file mode 100644 index 0000000..195143a --- /dev/null +++ b/CefSharp.OutOfProcess.Interface/Callbacks/FileDialogCallbackDetails.cs @@ -0,0 +1,9 @@ +namespace CefSharp.OutOfProcess.Interface.Callbacks +{ + public class FileDialogCallbackDetails : CallbackDetails + { + public string[] Files { get; set; } + + public bool Continue { get; set; } + } +} diff --git a/CefSharp.OutOfProcess.Interface/IOutOfProcessHostRpc.cs b/CefSharp.OutOfProcess.Interface/IOutOfProcessHostRpc.cs index 2ff909e..b7dd461 100644 --- a/CefSharp.OutOfProcess.Interface/IOutOfProcessHostRpc.cs +++ b/CefSharp.OutOfProcess.Interface/IOutOfProcessHostRpc.cs @@ -1,4 +1,6 @@ -using System; +using CefSharp.OutOfProcess.Interface.Callbacks; +using System; +using System.Threading.Tasks; namespace CefSharp.OutOfProcess.Interface { @@ -78,5 +80,10 @@ public interface IOutOfProcessHostRpc /// Cef Version /// Chromium Version void NotifyContextInitialized(int threadId, string cefSharpVersion, string cefVersion, string chromiumVersion); + + Task OnFileDialog(int browserId, string mode, string title, string defaultFilePath, string[] acceptFilters, int callback); + + event EventHandler FileDialogCallback; + } } diff --git a/CefSharp.OutOfProcess.WinForms/CefSharp.OutOfProcess.WinForms.csproj b/CefSharp.OutOfProcess.WinForms/CefSharp.OutOfProcess.WinForms.csproj index fd55fc3..f3678f6 100644 --- a/CefSharp.OutOfProcess.WinForms/CefSharp.OutOfProcess.WinForms.csproj +++ b/CefSharp.OutOfProcess.WinForms/CefSharp.OutOfProcess.WinForms.csproj @@ -2,6 +2,7 @@ netcoreapp3.1;net462 + AnyCPU true diff --git a/CefSharp.OutOfProcess.WinForms/ChromiumWebBrowser.cs b/CefSharp.OutOfProcess.WinForms/ChromiumWebBrowser.cs index a43100a..6656334 100644 --- a/CefSharp.OutOfProcess.WinForms/ChromiumWebBrowser.cs +++ b/CefSharp.OutOfProcess.WinForms/ChromiumWebBrowser.cs @@ -121,6 +121,8 @@ public IDevToolsContext DevToolsContext /// public Frame MainFrame => _devToolsContext == null ? null : _devToolsContext.MainFrame; + Handler.IDialogHandler IChromiumWebBrowser.DialogHandler { get => throw new NotImplementedException(); set => throw new NotImplementedException(); } + /// protected override void OnHandleCreated(EventArgs e) { diff --git a/CefSharp.OutOfProcess.Wpf.HwndHost/CefSharp.OutOfProcess.Wpf.HwndHost.csproj b/CefSharp.OutOfProcess.Wpf.HwndHost/CefSharp.OutOfProcess.Wpf.HwndHost.csproj index f686ad4..3aa5ecc 100644 --- a/CefSharp.OutOfProcess.Wpf.HwndHost/CefSharp.OutOfProcess.Wpf.HwndHost.csproj +++ b/CefSharp.OutOfProcess.Wpf.HwndHost/CefSharp.OutOfProcess.Wpf.HwndHost.csproj @@ -2,6 +2,7 @@ netcoreapp3.1;net462 + AnyCPU true diff --git a/CefSharp.OutOfProcess.Wpf.HwndHost/ChromiumWebBrowser.cs b/CefSharp.OutOfProcess.Wpf.HwndHost/ChromiumWebBrowser.cs index 93df485..096158b 100644 --- a/CefSharp.OutOfProcess.Wpf.HwndHost/ChromiumWebBrowser.cs +++ b/CefSharp.OutOfProcess.Wpf.HwndHost/ChromiumWebBrowser.cs @@ -1064,6 +1064,8 @@ public IChromiumWebBrowser WebBrowser set { SetValue(WebBrowserProperty, value); } } + Handler.IDialogHandler IChromiumWebBrowser.DialogHandler { get => throw new NotImplementedException(); set => throw new NotImplementedException(); } + /// /// The WebBrowser property /// From 2b666487991910338ef9b1caa2ea2cec9ddb08ca Mon Sep 17 00:00:00 2001 From: yy-2020 Date: Tue, 24 Jan 2023 11:35:54 +0100 Subject: [PATCH 2/5] remove references to cefsharp.common --- .../CefSharp.OutOfProcess.Core.csproj | 1 - CefSharp.OutOfProcess.Core/Handler/IDialogHandler.cs | 3 ++- CefSharp.OutOfProcess.Core/OutOfProcessHost.cs | 3 +-- .../Callbacks/IFileDialogCallback.cs | 11 +++++++++++ 4 files changed, 14 insertions(+), 4 deletions(-) create mode 100644 CefSharp.OutOfProcess.Interface/Callbacks/IFileDialogCallback.cs diff --git a/CefSharp.OutOfProcess.Core/CefSharp.OutOfProcess.Core.csproj b/CefSharp.OutOfProcess.Core/CefSharp.OutOfProcess.Core.csproj index 129b32a..9ef402e 100644 --- a/CefSharp.OutOfProcess.Core/CefSharp.OutOfProcess.Core.csproj +++ b/CefSharp.OutOfProcess.Core/CefSharp.OutOfProcess.Core.csproj @@ -7,7 +7,6 @@ - diff --git a/CefSharp.OutOfProcess.Core/Handler/IDialogHandler.cs b/CefSharp.OutOfProcess.Core/Handler/IDialogHandler.cs index 3f7f49a..5323cdd 100644 --- a/CefSharp.OutOfProcess.Core/Handler/IDialogHandler.cs +++ b/CefSharp.OutOfProcess.Core/Handler/IDialogHandler.cs @@ -1,6 +1,7 @@ namespace CefSharp.OutOfProcess.Handler { using System.Collections.Generic; + using CefSharp.OutOfProcess.Interface.Callbacks; public interface IDialogHandler { @@ -38,6 +39,6 @@ public interface IDialogHandler // Returns: // To display a custom dialog return true. To display the default dialog return // false. - bool OnFileDialog(IChromiumWebBrowser chromiumWebBrowser, CefFileDialogMode mode, string title, string defaultFilePath, IEnumerable acceptFilters, IFileDialogCallback callback); + bool OnFileDialog(IChromiumWebBrowser chromiumWebBrowser, string mode, string title, string defaultFilePath, IEnumerable acceptFilters, IFileDialogCallback callback); } } \ No newline at end of file diff --git a/CefSharp.OutOfProcess.Core/OutOfProcessHost.cs b/CefSharp.OutOfProcess.Core/OutOfProcessHost.cs index a144da0..4f3cc3f 100644 --- a/CefSharp.OutOfProcess.Core/OutOfProcessHost.cs +++ b/CefSharp.OutOfProcess.Core/OutOfProcessHost.cs @@ -263,8 +263,7 @@ Task IOutOfProcessHostRpc.OnFileDialog(int browserId, string mode, string { if (_browsers.TryGetValue(browserId, out var chromiumWebBrowser) && chromiumWebBrowser.DialogHandler != null) { - - var result = chromiumWebBrowser.DialogHandler.OnFileDialog(chromiumWebBrowser, (CefFileDialogMode)Enum.Parse(typeof(CefFileDialogMode), mode), title, defaultFilePath, acceptFilters.ToList(), new FileDialogCallbackProxy(this, callback, chromiumWebBrowser)); + var result = chromiumWebBrowser.DialogHandler.OnFileDialog(chromiumWebBrowser, mode, title, defaultFilePath, acceptFilters.ToList(), new FileDialogCallbackProxy(this, callback, chromiumWebBrowser)); return Task.FromResult(result); } diff --git a/CefSharp.OutOfProcess.Interface/Callbacks/IFileDialogCallback.cs b/CefSharp.OutOfProcess.Interface/Callbacks/IFileDialogCallback.cs new file mode 100644 index 0000000..a758745 --- /dev/null +++ b/CefSharp.OutOfProcess.Interface/Callbacks/IFileDialogCallback.cs @@ -0,0 +1,11 @@ +namespace CefSharp.OutOfProcess.Interface.Callbacks +{ + using System.Collections.Generic; + + public interface IFileDialogCallback + { + bool IsDisposed { get; } + void Cancel(); + void Continue(List filePaths); + } +} From fb4eb7f270526c7c5c750df51b2baccd2a7f1d69 Mon Sep 17 00:00:00 2001 From: yy-2020 Date: Wed, 25 Jan 2023 09:22:49 +0100 Subject: [PATCH 3/5] restore netstandard2.0 --- CefSharp.OutOfProcess.Core/CefSharp.OutOfProcess.Core.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CefSharp.OutOfProcess.Core/CefSharp.OutOfProcess.Core.csproj b/CefSharp.OutOfProcess.Core/CefSharp.OutOfProcess.Core.csproj index 9ef402e..bd38784 100644 --- a/CefSharp.OutOfProcess.Core/CefSharp.OutOfProcess.Core.csproj +++ b/CefSharp.OutOfProcess.Core/CefSharp.OutOfProcess.Core.csproj @@ -1,7 +1,7 @@  - net462 + netstandard2.0 AnyCPU CefSharp.OutOfProcess From 85ca0fe10e4e2c23c0c9ac741c77ff5d0aeef479 Mon Sep 17 00:00:00 2001 From: yy-2020 Date: Wed, 25 Jan 2023 09:27:58 +0100 Subject: [PATCH 4/5] use getbrowser method --- .../BrowserProcessHandler.cs | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/CefSharp.OutOfProcess.BrowserProcess/BrowserProcessHandler.cs b/CefSharp.OutOfProcess.BrowserProcess/BrowserProcessHandler.cs index 37a5425..d4c14e5 100644 --- a/CefSharp.OutOfProcess.BrowserProcess/BrowserProcessHandler.cs +++ b/CefSharp.OutOfProcess.BrowserProcess/BrowserProcessHandler.cs @@ -74,7 +74,7 @@ private void _outOfProcessServer_FileDialogCallback(object sender, FileDialogCal { _ = CefThread.ExecuteOnUiThread(() => { - ((DialogHandlerProxy)GetBrowser(e.BrowserId).DialogHandler).Callback(e); + ((DialogHandlerProxy)GetBrowser(e.BrowserId).DialogHandler)?.Callback(e); return true; }); } @@ -83,10 +83,7 @@ Task IOutOfProcessClientRpc.SendDevToolsMessage(int browserId, string message) { return CefThread.ExecuteOnUiThread(() => { - var browser = _browsers.FirstOrDefault(x => x.Id == browserId); - - browser?.GetBrowserHost().SendDevToolsMessage(message); - + GetBrowser(browserId).GetBrowserHost()?.SendDevToolsMessage(message); return true; }); } @@ -127,16 +124,12 @@ Task IOutOfProcessClientRpc.CreateBrowser(IntPtr parentHwnd, string url, int id) void IOutOfProcessClientRpc.NotifyMoveOrResizeStarted(int browserId) { - var browser = _browsers.FirstOrDefault(x => x.Id == browserId); - - browser?.GetBrowserHost().NotifyMoveOrResizeStarted(); + GetBrowser(browserId).GetBrowserHost()?.NotifyMoveOrResizeStarted(); } void IOutOfProcessClientRpc.SetFocus(int browserId, bool focus) { - var browser = _browsers.FirstOrDefault(x => x.Id == browserId); - - browser?.GetBrowserHost().SetFocus(focus); + GetBrowser(browserId).GetBrowserHost()?.SetFocus(focus); } } } From 442be3c1bff5965a96df46b0d4e84516aa80ca16 Mon Sep 17 00:00:00 2001 From: yy-2020 Date: Tue, 31 Jan 2023 08:10:56 +0100 Subject: [PATCH 5/5] code review changes --- .../CallbackProxies/DialogHandlerProxy.cs | 11 +++++++++++ .../CallbackProxies/CallbackProxyBase.cs | 6 +----- .../CefSharp.OutOfProcess.Core.csproj | 2 +- .../CefSharp.OutOfProcess.WinForms.csproj | 1 - CefSharp.OutOfProcess.WinForms/ChromiumWebBrowser.cs | 2 +- .../CefSharp.OutOfProcess.Wpf.HwndHost.csproj | 1 - .../ChromiumWebBrowser.cs | 2 +- 7 files changed, 15 insertions(+), 10 deletions(-) diff --git a/CefSharp.OutOfProcess.BrowserProcess/CallbackProxies/DialogHandlerProxy.cs b/CefSharp.OutOfProcess.BrowserProcess/CallbackProxies/DialogHandlerProxy.cs index a0e30ab..e95aa27 100644 --- a/CefSharp.OutOfProcess.BrowserProcess/CallbackProxies/DialogHandlerProxy.cs +++ b/CefSharp.OutOfProcess.BrowserProcess/CallbackProxies/DialogHandlerProxy.cs @@ -3,6 +3,7 @@ using CefSharp.Handler; using System.Linq; using CefSharp.OutOfProcess.Interface.Callbacks; +using System; namespace CefSharp.OutOfProcess.BrowserProcess.CallbackProxies { @@ -17,6 +18,16 @@ public DialogHandlerProxy(IOutOfProcessHostRpc host) public void Callback(FileDialogCallbackDetails details) { + if (details == null) + { + throw new ArgumentNullException(nameof(details)); + } + + if (details.Files == null) + { + throw new ArgumentNullException(nameof(details.Files)); + } + var cb = GetCallback(details.CallbackId); if (details.Continue) diff --git a/CefSharp.OutOfProcess.Core/CallbackProxies/CallbackProxyBase.cs b/CefSharp.OutOfProcess.Core/CallbackProxies/CallbackProxyBase.cs index 2d43475..767814a 100644 --- a/CefSharp.OutOfProcess.Core/CallbackProxies/CallbackProxyBase.cs +++ b/CefSharp.OutOfProcess.Core/CallbackProxies/CallbackProxyBase.cs @@ -25,18 +25,14 @@ protected virtual void Dispose(bool disposing) { if (disposing) { - // TODO: dispose managed state (managed objects) } - - // TODO: free unmanaged resources (unmanaged objects) and override finalizer - // TODO: set large fields to null + disposedValue = true; } } void IDisposable.Dispose() { - // Do not change this code. Put cleanup code in 'Dispose(bool disposing)' method Dispose(disposing: true); GC.SuppressFinalize(this); } diff --git a/CefSharp.OutOfProcess.Core/CefSharp.OutOfProcess.Core.csproj b/CefSharp.OutOfProcess.Core/CefSharp.OutOfProcess.Core.csproj index bd38784..b886f7a 100644 --- a/CefSharp.OutOfProcess.Core/CefSharp.OutOfProcess.Core.csproj +++ b/CefSharp.OutOfProcess.Core/CefSharp.OutOfProcess.Core.csproj @@ -2,7 +2,6 @@ netstandard2.0 - AnyCPU CefSharp.OutOfProcess @@ -11,6 +10,7 @@ + diff --git a/CefSharp.OutOfProcess.WinForms/CefSharp.OutOfProcess.WinForms.csproj b/CefSharp.OutOfProcess.WinForms/CefSharp.OutOfProcess.WinForms.csproj index f3678f6..fd55fc3 100644 --- a/CefSharp.OutOfProcess.WinForms/CefSharp.OutOfProcess.WinForms.csproj +++ b/CefSharp.OutOfProcess.WinForms/CefSharp.OutOfProcess.WinForms.csproj @@ -2,7 +2,6 @@ netcoreapp3.1;net462 - AnyCPU true diff --git a/CefSharp.OutOfProcess.WinForms/ChromiumWebBrowser.cs b/CefSharp.OutOfProcess.WinForms/ChromiumWebBrowser.cs index 6656334..fce386d 100644 --- a/CefSharp.OutOfProcess.WinForms/ChromiumWebBrowser.cs +++ b/CefSharp.OutOfProcess.WinForms/ChromiumWebBrowser.cs @@ -121,7 +121,7 @@ public IDevToolsContext DevToolsContext /// public Frame MainFrame => _devToolsContext == null ? null : _devToolsContext.MainFrame; - Handler.IDialogHandler IChromiumWebBrowser.DialogHandler { get => throw new NotImplementedException(); set => throw new NotImplementedException(); } + Handler.IDialogHandler IChromiumWebBrowser.DialogHandler { get; set; } /// protected override void OnHandleCreated(EventArgs e) diff --git a/CefSharp.OutOfProcess.Wpf.HwndHost/CefSharp.OutOfProcess.Wpf.HwndHost.csproj b/CefSharp.OutOfProcess.Wpf.HwndHost/CefSharp.OutOfProcess.Wpf.HwndHost.csproj index 3aa5ecc..f686ad4 100644 --- a/CefSharp.OutOfProcess.Wpf.HwndHost/CefSharp.OutOfProcess.Wpf.HwndHost.csproj +++ b/CefSharp.OutOfProcess.Wpf.HwndHost/CefSharp.OutOfProcess.Wpf.HwndHost.csproj @@ -2,7 +2,6 @@ netcoreapp3.1;net462 - AnyCPU true diff --git a/CefSharp.OutOfProcess.Wpf.HwndHost/ChromiumWebBrowser.cs b/CefSharp.OutOfProcess.Wpf.HwndHost/ChromiumWebBrowser.cs index 096158b..6ff5b21 100644 --- a/CefSharp.OutOfProcess.Wpf.HwndHost/ChromiumWebBrowser.cs +++ b/CefSharp.OutOfProcess.Wpf.HwndHost/ChromiumWebBrowser.cs @@ -1064,7 +1064,7 @@ public IChromiumWebBrowser WebBrowser set { SetValue(WebBrowserProperty, value); } } - Handler.IDialogHandler IChromiumWebBrowser.DialogHandler { get => throw new NotImplementedException(); set => throw new NotImplementedException(); } + Handler.IDialogHandler IChromiumWebBrowser.DialogHandler { get; set; } /// /// The WebBrowser property