Changeset 197050 in webkit
- Timestamp:
- Feb 24, 2016, 1:44:00 PM (11 years ago)
- Location:
- trunk/Source/WebKit2
- Files:
-
- 19 edited
-
ChangeLog (modified) (1 diff)
-
NetworkProcess/Downloads/DownloadManager.cpp (modified) (2 diffs)
-
NetworkProcess/Downloads/DownloadManager.h (modified) (2 diffs)
-
NetworkProcess/Downloads/PendingDownload.cpp (modified) (2 diffs)
-
NetworkProcess/Downloads/PendingDownload.h (modified) (1 diff)
-
NetworkProcess/Downloads/cocoa/DownloadCocoa.mm (modified) (2 diffs)
-
NetworkProcess/NetworkConnectionToWebProcess.cpp (modified) (1 diff)
-
NetworkProcess/NetworkDataTask.h (modified) (1 diff)
-
NetworkProcess/NetworkLoad.cpp (modified) (3 diffs)
-
NetworkProcess/NetworkLoadClient.h (modified) (1 diff)
-
NetworkProcess/NetworkProcess.cpp (modified) (3 diffs)
-
NetworkProcess/NetworkProcess.h (modified) (3 diffs)
-
NetworkProcess/NetworkProcess.messages.in (modified) (1 diff)
-
NetworkProcess/NetworkResourceLoader.cpp (modified) (1 diff)
-
NetworkProcess/NetworkResourceLoader.h (modified) (1 diff)
-
NetworkProcess/cache/NetworkCacheSpeculativeLoad.h (modified) (1 diff)
-
NetworkProcess/cocoa/NetworkDataTaskCocoa.mm (modified) (2 diffs)
-
NetworkProcess/cocoa/NetworkSessionCocoa.mm (modified) (2 diffs)
-
UIProcess/Downloads/DownloadProxy.cpp (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebKit2/ChangeLog
r197041 r197050 1 2016-02-24 Alex Christensen <achristensen@webkit.org> 2 3 Fix downloads when using NetworkSession 4 https://bugs.webkit.org/show_bug.cgi?id=154620 5 6 Reviewed by Brady Eidson. 7 8 This fixes all the _WKDownload API tests when using NetworkSession. 9 10 * NetworkProcess/Downloads/DownloadManager.cpp: 11 (WebKit::DownloadManager::willDecidePendingDownloadDestination): 12 When we store the NetworkDataTask in m_downloadsWaitingForDestination, we want to remove its owner 13 from m_pendingDownloads to prevent memory leaks. 14 (WebKit::DownloadManager::continueDecidePendingDownloadDestination): 15 If a file exists and the UIProcess has told us to overwrite the file, delete the file 16 before starting a new download in its place. This used to be done by CFNetwork in 17 NSURLDownload's setDestination:allowOverwrite:, but the NSURLSession equivalent (setting 18 NSURLSessionDataTask's _pathToDownloadTaskFile attribute) does not overwrite the file for us. 19 (WebKit::DownloadManager::cancelDownload): 20 If a download is canceled while it is waiting for its destination from the UIProcess, the Download 21 object does not exist yet. Instead, we have a completion handler stored in m_downloadsWaitingForDestination. 22 In this case, we want to send the UIProcess a DownloadProxy::DidCancel message, which I did through 23 NetworkProcess::pendingDownloadCanceled because the DownloadManager is not a MessageSender, and then 24 call the completion handler with PolicyIgnore to cancel the download. 25 (WebKit::DownloadManager::downloadFinished): 26 * NetworkProcess/Downloads/DownloadManager.h: 27 * NetworkProcess/Downloads/PendingDownload.cpp: 28 (WebKit::PendingDownload::continueCanAuthenticateAgainstProtectionSpace): 29 (WebKit::PendingDownload::didBecomeDownload): 30 (WebKit::PendingDownload::didFailLoading): 31 (WebKit::PendingDownload::messageSenderConnection): 32 (WebKit::PendingDownload::didConvertToDownload): Deleted. 33 * NetworkProcess/Downloads/PendingDownload.h: 34 * NetworkProcess/Downloads/cocoa/DownloadCocoa.mm: 35 (WebKit::Download::cancel): 36 Send a didCancel message to the UIProcess when a download was cancelled. 37 Use cancelByProducingResumeData so we can resume canceled downloads. 38 * NetworkProcess/NetworkConnectionToWebProcess.cpp: 39 (WebKit::NetworkConnectionToWebProcess::convertMainResourceLoadToDownload): 40 didConvertToDownload is needed when using NetworkSession to tell the NetworkResourceLoader 41 not to call cancel on the NetworkLoad after converting it to a download. 42 * NetworkProcess/NetworkDataTask.h: 43 (WebKit::NetworkDataTask::setPendingDownload): 44 (WebKit::NetworkDataTask::pendingDownloadLocation): 45 * NetworkProcess/NetworkLoad.cpp: 46 (WebKit::NetworkLoad::convertTaskToDownload): 47 (WebKit::NetworkLoad::setPendingDownloadID): 48 (WebKit::NetworkLoad::didReceiveResponseNetworkSession): 49 Don't call findPendingDownloadLocation as a method on the NetworkDataTask to avoid memory leaks 50 in DownloadManager.m_pendingDownloads. 51 (WebKit::NetworkLoad::didBecomeDownload): 52 Call m_client.didBecomeDownload which is being separated from didConvertToDownload. The former is 53 called after the NetworkDataTask becomes a Download, the latter is called as soon as 54 convertMainResourceLoadToDownload is called. 55 * NetworkProcess/NetworkLoadClient.h: 56 * NetworkProcess/NetworkProcess.cpp: 57 (WebKit::NetworkProcess::continueWillSendRequest): 58 (WebKit::NetworkProcess::pendingDownloadCanceled): 59 Send a DownloadProxy::DidCancel message when a pending download is canceled. 60 (WebKit::NetworkProcess::findPendingDownloadLocation): 61 (WebKit::NetworkProcess::continueDecidePendingDownloadDestination): 62 * NetworkProcess/NetworkProcess.h: 63 * NetworkProcess/NetworkProcess.messages.in: 64 * NetworkProcess/NetworkResourceLoader.cpp: 65 (WebKit::NetworkResourceLoader::didConvertToDownload): 66 (WebKit::NetworkResourceLoader::didBecomeDownload): 67 Separate setting m_didConvertToDownload, which needs to happen before the didReceiveResponse completion 68 handler is called to tell the NetworkResourceLoader not to call cancel in NetworkResourceLoader::abort, 69 from deleting the NetworkLoad, which can be done after the NSURLSessionDataTask has been converted to a 70 NSURLSessionDownloadTask. 71 * NetworkProcess/NetworkResourceLoader.h: 72 * NetworkProcess/cache/NetworkCacheSpeculativeLoad.h: 73 * NetworkProcess/cocoa/NetworkDataTaskCocoa.mm: 74 (WebKit::NetworkDataTask::failureTimerFired): 75 (WebKit::NetworkDataTask::setPendingDownloadLocation): 76 (WebKit::NetworkDataTask::transferSandboxExtensionToDownload): 77 (WebKit::NetworkDataTask::suggestedFilename): 78 (WebKit::NetworkDataTask::currentRequest): 79 (WebKit::NetworkDataTask::findPendingDownloadLocation): Deleted. 80 * NetworkProcess/cocoa/NetworkSessionCocoa.mm: 81 (-[WKNetworkSessionDelegate URLSession:task:didCompleteWithError:]): 82 Take the downloadID if it failed because we will report that download as failed and not use it again. 83 (WebKit::NetworkSession::takeDownloadID): 84 * UIProcess/Downloads/DownloadProxy.cpp: 85 (WebKit::DownloadProxy::decideDestinationWithSuggestedFilenameAsync): 86 (WebKit::DownloadProxy::decideDestinationWithSuggestedFilename): 87 1 88 2016-02-24 Anders Carlsson <andersca@apple.com> 2 89 -
trunk/Source/WebKit2/NetworkProcess/Downloads/DownloadManager.cpp
r196984 r197050 98 98 void DownloadManager::willDecidePendingDownloadDestination(NetworkDataTask& networkDataTask, ResponseCompletionHandler completionHandler) 99 99 { 100 auto addResult = m_downloadsWaitingForDestination.set(networkDataTask.pendingDownloadID(), std::make_pair<RefPtr<NetworkDataTask>, ResponseCompletionHandler>(&networkDataTask, WTFMove(completionHandler))); 100 auto downloadID = networkDataTask.pendingDownloadID(); 101 auto pendingDownload = m_pendingDownloads.take(downloadID); 102 ASSERT(networkDataTask.pendingDownload() == pendingDownload.get()); 103 auto addResult = m_downloadsWaitingForDestination.set(downloadID, std::make_pair<RefPtr<NetworkDataTask>, ResponseCompletionHandler>(&networkDataTask, WTFMove(completionHandler))); 101 104 ASSERT_UNUSED(addResult, addResult.isNewEntry); 102 105 } 103 106 104 void DownloadManager::continueDecidePendingDownloadDestination(DownloadID downloadID, String destination, const SandboxExtension::Handle& sandboxExtensionHandle )107 void DownloadManager::continueDecidePendingDownloadDestination(DownloadID downloadID, String destination, const SandboxExtension::Handle& sandboxExtensionHandle, bool allowOverwrite) 105 108 { 106 109 auto pair = m_downloadsWaitingForDestination.take(downloadID); 107 110 auto networkDataTask = pair.first; 108 111 auto completionHandler = pair.second; 109 if (!networkDataTask || !completionHandler) { 110 ASSERT_NOT_REACHED(); 112 if (!networkDataTask || !completionHandler) 111 113 return; 112 } 114 113 115 networkDataTask->setPendingDownloadLocation(destination, sandboxExtensionHandle); 116 117 if (allowOverwrite && fileExists(destination)) 118 deleteFile(destination); 119 114 120 completionHandler(PolicyDownload); 115 121 … … 144 150 void DownloadManager::cancelDownload(DownloadID downloadID) 145 151 { 146 Download* download = m_downloads.get(downloadID);147 if (!download)152 if (Download* download = m_downloads.get(downloadID)) { 153 download->cancel(); 148 154 return; 149 150 download->cancel(); 155 } 156 #if USE(NETWORK_SESSION) 157 if (auto completionHandler = m_downloadsWaitingForDestination.take(downloadID).second) { 158 m_client.pendingDownloadCanceled(downloadID); 159 completionHandler(PolicyIgnore); 160 return; 161 } 162 #endif 151 163 } 152 164 -
trunk/Source/WebKit2/NetworkProcess/Downloads/DownloadManager.h
r196984 r197050 68 68 virtual IPC::Connection* downloadProxyConnection() = 0; 69 69 virtual AuthenticationManager& downloadsAuthenticationManager() = 0; 70 #if USE(NETWORK_SESSION) 71 virtual void pendingDownloadCanceled(DownloadID) = 0; 72 #endif 70 73 }; 71 74 … … 78 81 void continueWillSendRequest(DownloadID, const WebCore::ResourceRequest&); 79 82 void willDecidePendingDownloadDestination(NetworkDataTask&, ResponseCompletionHandler); 80 void continueDecidePendingDownloadDestination(DownloadID, String destination, const SandboxExtension::Handle& );83 void continueDecidePendingDownloadDestination(DownloadID, String destination, const SandboxExtension::Handle&, bool allowOverwrite); 81 84 #else 82 85 void convertHandleToDownload(DownloadID, WebCore::ResourceHandle*, const WebCore::ResourceRequest&, const WebCore::ResourceResponse&); -
trunk/Source/WebKit2/NetworkProcess/Downloads/PendingDownload.cpp
r195357 r197050 29 29 #if USE(NETWORK_SESSION) 30 30 31 #include "DataReference.h" 31 32 #include "DownloadProxyMessages.h" 32 33 #include "NetworkLoad.h" … … 65 66 } 66 67 67 void PendingDownload::did ConvertToDownload()68 void PendingDownload::didBecomeDownload() 68 69 { 69 70 m_networkLoad = nullptr; 71 } 72 73 void PendingDownload::didFailLoading(const WebCore::ResourceError& error) 74 { 75 send(Messages::DownloadProxy::DidFail(error, { })); 70 76 } 71 77 -
trunk/Source/WebKit2/NetworkProcess/Downloads/PendingDownload.h
r194902 r197050 58 58 virtual void didReceiveBuffer(RefPtr<WebCore::SharedBuffer>&&, int reportedEncodedDataLength) override { }; 59 59 virtual void didFinishLoading(double finishTime) override { }; 60 virtual void didFailLoading(const WebCore::ResourceError&) override { };61 virtual void did ConvertToDownload() override;60 virtual void didFailLoading(const WebCore::ResourceError&) override; 61 virtual void didBecomeDownload() override; 62 62 #if PLATFORM(COCOA) 63 63 virtual void willCacheResponseAsync(CFCachedURLResponseRef) override { } -
trunk/Source/WebKit2/NetworkProcess/Downloads/cocoa/DownloadCocoa.mm
r194562 r197050 29 29 #if USE(NETWORK_SESSION) 30 30 31 #import "DataReference.h" 31 32 #import <WebCore/NotImplemented.h> 32 33 … … 40 41 void Download::cancel() 41 42 { 42 [m_download cancel]; 43 [m_download cancelByProducingResumeData: ^(NSData *resumeData) 44 { 45 didCancel(IPC::DataReference(reinterpret_cast<const uint8_t*>([resumeData bytes]), [resumeData length])); 46 }]; 43 47 } 44 48 -
trunk/Source/WebKit2/NetworkProcess/NetworkConnectionToWebProcess.cpp
r196174 r197050 205 205 loader->networkLoad()->handle()->continueDidReceiveResponse(); 206 206 207 #endif 207 208 loader->didConvertToDownload(); 208 #endif209 209 } 210 210 -
trunk/Source/WebKit2/NetworkProcess/NetworkDataTask.h
r196984 r197050 120 120 m_pendingDownload = &pendingDownload; 121 121 } 122 void findPendingDownloadLocation(ResponseCompletionHandler);123 122 void setPendingDownloadLocation(const String& filename, const SandboxExtension::Handle&); 124 123 const String& pendingDownloadLocation() { return m_pendingDownloadLocation; } 125 124 WebCore::ResourceRequest currentRequest(); 125 String suggestedFilename(); 126 126 bool tryPasswordBasedAuthentication(const WebCore::AuthenticationChallenge&, ChallengeCompletionHandler); 127 127 void willPerformHTTPRedirection(const WebCore::ResourceResponse&, WebCore::ResourceRequest&&, RedirectCompletionHandler); -
trunk/Source/WebKit2/NetworkProcess/NetworkLoad.cpp
r196984 r197050 173 173 ASSERT(m_responseCompletionHandler); 174 174 if (m_responseCompletionHandler) 175 m_task->findPendingDownloadLocation(WTFMove(m_responseCompletionHandler));175 NetworkProcess::singleton().findPendingDownloadLocation(*m_task.get(), WTFMove(m_responseCompletionHandler)); 176 176 } 177 177 … … 222 222 ASSERT(isMainThread()); 223 223 if (m_task && m_task->pendingDownloadID().downloadID()) 224 m_task->findPendingDownloadLocation(completionHandler);224 NetworkProcess::singleton().findPendingDownloadLocation(*m_task.get(), completionHandler); 225 225 else if (sharedDidReceiveResponse(response) == NetworkLoadClient::ShouldContinueDidReceiveResponse::Yes) 226 226 completionHandler(PolicyUse); … … 246 246 void NetworkLoad::didBecomeDownload() 247 247 { 248 m_client.did ConvertToDownload();248 m_client.didBecomeDownload(); 249 249 } 250 250 -
trunk/Source/WebKit2/NetworkProcess/NetworkLoadClient.h
r194313 r197050 57 57 virtual void didFinishLoading(double finishTime) = 0; 58 58 virtual void didFailLoading(const WebCore::ResourceError&) = 0; 59 virtual void didConvertToDownload() = 0; 59 #if USE(NETWORK_SESSION) 60 virtual void didBecomeDownload() = 0; 61 #endif 60 62 61 63 #if PLATFORM(COCOA) -
trunk/Source/WebKit2/NetworkProcess/NetworkProcess.cpp
r196984 r197050 32 32 #include "ChildProcessMessages.h" 33 33 #include "CustomProtocolManager.h" 34 #include "DataReference.h" 34 35 #include "DownloadProxyMessages.h" 35 36 #include "Logging.h" … … 472 473 } 473 474 474 void NetworkProcess::findPendingDownloadLocation(NetworkDataTask& networkDataTask, String suggestedFilename, ResponseCompletionHandler completionHandler) 475 void NetworkProcess::pendingDownloadCanceled(DownloadID downloadID) 476 { 477 downloadProxyConnection()->send(Messages::DownloadProxy::DidCancel({ }), downloadID.downloadID()); 478 } 479 480 void NetworkProcess::findPendingDownloadLocation(NetworkDataTask& networkDataTask, ResponseCompletionHandler completionHandler) 475 481 { 476 482 uint64_t destinationID = networkDataTask.pendingDownloadID().downloadID(); … … 478 484 479 485 downloadManager().willDecidePendingDownloadDestination(networkDataTask, completionHandler); 480 downloadProxyConnection()->send(Messages::DownloadProxy::DecideDestinationWithSuggestedFilenameAsync(networkDataTask.pendingDownloadID(), suggestedFilename), destinationID);486 downloadProxyConnection()->send(Messages::DownloadProxy::DecideDestinationWithSuggestedFilenameAsync(networkDataTask.pendingDownloadID(), networkDataTask.suggestedFilename()), destinationID); 481 487 } 482 488 483 void NetworkProcess::continueDecidePendingDownloadDestination(DownloadID downloadID, String destination, const SandboxExtension::Handle& sandboxExtensionHandle )484 { 485 downloadManager().continueDecidePendingDownloadDestination(downloadID, destination, sandboxExtensionHandle );489 void NetworkProcess::continueDecidePendingDownloadDestination(DownloadID downloadID, String destination, const SandboxExtension::Handle& sandboxExtensionHandle, bool allowOverwrite) 490 { 491 downloadManager().continueDecidePendingDownloadDestination(downloadID, destination, sandboxExtensionHandle, allowOverwrite); 486 492 } 487 493 #endif -
trunk/Source/WebKit2/NetworkProcess/NetworkProcess.h
r196984 r197050 102 102 103 103 #if USE(NETWORK_SESSION) 104 void findPendingDownloadLocation(NetworkDataTask&, String suggestedFilename,ResponseCompletionHandler);104 void findPendingDownloadLocation(NetworkDataTask&, ResponseCompletionHandler); 105 105 #endif 106 106 … … 139 139 virtual IPC::Connection* downloadProxyConnection() override; 140 140 virtual AuthenticationManager& downloadsAuthenticationManager() override; 141 #if USE(NETWORK_SESSION) 142 virtual void pendingDownloadCanceled(DownloadID) override; 143 #endif 141 144 142 145 // Message Handlers … … 163 166 void continueCanAuthenticateAgainstProtectionSpace(DownloadID, bool canAuthenticate); 164 167 void continueWillSendRequest(DownloadID, const WebCore::ResourceRequest&); 165 void continueDecidePendingDownloadDestination(DownloadID, String destination, const SandboxExtension::Handle& sandboxExtensionHandle );168 void continueDecidePendingDownloadDestination(DownloadID, String destination, const SandboxExtension::Handle& sandboxExtensionHandle, bool allowOverwrite); 166 169 #endif 167 170 void setCacheModel(uint32_t); -
trunk/Source/WebKit2/NetworkProcess/NetworkProcess.messages.in
r196984 r197050 48 48 ContinueCanAuthenticateAgainstProtectionSpace(WebKit::DownloadID downloadID, bool canAuthenticate) 49 49 ContinueWillSendRequest(WebKit::DownloadID downloadID, WebCore::ResourceRequest request) 50 ContinueDecidePendingDownloadDestination(WebKit::DownloadID downloadID, String destination, WebKit::SandboxExtension::Handle sandboxExtensionHandle )50 ContinueDecidePendingDownloadDestination(WebKit::DownloadID downloadID, String destination, WebKit::SandboxExtension::Handle sandboxExtensionHandle, bool allowOverwrite) 51 51 #endif 52 52 -
trunk/Source/WebKit2/NetworkProcess/NetworkResourceLoader.cpp
r194496 r197050 238 238 void NetworkResourceLoader::didConvertToDownload() 239 239 { 240 ASSERT(!m_didConvertToDownload); 240 241 ASSERT(m_networkLoad); 241 242 m_didConvertToDownload = true; 243 } 244 242 245 #if USE(NETWORK_SESSION) 246 void NetworkResourceLoader::didBecomeDownload() 247 { 248 ASSERT(m_didConvertToDownload); 249 ASSERT(m_networkLoad); 243 250 m_networkLoad = nullptr; 244 #endif 245 } 251 } 252 #endif 246 253 247 254 void NetworkResourceLoader::abort() -
trunk/Source/WebKit2/NetworkProcess/NetworkResourceLoader.h
r194496 r197050 103 103 virtual void didFinishLoading(double finishTime) override; 104 104 virtual void didFailLoading(const WebCore::ResourceError&) override; 105 virtual void didConvertToDownload() override; 105 #if USE(NETWORK_SESSION) 106 virtual void didBecomeDownload() override; 107 #endif 108 109 void didConvertToDownload(); 106 110 107 111 private: -
trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheSpeculativeLoad.h
r194313 r197050 60 60 virtual void didFinishLoading(double finishTime) override; 61 61 virtual void didFailLoading(const WebCore::ResourceError&) override; 62 virtual void didConvertToDownload() override { ASSERT_NOT_REACHED(); } 62 #if USE(NETWORK_SESSION) 63 virtual void didBecomeDownload() override { ASSERT_NOT_REACHED(); } 64 #endif 63 65 #if PLATFORM(COCOA) 64 66 virtual void willCacheResponseAsync(CFCachedURLResponseRef) override { } -
trunk/Source/WebKit2/NetworkProcess/cocoa/NetworkDataTaskCocoa.mm
r196984 r197050 194 194 } 195 195 196 void NetworkDataTask::findPendingDownloadLocation(ResponseCompletionHandler completionHandler)197 {198 NetworkProcess::singleton().findPendingDownloadLocation(*this, m_task.get().response.suggestedFilename, completionHandler);199 }200 201 196 void NetworkDataTask::setPendingDownloadLocation(const WTF::String& filename, const SandboxExtension::Handle& sandboxExtensionHandle) 202 197 { … … 235 230 } 236 231 232 String NetworkDataTask::suggestedFilename() 233 { 234 return m_task.get().response.suggestedFilename; 235 } 236 237 237 WebCore::ResourceRequest NetworkDataTask::currentRequest() 238 238 { -
trunk/Source/WebKit2/NetworkProcess/cocoa/NetworkSessionCocoa.mm
r196984 r197050 135 135 if (auto* networkDataTask = _session->dataTaskForIdentifier(task.taskIdentifier)) 136 136 networkDataTask->didCompleteWithError(error); 137 else if (auto* download = WebKit::NetworkProcess::singleton().downloadManager().download(_session->downloadID(task.taskIdentifier))) { 138 if (error) 139 download->didFail(error, { }); // FIXME: Give some actual data here for resuming. 137 else if (error) { 138 auto downloadID = _session->takeDownloadID(task.taskIdentifier); 139 if (downloadID.downloadID()) { 140 if (auto* download = WebKit::NetworkProcess::singleton().downloadManager().download(downloadID)) 141 download->didFail(error, { }); 142 } 140 143 } 141 144 } … … 276 279 { 277 280 auto downloadID = m_downloadMap.take(taskIdentifier); 278 ASSERT(downloadID.downloadID());279 281 return downloadID; 280 282 } -
trunk/Source/WebKit2/UIProcess/Downloads/DownloadProxy.cpp
r196984 r197050 185 185 if (!destination.isNull()) 186 186 SandboxExtension::createHandle(destination, SandboxExtension::ReadWrite, sandboxExtensionHandle); 187 187 188 188 if (NetworkProcessProxy* networkProcess = m_processPool->networkProcess()) 189 networkProcess->connection()->send(Messages::NetworkProcess::ContinueDecidePendingDownloadDestination(downloadID, destination, sandboxExtensionHandle ), 0);189 networkProcess->connection()->send(Messages::NetworkProcess::ContinueDecidePendingDownloadDestination(downloadID, destination, sandboxExtensionHandle, allowOverwrite), 0); 190 190 } 191 191 #else
Note:
See TracChangeset
for help on using the changeset viewer.