browser(webkit): support downloads on windows (#1642)
This commit is contained in:
parent
692f4db0a7
commit
f3f10ae3d8
|
|
@ -1 +1 @@
|
||||||
1185
|
1186
|
||||||
|
|
|
||||||
|
|
@ -5397,6 +5397,92 @@ index 82e6ffd18a3bcd8a14e4a1890fb549269c8b4252..17254c036846b7f80df6bc22e2e01fbc
|
||||||
const String& host = challenge.protectionSpace().host();
|
const String& host = challenge.protectionSpace().host();
|
||||||
NSArray *certificates = [NSURLRequest allowsSpecificHTTPSCertificateForHost:host];
|
NSArray *certificates = [NSURLRequest allowsSpecificHTTPSCertificateForHost:host];
|
||||||
if (!certificates)
|
if (!certificates)
|
||||||
|
diff --git a/Source/WebKit/NetworkProcess/curl/NetworkDataTaskCurl.cpp b/Source/WebKit/NetworkProcess/curl/NetworkDataTaskCurl.cpp
|
||||||
|
index 977a403be8dc962a9ccfa6428bc1d3e7c4682f86..5fb2c30136bffda04d4d5ffacea4511ef86ca427 100644
|
||||||
|
--- a/Source/WebKit/NetworkProcess/curl/NetworkDataTaskCurl.cpp
|
||||||
|
+++ b/Source/WebKit/NetworkProcess/curl/NetworkDataTaskCurl.cpp
|
||||||
|
@@ -26,9 +26,13 @@
|
||||||
|
#include "config.h"
|
||||||
|
#include "NetworkDataTaskCurl.h"
|
||||||
|
|
||||||
|
+#include "APIError.h"
|
||||||
|
#include "AuthenticationChallengeDisposition.h"
|
||||||
|
#include "AuthenticationManager.h"
|
||||||
|
+#include "DataReference.h"
|
||||||
|
+#include "Download.h"
|
||||||
|
#include "NetworkSessionCurl.h"
|
||||||
|
+#include "NetworkProcess.h"
|
||||||
|
#include <WebCore/AuthenticationChallenge.h>
|
||||||
|
#include <WebCore/CookieJar.h>
|
||||||
|
#include <WebCore/CurlRequest.h>
|
||||||
|
@@ -38,6 +42,7 @@
|
||||||
|
#include <WebCore/ResourceError.h>
|
||||||
|
#include <WebCore/SameSiteInfo.h>
|
||||||
|
#include <WebCore/SynchronousLoaderClient.h>
|
||||||
|
+#include <wtf/FileSystem.h>
|
||||||
|
|
||||||
|
namespace WebKit {
|
||||||
|
|
||||||
|
@@ -177,7 +182,12 @@ void NetworkDataTaskCurl::curlDidReceiveBuffer(CurlRequest&, Ref<SharedBuffer>&&
|
||||||
|
auto protectedThis = makeRef(*this);
|
||||||
|
if (state() == State::Canceling || state() == State::Completed || (!m_client && !isDownload()))
|
||||||
|
return;
|
||||||
|
-
|
||||||
|
+ if (isDownload()) {
|
||||||
|
+ FileSystem::PlatformFileHandle file = FileSystem::openFile(m_pendingDownloadLocation, FileSystem::FileOpenMode::Write);
|
||||||
|
+ FileSystem::writeToFile(file, buffer->data(), buffer->size());
|
||||||
|
+ FileSystem::closeFile(file);
|
||||||
|
+ return;
|
||||||
|
+ }
|
||||||
|
m_client->didReceiveData(WTFMove(buffer));
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -186,6 +196,12 @@ void NetworkDataTaskCurl::curlDidComplete(CurlRequest&, NetworkLoadMetrics&& net
|
||||||
|
if (state() == State::Canceling || state() == State::Completed || (!m_client && !isDownload()))
|
||||||
|
return;
|
||||||
|
|
||||||
|
+ if (isDownload()) {
|
||||||
|
+ auto* download = m_session->networkProcess().downloadManager().download(m_pendingDownloadID);
|
||||||
|
+ ASSERT(download);
|
||||||
|
+ download->didFinish();
|
||||||
|
+ return;
|
||||||
|
+ }
|
||||||
|
m_client->didCompleteWithError({ }, WTFMove(networkLoadMetrics));
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -199,6 +215,13 @@ void NetworkDataTaskCurl::curlDidFailWithError(CurlRequest& request, ResourceErr
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ if (isDownload()) {
|
||||||
|
+ auto* download = m_session->networkProcess().downloadManager().download(m_pendingDownloadID);
|
||||||
|
+ ASSERT(download);
|
||||||
|
+ download->didFail(resourceError, IPC::DataReference());
|
||||||
|
+ return;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
m_client->didCompleteWithError(resourceError);
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -235,6 +258,18 @@ void NetworkDataTaskCurl::invokeDidReceiveResponse()
|
||||||
|
break;
|
||||||
|
case PolicyAction::Ignore:
|
||||||
|
break;
|
||||||
|
+ case PolicyAction::Download: {
|
||||||
|
+ FileSystem::deleteFile(m_pendingDownloadLocation);
|
||||||
|
+ auto& downloadManager = m_session->networkProcess().downloadManager();
|
||||||
|
+ auto download = makeUnique<Download>(downloadManager, m_pendingDownloadID, *this, *m_session, suggestedFilename());
|
||||||
|
+ auto* downloadPtr = download.get();
|
||||||
|
+ downloadManager.dataTaskBecameDownloadTask(m_pendingDownloadID, WTFMove(download));
|
||||||
|
+ downloadPtr->didCreateDestination(m_pendingDownloadLocation);
|
||||||
|
+
|
||||||
|
+ if (m_curlRequest)
|
||||||
|
+ m_curlRequest->completeDidReceiveResponse();
|
||||||
|
+ break;
|
||||||
|
+ }
|
||||||
|
default:
|
||||||
|
notImplemented();
|
||||||
|
break;
|
||||||
diff --git a/Source/WebKit/NetworkProcess/curl/NetworkProcessCurl.cpp b/Source/WebKit/NetworkProcess/curl/NetworkProcessCurl.cpp
|
diff --git a/Source/WebKit/NetworkProcess/curl/NetworkProcessCurl.cpp b/Source/WebKit/NetworkProcess/curl/NetworkProcessCurl.cpp
|
||||||
index 20b659f5cf4895e75a2762a9260611cd5f2fff80..ef094ae0d772f9884fd3021ba0eb4f491264ddbf 100644
|
index 20b659f5cf4895e75a2762a9260611cd5f2fff80..ef094ae0d772f9884fd3021ba0eb4f491264ddbf 100644
|
||||||
--- a/Source/WebKit/NetworkProcess/curl/NetworkProcessCurl.cpp
|
--- a/Source/WebKit/NetworkProcess/curl/NetworkProcessCurl.cpp
|
||||||
|
|
@ -13381,10 +13467,18 @@ index d79c6fdc4fa05e1e4b9acdcc6932e571163320eb..99718b19797788634f4233a8892729b5
|
||||||
int m_toolbarItemsWidth { };
|
int m_toolbarItemsWidth { };
|
||||||
};
|
};
|
||||||
diff --git a/Tools/MiniBrowser/win/WebKitBrowserWindow.cpp b/Tools/MiniBrowser/win/WebKitBrowserWindow.cpp
|
diff --git a/Tools/MiniBrowser/win/WebKitBrowserWindow.cpp b/Tools/MiniBrowser/win/WebKitBrowserWindow.cpp
|
||||||
index 1e4fb27884034dcca333f77efd24150d4c9dc2ec..ed9046f38f0b517644f8c5208c8b7800fd2fc9fe 100644
|
index 1e4fb27884034dcca333f77efd24150d4c9dc2ec..30eaa65b5600fce08e6153bbd47fdbca900bbd7b 100644
|
||||||
--- a/Tools/MiniBrowser/win/WebKitBrowserWindow.cpp
|
--- a/Tools/MiniBrowser/win/WebKitBrowserWindow.cpp
|
||||||
+++ b/Tools/MiniBrowser/win/WebKitBrowserWindow.cpp
|
+++ b/Tools/MiniBrowser/win/WebKitBrowserWindow.cpp
|
||||||
@@ -106,7 +106,7 @@ WKRetainPtr<WKURLRef> createWKURL(const std::wstring& str)
|
@@ -32,6 +32,7 @@
|
||||||
|
#include <WebKit/WKAuthenticationDecisionListener.h>
|
||||||
|
#include <WebKit/WKCertificateInfoCurl.h>
|
||||||
|
#include <WebKit/WKCredential.h>
|
||||||
|
+#include <WebKit/WKFramePolicyListener.h>
|
||||||
|
#include <WebKit/WKInspector.h>
|
||||||
|
#include <WebKit/WKProtectionSpace.h>
|
||||||
|
#include <WebKit/WKProtectionSpaceCurl.h>
|
||||||
|
@@ -106,7 +107,7 @@ WKRetainPtr<WKURLRef> createWKURL(const std::wstring& str)
|
||||||
return adoptWK(WKURLCreateWithUTF8CString(utf8.data()));
|
return adoptWK(WKURLCreateWithUTF8CString(utf8.data()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -13393,7 +13487,7 @@ index 1e4fb27884034dcca333f77efd24150d4c9dc2ec..ed9046f38f0b517644f8c5208c8b7800
|
||||||
{
|
{
|
||||||
auto conf = adoptWK(WKPageConfigurationCreate());
|
auto conf = adoptWK(WKPageConfigurationCreate());
|
||||||
|
|
||||||
@@ -120,8 +120,8 @@ Ref<BrowserWindow> WebKitBrowserWindow::create(BrowserWindowClient& client, HWND
|
@@ -120,8 +121,8 @@ Ref<BrowserWindow> WebKitBrowserWindow::create(BrowserWindowClient& client, HWND
|
||||||
WKPreferencesSetDeveloperExtrasEnabled(prefs.get(), true);
|
WKPreferencesSetDeveloperExtrasEnabled(prefs.get(), true);
|
||||||
WKPageConfigurationSetPreferences(conf.get(), prefs.get());
|
WKPageConfigurationSetPreferences(conf.get(), prefs.get());
|
||||||
|
|
||||||
|
|
@ -13404,7 +13498,7 @@ index 1e4fb27884034dcca333f77efd24150d4c9dc2ec..ed9046f38f0b517644f8c5208c8b7800
|
||||||
|
|
||||||
return adoptRef(*new WebKitBrowserWindow(client, conf.get(), mainWnd));
|
return adoptRef(*new WebKitBrowserWindow(client, conf.get(), mainWnd));
|
||||||
}
|
}
|
||||||
@@ -142,11 +142,17 @@ WebKitBrowserWindow::WebKitBrowserWindow(BrowserWindowClient& client, WKPageConf
|
@@ -142,11 +143,17 @@ WebKitBrowserWindow::WebKitBrowserWindow(BrowserWindowClient& client, WKPageConf
|
||||||
navigationClient.didReceiveAuthenticationChallenge = didReceiveAuthenticationChallenge;
|
navigationClient.didReceiveAuthenticationChallenge = didReceiveAuthenticationChallenge;
|
||||||
WKPageSetPageNavigationClient(page, &navigationClient.base);
|
WKPageSetPageNavigationClient(page, &navigationClient.base);
|
||||||
|
|
||||||
|
|
@ -13424,15 +13518,20 @@ index 1e4fb27884034dcca333f77efd24150d4c9dc2ec..ed9046f38f0b517644f8c5208c8b7800
|
||||||
WKPageSetPageUIClient(page, &uiClient.base);
|
WKPageSetPageUIClient(page, &uiClient.base);
|
||||||
|
|
||||||
WKPageStateClientV0 stateClient = { };
|
WKPageStateClientV0 stateClient = { };
|
||||||
@@ -158,7 +164,6 @@ WebKitBrowserWindow::WebKitBrowserWindow(BrowserWindowClient& client, WKPageConf
|
@@ -158,7 +165,11 @@ WebKitBrowserWindow::WebKitBrowserWindow(BrowserWindowClient& client, WKPageConf
|
||||||
stateClient.didChangeActiveURL = didChangeActiveURL;
|
stateClient.didChangeActiveURL = didChangeActiveURL;
|
||||||
WKPageSetPageStateClient(page, &stateClient.base);
|
WKPageSetPageStateClient(page, &stateClient.base);
|
||||||
|
|
||||||
- updateProxySettings();
|
- updateProxySettings();
|
||||||
|
+ WKPagePolicyClientV1 policyClient = { };
|
||||||
|
+ policyClient.base.version = 1;
|
||||||
|
+ policyClient.base.clientInfo = this;
|
||||||
|
+ policyClient.decidePolicyForResponse_deprecatedForUseWithV0 = decidePolicyForResponse;
|
||||||
|
+ WKPageSetPagePolicyClient(page, &policyClient.base);
|
||||||
resetZoom();
|
resetZoom();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -182,6 +187,29 @@ void WebKitBrowserWindow::updateProxySettings()
|
@@ -182,6 +193,29 @@ void WebKitBrowserWindow::updateProxySettings()
|
||||||
WKWebsiteDataStoreEnableCustomNetworkProxySettings(store, url.get(), excludeHosts.get());
|
WKWebsiteDataStoreEnableCustomNetworkProxySettings(store, url.get(), excludeHosts.get());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -13462,7 +13561,7 @@ index 1e4fb27884034dcca333f77efd24150d4c9dc2ec..ed9046f38f0b517644f8c5208c8b7800
|
||||||
HRESULT WebKitBrowserWindow::init()
|
HRESULT WebKitBrowserWindow::init()
|
||||||
{
|
{
|
||||||
return S_OK;
|
return S_OK;
|
||||||
@@ -250,7 +278,6 @@ void WebKitBrowserWindow::openProxySettings()
|
@@ -250,7 +284,6 @@ void WebKitBrowserWindow::openProxySettings()
|
||||||
{
|
{
|
||||||
if (askProxySettings(m_hMainWnd, m_proxy))
|
if (askProxySettings(m_hMainWnd, m_proxy))
|
||||||
updateProxySettings();
|
updateProxySettings();
|
||||||
|
|
@ -13470,15 +13569,13 @@ index 1e4fb27884034dcca333f77efd24150d4c9dc2ec..ed9046f38f0b517644f8c5208c8b7800
|
||||||
}
|
}
|
||||||
|
|
||||||
void WebKitBrowserWindow::setUserAgent(_bstr_t& customUAString)
|
void WebKitBrowserWindow::setUserAgent(_bstr_t& customUAString)
|
||||||
@@ -388,18 +415,94 @@ bool WebKitBrowserWindow::canTrustServerCertificate(WKProtectionSpaceRef protect
|
@@ -388,18 +421,94 @@ bool WebKitBrowserWindow::canTrustServerCertificate(WKProtectionSpaceRef protect
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
-WKPageRef WebKitBrowserWindow::createNewPage(WKPageRef page, WKPageConfigurationRef configuration, WKNavigationActionRef navigationAction, WKWindowFeaturesRef windowFeatures, const void *clientInfo)
|
-WKPageRef WebKitBrowserWindow::createNewPage(WKPageRef page, WKPageConfigurationRef configuration, WKNavigationActionRef navigationAction, WKWindowFeaturesRef windowFeatures, const void *clientInfo)
|
||||||
+void WebKitBrowserWindow::closeWindow(WKPageRef page, const void* clientInfo)
|
+void WebKitBrowserWindow::closeWindow(WKPageRef page, const void* clientInfo)
|
||||||
{
|
+{
|
||||||
- auto& newWindow = MainWindow::create().leakRef();
|
|
||||||
- auto factory = [configuration](BrowserWindowClient& client, HWND mainWnd, bool) -> auto {
|
|
||||||
+ auto& thisWindow = toWebKitBrowserWindow(clientInfo);
|
+ auto& thisWindow = toWebKitBrowserWindow(clientInfo);
|
||||||
+ PostMessage(thisWindow.m_hMainWnd, WM_CLOSE, 0, 0);
|
+ PostMessage(thisWindow.m_hMainWnd, WM_CLOSE, 0, 0);
|
||||||
+}
|
+}
|
||||||
|
|
@ -13505,7 +13602,9 @@ index 1e4fb27884034dcca333f77efd24150d4c9dc2ec..ed9046f38f0b517644f8c5208c8b7800
|
||||||
+}
|
+}
|
||||||
+
|
+
|
||||||
+void WebKitBrowserWindow::runBeforeUnloadConfirmPanel(WKPageRef page, WKStringRef message, WKFrameRef frame, WKPageRunBeforeUnloadConfirmPanelResultListenerRef listener, const void *clientInfo)
|
+void WebKitBrowserWindow::runBeforeUnloadConfirmPanel(WKPageRef page, WKStringRef message, WKFrameRef frame, WKPageRunBeforeUnloadConfirmPanelResultListenerRef listener, const void *clientInfo)
|
||||||
+{
|
{
|
||||||
|
- auto& newWindow = MainWindow::create().leakRef();
|
||||||
|
- auto factory = [configuration](BrowserWindowClient& client, HWND mainWnd, bool) -> auto {
|
||||||
+ auto& thisWindow = toWebKitBrowserWindow(clientInfo);
|
+ auto& thisWindow = toWebKitBrowserWindow(clientInfo);
|
||||||
+ WKRetain(listener);
|
+ WKRetain(listener);
|
||||||
+ thisWindow.m_beforeUnloadDialog = listener;
|
+ thisWindow.m_beforeUnloadDialog = listener;
|
||||||
|
|
@ -13572,8 +13671,20 @@ index 1e4fb27884034dcca333f77efd24150d4c9dc2ec..ed9046f38f0b517644f8c5208c8b7800
|
||||||
return newPage.leakRef();
|
return newPage.leakRef();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -408,3 +517,11 @@ void WebKitBrowserWindow::didNotHandleKeyEvent(WKPageRef, WKNativeEventPtr event
|
||||||
|
auto& thisWindow = toWebKitBrowserWindow(clientInfo);
|
||||||
|
PostMessage(thisWindow.m_hMainWnd, event->message, event->wParam, event->lParam);
|
||||||
|
}
|
||||||
|
+
|
||||||
|
+void WebKitBrowserWindow::decidePolicyForResponse(WKPageRef page, WKFrameRef frame, WKURLResponseRef response, WKURLRequestRef request, WKFramePolicyListenerRef listener, WKTypeRef userData, const void* clientInfo)
|
||||||
|
+{
|
||||||
|
+ if (WKURLResponseIsAttachment(response))
|
||||||
|
+ WKFramePolicyListenerDownload(listener);
|
||||||
|
+ else
|
||||||
|
+ WKFramePolicyListenerUse(listener);
|
||||||
|
+}
|
||||||
diff --git a/Tools/MiniBrowser/win/WebKitBrowserWindow.h b/Tools/MiniBrowser/win/WebKitBrowserWindow.h
|
diff --git a/Tools/MiniBrowser/win/WebKitBrowserWindow.h b/Tools/MiniBrowser/win/WebKitBrowserWindow.h
|
||||||
index 373d0de77e852c673a6615e0acedd5195e3c021b..cfeb4f806f79d1a213fdb13346e2b383b9a64273 100644
|
index 373d0de77e852c673a6615e0acedd5195e3c021b..2f25d60c366efa428197dba4a7e0aea6de86af6c 100644
|
||||||
--- a/Tools/MiniBrowser/win/WebKitBrowserWindow.h
|
--- a/Tools/MiniBrowser/win/WebKitBrowserWindow.h
|
||||||
+++ b/Tools/MiniBrowser/win/WebKitBrowserWindow.h
|
+++ b/Tools/MiniBrowser/win/WebKitBrowserWindow.h
|
||||||
@@ -26,6 +26,7 @@
|
@@ -26,6 +26,7 @@
|
||||||
|
|
@ -13599,7 +13710,7 @@ index 373d0de77e852c673a6615e0acedd5195e3c021b..cfeb4f806f79d1a213fdb13346e2b383
|
||||||
|
|
||||||
HRESULT init() override;
|
HRESULT init() override;
|
||||||
HWND hwnd() override;
|
HWND hwnd() override;
|
||||||
@@ -71,6 +75,12 @@ private:
|
@@ -71,11 +75,22 @@ private:
|
||||||
static void didChangeActiveURL(const void*);
|
static void didChangeActiveURL(const void*);
|
||||||
static void didReceiveAuthenticationChallenge(WKPageRef, WKAuthenticationChallengeRef, const void*);
|
static void didReceiveAuthenticationChallenge(WKPageRef, WKAuthenticationChallengeRef, const void*);
|
||||||
static WKPageRef createNewPage(WKPageRef, WKPageConfigurationRef, WKNavigationActionRef, WKWindowFeaturesRef, const void *);
|
static WKPageRef createNewPage(WKPageRef, WKPageConfigurationRef, WKNavigationActionRef, WKWindowFeaturesRef, const void *);
|
||||||
|
|
@ -13610,9 +13721,10 @@ index 373d0de77e852c673a6615e0acedd5195e3c021b..cfeb4f806f79d1a213fdb13346e2b383
|
||||||
+ static void runBeforeUnloadConfirmPanel(WKPageRef page, WKStringRef message, WKFrameRef frame, WKPageRunBeforeUnloadConfirmPanelResultListenerRef listener, const void *clientInfo);
|
+ static void runBeforeUnloadConfirmPanel(WKPageRef page, WKStringRef message, WKFrameRef frame, WKPageRunBeforeUnloadConfirmPanelResultListenerRef listener, const void *clientInfo);
|
||||||
+ static void handleJavaScriptDialog(WKPageRef page, bool accept, WKStringRef value, const void *clientInfo);
|
+ static void handleJavaScriptDialog(WKPageRef page, bool accept, WKStringRef value, const void *clientInfo);
|
||||||
static void didNotHandleKeyEvent(WKPageRef, WKNativeEventPtr, const void*);
|
static void didNotHandleKeyEvent(WKPageRef, WKNativeEventPtr, const void*);
|
||||||
|
+ static void decidePolicyForResponse(WKPageRef, WKFrameRef, WKURLResponseRef, WKURLRequestRef, WKFramePolicyListenerRef, WKTypeRef, const void*);
|
||||||
|
|
||||||
BrowserWindowClient& m_client;
|
BrowserWindowClient& m_client;
|
||||||
@@ -78,4 +88,8 @@ private:
|
WKRetainPtr<WKViewRef> m_view;
|
||||||
HWND m_hMainWnd { nullptr };
|
HWND m_hMainWnd { nullptr };
|
||||||
ProxySettings m_proxy { };
|
ProxySettings m_proxy { };
|
||||||
std::unordered_map<std::wstring, std::wstring> m_acceptedServerTrustCerts;
|
std::unordered_map<std::wstring, std::wstring> m_acceptedServerTrustCerts;
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue