From 0039b313b8d29b22069210b45b311d142e78e49b Mon Sep 17 00:00:00 2001 From: Yury Semikhatsky Date: Tue, 27 Apr 2021 23:21:23 +0000 Subject: [PATCH] browser(webkit): support downloads larger than 16Kb on Windows (#6343) --- browser_patches/webkit/BUILD_NUMBER | 4 +- browser_patches/webkit/patches/bootstrap.diff | 71 +++++++++++++++---- 2 files changed, 58 insertions(+), 17 deletions(-) diff --git a/browser_patches/webkit/BUILD_NUMBER b/browser_patches/webkit/BUILD_NUMBER index 66057005c500f..e93b0960513e0 100644 --- a/browser_patches/webkit/BUILD_NUMBER +++ b/browser_patches/webkit/BUILD_NUMBER @@ -1,2 +1,2 @@ -1467 -Changed: yurys@chromium.org Mon 26 Apr 2021 04:14:04 PM PDT +1468 +Changed: yurys@chromium.org Tue, Apr 27, 2021 10:33:49 PM diff --git a/browser_patches/webkit/patches/bootstrap.diff b/browser_patches/webkit/patches/bootstrap.diff index 182b818fc17f9..3a332f2896adb 100644 --- a/browser_patches/webkit/patches/bootstrap.diff +++ b/browser_patches/webkit/patches/bootstrap.diff @@ -8394,7 +8394,7 @@ index 88abe8c29c43b8c8881d29e25a21e4dd370ab498..c5e3439a0ce52a9d368b984c7849fac7 #if !LOG_DISABLED LOG(NetworkSession, "%llu didReceiveResponse completionHandler (%d)", taskIdentifier, policyAction); diff --git a/Source/WebKit/NetworkProcess/curl/NetworkDataTaskCurl.cpp b/Source/WebKit/NetworkProcess/curl/NetworkDataTaskCurl.cpp -index e9fdf357d64f8916b35e5e00469b997580db3abd..32135740fb58e7ca124a4fdc8514ebfc2e0712de 100644 +index e9fdf357d64f8916b35e5e00469b997580db3abd..7f44429cde3a8d2e44b47d3f65549b76a24ed38a 100644 --- a/Source/WebKit/NetworkProcess/curl/NetworkDataTaskCurl.cpp +++ b/Source/WebKit/NetworkProcess/curl/NetworkDataTaskCurl.cpp @@ -26,9 +26,13 @@ @@ -8428,7 +8428,17 @@ index e9fdf357d64f8916b35e5e00469b997580db3abd..32135740fb58e7ca124a4fdc8514ebfc m_curlRequest->setStartTime(m_startTime); m_curlRequest->start(); } -@@ -153,6 +160,7 @@ void NetworkDataTaskCurl::curlDidReceiveResponse(CurlRequest& request, CurlRespo +@@ -109,6 +116,9 @@ void NetworkDataTaskCurl::cancel() + + if (m_curlRequest) + m_curlRequest->cancel(); ++ ++ if (isDownload()) ++ deleteDownloadFile(); + } + + void NetworkDataTaskCurl::invalidateAndCancel() +@@ -153,6 +163,7 @@ void NetworkDataTaskCurl::curlDidReceiveResponse(CurlRequest& request, CurlRespo m_response = ResourceResponse(receivedResponse); m_response.setCertificateInfo(WTFMove(receivedResponse.certificateInfo)); m_response.setDeprecatedNetworkLoadMetrics(Box::create(WTFMove(receivedResponse.networkLoadMetrics))); @@ -8436,38 +8446,51 @@ index e9fdf357d64f8916b35e5e00469b997580db3abd..32135740fb58e7ca124a4fdc8514ebfc handleCookieHeaders(request.resourceRequest(), receivedResponse); -@@ -180,7 +188,12 @@ void NetworkDataTaskCurl::curlDidReceiveBuffer(CurlRequest&, Ref&& +@@ -180,7 +191,10 @@ void NetworkDataTaskCurl::curlDidReceiveBuffer(CurlRequest&, Ref&& 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); ++ FileSystem::writeToFile(m_downloadDestinationFile, buffer->data(), buffer->size()); + return; + } m_client->didReceiveData(WTFMove(buffer)); } -@@ -189,6 +202,12 @@ void NetworkDataTaskCurl::curlDidComplete(CurlRequest&, NetworkLoadMetrics&& net +@@ -189,9 +203,26 @@ 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); ++ FileSystem::closeFile(m_downloadDestinationFile); ++ m_downloadDestinationFile = FileSystem::invalidPlatformFileHandle; + download->didFinish(); + return; + } m_client->didCompleteWithError({ }, WTFMove(networkLoadMetrics)); } -@@ -202,6 +221,13 @@ void NetworkDataTaskCurl::curlDidFailWithError(CurlRequest& request, ResourceErr ++void NetworkDataTaskCurl::deleteDownloadFile() ++{ ++ if (m_downloadDestinationFile != FileSystem::invalidPlatformFileHandle) { ++ FileSystem::closeFile(m_downloadDestinationFile); ++ FileSystem::deleteFile(m_pendingDownloadLocation); ++ m_downloadDestinationFile = FileSystem::invalidPlatformFileHandle; ++ } ++} ++ + void NetworkDataTaskCurl::curlDidFailWithError(CurlRequest& request, ResourceError&& resourceError, CertificateInfo&& certificateInfo) + { + if (state() == State::Canceling || state() == State::Completed || (!m_client && !isDownload())) +@@ -202,6 +233,14 @@ void NetworkDataTaskCurl::curlDidFailWithError(CurlRequest& request, ResourceErr return; } + if (isDownload()) { ++ deleteDownloadFile(); + auto* download = m_session->networkProcess().downloadManager().download(m_pendingDownloadID); + ASSERT(download); + download->didFail(resourceError, IPC::DataReference()); @@ -8477,7 +8500,7 @@ index e9fdf357d64f8916b35e5e00469b997580db3abd..32135740fb58e7ca124a4fdc8514ebfc m_client->didCompleteWithError(resourceError); } -@@ -239,6 +265,18 @@ void NetworkDataTaskCurl::invokeDidReceiveResponse() +@@ -239,6 +278,19 @@ void NetworkDataTaskCurl::invokeDidReceiveResponse() case PolicyAction::Ignore: invalidateAndCancel(); break; @@ -8487,6 +8510,7 @@ index e9fdf357d64f8916b35e5e00469b997580db3abd..32135740fb58e7ca124a4fdc8514ebfc + auto download = makeUnique(downloadManager, m_pendingDownloadID, *this, *m_session, suggestedFilename()); + auto* downloadPtr = download.get(); + downloadManager.dataTaskBecameDownloadTask(m_pendingDownloadID, WTFMove(download)); ++ m_downloadDestinationFile = FileSystem::openFile(m_pendingDownloadLocation, FileSystem::FileOpenMode::Write); + downloadPtr->didCreateDestination(m_pendingDownloadLocation); + + if (m_curlRequest) @@ -8496,7 +8520,7 @@ index e9fdf357d64f8916b35e5e00469b997580db3abd..32135740fb58e7ca124a4fdc8514ebfc default: notImplemented(); break; -@@ -321,6 +359,8 @@ void NetworkDataTaskCurl::willPerformHTTPRedirection() +@@ -321,6 +373,8 @@ void NetworkDataTaskCurl::willPerformHTTPRedirection() m_curlRequest->setUserPass(m_initialCredential.user(), m_initialCredential.password()); m_curlRequest->setAuthenticationScheme(ProtectionSpaceAuthenticationSchemeHTTPBasic); } @@ -8506,10 +8530,18 @@ index e9fdf357d64f8916b35e5e00469b997580db3abd..32135740fb58e7ca124a4fdc8514ebfc m_curlRequest->start(); diff --git a/Source/WebKit/NetworkProcess/curl/NetworkDataTaskCurl.h b/Source/WebKit/NetworkProcess/curl/NetworkDataTaskCurl.h -index 46c215a99a9bb31546e8880ce6f0876193c075fe..3509c62ac2c970fdcf78db2503c0cc4259f56dbd 100644 +index 46c215a99a9bb31546e8880ce6f0876193c075fe..82c3afd36a91962c540e69d176c086b98e80ddc1 100644 --- a/Source/WebKit/NetworkProcess/curl/NetworkDataTaskCurl.h +++ b/Source/WebKit/NetworkProcess/curl/NetworkDataTaskCurl.h -@@ -85,14 +85,13 @@ private: +@@ -32,6 +32,7 @@ + #include + #include + #include ++#include + #include + + namespace WebCore { +@@ -85,13 +86,13 @@ private: void appendCookieHeader(WebCore::ResourceRequest&); void handleCookieHeaders(const WebCore::ResourceRequest&, const WebCore::CurlResponse&); @@ -8519,12 +8551,21 @@ index 46c215a99a9bb31546e8880ce6f0876193c075fe..3509c62ac2c970fdcf78db2503c0cc42 bool shouldBlockCookies(const WebCore::ResourceRequest&); void blockCookies(); void unblockCookies(); - -- String suggestedFilename() const override; - +- String suggestedFilename() const override; ++ void deleteDownloadFile(); + State m_state { State::Suspended }; - RefPtr m_curlRequest; +@@ -104,6 +105,8 @@ private: + WebCore::FrameIdentifier m_frameID; + WebCore::PageIdentifier m_pageID; + ++ FileSystem::PlatformFileHandle m_downloadDestinationFile { FileSystem::invalidPlatformFileHandle }; ++ + bool m_blockingCookies { false }; + + WebCore::ShouldRelaxThirdPartyCookieBlocking m_shouldRelaxThirdPartyCookieBlocking { WebCore::ShouldRelaxThirdPartyCookieBlocking::No }; diff --git a/Source/WebKit/NetworkProcess/soup/NetworkDataTaskSoup.cpp b/Source/WebKit/NetworkProcess/soup/NetworkDataTaskSoup.cpp index 0d690beb77a8d299b6e0137ac3f21d40eff2f2d9..25a05f893cb10aaeaaf17c7c27bd2a1e61abe384 100644 --- a/Source/WebKit/NetworkProcess/soup/NetworkDataTaskSoup.cpp