Skip to content

Commit 3f7c5c8

Browse files
committed
Core - Add IDownloadHandler.CanDownload
- Add IDownloadHandler.CanDownload - Add to Fluent implementation - Update examples https://bitbucket.org/chromiumembedded/cef/commits/6d7a6801871cd4fcceb174dfa99a5b46da6253c1 Resolves #4090
1 parent c09328b commit 3f7c5c8

File tree

9 files changed

+108
-48
lines changed

9 files changed

+108
-48
lines changed

CefSharp.Core.Runtime/Internals/ClientAdapter.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -990,6 +990,20 @@ namespace CefSharp
990990
}
991991
}
992992

993+
bool ClientAdapter::CanDownload(CefRefPtr<CefBrowser> browser, const CefString& url, const CefString& request_method)
994+
{
995+
auto handler = _browserControl->DownloadHandler;
996+
997+
if (handler == nullptr)
998+
{
999+
return true;
1000+
}
1001+
1002+
auto browserWrapper = GetBrowserWrapper(browser->GetIdentifier(), browser->IsPopup());
1003+
1004+
return handler->CanDownload(_browserControl, browserWrapper, StringUtils::ToClr(url), StringUtils::ToClr(request_method));
1005+
}
1006+
9931007
void ClientAdapter::OnBeforeDownload(CefRefPtr<CefBrowser> browser, CefRefPtr<CefDownloadItem> download_item,
9941008
const CefString& suggested_name, CefRefPtr<CefBeforeDownloadCallback> callback)
9951009
{

CefSharp.Core.Runtime/Internals/ClientAdapter.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,7 @@ namespace CefSharp
187187
virtual DECL void OnDraggableRegionsChanged(CefRefPtr<CefBrowser> browser, CefRefPtr<CefFrame> frame, const std::vector<CefDraggableRegion>& regions) override;
188188

189189
//CefDownloadHandler
190+
virtual DECL bool CanDownload(CefRefPtr<CefBrowser> browser, const CefString & url, const CefString & request_method) override;
190191
virtual DECL void OnBeforeDownload(CefRefPtr<CefBrowser> browser, CefRefPtr<CefDownloadItem> download_item,
191192
const CefString& suggested_name, CefRefPtr<CefBeforeDownloadCallback> callback) override;
192193
virtual DECL void OnDownloadUpdated(CefRefPtr<CefBrowser> browser, CefRefPtr<CefDownloadItem> download_item,

CefSharp.Core/Fluent/DownloadHandler.cs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,18 @@
66

77
namespace CefSharp.Fluent
88
{
9+
/// <summary>
10+
/// Called before a download begins in response to a user-initiated action
11+
/// (e.g. alt + link click or link click that returns a `Content-Disposition:
12+
/// attachment` response from the server).
13+
/// </summary>
14+
/// <param name="chromiumWebBrowser">the ChromiumWebBrowser control</param>
15+
/// <param name="browser">The browser instance</param>
16+
/// <param name="url">is the target download URL</param>
17+
/// <param name="requestMethod">is the target method (GET, POST, etc)</param>
18+
/// <returns>Return true to proceed with the download or false to cancel the download.</returns>
19+
public delegate bool CanDownloadDelegate(IWebBrowser chromiumWebBrowser, IBrowser browser, string url, string requestMethod);
20+
921
/// <summary>
1022
/// Called before a download begins.
1123
/// </summary>
@@ -30,6 +42,7 @@ namespace CefSharp.Fluent
3042
/// </summary>
3143
public class DownloadHandler : Handler.DownloadHandler
3244
{
45+
private CanDownloadDelegate canDownload;
3346
private OnBeforeDownloadDelegate onBeforeDownload;
3447
private OnDownloadUpdatedDelegate onDownloadUpdated;
3548

@@ -94,6 +107,11 @@ internal DownloadHandler()
94107

95108
}
96109

110+
internal void SetCanDownload(CanDownloadDelegate action)
111+
{
112+
canDownload = action;
113+
}
114+
97115
internal void SetOnBeforeDownload(OnBeforeDownloadDelegate action)
98116
{
99117
onBeforeDownload = action;
@@ -104,6 +122,12 @@ internal void SetOnDownloadUpdated(OnDownloadUpdatedDelegate action)
104122
onDownloadUpdated = action;
105123
}
106124

125+
/// <inheritdoc/>
126+
protected override bool CanDownload(IWebBrowser chromiumWebBrowser, IBrowser browser, string url, string requestMethod)
127+
{
128+
return canDownload?.Invoke(chromiumWebBrowser, browser, url, requestMethod) ?? true;
129+
}
130+
107131
/// <inheritdoc/>
108132
protected override void OnBeforeDownload(IWebBrowser chromiumWebBrowser, IBrowser browser, DownloadItem downloadItem, IBeforeDownloadCallback callback)
109133
{

CefSharp.Core/Fluent/DownloadHandlerBuilder.cs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,22 @@ public class DownloadHandlerBuilder
1111
{
1212
private readonly DownloadHandler handler = new DownloadHandler();
1313

14+
/// <summary>
15+
/// See <see cref="IDownloadHandler.CanDownload(IWebBrowser, IBrowser, string, string)"/> for details.
16+
/// </summary>
17+
/// <param name="action">Action to be executed when <see cref="IDownloadHandler.CanDownload(IWebBrowser, IBrowser, string, string)"/>
18+
/// is called</param>
19+
/// <returns>
20+
/// Fluent Builder, call <see cref="Build"/> to create
21+
/// a new <see cref="IDownloadHandler"/> instance
22+
/// </returns>
23+
public DownloadHandlerBuilder CanDownload(CanDownloadDelegate action)
24+
{
25+
handler.SetCanDownload(action);
26+
27+
return this;
28+
}
29+
1430
/// <summary>
1531
/// See <see cref="IDownloadHandler.OnBeforeDownload(IWebBrowser, IBrowser, DownloadItem, IBeforeDownloadCallback)"/> for details.
1632
/// </summary>

CefSharp.Example/Handlers/DownloadHandler.cs

Lines changed: 0 additions & 33 deletions
This file was deleted.

CefSharp.WinForms.Example/BrowserTabUserControl.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ public BrowserTabUserControl(Action<string, int?> openNewTab, string url, bool m
5757
browser.MenuHandler = new MenuHandler();
5858
browser.RequestHandler = new WinFormsRequestHandler(openNewTab);
5959
browser.JsDialogHandler = new JsDialogHandler();
60-
browser.DownloadHandler = new DownloadHandler();
60+
browser.DownloadHandler = Fluent.DownloadHandler.AskUser();
6161
browser.AudioHandler = new CefSharp.Handler.AudioHandler();
6262
browser.FrameHandler = new CefSharp.Handler.FrameHandler();
6363

CefSharp.Wpf.Example/Views/BrowserTabView.xaml.cs

Lines changed: 19 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
using CefSharp.Example.JavascriptBinding;
1414
using CefSharp.Example.ModelBinding;
1515
using CefSharp.Example.PostMessage;
16+
using CefSharp.Fluent;
1617
using CefSharp.Wpf.Example.Handlers;
1718
using CefSharp.Wpf.Example.ViewModels;
1819
using CefSharp.Wpf.Experimental.Accessibility;
@@ -131,10 +132,24 @@ public BrowserTabView()
131132
}
132133
};
133134

134-
var downloadHandler = new DownloadHandler();
135-
downloadHandler.OnBeforeDownloadFired += OnBeforeDownloadFired;
136-
downloadHandler.OnDownloadUpdatedFired += OnDownloadUpdatedFired;
137-
browser.DownloadHandler = downloadHandler;
135+
browser.DownloadHandler = DownloadHandler
136+
.Create()
137+
.CanDownload((chromiumWebBrowser, browser, url, requestMethod) =>
138+
{
139+
//All all downloads
140+
return true;
141+
})
142+
.OnBeforeDownload((chromiumWebBrowser, browser, downloadItem, callback) =>
143+
{
144+
UpdateDownloadAction("OnBeforeDownload", downloadItem);
145+
146+
callback.Continue("", showDialog: true);
147+
148+
}).OnDownloadUpdated((chromiumWebBrowser, browser, downloadItem, callback) =>
149+
{
150+
UpdateDownloadAction("OnDownloadUpdated", downloadItem);
151+
})
152+
.Build();
138153
browser.AudioHandler = new CefSharp.Handler.AudioHandler();
139154

140155
//Read an embedded bitmap into a memory stream then register it as a resource you can then load custom://cefsharp/images/beach.jpg
@@ -238,16 +253,6 @@ private void OnBrowserJavascriptMessageReceived(object sender, JavascriptMessage
238253

239254
}
240255

241-
private void OnBeforeDownloadFired(object sender, DownloadItem e)
242-
{
243-
this.UpdateDownloadAction("OnBeforeDownload", e);
244-
}
245-
246-
private void OnDownloadUpdatedFired(object sender, DownloadItem e)
247-
{
248-
this.UpdateDownloadAction("OnDownloadUpdated", e);
249-
}
250-
251256
private void UpdateDownloadAction(string downloadAction, DownloadItem downloadItem)
252257
{
253258
this.Dispatcher.InvokeAsync(() =>

CefSharp/Handler/DownloadHandler.cs

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,27 @@ namespace CefSharp.Handler
1010
/// </summary>
1111
public class DownloadHandler : IDownloadHandler
1212
{
13+
/// <inheritdoc />
14+
bool IDownloadHandler.CanDownload(IWebBrowser chromiumWebBrowser, IBrowser browser, string url, string requestMethod)
15+
{
16+
return CanDownload(chromiumWebBrowser, browser, url, requestMethod);
17+
}
18+
19+
/// <summary>
20+
/// Called before a download begins in response to a user-initiated action
21+
/// (e.g. alt + link click or link click that returns a `Content-Disposition:
22+
/// attachment` response from the server).
23+
/// </summary>
24+
/// <param name="chromiumWebBrowser">the ChromiumWebBrowser control</param>
25+
/// <param name="browser">The browser instance</param>
26+
/// <param name="url">is the target download URL</param>
27+
/// <param name="requestMethod">is the target method (GET, POST, etc)</param>
28+
/// <returns>Return true to proceed with the download or false to cancel the download.</returns>
29+
protected virtual bool CanDownload(IWebBrowser chromiumWebBrowser, IBrowser browser, string url, string requestMethod)
30+
{
31+
return true;
32+
}
33+
1334
/// <summary>
1435
/// Called before a download begins.
1536
/// </summary>

CefSharp/Handler/IDownloadHandler.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,18 @@ namespace CefSharp
1010
/// </summary>
1111
public interface IDownloadHandler
1212
{
13+
/// <summary>
14+
/// Called before a download begins in response to a user-initiated action
15+
/// (e.g. alt + link click or link click that returns a `Content-Disposition:
16+
/// attachment` response from the server).
17+
/// </summary>
18+
/// <param name="chromiumWebBrowser">the ChromiumWebBrowser control</param>
19+
/// <param name="browser">The browser instance</param>
20+
/// <param name="url">is the target download URL</param>
21+
/// <param name="requestMethod">is the target method (GET, POST, etc)</param>
22+
/// <returns>Return true to proceed with the download or false to cancel the download.</returns>
23+
bool CanDownload(IWebBrowser chromiumWebBrowser, IBrowser browser, string url, string requestMethod);
24+
1325
/// <summary>
1426
/// Called before a download begins.
1527
/// </summary>

0 commit comments

Comments
 (0)