diff --git a/CefSharp.OutOfProcess.BrowserProcess/BrowserProcessHandler.cs b/CefSharp.OutOfProcess.BrowserProcess/BrowserProcessHandler.cs index eb35359..476650d 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,8 +40,22 @@ protected override void OnContextInitialized() var threadId = Kernel32.GetCurrentThreadId(); _outOfProcessServer.NotifyContextInitialized(threadId, Cef.CefSharpVersion, Cef.CefVersion, Cef.ChromiumVersion); + _outOfProcessServer.BeforeDownloadCallback += _outOfProcessServer_BeforeDownloadCallback; + _outOfProcessServer.DownloadCallback += _outOfProcessServer_DownloadCallback; } + private void _outOfProcessServer_DownloadCallback(object sender, DownloadCallbackDetails e) + { + ((DownloadHandlerProxy)GetBrowser(e.BrowserId).DownloadHandler)?.DownloadCallback(e); + } + + private void _outOfProcessServer_BeforeDownloadCallback(object sender, BeforeDownloadCallbackDetails e) + { + ((DownloadHandlerProxy)GetBrowser(e.BrowserId).DownloadHandler)?.BeforeDownloadCallback(e); + } + + private OutOfProcessChromiumWebBrowser GetBrowser(int id) => _browsers.FirstOrDefault(x => x.Id == id); + protected override void Dispose(bool disposing) { base.Dispose(disposing); @@ -69,9 +85,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; }); @@ -120,9 +134,7 @@ void IOutOfProcessClientRpc.NotifyMoveOrResizeStarted(int browserId) void IOutOfProcessClientRpc.SetFocus(int browserId, bool focus) { - var browser = _browsers.FirstOrDefault(x => x.Id == browserId); - - browser?.GetBrowserHost().SetFocus(focus); + GetBrowser(browserId).GetBrowserHost().SetFocus(focus); } } } 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/DownloadHandlerProxy.cs b/CefSharp.OutOfProcess.BrowserProcess/CallbackProxies/DownloadHandlerProxy.cs new file mode 100644 index 0000000..456ee4c --- /dev/null +++ b/CefSharp.OutOfProcess.BrowserProcess/CallbackProxies/DownloadHandlerProxy.cs @@ -0,0 +1,73 @@ +namespace CefSharp.OutOfProcess.BrowserProcess.CallbackProxies +{ + using System.Diagnostics; + using CefSharp; + using CefSharp.OutOfProcess.Interface; + using CefSharp.OutOfProcess.Interface.Callbacks; + + internal class DownloadHandlerProxy : CallbackProxyBase, IDownloadHandler + { + public DownloadHandlerProxy(IOutOfProcessHostRpc host) + : base(host) + { + } + + public void BeforeDownloadCallback(BeforeDownloadCallbackDetails details) + { + ((CefSharp.OutOfProcess.Interface.Callbacks.IBeforeDownloadCallback)GetCallback(details.CallbackId)).Continue(details.DownloadPath, details.ShowDialog); + } + + public void DownloadCallback(DownloadCallbackDetails details) + { + var cb = (CefSharp.OutOfProcess.Interface.Callbacks.IDownloadItemCallback)GetCallback(details.CallbackId); + if (details.Cancel) + { + cb.Cancel(); + } + else if (details.Pause) + { + cb.Pause(); + } + else if (details.Resume) + { + cb.Resume(); + } + } + + bool IDownloadHandler.CanDownload(IWebBrowser chromiumWebBrowser, IBrowser browser, string url, string requestMethod) + { + return host.OnCanDownloadAsync(((OutOfProcessChromiumWebBrowser)chromiumWebBrowser).Id, url, requestMethod).Result; + } + + void IDownloadHandler.OnBeforeDownload(IWebBrowser chromiumWebBrowser, IBrowser browser, CefSharp.DownloadItem downloadItem, CefSharp.IBeforeDownloadCallback callback) + { + host.OnBeforeDownload(((OutOfProcessChromiumWebBrowser)chromiumWebBrowser).Id, Convert(downloadItem), CreateCallback(callback)); + } + + void IDownloadHandler.OnDownloadUpdated(IWebBrowser chromiumWebBrowser, IBrowser browser, CefSharp.DownloadItem downloadItem, CefSharp.IDownloadItemCallback callback) + { + host.OnDownloadUpdated(((OutOfProcessChromiumWebBrowser)chromiumWebBrowser).Id, Convert(downloadItem), CreateCallback(callback)); + } + + private static CefSharp.OutOfProcess.Interface.Callbacks.DownloadItem Convert(CefSharp.DownloadItem item) => new CefSharp.OutOfProcess.Interface.Callbacks.DownloadItem() + { + SuggestedFileName = item.SuggestedFileName, + CurrentSpeed = item.CurrentSpeed, + Id = item.Id, + ContentDisposition = item.ContentDisposition, + EndTime = item.EndTime, + FullPath = item.FullPath, + IsCancelled = item.IsCancelled, + IsComplete = item.IsComplete, + IsInProgress = item.IsInProgress, + IsValid = item.IsValid, + MimeType = item.MimeType, + OriginalUrl = item.OriginalUrl, + PercentComplete = item.PercentComplete, + ReceivedBytes = item.ReceivedBytes, + StartTime = item.StartTime, + TotalBytes = item.TotalBytes, + Url = item.Url, + }; + } +} \ No newline at end of file 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/DownloadCallbackProxy.cs b/CefSharp.OutOfProcess.Core/CallbackProxies/DownloadCallbackProxy.cs new file mode 100644 index 0000000..5ce3034 --- /dev/null +++ b/CefSharp.OutOfProcess.Core/CallbackProxies/DownloadCallbackProxy.cs @@ -0,0 +1,54 @@ +namespace CefSharp.OutOfProcess +{ + using CefSharp.OutOfProcess.Interface.Callbacks; + using CefSharp.OutOfProcess.Internal; + + internal sealed class DownloadCallbackProxy : CallbackProxyBase, IBeforeDownloadCallback, IDownloadItemCallback + { + public DownloadCallbackProxy(OutOfProcessHost outOfProcessHost, int callback, IChromiumWebBrowserInternal chromiumWebBrowser) + : base(outOfProcessHost, callback, chromiumWebBrowser) + { + } + + void IDownloadItemCallback.Cancel() + { + outOfProcessHost.InvokeDownloadCallback(new DownloadCallbackDetails() + { + CallbackId = callback, + BrowserId = chromiumWebBrowser.Id, + Cancel = true, + }); + } + + void IBeforeDownloadCallback.Continue(string downloadPath, bool showDialog) + { + outOfProcessHost.InvokeBeforeDownloadCallback(new BeforeDownloadCallbackDetails() + { + CallbackId = callback, + BrowserId = chromiumWebBrowser.Id, + DownloadPath = downloadPath, + ShowDialog = showDialog, + }); + } + + void IDownloadItemCallback.Pause() + { + outOfProcessHost.InvokeDownloadCallback(new DownloadCallbackDetails() + { + CallbackId = callback, + BrowserId = chromiumWebBrowser.Id, + Pause = true, + }); + } + + void IDownloadItemCallback.Resume() + { + outOfProcessHost.InvokeDownloadCallback(new DownloadCallbackDetails() + { + CallbackId = callback, + BrowserId = chromiumWebBrowser.Id, + Resume = true, + }); + } + } +} diff --git a/CefSharp.OutOfProcess.Core/CefSharp.OutOfProcess.Core.csproj b/CefSharp.OutOfProcess.Core/CefSharp.OutOfProcess.Core.csproj index 59e3902..bf1cba0 100644 --- a/CefSharp.OutOfProcess.Core/CefSharp.OutOfProcess.Core.csproj +++ b/CefSharp.OutOfProcess.Core/CefSharp.OutOfProcess.Core.csproj @@ -1,7 +1,8 @@  - netstandard2.0 + net462 + AnyCPU CefSharp.OutOfProcess @@ -9,8 +10,8 @@ + - diff --git a/CefSharp.OutOfProcess.Core/Handler/IDownloadHandler.cs b/CefSharp.OutOfProcess.Core/Handler/IDownloadHandler.cs new file mode 100644 index 0000000..74343af --- /dev/null +++ b/CefSharp.OutOfProcess.Core/Handler/IDownloadHandler.cs @@ -0,0 +1,13 @@ +namespace CefSharp.OutOfProcess.Handler +{ + using CefSharp.OutOfProcess.Interface.Callbacks; + + public interface IDownloadHandler + { + bool CanDownload(IChromiumWebBrowser chromiumWebBrowser, string url, string requestMethod); + + void OnBeforeDownload(IChromiumWebBrowser chromiumWebBrowser, CefSharp.OutOfProcess.Interface.Callbacks.DownloadItem downloadItem, IBeforeDownloadCallback callback); + + void OnDownloadUpdated(IChromiumWebBrowser chromiumWebBrowser, CefSharp.OutOfProcess.Interface.Callbacks.DownloadItem downloadItem, IDownloadItemCallback callback); + } +} \ No newline at end of file diff --git a/CefSharp.OutOfProcess.Core/IChromiumWebBrowser.cs b/CefSharp.OutOfProcess.Core/IChromiumWebBrowser.cs index 9704d7b..a3d7d7a 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.IDownloadHandler DownloadHandler { 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..8880188 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; @@ -37,6 +38,11 @@ private OutOfProcessHost(string outOfProcessHostExePath, string cachePath = null _cachePath = cachePath; } + public event EventHandler DownloadCallback; + + public event EventHandler BeforeDownloadCallback; + + /// /// UI Thread assocuated with this /// @@ -135,18 +141,12 @@ private void OnBrowserProcessExited(object sender, EventArgs e) void IOutOfProcessHostRpc.NotifyAddressChanged(int browserId, string address) { - if (_browsers.TryGetValue(browserId, out var chromiumWebBrowser)) - { - chromiumWebBrowser.SetAddress(address); - } + GetBrowser(browserId)?.SetAddress(address); } void IOutOfProcessHostRpc.NotifyBrowserCreated(int browserId, IntPtr browserHwnd) { - if (_browsers.TryGetValue(browserId, out var chromiumWebBrowser)) - { - chromiumWebBrowser.OnAfterBrowserCreated(browserHwnd); - } + GetBrowser(browserId)?.OnAfterBrowserCreated(browserHwnd); } void IOutOfProcessHostRpc.NotifyContextInitialized(int threadId, string cefSharpVersion, string cefVersion, string chromiumVersion) @@ -169,42 +169,27 @@ void IOutOfProcessHostRpc.NotifyDevToolsAgentDetached(int browserId) void IOutOfProcessHostRpc.NotifyDevToolsMessage(int browserId, string devToolsMessage) { - if (_browsers.TryGetValue(browserId, out var chromiumWebBrowser)) - { - chromiumWebBrowser.OnDevToolsMessage(devToolsMessage); - } + GetBrowser(browserId)?.OnDevToolsMessage(devToolsMessage); } void IOutOfProcessHostRpc.NotifyDevToolsReady(int browserId) { - if (_browsers.TryGetValue(browserId, out var chromiumWebBrowser)) - { - chromiumWebBrowser.OnDevToolsReady(); - } + GetBrowser(browserId)?.OnDevToolsReady(); } void IOutOfProcessHostRpc.NotifyLoadingStateChange(int browserId, bool canGoBack, bool canGoForward, bool isLoading) { - if (_browsers.TryGetValue(browserId, out var chromiumWebBrowser)) - { - chromiumWebBrowser.SetLoadingStateChange(canGoBack, canGoForward, isLoading); - } + GetBrowser(browserId)?.SetLoadingStateChange(canGoBack, canGoForward, isLoading); } void IOutOfProcessHostRpc.NotifyStatusMessage(int browserId, string statusMessage) { - if (_browsers.TryGetValue(browserId, out var chromiumWebBrowser)) - { - chromiumWebBrowser.SetStatusMessage(statusMessage); - } + GetBrowser(browserId)?.SetStatusMessage(statusMessage); } void IOutOfProcessHostRpc.NotifyTitleChanged(int browserId, string title) { - if (_browsers.TryGetValue(browserId, out var chromiumWebBrowser)) - { - chromiumWebBrowser.SetTitle(title); - } + GetBrowser(browserId)?.SetTitle(title); } public void NotifyMoveOrResizeStarted(int id) @@ -253,6 +238,54 @@ public static Task CreateAsync(string path = HostExeName, stri host.Init(); return host.InitializedTask; - } + } + + + void IOutOfProcessHostRpc.OnBeforeDownload(int browserId, CefSharp.OutOfProcess.Interface.Callbacks.DownloadItem downloadItem, int callback) + { + if (_browsers.TryGetValue(browserId, out var chromiumWebBrowser)) + { + chromiumWebBrowser.DownloadHandler?.OnBeforeDownload(chromiumWebBrowser, downloadItem, new DownloadCallbackProxy(this, callback, chromiumWebBrowser)); + } + } + + void IOutOfProcessHostRpc.OnDownloadUpdated(int browserId, CefSharp.OutOfProcess.Interface.Callbacks.DownloadItem downloadItem, int callback) + { + if (_browsers.TryGetValue(browserId, out var chromiumWebBrowser)) + { + GetBrowser(browserId)?.DownloadHandler?.OnDownloadUpdated(chromiumWebBrowser, downloadItem, new DownloadCallbackProxy(this, callback, chromiumWebBrowser)); + } + } + + private IChromiumWebBrowserInternal GetBrowser(int browserId) + { + if (_browsers.TryGetValue(browserId, out var chromiumWebBrowser)) + { + return chromiumWebBrowser; + } + + return null; + } + + Task IOutOfProcessHostRpc.OnCanDownloadAsync(int browserId, string url, string requestMethod) + { + if (_browsers.TryGetValue(browserId, out var chromiumWebBrowser)) + { + var handler = chromiumWebBrowser.DownloadHandler; + if (handler == null) + { + return Task.FromResult(false); + } + + var result = handler.CanDownload(chromiumWebBrowser, url, requestMethod); + return Task.FromResult(result); + } + + return Task.FromResult(false); + } + + internal void InvokeBeforeDownloadCallback(BeforeDownloadCallbackDetails callbackDetails) => BeforeDownloadCallback.Invoke(this, callbackDetails); + + internal void InvokeDownloadCallback(DownloadCallbackDetails callbackDetails) => DownloadCallback.Invoke(this, callbackDetails); } } diff --git a/CefSharp.OutOfProcess.Interface/Callbacks/BeforeDownloadCallbackDetails.cs b/CefSharp.OutOfProcess.Interface/Callbacks/BeforeDownloadCallbackDetails.cs new file mode 100644 index 0000000..5a8dc9a --- /dev/null +++ b/CefSharp.OutOfProcess.Interface/Callbacks/BeforeDownloadCallbackDetails.cs @@ -0,0 +1,9 @@ +namespace CefSharp.OutOfProcess.Interface.Callbacks +{ + public sealed class BeforeDownloadCallbackDetails : CallbackDetails + { + public string DownloadPath { get; set; } + + public bool ShowDialog { get; set; } + } +} 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/DownloadCallbackDetails.cs b/CefSharp.OutOfProcess.Interface/Callbacks/DownloadCallbackDetails.cs new file mode 100644 index 0000000..b6b38c0 --- /dev/null +++ b/CefSharp.OutOfProcess.Interface/Callbacks/DownloadCallbackDetails.cs @@ -0,0 +1,11 @@ +namespace CefSharp.OutOfProcess.Interface.Callbacks +{ + public sealed class DownloadCallbackDetails : CallbackDetails + { + public bool Cancel { get; set; } + + public bool Pause { get; set; } + + public bool Resume { get; set; } + } +} diff --git a/CefSharp.OutOfProcess.Interface/Callbacks/DownloadItem.cs b/CefSharp.OutOfProcess.Interface/Callbacks/DownloadItem.cs new file mode 100644 index 0000000..76b9803 --- /dev/null +++ b/CefSharp.OutOfProcess.Interface/Callbacks/DownloadItem.cs @@ -0,0 +1,26 @@ +using System; + +namespace CefSharp.OutOfProcess.Interface.Callbacks +{ + + public sealed class DownloadItem + { + public string SuggestedFileName { get; set; } + public string OriginalUrl { get; set; } + public string Url { get; set; } + public int Id { get; set; } + public string FullPath { get; set; } + public DateTime? EndTime { get; set; } + public DateTime? StartTime { get; set; } + public long ReceivedBytes { get; set; } + public long TotalBytes { get; set; } + public int PercentComplete { get; set; } + public long CurrentSpeed { get; set; } + public bool IsCancelled { get; set; } + public bool IsComplete { get; set; } + public bool IsInProgress { get; set; } + public bool IsValid { get; set; } + public string ContentDisposition { get; set; } + public string MimeType { get; set; } + } +} \ No newline at end of file diff --git a/CefSharp.OutOfProcess.Interface/Callbacks/IBeforeDownloadCallback.cs b/CefSharp.OutOfProcess.Interface/Callbacks/IBeforeDownloadCallback.cs new file mode 100644 index 0000000..0bbc099 --- /dev/null +++ b/CefSharp.OutOfProcess.Interface/Callbacks/IBeforeDownloadCallback.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace CefSharp.OutOfProcess.Interface.Callbacks +{ + public interface IBeforeDownloadCallback : IDisposable + { + bool IsDisposed { get; } + void Continue(string downloadPath, bool showDialog); + } +} diff --git a/CefSharp.OutOfProcess.Interface/Callbacks/IDownloadItemCallback.cs b/CefSharp.OutOfProcess.Interface/Callbacks/IDownloadItemCallback.cs new file mode 100644 index 0000000..66f26c9 --- /dev/null +++ b/CefSharp.OutOfProcess.Interface/Callbacks/IDownloadItemCallback.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace CefSharp.OutOfProcess.Interface.Callbacks +{ + public interface IDownloadItemCallback : IDisposable + { + bool IsDisposed { get; } + void Cancel(); + void Pause(); + void Resume(); + } +} diff --git a/CefSharp.OutOfProcess.Interface/IOutOfProcessHostRpc.cs b/CefSharp.OutOfProcess.Interface/IOutOfProcessHostRpc.cs index 2ff909e..8388020 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,14 @@ public interface IOutOfProcessHostRpc /// Cef Version /// Chromium Version void NotifyContextInitialized(int threadId, string cefSharpVersion, string cefVersion, string chromiumVersion); + + Task OnCanDownloadAsync(int browserId, string url, string requestMethod); + + void OnBeforeDownload(int browserId, DownloadItem downloadItem, int callback); + + void OnDownloadUpdated(int browserId, DownloadItem downloadItem, int callback); + + event EventHandler BeforeDownloadCallback; + event EventHandler DownloadCallback; } } 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..efd15b4 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.IDownloadHandler IChromiumWebBrowser.DownloadHandler { 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 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..58dd793 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.IDownloadHandler IChromiumWebBrowser.DownloadHandler { get; set; } + /// /// The WebBrowser property ///