<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[208388] trunk/Source</title>
</head>
<body>
<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; }
#msg dl a { font-weight: bold}
#msg dl a:link { color:#fc3; }
#msg dl a:active { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/208388">208388</a></dd>
<dt>Author</dt> <dd>achristensen@apple.com</dd>
<dt>Date</dt> <dd>2016-11-04 11:08:05 -0700 (Fri, 04 Nov 2016)</dd>
</dl>
<h3>Log Message</h3>
<pre>NetworkSession: Add NetworkDataTask implementation for blobs
https://bugs.webkit.org/show_bug.cgi?id=163939
Source/WebCore:
Patch by Keith Rollin <krollin@apple.com> on 2016-11-04
Reviewed by Alex Christensen.
* WebCore.xcodeproj/project.pbxproj: Mark HTTPParsers.h and AsyncFileStream.h as private.
* fileapi/AsyncFileStream.h: Add WEBCORE_EXPORT to AsyncFileStream class.
* platform/network/BlobData.h: Add WEBCORE_EXPORT to length().
* platform/network/HTTPParsers.h: Add WEBCORE_EXPORT to parseRange().
* platform/network/ResourceResponseBase.h: Add WEBCORE_EXPORT to setHTTPHeaderField().
Source/WebCore/platform/gtk/po:
Patch by Carlos Garcia Campos <cgarcia@igalia.com> on 2016-11-04
Reviewed by Alex Christensen.
* POTFILES.in: Remove DownloadSoup.cpp
Source/WebKit2:
Patch by Carlos Garcia Campos <cgarcia@igalia.com> on 2016-11-04
Reviewed by Alex Christensen.
Add NetworkDataTaskBlob to handle blobs when using NetworkSession instead of using ResourceHandle. This patch
adds more USE(NETWORK_SESSION) ifdefs to not use ResourceHandle in Downloads and NetworkLoad when NetworkSession
is enabled.
* CMakeLists.txt: Add new files to compilation.
* NetworkProcess/Downloads/BlobDownloadClient.cpp:
* NetworkProcess/Downloads/BlobDownloadClient.h:
* NetworkProcess/Downloads/Download.cpp:
(WebKit::Download::Download): Split the constructor again and remove the PlatformDownloadTaskRef
definitions. Now Cocoa specific constructor receives a NSURLSessionDownloadTask and the general constructor
reveices a NetworkDataTask and is used by Soup backend and blobs.
(WebKit::Download::~Download):
(WebKit::Download::start):
(WebKit::Download::startWithHandle):
(WebKit::Download::cancel):
(WebKit::Download::didReceiveAuthenticationChallenge):
(WebKit::Download::didReceiveData):
(WebKit::Download::didFinish):
(WebKit::Download::platformCancelNetworkLoad): Rename cancelNetworkLoad() as platformCancelNetworkLoad() since
this is now used only by Cocoa platform to cancel the NSURLSessionDownloadTask.
* NetworkProcess/Downloads/Download.h:
(WebKit::Download::Download):
(WebKit::Download::suggestedName):
(WebKit::Download::request):
* NetworkProcess/Downloads/DownloadManager.cpp:
(WebKit::DownloadManager::startDownload): Remove blobs specific code when using NetworkSession.
(WebKit::DownloadManager::continueDecidePendingDownloadDestination):
* NetworkProcess/Downloads/DownloadManager.h:
* NetworkProcess/Downloads/cocoa/DownloadCocoa.mm:
(WebKit::Download::platformCancelNetworkLoad):
* NetworkProcess/Downloads/soup/DownloadSoup.cpp: Removed.
* NetworkProcess/NetworkConnectionToWebProcess.cpp:
(WebKit::NetworkConnectionToWebProcess::convertMainResourceLoadToDownload): Remove blobs specific code when
using NetworkSession.
* NetworkProcess/NetworkDataTask.cpp:
(WebKit::NetworkDataTask::create): If request is a blob, create a NetworkDataTaskBlob.
* NetworkProcess/NetworkDataTask.h: Add invalidateAndCancel pure virtual method.
* NetworkProcess/NetworkDataTaskBlob.cpp: Added.
(WebKit::NetworkDataTaskBlob::NetworkDataTaskBlob):
(WebKit::NetworkDataTaskBlob::~NetworkDataTaskBlob):
(WebKit::NetworkDataTaskBlob::clearStream):
(WebKit::NetworkDataTaskBlob::resume):
(WebKit::NetworkDataTaskBlob::suspend):
(WebKit::NetworkDataTaskBlob::cancel):
(WebKit::NetworkDataTaskBlob::invalidateAndCancel):
(WebKit::NetworkDataTaskBlob::getSizeForNext):
(WebKit::NetworkDataTaskBlob::didGetSize):
(WebKit::NetworkDataTaskBlob::seek):
(WebKit::NetworkDataTaskBlob::didReceiveResponse):
(WebKit::NetworkDataTaskBlob::read):
(WebKit::NetworkDataTaskBlob::readData):
(WebKit::NetworkDataTaskBlob::readFile):
(WebKit::NetworkDataTaskBlob::didOpen):
(WebKit::NetworkDataTaskBlob::didRead):
(WebKit::NetworkDataTaskBlob::consumeData):
(WebKit::NetworkDataTaskBlob::setPendingDownloadLocation):
(WebKit::NetworkDataTaskBlob::suggestedFilename):
(WebKit::NetworkDataTaskBlob::download):
(WebKit::NetworkDataTaskBlob::writeDownload):
(WebKit::NetworkDataTaskBlob::cleanDownloadFiles):
(WebKit::NetworkDataTaskBlob::didFailDownload):
(WebKit::NetworkDataTaskBlob::didFinishDownload):
(WebKit::NetworkDataTaskBlob::didFail):
(WebKit::NetworkDataTaskBlob::didFinish):
* NetworkProcess/NetworkDataTaskBlob.h: Added.
* NetworkProcess/NetworkLoad.cpp:
(WebKit::NetworkLoad::NetworkLoad): Remove blobs specific code when using NetworkSession.
(WebKit::NetworkLoad::~NetworkLoad):
(WebKit::NetworkLoad::setDefersLoading):
(WebKit::NetworkLoad::cancel):
(WebKit::NetworkLoad::continueWillSendRequest):
(WebKit::NetworkLoad::continueDidReceiveResponse):
(WebKit::NetworkLoad::continueCanAuthenticateAgainstProtectionSpace):
(WebKit::NetworkLoad::canAuthenticateAgainstProtectionSpaceAsync):
* NetworkProcess/NetworkLoad.h:
* NetworkProcess/NetworkSession.cpp:
(WebKit::NetworkSession::invalidateAndCancel): Moved from NetworkSessionSoup, since this is now used also by blobs.
* NetworkProcess/NetworkSession.h:
(WebKit::NetworkSession::registerNetworkDataTask): Ditto.
(WebKit::NetworkSession::unregisterNetworkDataTask): Ditto.
* NetworkProcess/cocoa/NetworkDataTaskCocoa.h: Add invalidateAndCancel() implementation that does nothing
because in Cocoa all tasks are invalidated and canceled by the network session.
* NetworkProcess/mac/NetworkLoadMac.mm:
* NetworkProcess/soup/NetworkDataTaskSoup.cpp:
(WebKit::NetworkDataTaskSoup::NetworkDataTaskSoup):
(WebKit::NetworkDataTaskSoup::~NetworkDataTaskSoup):
(WebKit::NetworkDataTaskSoup::download):
* NetworkProcess/soup/NetworkDataTaskSoup.h:
* NetworkProcess/soup/NetworkSessionSoup.cpp:
* NetworkProcess/soup/NetworkSessionSoup.h:
* PlatformEfl.cmake: Remove DownloadSoup.cpp from compilation.
* PlatformGTK.cmake: Ditto.
* WebKit2.xcodeproj/project.pbxproj: Add new files to compilation.</pre>
<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreWebCorexcodeprojprojectpbxproj">trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj</a></li>
<li><a href="#trunkSourceWebCorefileapiAsyncFileStreamh">trunk/Source/WebCore/fileapi/AsyncFileStream.h</a></li>
<li><a href="#trunkSourceWebCoreplatformgtkpoChangeLog">trunk/Source/WebCore/platform/gtk/po/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreplatformgtkpoPOTFILESin">trunk/Source/WebCore/platform/gtk/po/POTFILES.in</a></li>
<li><a href="#trunkSourceWebCoreplatformnetworkBlobDatah">trunk/Source/WebCore/platform/network/BlobData.h</a></li>
<li><a href="#trunkSourceWebCoreplatformnetworkHTTPParsersh">trunk/Source/WebCore/platform/network/HTTPParsers.h</a></li>
<li><a href="#trunkSourceWebCoreplatformnetworkResourceResponseBaseh">trunk/Source/WebCore/platform/network/ResourceResponseBase.h</a></li>
<li><a href="#trunkSourceWebKit2CMakeListstxt">trunk/Source/WebKit2/CMakeLists.txt</a></li>
<li><a href="#trunkSourceWebKit2ChangeLog">trunk/Source/WebKit2/ChangeLog</a></li>
<li><a href="#trunkSourceWebKit2NetworkProcessDownloadsBlobDownloadClientcpp">trunk/Source/WebKit2/NetworkProcess/Downloads/BlobDownloadClient.cpp</a></li>
<li><a href="#trunkSourceWebKit2NetworkProcessDownloadsBlobDownloadClienth">trunk/Source/WebKit2/NetworkProcess/Downloads/BlobDownloadClient.h</a></li>
<li><a href="#trunkSourceWebKit2NetworkProcessDownloadsDownloadcpp">trunk/Source/WebKit2/NetworkProcess/Downloads/Download.cpp</a></li>
<li><a href="#trunkSourceWebKit2NetworkProcessDownloadsDownloadh">trunk/Source/WebKit2/NetworkProcess/Downloads/Download.h</a></li>
<li><a href="#trunkSourceWebKit2NetworkProcessDownloadsDownloadManagercpp">trunk/Source/WebKit2/NetworkProcess/Downloads/DownloadManager.cpp</a></li>
<li><a href="#trunkSourceWebKit2NetworkProcessDownloadsDownloadManagerh">trunk/Source/WebKit2/NetworkProcess/Downloads/DownloadManager.h</a></li>
<li><a href="#trunkSourceWebKit2NetworkProcessDownloadscocoaDownloadCocoamm">trunk/Source/WebKit2/NetworkProcess/Downloads/cocoa/DownloadCocoa.mm</a></li>
<li><a href="#trunkSourceWebKit2NetworkProcessDownloadsiosDownloadIOSmm">trunk/Source/WebKit2/NetworkProcess/Downloads/ios/DownloadIOS.mm</a></li>
<li><a href="#trunkSourceWebKit2NetworkProcessDownloadsmacDownloadMacmm">trunk/Source/WebKit2/NetworkProcess/Downloads/mac/DownloadMac.mm</a></li>
<li><a href="#trunkSourceWebKit2NetworkProcessNetworkConnectionToWebProcesscpp">trunk/Source/WebKit2/NetworkProcess/NetworkConnectionToWebProcess.cpp</a></li>
<li><a href="#trunkSourceWebKit2NetworkProcessNetworkDataTaskcpp">trunk/Source/WebKit2/NetworkProcess/NetworkDataTask.cpp</a></li>
<li><a href="#trunkSourceWebKit2NetworkProcessNetworkDataTaskh">trunk/Source/WebKit2/NetworkProcess/NetworkDataTask.h</a></li>
<li><a href="#trunkSourceWebKit2NetworkProcessNetworkLoadcpp">trunk/Source/WebKit2/NetworkProcess/NetworkLoad.cpp</a></li>
<li><a href="#trunkSourceWebKit2NetworkProcessNetworkLoadh">trunk/Source/WebKit2/NetworkProcess/NetworkLoad.h</a></li>
<li><a href="#trunkSourceWebKit2NetworkProcessNetworkSessioncpp">trunk/Source/WebKit2/NetworkProcess/NetworkSession.cpp</a></li>
<li><a href="#trunkSourceWebKit2NetworkProcessNetworkSessionh">trunk/Source/WebKit2/NetworkProcess/NetworkSession.h</a></li>
<li><a href="#trunkSourceWebKit2NetworkProcesscocoaNetworkDataTaskCocoah">trunk/Source/WebKit2/NetworkProcess/cocoa/NetworkDataTaskCocoa.h</a></li>
<li><a href="#trunkSourceWebKit2NetworkProcesscocoaNetworkSessionCocoamm">trunk/Source/WebKit2/NetworkProcess/cocoa/NetworkSessionCocoa.mm</a></li>
<li><a href="#trunkSourceWebKit2NetworkProcessmacNetworkLoadMacmm">trunk/Source/WebKit2/NetworkProcess/mac/NetworkLoadMac.mm</a></li>
<li><a href="#trunkSourceWebKit2NetworkProcesssoupNetworkDataTaskSoupcpp">trunk/Source/WebKit2/NetworkProcess/soup/NetworkDataTaskSoup.cpp</a></li>
<li><a href="#trunkSourceWebKit2NetworkProcesssoupNetworkDataTaskSouph">trunk/Source/WebKit2/NetworkProcess/soup/NetworkDataTaskSoup.h</a></li>
<li><a href="#trunkSourceWebKit2NetworkProcesssoupNetworkSessionSoupcpp">trunk/Source/WebKit2/NetworkProcess/soup/NetworkSessionSoup.cpp</a></li>
<li><a href="#trunkSourceWebKit2NetworkProcesssoupNetworkSessionSouph">trunk/Source/WebKit2/NetworkProcess/soup/NetworkSessionSoup.h</a></li>
<li><a href="#trunkSourceWebKit2PlatformEflcmake">trunk/Source/WebKit2/PlatformEfl.cmake</a></li>
<li><a href="#trunkSourceWebKit2PlatformGTKcmake">trunk/Source/WebKit2/PlatformGTK.cmake</a></li>
<li><a href="#trunkSourceWebKit2WebKit2xcodeprojprojectpbxproj">trunk/Source/WebKit2/WebKit2.xcodeproj/project.pbxproj</a></li>
</ul>
<h3>Added Paths</h3>
<ul>
<li><a href="#trunkSourceWebKit2NetworkProcessNetworkDataTaskBlobcpp">trunk/Source/WebKit2/NetworkProcess/NetworkDataTaskBlob.cpp</a></li>
<li><a href="#trunkSourceWebKit2NetworkProcessNetworkDataTaskBlobh">trunk/Source/WebKit2/NetworkProcess/NetworkDataTaskBlob.h</a></li>
</ul>
<h3>Removed Paths</h3>
<ul>
<li><a href="#trunkSourceWebKit2NetworkProcessDownloadssoupDownloadSoupcpp">trunk/Source/WebKit2/NetworkProcess/Downloads/soup/DownloadSoup.cpp</a></li>
</ul>
</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (208387 => 208388)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2016-11-04 18:02:32 UTC (rev 208387)
+++ trunk/Source/WebCore/ChangeLog        2016-11-04 18:08:05 UTC (rev 208388)
</span><span class="lines">@@ -1,3 +1,16 @@
</span><ins>+2016-11-04 Keith Rollin <krollin@apple.com>
+
+ NetworkSession: Add NetworkDataTask implementation for blobs
+ https://bugs.webkit.org/show_bug.cgi?id=163939
+
+ Reviewed by Alex Christensen.
+
+ * WebCore.xcodeproj/project.pbxproj: Mark HTTPParsers.h and AsyncFileStream.h as private.
+ * fileapi/AsyncFileStream.h: Add WEBCORE_EXPORT to AsyncFileStream class.
+ * platform/network/BlobData.h: Add WEBCORE_EXPORT to length().
+ * platform/network/HTTPParsers.h: Add WEBCORE_EXPORT to parseRange().
+ * platform/network/ResourceResponseBase.h: Add WEBCORE_EXPORT to setHTTPHeaderField().
+
</ins><span class="cx"> 2016-11-04 Brady Eidson <beidson@apple.com>
</span><span class="cx">
</span><span class="cx"> IndexedDB 2.0: Use IDB-specific exceptions in places where the generic exceptions are currently used.
</span></span></pre></div>
<a id="trunkSourceWebCoreWebCorexcodeprojprojectpbxproj"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj (208387 => 208388)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj        2016-11-04 18:02:32 UTC (rev 208387)
+++ trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj        2016-11-04 18:08:05 UTC (rev 208388)
</span><span class="lines">@@ -2061,7 +2061,7 @@
</span><span class="cx">                 514C76700CE923A1007EF3CD /* FormData.h in Headers */ = {isa = PBXBuildFile; fileRef = 514C765B0CE923A1007EF3CD /* FormData.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><span class="cx">                 514C76710CE923A1007EF3CD /* HTTPHeaderMap.h in Headers */ = {isa = PBXBuildFile; fileRef = 514C765C0CE923A1007EF3CD /* HTTPHeaderMap.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><span class="cx">                 514C76720CE923A1007EF3CD /* HTTPParsers.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 514C765D0CE923A1007EF3CD /* HTTPParsers.cpp */; };
</span><del>-                514C76730CE923A1007EF3CD /* HTTPParsers.h in Headers */ = {isa = PBXBuildFile; fileRef = 514C765E0CE923A1007EF3CD /* HTTPParsers.h */; };
</del><ins>+                514C76730CE923A1007EF3CD /* HTTPParsers.h in Headers */ = {isa = PBXBuildFile; fileRef = 514C765E0CE923A1007EF3CD /* HTTPParsers.h */; settings = {ATTRIBUTES = (Private, ); }; };
</ins><span class="cx">                 514C76740CE923A1007EF3CD /* ProtectionSpaceBase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 514C765F0CE923A1007EF3CD /* ProtectionSpaceBase.cpp */; };
</span><span class="cx">                 514C76750CE923A1007EF3CD /* ProtectionSpaceBase.h in Headers */ = {isa = PBXBuildFile; fileRef = 514C76600CE923A1007EF3CD /* ProtectionSpaceBase.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><span class="cx">                 514C76780CE923A1007EF3CD /* ResourceHandle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 514C76630CE923A1007EF3CD /* ResourceHandle.cpp */; };
</span><span class="lines">@@ -6183,7 +6183,7 @@
</span><span class="cx">                 E1CA5CBC0E8CDCAF00E8EF90 /* JSWorkerCustom.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E1CA5CBB0E8CDCAF00E8EF90 /* JSWorkerCustom.cpp */; };
</span><span class="cx">                 E1CAA5C60E8BD23600A73ECA /* JSWorker.h in Headers */ = {isa = PBXBuildFile; fileRef = E1CAA5C50E8BD23600A73ECA /* JSWorker.h */; };
</span><span class="cx">                 E1CDE92015018ED000862CC5 /* AsyncFileStream.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E1CDE91F15018ED000862CC5 /* AsyncFileStream.cpp */; };
</span><del>-                E1CDE9221501916900862CC5 /* AsyncFileStream.h in Headers */ = {isa = PBXBuildFile; fileRef = E1CDE9211501916900862CC5 /* AsyncFileStream.h */; settings = {ATTRIBUTES = (); }; };
</del><ins>+                E1CDE9221501916900862CC5 /* AsyncFileStream.h in Headers */ = {isa = PBXBuildFile; fileRef = E1CDE9211501916900862CC5 /* AsyncFileStream.h */; settings = {ATTRIBUTES = (Private, ); }; };
</ins><span class="cx">                 E1D31CDC19196020001005A3 /* BlobDataFileReference.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E1D31CDA19196020001005A3 /* BlobDataFileReference.cpp */; };
</span><span class="cx">                 E1D31CDD19196020001005A3 /* BlobDataFileReference.h in Headers */ = {isa = PBXBuildFile; fileRef = E1D31CDB19196020001005A3 /* BlobDataFileReference.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><span class="cx">                 E1E1BF00115FF6FB006F52CA /* WindowsKeyboardCodes.h in Headers */ = {isa = PBXBuildFile; fileRef = E1E1BEFF115FF6FB006F52CA /* WindowsKeyboardCodes.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span></span></pre></div>
<a id="trunkSourceWebCorefileapiAsyncFileStreamh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/fileapi/AsyncFileStream.h (208387 => 208388)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/fileapi/AsyncFileStream.h        2016-11-04 18:02:32 UTC (rev 208387)
+++ trunk/Source/WebCore/fileapi/AsyncFileStream.h        2016-11-04 18:08:05 UTC (rev 208388)
</span><span class="lines">@@ -42,7 +42,7 @@
</span><span class="cx"> class FileStream;
</span><span class="cx"> class URL;
</span><span class="cx">
</span><del>-class AsyncFileStream {
</del><ins>+class WEBCORE_EXPORT AsyncFileStream {
</ins><span class="cx"> public:
</span><span class="cx"> explicit AsyncFileStream(FileStreamClient&);
</span><span class="cx"> ~AsyncFileStream();
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgtkpoChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/gtk/po/ChangeLog (208387 => 208388)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/gtk/po/ChangeLog        2016-11-04 18:02:32 UTC (rev 208387)
+++ trunk/Source/WebCore/platform/gtk/po/ChangeLog        2016-11-04 18:08:05 UTC (rev 208388)
</span><span class="lines">@@ -1,3 +1,12 @@
</span><ins>+2016-11-04 Carlos Garcia Campos <cgarcia@igalia.com>
+
+ NetworkSession: Add NetworkDataTask implementation for blobs
+ https://bugs.webkit.org/show_bug.cgi?id=163939
+
+ Reviewed by Alex Christensen.
+
+ * POTFILES.in: Remove DownloadSoup.cpp
+
</ins><span class="cx"> 2016-11-03 Alex Christensen <achristensen@webkit.org>
</span><span class="cx">
</span><span class="cx"> Unreviewed, rolling out r208298.
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgtkpoPOTFILESin"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/gtk/po/POTFILES.in (208387 => 208388)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/gtk/po/POTFILES.in        2016-11-04 18:02:32 UTC (rev 208387)
+++ trunk/Source/WebCore/platform/gtk/po/POTFILES.in        2016-11-04 18:08:05 UTC (rev 208388)
</span><span class="lines">@@ -1,7 +1,6 @@
</span><span class="cx"> # List of source files which contain translatable strings.
</span><span class="cx"> ErrorsGtk.cpp
</span><span class="cx"> LocalizedStringsGtk.cpp
</span><del>-../../../WebKit2/NetworkProcess/Downloads/soup/DownloadSoup.cpp
</del><span class="cx"> ../../../WebKit2/UIProcess/API/gtk/WebKitAuthenticationDialog.cpp
</span><span class="cx"> ../../../WebKit2/UIProcess/API/gtk/WebKitDownload.cpp
</span><span class="cx"> ../../../WebKit2/UIProcess/API/gtk/WebKitFaviconDatabase.cpp
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformnetworkBlobDatah"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/network/BlobData.h (208387 => 208388)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/network/BlobData.h        2016-11-04 18:02:32 UTC (rev 208387)
+++ trunk/Source/WebCore/platform/network/BlobData.h        2016-11-04 18:08:05 UTC (rev 208388)
</span><span class="lines">@@ -59,7 +59,7 @@
</span><span class="cx"> BlobDataFileReference* file() const { return m_file.get(); }
</span><span class="cx">
</span><span class="cx"> long long offset() const { return m_offset; }
</span><del>- long long length() const; // Computes file length if it's not known yet.
</del><ins>+ WEBCORE_EXPORT long long length() const; // Computes file length if it's not known yet.
</ins><span class="cx">
</span><span class="cx"> private:
</span><span class="cx"> friend class BlobData;
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformnetworkHTTPParsersh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/network/HTTPParsers.h (208387 => 208388)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/network/HTTPParsers.h        2016-11-04 18:02:32 UTC (rev 208387)
+++ trunk/Source/WebCore/platform/network/HTTPParsers.h        2016-11-04 18:08:05 UTC (rev 208388)
</span><span class="lines">@@ -81,7 +81,7 @@
</span><span class="cx"> XFrameOptionsDisposition parseXFrameOptionsHeader(const String&);
</span><span class="cx">
</span><span class="cx"> // -1 could be set to one of the return parameters to indicate the value is not specified.
</span><del>-bool parseRange(const String&, long long& rangeOffset, long long& rangeEnd, long long& rangeSuffixLength);
</del><ins>+WEBCORE_EXPORT bool parseRange(const String&, long long& rangeOffset, long long& rangeEnd, long long& rangeSuffixLength);
</ins><span class="cx">
</span><span class="cx"> #if ENABLE(NOSNIFF)
</span><span class="cx"> ContentTypeOptionsDisposition parseContentTypeOptionsHeader(const String& header);
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformnetworkResourceResponseBaseh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/network/ResourceResponseBase.h (208387 => 208388)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/network/ResourceResponseBase.h        2016-11-04 18:02:32 UTC (rev 208387)
+++ trunk/Source/WebCore/platform/network/ResourceResponseBase.h        2016-11-04 18:08:05 UTC (rev 208388)
</span><span class="lines">@@ -99,7 +99,7 @@
</span><span class="cx"> String httpHeaderField(const String& name) const;
</span><span class="cx"> WEBCORE_EXPORT String httpHeaderField(HTTPHeaderName) const;
</span><span class="cx"> WEBCORE_EXPORT void setHTTPHeaderField(const String& name, const String& value);
</span><del>- void setHTTPHeaderField(HTTPHeaderName, const String& value);
</del><ins>+ WEBCORE_EXPORT void setHTTPHeaderField(HTTPHeaderName, const String& value);
</ins><span class="cx">
</span><span class="cx"> void addHTTPHeaderField(HTTPHeaderName, const String& value);
</span><span class="cx"> void addHTTPHeaderField(const String& name, const String& value);
</span></span></pre></div>
<a id="trunkSourceWebKit2CMakeListstxt"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/CMakeLists.txt (208387 => 208388)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/CMakeLists.txt        2016-11-04 18:02:32 UTC (rev 208387)
+++ trunk/Source/WebKit2/CMakeLists.txt        2016-11-04 18:08:05 UTC (rev 208388)
</span><span class="lines">@@ -181,6 +181,7 @@
</span><span class="cx"> set(NetworkProcess_COMMON_SOURCES
</span><span class="cx"> NetworkProcess/NetworkConnectionToWebProcess.cpp
</span><span class="cx"> NetworkProcess/NetworkDataTask.cpp
</span><ins>+ NetworkProcess/NetworkDataTaskBlob.cpp
</ins><span class="cx"> NetworkProcess/NetworkLoad.cpp
</span><span class="cx"> NetworkProcess/NetworkProcess.cpp
</span><span class="cx"> NetworkProcess/NetworkProcessPlatformStrategies.cpp
</span></span></pre></div>
<a id="trunkSourceWebKit2ChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/ChangeLog (208387 => 208388)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/ChangeLog        2016-11-04 18:02:32 UTC (rev 208387)
+++ trunk/Source/WebKit2/ChangeLog        2016-11-04 18:08:05 UTC (rev 208388)
</span><span class="lines">@@ -1,3 +1,104 @@
</span><ins>+2016-11-04 Carlos Garcia Campos <cgarcia@igalia.com>
+
+ NetworkSession: Add NetworkDataTask implementation for blobs
+ https://bugs.webkit.org/show_bug.cgi?id=163939
+
+ Reviewed by Alex Christensen.
+
+ Add NetworkDataTaskBlob to handle blobs when using NetworkSession instead of using ResourceHandle. This patch
+ adds more USE(NETWORK_SESSION) ifdefs to not use ResourceHandle in Downloads and NetworkLoad when NetworkSession
+ is enabled.
+
+ * CMakeLists.txt: Add new files to compilation.
+ * NetworkProcess/Downloads/BlobDownloadClient.cpp:
+ * NetworkProcess/Downloads/BlobDownloadClient.h:
+ * NetworkProcess/Downloads/Download.cpp:
+ (WebKit::Download::Download): Split the constructor again and remove the PlatformDownloadTaskRef
+ definitions. Now Cocoa specific constructor receives a NSURLSessionDownloadTask and the general constructor
+ reveices a NetworkDataTask and is used by Soup backend and blobs.
+ (WebKit::Download::~Download):
+ (WebKit::Download::start):
+ (WebKit::Download::startWithHandle):
+ (WebKit::Download::cancel):
+ (WebKit::Download::didReceiveAuthenticationChallenge):
+ (WebKit::Download::didReceiveData):
+ (WebKit::Download::didFinish):
+ (WebKit::Download::platformCancelNetworkLoad): Rename cancelNetworkLoad() as platformCancelNetworkLoad() since
+ this is now used only by Cocoa platform to cancel the NSURLSessionDownloadTask.
+ * NetworkProcess/Downloads/Download.h:
+ (WebKit::Download::Download):
+ (WebKit::Download::suggestedName):
+ (WebKit::Download::request):
+ * NetworkProcess/Downloads/DownloadManager.cpp:
+ (WebKit::DownloadManager::startDownload): Remove blobs specific code when using NetworkSession.
+ (WebKit::DownloadManager::continueDecidePendingDownloadDestination):
+ * NetworkProcess/Downloads/DownloadManager.h:
+ * NetworkProcess/Downloads/cocoa/DownloadCocoa.mm:
+ (WebKit::Download::platformCancelNetworkLoad):
+ * NetworkProcess/Downloads/soup/DownloadSoup.cpp: Removed.
+ * NetworkProcess/NetworkConnectionToWebProcess.cpp:
+ (WebKit::NetworkConnectionToWebProcess::convertMainResourceLoadToDownload): Remove blobs specific code when
+ using NetworkSession.
+ * NetworkProcess/NetworkDataTask.cpp:
+ (WebKit::NetworkDataTask::create): If request is a blob, create a NetworkDataTaskBlob.
+ * NetworkProcess/NetworkDataTask.h: Add invalidateAndCancel pure virtual method.
+ * NetworkProcess/NetworkDataTaskBlob.cpp: Added.
+ (WebKit::NetworkDataTaskBlob::NetworkDataTaskBlob):
+ (WebKit::NetworkDataTaskBlob::~NetworkDataTaskBlob):
+ (WebKit::NetworkDataTaskBlob::clearStream):
+ (WebKit::NetworkDataTaskBlob::resume):
+ (WebKit::NetworkDataTaskBlob::suspend):
+ (WebKit::NetworkDataTaskBlob::cancel):
+ (WebKit::NetworkDataTaskBlob::invalidateAndCancel):
+ (WebKit::NetworkDataTaskBlob::getSizeForNext):
+ (WebKit::NetworkDataTaskBlob::didGetSize):
+ (WebKit::NetworkDataTaskBlob::seek):
+ (WebKit::NetworkDataTaskBlob::didReceiveResponse):
+ (WebKit::NetworkDataTaskBlob::read):
+ (WebKit::NetworkDataTaskBlob::readData):
+ (WebKit::NetworkDataTaskBlob::readFile):
+ (WebKit::NetworkDataTaskBlob::didOpen):
+ (WebKit::NetworkDataTaskBlob::didRead):
+ (WebKit::NetworkDataTaskBlob::consumeData):
+ (WebKit::NetworkDataTaskBlob::setPendingDownloadLocation):
+ (WebKit::NetworkDataTaskBlob::suggestedFilename):
+ (WebKit::NetworkDataTaskBlob::download):
+ (WebKit::NetworkDataTaskBlob::writeDownload):
+ (WebKit::NetworkDataTaskBlob::cleanDownloadFiles):
+ (WebKit::NetworkDataTaskBlob::didFailDownload):
+ (WebKit::NetworkDataTaskBlob::didFinishDownload):
+ (WebKit::NetworkDataTaskBlob::didFail):
+ (WebKit::NetworkDataTaskBlob::didFinish):
+ * NetworkProcess/NetworkDataTaskBlob.h: Added.
+ * NetworkProcess/NetworkLoad.cpp:
+ (WebKit::NetworkLoad::NetworkLoad): Remove blobs specific code when using NetworkSession.
+ (WebKit::NetworkLoad::~NetworkLoad):
+ (WebKit::NetworkLoad::setDefersLoading):
+ (WebKit::NetworkLoad::cancel):
+ (WebKit::NetworkLoad::continueWillSendRequest):
+ (WebKit::NetworkLoad::continueDidReceiveResponse):
+ (WebKit::NetworkLoad::continueCanAuthenticateAgainstProtectionSpace):
+ (WebKit::NetworkLoad::canAuthenticateAgainstProtectionSpaceAsync):
+ * NetworkProcess/NetworkLoad.h:
+ * NetworkProcess/NetworkSession.cpp:
+ (WebKit::NetworkSession::invalidateAndCancel): Moved from NetworkSessionSoup, since this is now used also by blobs.
+ * NetworkProcess/NetworkSession.h:
+ (WebKit::NetworkSession::registerNetworkDataTask): Ditto.
+ (WebKit::NetworkSession::unregisterNetworkDataTask): Ditto.
+ * NetworkProcess/cocoa/NetworkDataTaskCocoa.h: Add invalidateAndCancel() implementation that does nothing
+ because in Cocoa all tasks are invalidated and canceled by the network session.
+ * NetworkProcess/mac/NetworkLoadMac.mm:
+ * NetworkProcess/soup/NetworkDataTaskSoup.cpp:
+ (WebKit::NetworkDataTaskSoup::NetworkDataTaskSoup):
+ (WebKit::NetworkDataTaskSoup::~NetworkDataTaskSoup):
+ (WebKit::NetworkDataTaskSoup::download):
+ * NetworkProcess/soup/NetworkDataTaskSoup.h:
+ * NetworkProcess/soup/NetworkSessionSoup.cpp:
+ * NetworkProcess/soup/NetworkSessionSoup.h:
+ * PlatformEfl.cmake: Remove DownloadSoup.cpp from compilation.
+ * PlatformGTK.cmake: Ditto.
+ * WebKit2.xcodeproj/project.pbxproj: Add new files to compilation.
+
</ins><span class="cx"> 2016-11-03 Simon Fraser <simon.fraser@apple.com>
</span><span class="cx">
</span><span class="cx"> Give all the geometry classes a single-argument scale() function for consistency
</span></span></pre></div>
<a id="trunkSourceWebKit2NetworkProcessDownloadsBlobDownloadClientcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/NetworkProcess/Downloads/BlobDownloadClient.cpp (208387 => 208388)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/NetworkProcess/Downloads/BlobDownloadClient.cpp        2016-11-04 18:02:32 UTC (rev 208387)
+++ trunk/Source/WebKit2/NetworkProcess/Downloads/BlobDownloadClient.cpp        2016-11-04 18:08:05 UTC (rev 208388)
</span><span class="lines">@@ -26,6 +26,8 @@
</span><span class="cx"> #include "config.h"
</span><span class="cx"> #include "BlobDownloadClient.h"
</span><span class="cx">
</span><ins>+#if !USE(NETWORK_SESSION)
+
</ins><span class="cx"> #include "DataReference.h"
</span><span class="cx"> #include "Download.h"
</span><span class="cx"> #include "WebErrors.h"
</span><span class="lines">@@ -97,3 +99,5 @@
</span><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> }
</span><ins>+
+#endif // !USE(NETWORK_SESSION)
</ins></span></pre></div>
<a id="trunkSourceWebKit2NetworkProcessDownloadsBlobDownloadClienth"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/NetworkProcess/Downloads/BlobDownloadClient.h (208387 => 208388)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/NetworkProcess/Downloads/BlobDownloadClient.h        2016-11-04 18:02:32 UTC (rev 208387)
+++ trunk/Source/WebKit2/NetworkProcess/Downloads/BlobDownloadClient.h        2016-11-04 18:08:05 UTC (rev 208388)
</span><span class="lines">@@ -25,6 +25,8 @@
</span><span class="cx">
</span><span class="cx"> #pragma once
</span><span class="cx">
</span><ins>+#if !USE(NETWORK_SESSION)
+
</ins><span class="cx"> #include <WebCore/FileSystem.h>
</span><span class="cx"> #include <WebCore/ResourceHandleClient.h>
</span><span class="cx"> #include <wtf/RefPtr.h>
</span><span class="lines">@@ -55,3 +57,5 @@
</span><span class="cx"> };
</span><span class="cx">
</span><span class="cx"> }
</span><ins>+
+#endif // !USE(NETWORK_SESSION)
</ins></span></pre></div>
<a id="trunkSourceWebKit2NetworkProcessDownloadsDownloadcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/NetworkProcess/Downloads/Download.cpp (208387 => 208388)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/NetworkProcess/Downloads/Download.cpp        2016-11-04 18:02:32 UTC (rev 208387)
+++ trunk/Source/WebKit2/NetworkProcess/Downloads/Download.cpp        2016-11-04 18:08:05 UTC (rev 208388)
</span><span class="lines">@@ -45,10 +45,10 @@
</span><span class="cx"> namespace WebKit {
</span><span class="cx">
</span><span class="cx"> #if USE(NETWORK_SESSION)
</span><del>-Download::Download(DownloadManager& downloadManager, DownloadID downloadID, PlatformDownloadTaskRef download, const WebCore::SessionID& sessionID, const String& suggestedName)
</del><ins>+Download::Download(DownloadManager& downloadManager, DownloadID downloadID, NetworkDataTask& download, const SessionID& sessionID, const String& suggestedName)
</ins><span class="cx"> : m_downloadManager(downloadManager)
</span><span class="cx"> , m_downloadID(downloadID)
</span><del>- , m_download(download)
</del><ins>+ , m_download(&download)
</ins><span class="cx"> , m_sessionID(sessionID)
</span><span class="cx"> , m_suggestedName(suggestedName)
</span><span class="cx"> {
</span><span class="lines">@@ -56,8 +56,20 @@
</span><span class="cx">
</span><span class="cx"> m_downloadManager.didCreateDownload();
</span><span class="cx"> }
</span><ins>+#if PLATFORM(COCOA)
+Download::Download(DownloadManager& downloadManager, DownloadID downloadID, NSURLSessionDownloadTask* download, const SessionID& sessionID, const String& suggestedName)
+ : m_downloadManager(downloadManager)
+ , m_downloadID(downloadID)
+ , m_downloadTask(download)
+ , m_sessionID(sessionID)
+ , m_suggestedName(suggestedName)
+{
+ ASSERT(m_downloadID.downloadID());
+
+ m_downloadManager.didCreateDownload();
+}
</ins><span class="cx"> #endif
</span><del>-
</del><ins>+#else
</ins><span class="cx"> Download::Download(DownloadManager& downloadManager, DownloadID downloadID, const ResourceRequest& request, const String& suggestedName)
</span><span class="cx"> : m_downloadManager(downloadManager)
</span><span class="cx"> , m_downloadID(downloadID)
</span><span class="lines">@@ -68,9 +80,11 @@
</span><span class="cx">
</span><span class="cx"> m_downloadManager.didCreateDownload();
</span><span class="cx"> }
</span><ins>+#endif // USE(NETWORK_SESSION)
</ins><span class="cx">
</span><span class="cx"> Download::~Download()
</span><span class="cx"> {
</span><ins>+#if !USE(NETWORK_SESSION)
</ins><span class="cx"> if (m_resourceHandle) {
</span><span class="cx"> m_resourceHandle->clearClient();
</span><span class="cx"> m_resourceHandle->cancel();
</span><span class="lines">@@ -79,10 +93,12 @@
</span><span class="cx"> m_downloadClient = nullptr;
</span><span class="cx">
</span><span class="cx"> platformInvalidate();
</span><ins>+#endif
</ins><span class="cx">
</span><span class="cx"> m_downloadManager.didDestroyDownload();
</span><span class="cx"> }
</span><span class="cx">
</span><ins>+#if !USE(NETWORK_SESSION)
</ins><span class="cx"> void Download::start()
</span><span class="cx"> {
</span><span class="cx"> if (m_request.url().protocolIsBlob()) {
</span><span class="lines">@@ -92,11 +108,7 @@
</span><span class="cx"> return;
</span><span class="cx"> }
</span><span class="cx">
</span><del>-#if USE(NETWORK_SESSION)
- ASSERT_NOT_REACHED();
-#else
</del><span class="cx"> startNetworkLoad();
</span><del>-#endif
</del><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> void Download::startWithHandle(ResourceHandle* handle, const ResourceResponse& response)
</span><span class="lines">@@ -108,17 +120,19 @@
</span><span class="cx"> return;
</span><span class="cx"> }
</span><span class="cx">
</span><del>-#if USE(NETWORK_SESSION)
- UNUSED_PARAM(handle);
- UNUSED_PARAM(response);
- ASSERT_NOT_REACHED();
-#else
</del><span class="cx"> startNetworkLoadWithHandle(handle, response);
</span><ins>+}
</ins><span class="cx"> #endif
</span><del>-}
</del><span class="cx">
</span><span class="cx"> void Download::cancel()
</span><span class="cx"> {
</span><ins>+#if USE(NETWORK_SESSION)
+ if (m_download) {
+ m_download->cancel();
+ didCancel({ });
+ return;
+ }
+#else
</ins><span class="cx"> if (m_request.url().protocolIsBlob()) {
</span><span class="cx"> auto resourceHandle = WTFMove(m_resourceHandle);
</span><span class="cx"> resourceHandle->cancel();
</span><span class="lines">@@ -125,20 +139,20 @@
</span><span class="cx"> static_cast<BlobDownloadClient*>(m_downloadClient.get())->didCancel();
</span><span class="cx"> return;
</span><span class="cx"> }
</span><del>- cancelNetworkLoad();
</del><ins>+#endif
+ platformCancelNetworkLoad();
</ins><span class="cx"> }
</span><span class="cx">
</span><ins>+#if !USE(NETWORK_SESSION)
</ins><span class="cx"> void Download::didStart()
</span><span class="cx"> {
</span><span class="cx"> send(Messages::DownloadProxy::DidStart(m_request, m_suggestedName));
</span><span class="cx"> }
</span><span class="cx">
</span><del>-#if !USE(NETWORK_SESSION)
</del><span class="cx"> void Download::didReceiveAuthenticationChallenge(const AuthenticationChallenge& authenticationChallenge)
</span><span class="cx"> {
</span><span class="cx"> m_downloadManager.downloadsAuthenticationManager().didReceiveAuthenticationChallenge(*this, authenticationChallenge);
</span><span class="cx"> }
</span><del>-#endif
</del><span class="cx">
</span><span class="cx"> void Download::didReceiveResponse(const ResourceResponse& response)
</span><span class="cx"> {
</span><span class="lines">@@ -147,16 +161,6 @@
</span><span class="cx"> send(Messages::DownloadProxy::DidReceiveResponse(response));
</span><span class="cx"> }
</span><span class="cx">
</span><del>-void Download::didReceiveData(uint64_t length)
-{
- if (!m_hasReceivedData) {
- RELEASE_LOG_IF_ALLOWED("didReceiveData: Started receiving data (id = %" PRIu64 ")", downloadID().downloadID());
- m_hasReceivedData = true;
- }
-
- send(Messages::DownloadProxy::DidReceiveData(length));
-}
-
</del><span class="cx"> bool Download::shouldDecodeSourceDataOfMIMEType(const String& mimeType)
</span><span class="cx"> {
</span><span class="cx"> bool result;
</span><span class="lines">@@ -166,8 +170,6 @@
</span><span class="cx"> return result;
</span><span class="cx"> }
</span><span class="cx">
</span><del>-#if !USE(NETWORK_SESSION)
-
</del><span class="cx"> String Download::decideDestinationWithSuggestedFilename(const String& filename, bool& allowOverwrite)
</span><span class="cx"> {
</span><span class="cx"> String destination;
</span><span class="lines">@@ -182,8 +184,6 @@
</span><span class="cx"> return destination;
</span><span class="cx"> }
</span><span class="cx">
</span><del>-#endif
-
</del><span class="cx"> void Download::decideDestinationWithSuggestedFilenameAsync(const String& suggestedFilename)
</span><span class="cx"> {
</span><span class="cx"> send(Messages::DownloadProxy::DecideDestinationWithSuggestedFilenameAsync(downloadID(), suggestedFilename));
</span><span class="lines">@@ -209,6 +209,7 @@
</span><span class="cx"> {
</span><span class="cx"> m_resourceHandle->continueDidReceiveResponse();
</span><span class="cx"> }
</span><ins>+#endif
</ins><span class="cx">
</span><span class="cx"> void Download::didCreateDestination(const String& path)
</span><span class="cx"> {
</span><span class="lines">@@ -215,11 +216,23 @@
</span><span class="cx"> send(Messages::DownloadProxy::DidCreateDestination(path));
</span><span class="cx"> }
</span><span class="cx">
</span><ins>+void Download::didReceiveData(uint64_t length)
+{
+ if (!m_hasReceivedData) {
+ RELEASE_LOG_IF_ALLOWED("didReceiveData: Started receiving data (id = %" PRIu64 ")", downloadID().downloadID());
+ m_hasReceivedData = true;
+ }
+
+ send(Messages::DownloadProxy::DidReceiveData(length));
+}
+
</ins><span class="cx"> void Download::didFinish()
</span><span class="cx"> {
</span><span class="cx"> RELEASE_LOG_IF_ALLOWED("didFinish: (id = %" PRIu64 ")", downloadID().downloadID());
</span><span class="cx">
</span><ins>+#if !USE(NETWORK_SESSION)
</ins><span class="cx"> platformDidFinish();
</span><ins>+#endif
</ins><span class="cx">
</span><span class="cx"> send(Messages::DownloadProxy::DidFinish());
</span><span class="cx">
</span><span class="lines">@@ -277,4 +290,10 @@
</span><span class="cx"> #endif
</span><span class="cx"> }
</span><span class="cx">
</span><ins>+#if !PLATFORM(COCOA)
+void Download::platformCancelNetworkLoad()
+{
+}
+#endif
+
</ins><span class="cx"> } // namespace WebKit
</span></span></pre></div>
<a id="trunkSourceWebKit2NetworkProcessDownloadsDownloadh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/NetworkProcess/Downloads/Download.h (208387 => 208388)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/NetworkProcess/Downloads/Download.h        2016-11-04 18:02:32 UTC (rev 208387)
+++ trunk/Source/WebKit2/NetworkProcess/Downloads/Download.h        2016-11-04 18:08:05 UTC (rev 208388)
</span><span class="lines">@@ -40,12 +40,6 @@
</span><span class="cx"> #if USE(NETWORK_SESSION)
</span><span class="cx"> #if PLATFORM(COCOA)
</span><span class="cx"> OBJC_CLASS NSURLSessionDownloadTask;
</span><del>-typedef NSURLSessionDownloadTask* PlatformDownloadTaskRef;
-#elif USE(SOUP)
-namespace WebKit {
-class NetworkDataTask;
-}
-typedef WebKit::NetworkDataTask* PlatformDownloadTaskRef;
</del><span class="cx"> #endif
</span><span class="cx"> #else // USE(NETWORK_SESSION)
</span><span class="cx"> #if PLATFORM(COCOA)
</span><span class="lines">@@ -73,6 +67,7 @@
</span><span class="cx"> namespace WebKit {
</span><span class="cx">
</span><span class="cx"> class DownloadManager;
</span><ins>+class NetworkDataTask;
</ins><span class="cx"> class NetworkSession;
</span><span class="cx"> class WebPage;
</span><span class="cx">
</span><span class="lines">@@ -80,39 +75,43 @@
</span><span class="cx"> WTF_MAKE_NONCOPYABLE(Download); WTF_MAKE_FAST_ALLOCATED;
</span><span class="cx"> public:
</span><span class="cx"> #if USE(NETWORK_SESSION)
</span><del>- Download(DownloadManager&, DownloadID, PlatformDownloadTaskRef, const WebCore::SessionID& sessionID, const String& suggestedFilename = { });
</del><ins>+ Download(DownloadManager&, DownloadID, NetworkDataTask&, const WebCore::SessionID& sessionID, const String& suggestedFilename = { });
+#if PLATFORM(COCOA)
+ Download(DownloadManager&, DownloadID, NSURLSessionDownloadTask*, const WebCore::SessionID& sessionID, const String& suggestedFilename = { });
</ins><span class="cx"> #endif
</span><ins>+#else
</ins><span class="cx"> Download(DownloadManager&, DownloadID, const WebCore::ResourceRequest&, const String& suggestedFilename = { });
</span><ins>+#endif
</ins><span class="cx">
</span><span class="cx"> ~Download();
</span><span class="cx">
</span><ins>+#if !USE(NETWORK_SESSION)
</ins><span class="cx"> void start();
</span><span class="cx"> void startWithHandle(WebCore::ResourceHandle*, const WebCore::ResourceResponse&);
</span><ins>+#endif
</ins><span class="cx"> void resume(const IPC::DataReference& resumeData, const String& path, const SandboxExtension::Handle&);
</span><span class="cx"> void cancel();
</span><span class="cx">
</span><span class="cx"> DownloadID downloadID() const { return m_downloadID; }
</span><span class="cx"> const String& suggestedName() const { return m_suggestedName; }
</span><del>- const WebCore::ResourceRequest& request() const { return m_request; }
</del><span class="cx">
</span><span class="cx"> #if USE(NETWORK_SESSION)
</span><span class="cx"> void setSandboxExtension(RefPtr<SandboxExtension>&& sandboxExtension) { m_sandboxExtension = WTFMove(sandboxExtension); }
</span><span class="cx"> #else
</span><ins>+ const WebCore::ResourceRequest& request() const { return m_request; }
</ins><span class="cx"> void didReceiveAuthenticationChallenge(const WebCore::AuthenticationChallenge&);
</span><del>-#endif
</del><span class="cx"> void didStart();
</span><span class="cx"> void didReceiveResponse(const WebCore::ResourceResponse&);
</span><del>- void didReceiveData(uint64_t length);
</del><span class="cx"> bool shouldDecodeSourceDataOfMIMEType(const String& mimeType);
</span><del>-#if !USE(NETWORK_SESSION)
</del><span class="cx"> String decideDestinationWithSuggestedFilename(const String& filename, bool& allowOverwrite);
</span><del>-#endif
</del><span class="cx"> void decideDestinationWithSuggestedFilenameAsync(const String&);
</span><span class="cx"> void didDecideDownloadDestination(const String& destinationPath, const SandboxExtension::Handle&, bool allowOverwrite);
</span><span class="cx"> void continueDidReceiveResponse();
</span><ins>+ void platformDidFinish();
+#endif
</ins><span class="cx"> void didCreateDestination(const String& path);
</span><ins>+ void didReceiveData(uint64_t length);
</ins><span class="cx"> void didFinish();
</span><del>- void platformDidFinish();
</del><span class="cx"> void didFail(const WebCore::ResourceError&, const IPC::DataReference& resumeData);
</span><span class="cx"> void didCancel(const IPC::DataReference& resumeData);
</span><span class="cx">
</span><span class="lines">@@ -124,37 +123,35 @@
</span><span class="cx"> #if !USE(NETWORK_SESSION)
</span><span class="cx"> void startNetworkLoad();
</span><span class="cx"> void startNetworkLoadWithHandle(WebCore::ResourceHandle*, const WebCore::ResourceResponse&);
</span><ins>+ void platformInvalidate();
</ins><span class="cx"> #endif
</span><del>- void cancelNetworkLoad();
</del><ins>+ void platformCancelNetworkLoad();
</ins><span class="cx">
</span><del>- void platformInvalidate();
-
</del><span class="cx"> bool isAlwaysOnLoggingAllowed() const;
</span><span class="cx">
</span><span class="cx"> DownloadManager& m_downloadManager;
</span><span class="cx"> DownloadID m_downloadID;
</span><del>- WebCore::ResourceRequest m_request;
</del><span class="cx">
</span><span class="cx"> RefPtr<SandboxExtension> m_sandboxExtension;
</span><span class="cx">
</span><span class="cx"> #if USE(NETWORK_SESSION)
</span><ins>+ RefPtr<NetworkDataTask> m_download;
</ins><span class="cx"> #if PLATFORM(COCOA)
</span><del>- RetainPtr<NSURLSessionDownloadTask> m_download;
-#elif USE(SOUP)
- RefPtr<NetworkDataTask> m_download;
</del><ins>+ RetainPtr<NSURLSessionDownloadTask> m_downloadTask;
</ins><span class="cx"> #endif
</span><span class="cx"> WebCore::SessionID m_sessionID;
</span><span class="cx"> #else // USE(NETWORK_SESSION)
</span><ins>+ WebCore::ResourceRequest m_request;
</ins><span class="cx"> #if PLATFORM(COCOA)
</span><span class="cx"> RetainPtr<NSURLDownload> m_nsURLDownload;
</span><span class="cx"> RetainPtr<WKDownloadAsDelegate> m_delegate;
</span><span class="cx"> #endif
</span><del>-#endif // USE(NETWORK_SESSION)
</del><span class="cx"> #if USE(CFURLCONNECTION)
</span><span class="cx"> RetainPtr<CFURLDownloadRef> m_download;
</span><span class="cx"> #endif
</span><span class="cx"> std::unique_ptr<WebCore::ResourceHandleClient> m_downloadClient;
</span><span class="cx"> RefPtr<WebCore::ResourceHandle> m_resourceHandle;
</span><ins>+#endif // USE(NETWORK_SESSION)
</ins><span class="cx"> String m_suggestedName;
</span><span class="cx"> bool m_hasReceivedData { false };
</span><span class="cx"> };
</span></span></pre></div>
<a id="trunkSourceWebKit2NetworkProcessDownloadsDownloadManagercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/NetworkProcess/Downloads/DownloadManager.cpp (208387 => 208388)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/NetworkProcess/Downloads/DownloadManager.cpp        2016-11-04 18:02:32 UTC (rev 208387)
+++ trunk/Source/WebKit2/NetworkProcess/Downloads/DownloadManager.cpp        2016-11-04 18:08:05 UTC (rev 208388)
</span><span class="lines">@@ -47,23 +47,21 @@
</span><span class="cx"> void DownloadManager::startDownload(SessionID sessionID, DownloadID downloadID, const ResourceRequest& request, const String& suggestedName)
</span><span class="cx"> {
</span><span class="cx"> #if USE(NETWORK_SESSION)
</span><del>- if (!request.url().protocolIsBlob()) {
- auto* networkSession = SessionTracker::networkSession(sessionID);
- if (!networkSession)
- return;
- NetworkLoadParameters parameters;
- parameters.sessionID = sessionID;
- parameters.request = request;
- parameters.clientCredentialPolicy = ClientCredentialPolicy::MayAskClientForCredentials;
- m_pendingDownloads.add(downloadID, std::make_unique<PendingDownload>(WTFMove(parameters), downloadID, *networkSession, suggestedName));
</del><ins>+ auto* networkSession = SessionTracker::networkSession(sessionID);
+ if (!networkSession)
</ins><span class="cx"> return;
</span><del>- }
-#endif
</del><ins>+ NetworkLoadParameters parameters;
+ parameters.sessionID = sessionID;
+ parameters.request = request;
+ parameters.clientCredentialPolicy = ClientCredentialPolicy::MayAskClientForCredentials;
+ m_pendingDownloads.add(downloadID, std::make_unique<PendingDownload>(WTFMove(parameters), downloadID, *networkSession, suggestedName));
+#else
</ins><span class="cx"> auto download = std::make_unique<Download>(*this, downloadID, request, suggestedName);
</span><span class="cx"> download->start();
</span><span class="cx">
</span><span class="cx"> ASSERT(!m_downloads.contains(downloadID));
</span><span class="cx"> m_downloads.add(downloadID, WTFMove(download));
</span><ins>+#endif
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> #if USE(NETWORK_SESSION)
</span><span class="lines">@@ -99,8 +97,7 @@
</span><span class="cx"> auto addResult = m_downloadsWaitingForDestination.set(downloadID, std::make_pair<RefPtr<NetworkDataTask>, ResponseCompletionHandler>(&networkDataTask, WTFMove(completionHandler)));
</span><span class="cx"> ASSERT_UNUSED(addResult, addResult.isNewEntry);
</span><span class="cx"> }
</span><del>-#endif
-
</del><ins>+#else
</ins><span class="cx"> void DownloadManager::convertHandleToDownload(DownloadID downloadID, ResourceHandle* handle, const ResourceRequest& request, const ResourceResponse& response)
</span><span class="cx"> {
</span><span class="cx"> auto download = std::make_unique<Download>(*this, downloadID, request);
</span><span class="lines">@@ -109,6 +106,7 @@
</span><span class="cx"> ASSERT(!m_downloads.contains(downloadID));
</span><span class="cx"> m_downloads.add(downloadID, WTFMove(download));
</span><span class="cx"> }
</span><ins>+#endif // USE(NETWORK_SESSION)
</ins><span class="cx">
</span><span class="cx"> void DownloadManager::continueDecidePendingDownloadDestination(DownloadID downloadID, String destination, const SandboxExtension::Handle& sandboxExtensionHandle, bool allowOverwrite)
</span><span class="cx"> {
</span><span class="lines">@@ -134,11 +132,11 @@
</span><span class="cx">
</span><span class="cx"> ASSERT(!m_downloadsAfterDestinationDecided.contains(downloadID));
</span><span class="cx"> m_downloadsAfterDestinationDecided.set(downloadID, networkDataTask);
</span><del>- return;
</del><span class="cx"> }
</span><del>-#endif
</del><ins>+#else
</ins><span class="cx"> if (auto* waitingDownload = download(downloadID))
</span><span class="cx"> waitingDownload->didDecideDownloadDestination(destination, sandboxExtensionHandle, allowOverwrite);
</span><ins>+#endif
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> void DownloadManager::resumeDownload(SessionID, DownloadID downloadID, const IPC::DataReference& resumeData, const String& path, const SandboxExtension::Handle& sandboxExtensionHandle)
</span></span></pre></div>
<a id="trunkSourceWebKit2NetworkProcessDownloadsDownloadManagerh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/NetworkProcess/Downloads/DownloadManager.h (208387 => 208388)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/NetworkProcess/Downloads/DownloadManager.h        2016-11-04 18:02:32 UTC (rev 208387)
+++ trunk/Source/WebKit2/NetworkProcess/Downloads/DownloadManager.h        2016-11-04 18:08:05 UTC (rev 208388)
</span><span class="lines">@@ -80,8 +80,9 @@
</span><span class="cx"> #endif
</span><span class="cx"> void continueWillSendRequest(DownloadID, WebCore::ResourceRequest&&);
</span><span class="cx"> void willDecidePendingDownloadDestination(NetworkDataTask&, ResponseCompletionHandler&&);
</span><ins>+#else
+ void convertHandleToDownload(DownloadID, WebCore::ResourceHandle*, const WebCore::ResourceRequest&, const WebCore::ResourceResponse&);
</ins><span class="cx"> #endif
</span><del>- void convertHandleToDownload(DownloadID, WebCore::ResourceHandle*, const WebCore::ResourceRequest&, const WebCore::ResourceResponse&);
</del><span class="cx"> void continueDecidePendingDownloadDestination(DownloadID, String destination, const SandboxExtension::Handle&, bool allowOverwrite);
</span><span class="cx">
</span><span class="cx"> void resumeDownload(WebCore::SessionID, DownloadID, const IPC::DataReference& resumeData, const String& path, const SandboxExtension::Handle&);
</span></span></pre></div>
<a id="trunkSourceWebKit2NetworkProcessDownloadscocoaDownloadCocoamm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/NetworkProcess/Downloads/cocoa/DownloadCocoa.mm (208387 => 208388)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/NetworkProcess/Downloads/cocoa/DownloadCocoa.mm        2016-11-04 18:02:32 UTC (rev 208387)
+++ trunk/Source/WebKit2/NetworkProcess/Downloads/cocoa/DownloadCocoa.mm        2016-11-04 18:08:05 UTC (rev 208388)
</span><span class="lines">@@ -38,10 +38,10 @@
</span><span class="cx"> notImplemented();
</span><span class="cx"> }
</span><span class="cx">
</span><del>-void Download::cancelNetworkLoad()
</del><ins>+void Download::platformCancelNetworkLoad()
</ins><span class="cx"> {
</span><del>- ASSERT(m_download);
- [m_download cancelByProducingResumeData: ^(NSData * _Nullable resumeData)
</del><ins>+ ASSERT(m_downloadTask);
+ [m_downloadTask cancelByProducingResumeData: ^(NSData * _Nullable resumeData)
</ins><span class="cx"> {
</span><span class="cx"> if (resumeData && resumeData.bytes && resumeData.length)
</span><span class="cx"> didCancel(IPC::DataReference(reinterpret_cast<const uint8_t*>(resumeData.bytes), resumeData.length));
</span><span class="lines">@@ -50,15 +50,6 @@
</span><span class="cx"> }];
</span><span class="cx"> }
</span><span class="cx">
</span><del>-void Download::platformInvalidate()
-{
- notImplemented();
</del><span class="cx"> }
</span><span class="cx">
</span><del>-void Download::platformDidFinish()
-{
-}
-
-}
-
</del><span class="cx"> #endif // USE(NETWORK_SESSION)
</span></span></pre></div>
<a id="trunkSourceWebKit2NetworkProcessDownloadsiosDownloadIOSmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/NetworkProcess/Downloads/ios/DownloadIOS.mm (208387 => 208388)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/NetworkProcess/Downloads/ios/DownloadIOS.mm        2016-11-04 18:02:32 UTC (rev 208387)
+++ trunk/Source/WebKit2/NetworkProcess/Downloads/ios/DownloadIOS.mm        2016-11-04 18:08:05 UTC (rev 208388)
</span><span class="lines">@@ -142,7 +142,7 @@
</span><span class="cx"> #pragma clang diagnostic pop
</span><span class="cx"> }
</span><span class="cx">
</span><del>-void Download::cancelNetworkLoad()
</del><ins>+void Download::platformCancelNetworkLoad()
</ins><span class="cx"> {
</span><span class="cx"> notImplemented();
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebKit2NetworkProcessDownloadsmacDownloadMacmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/NetworkProcess/Downloads/mac/DownloadMac.mm (208387 => 208388)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/NetworkProcess/Downloads/mac/DownloadMac.mm        2016-11-04 18:02:32 UTC (rev 208387)
+++ trunk/Source/WebKit2/NetworkProcess/Downloads/mac/DownloadMac.mm        2016-11-04 18:08:05 UTC (rev 208388)
</span><span class="lines">@@ -109,7 +109,7 @@
</span><span class="cx"> [m_nsURLDownload setDeletesFileUponFailure:NO];
</span><span class="cx"> }
</span><span class="cx">
</span><del>-void Download::cancelNetworkLoad()
</del><ins>+void Download::platformCancelNetworkLoad()
</ins><span class="cx"> {
</span><span class="cx"> [m_nsURLDownload cancel];
</span><span class="cx">
</span></span></pre></div>
<a id="trunkSourceWebKit2NetworkProcessDownloadssoupDownloadSoupcpp"></a>
<div class="delfile"><h4>Deleted: trunk/Source/WebKit2/NetworkProcess/Downloads/soup/DownloadSoup.cpp (208387 => 208388)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/NetworkProcess/Downloads/soup/DownloadSoup.cpp        2016-11-04 18:02:32 UTC (rev 208387)
+++ trunk/Source/WebKit2/NetworkProcess/Downloads/soup/DownloadSoup.cpp        2016-11-04 18:08:05 UTC (rev 208388)
</span><span class="lines">@@ -1,57 +0,0 @@
</span><del>-/*
- * Copyright (C) 2010, 2011 Apple Inc. All rights reserved.
- * Copyright (C) 2010 Brent Fulgham <bfulgham@webkit.org>
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
- * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "config.h"
-#include "Download.h"
-
-#include "DataReference.h"
-#include "NetworkDataTask.h"
-#include <WebCore/NotImplemented.h>
-
-using namespace WebCore;
-
-namespace WebKit {
-
-void Download::resume(const IPC::DataReference&, const String&, const SandboxExtension::Handle&)
-{
- notImplemented();
-}
-
-void Download::cancelNetworkLoad()
-{
- m_download->cancel();
- didCancel({ });
-}
-
-void Download::platformInvalidate()
-{
-}
-
-void Download::platformDidFinish()
-{
-}
-
-} // namespace WebKit
</del></span></pre></div>
<a id="trunkSourceWebKit2NetworkProcessNetworkConnectionToWebProcesscpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/NetworkProcess/NetworkConnectionToWebProcess.cpp (208387 => 208388)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/NetworkProcess/NetworkConnectionToWebProcess.cpp        2016-11-04 18:02:32 UTC (rev 208387)
+++ trunk/Source/WebKit2/NetworkProcess/NetworkConnectionToWebProcess.cpp        2016-11-04 18:08:05 UTC (rev 208388)
</span><span class="lines">@@ -207,12 +207,9 @@
</span><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> #if USE(NETWORK_SESSION)
</span><del>- if (!request.url().protocolIsBlob()) {
- loader->networkLoad()->convertTaskToDownload(downloadID, request, response);
- loader->didConvertToDownload();
- return;
- }
-#endif
</del><ins>+ loader->networkLoad()->convertTaskToDownload(downloadID, request, response);
+ loader->didConvertToDownload();
+#else
</ins><span class="cx"> networkProcess.downloadManager().convertHandleToDownload(downloadID, loader->networkLoad()->handle(), request, response);
</span><span class="cx">
</span><span class="cx"> // Unblock the URL connection operation queue.
</span><span class="lines">@@ -219,6 +216,7 @@
</span><span class="cx"> loader->networkLoad()->handle()->continueDidReceiveResponse();
</span><span class="cx">
</span><span class="cx"> loader->didConvertToDownload();
</span><ins>+#endif
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> void NetworkConnectionToWebProcess::cookiesForDOM(SessionID sessionID, const URL& firstParty, const URL& url, String& result)
</span></span></pre></div>
<a id="trunkSourceWebKit2NetworkProcessNetworkDataTaskcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/NetworkProcess/NetworkDataTask.cpp (208387 => 208388)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/NetworkProcess/NetworkDataTask.cpp        2016-11-04 18:02:32 UTC (rev 208387)
+++ trunk/Source/WebKit2/NetworkProcess/NetworkDataTask.cpp        2016-11-04 18:08:05 UTC (rev 208388)
</span><span class="lines">@@ -28,6 +28,7 @@
</span><span class="cx">
</span><span class="cx"> #if USE(NETWORK_SESSION)
</span><span class="cx">
</span><ins>+#include "NetworkDataTaskBlob.h"
</ins><span class="cx"> #include "NetworkSession.h"
</span><span class="cx"> #include <wtf/MainThread.h>
</span><span class="cx">
</span><span class="lines">@@ -44,6 +45,9 @@
</span><span class="cx">
</span><span class="cx"> Ref<NetworkDataTask> NetworkDataTask::create(NetworkSession& session, NetworkDataTaskClient& client, const ResourceRequest& request, StoredCredentials storedCredentials, ContentSniffingPolicy shouldContentSniff, bool shouldClearReferrerOnHTTPSToHTTPRedirect)
</span><span class="cx"> {
</span><ins>+ if (request.url().protocolIsBlob())
+ return NetworkDataTaskBlob::create(session, client, request, shouldContentSniff);
+
</ins><span class="cx"> #if PLATFORM(COCOA)
</span><span class="cx"> return NetworkDataTaskCocoa::create(session, client, request, storedCredentials, shouldContentSniff, shouldClearReferrerOnHTTPSToHTTPRedirect);
</span><span class="cx"> #endif
</span></span></pre></div>
<a id="trunkSourceWebKit2NetworkProcessNetworkDataTaskh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/NetworkProcess/NetworkDataTask.h (208387 => 208388)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/NetworkProcess/NetworkDataTask.h        2016-11-04 18:02:32 UTC (rev 208387)
+++ trunk/Source/WebKit2/NetworkProcess/NetworkDataTask.h        2016-11-04 18:08:05 UTC (rev 208388)
</span><span class="lines">@@ -80,6 +80,7 @@
</span><span class="cx"> virtual void suspend() = 0;
</span><span class="cx"> virtual void cancel() = 0;
</span><span class="cx"> virtual void resume() = 0;
</span><ins>+ virtual void invalidateAndCancel() = 0;
</ins><span class="cx">
</span><span class="cx"> enum class State {
</span><span class="cx"> Running,
</span></span></pre></div>
<a id="trunkSourceWebKit2NetworkProcessNetworkDataTaskBlobcpp"></a>
<div class="addfile"><h4>Added: trunk/Source/WebKit2/NetworkProcess/NetworkDataTaskBlob.cpp (0 => 208388)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/NetworkProcess/NetworkDataTaskBlob.cpp         (rev 0)
+++ trunk/Source/WebKit2/NetworkProcess/NetworkDataTaskBlob.cpp        2016-11-04 18:08:05 UTC (rev 208388)
</span><span class="lines">@@ -0,0 +1,582 @@
</span><ins>+/*
+ * Copyright (C) 2010 Google Inc. All rights reserved.
+ * Copyright (C) 2016 Igalia S.L.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "config.h"
+#include "NetworkDataTaskBlob.h"
+
+#if USE(NETWORK_SESSION)
+
+#include "DataReference.h"
+#include "Download.h"
+#include "Logging.h"
+#include "NetworkProcess.h"
+#include "NetworkSession.h"
+#include "WebErrors.h"
+#include <WebCore/AsyncFileStream.h>
+#include <WebCore/BlobData.h>
+#include <WebCore/BlobRegistryImpl.h>
+#include <WebCore/FileStream.h>
+#include <WebCore/HTTPHeaderNames.h>
+#include <WebCore/HTTPParsers.h>
+#include <WebCore/ParsedContentRange.h>
+#include <WebCore/ResourceError.h>
+#include <WebCore/ResourceResponse.h>
+#include <WebCore/SharedBuffer.h>
+#include <WebCore/URL.h>
+#include <wtf/MainThread.h>
+#include <wtf/RunLoop.h>
+
+using namespace WebCore;
+
+namespace WebKit {
+
+static const unsigned bufferSize = 512 * 1024;
+
+static const int httpOK = 200;
+static const int httpPartialContent = 206;
+static const int httpNotAllowed = 403;
+static const int httpRequestedRangeNotSatisfiable = 416;
+static const int httpInternalError = 500;
+static const char* httpOKText = "OK";
+static const char* httpPartialContentText = "Partial Content";
+static const char* httpNotAllowedText = "Not Allowed";
+static const char* httpRequestedRangeNotSatisfiableText = "Requested Range Not Satisfiable";
+static const char* httpInternalErrorText = "Internal Server Error";
+
+static const char* const webKitBlobResourceDomain = "WebKitBlobResource";
+
+NetworkDataTaskBlob::NetworkDataTaskBlob(NetworkSession& session, NetworkDataTaskClient& client, const ResourceRequest& request, ContentSniffingPolicy shouldContentSniff)
+ : NetworkDataTask(session, client, request, DoNotAllowStoredCredentials, false)
+ , m_blobData(static_cast<BlobRegistryImpl&>(blobRegistry()).getBlobDataFromURL(request.url()))
+ , m_stream(std::make_unique<AsyncFileStream>(*this))
+{
+ m_session->registerNetworkDataTask(*this);
+ LOG(NetworkSession, "%p - Created NetworkDataTaskBlob for %s", this, request.url().string().utf8().data());
+}
+
+NetworkDataTaskBlob::~NetworkDataTaskBlob()
+{
+ clearStream();
+ m_session->unregisterNetworkDataTask(*this);
+}
+
+void NetworkDataTaskBlob::clearStream()
+{
+ if (m_state == State::Completed)
+ return;
+
+ m_state = State::Completed;
+
+ if (m_fileOpened) {
+ m_fileOpened = false;
+ m_stream->close();
+ }
+ m_stream = nullptr;
+}
+
+void NetworkDataTaskBlob::resume()
+{
+ ASSERT(m_state != State::Running);
+ if (m_state == State::Canceling || m_state == State::Completed)
+ return;
+
+ m_state = State::Running;
+
+ if (m_scheduledFailureType != NoFailure) {
+ ASSERT(m_failureTimer.isActive());
+ return;
+ }
+
+ RunLoop::main().dispatch([this, protectedThis = makeRef(*this)] {
+ if (m_state == State::Canceling || m_state == State::Completed || !m_client) {
+ clearStream();
+ return;
+ }
+
+ if (!equalLettersIgnoringASCIICase(m_firstRequest.httpMethod(), "get")) {
+ didFail(Error::MethodNotAllowed);
+ return;
+ }
+
+ // If the blob data is not found, fail now.
+ if (!m_blobData) {
+ didFail(Error::NotFoundError);
+ return;
+ }
+
+ // Parse the "Range" header we care about.
+ String range = m_firstRequest.httpHeaderField(HTTPHeaderName::Range);
+ if (!range.isEmpty() && !parseRange(range, m_rangeOffset, m_rangeEnd, m_rangeSuffixLength)) {
+ didReceiveResponse(Error::RangeError);
+ return;
+ }
+
+ getSizeForNext();
+ });
+}
+
+void NetworkDataTaskBlob::suspend()
+{
+ // FIXME: can this happen?
+}
+
+void NetworkDataTaskBlob::cancel()
+{
+ if (m_state == State::Canceling || m_state == State::Completed)
+ return;
+
+ m_state = State::Canceling;
+
+ if (m_fileOpened) {
+ m_fileOpened = false;
+ m_stream->close();
+ }
+
+ if (isDownload())
+ cleanDownloadFiles();
+}
+
+void NetworkDataTaskBlob::invalidateAndCancel()
+{
+ cancel();
+ clearStream();
+}
+
+void NetworkDataTaskBlob::getSizeForNext()
+{
+ ASSERT(isMainThread());
+
+ // Do we finish validating and counting size for all items?
+ if (m_sizeItemCount >= m_blobData->items().size()) {
+ seek();
+ didReceiveResponse();
+ return;
+ }
+
+ const BlobDataItem& item = m_blobData->items().at(m_sizeItemCount);
+ switch (item.type()) {
+ case BlobDataItem::Type::Data:
+ didGetSize(item.length());
+ break;
+ case BlobDataItem::Type::File:
+ // Files know their sizes, but asking the stream to verify that the file wasn't modified.
+ m_stream->getSize(item.file()->path(), item.file()->expectedModificationTime());
+ break;
+ default:
+ ASSERT_NOT_REACHED();
+ }
+}
+
+void NetworkDataTaskBlob::didGetSize(long long size)
+{
+ ASSERT(isMainThread());
+
+ if (m_state == State::Canceling || m_state == State::Completed || (!m_client && !isDownload())) {
+ clearStream();
+ return;
+ }
+
+ // If the size is -1, it means the file has been moved or changed. Fail now.
+ if (size == -1) {
+ didFail(Error::NotFoundError);
+ return;
+ }
+
+ // The size passed back is the size of the whole file. If the underlying item is a sliced file, we need to use the slice length.
+ const BlobDataItem& item = m_blobData->items().at(m_sizeItemCount);
+ size = item.length();
+
+ // Cache the size.
+ m_itemLengthList.append(size);
+
+ // Count the size.
+ m_totalSize += size;
+ m_totalRemainingSize += size;
+ m_sizeItemCount++;
+
+ // Continue with the next item.
+ getSizeForNext();
+}
+
+void NetworkDataTaskBlob::seek()
+{
+ ASSERT(isMainThread());
+
+ // Convert from the suffix length to the range.
+ if (m_rangeSuffixLength != kPositionNotSpecified) {
+ m_rangeOffset = m_totalRemainingSize - m_rangeSuffixLength;
+ m_rangeEnd = m_rangeOffset + m_rangeSuffixLength - 1;
+ }
+
+ // Bail out if the range is not provided.
+ if (m_rangeOffset == kPositionNotSpecified)
+ return;
+
+ // Skip the initial items that are not in the range.
+ long long offset = m_rangeOffset;
+ for (m_readItemCount = 0; m_readItemCount < m_blobData->items().size() && offset >= m_itemLengthList[m_readItemCount]; ++m_readItemCount)
+ offset -= m_itemLengthList[m_readItemCount];
+
+ // Set the offset that need to jump to for the first item in the range.
+ m_currentItemReadSize = offset;
+
+ // Adjust the total remaining size in order not to go beyond the range.
+ if (m_rangeEnd != kPositionNotSpecified) {
+ long long rangeSize = m_rangeEnd - m_rangeOffset + 1;
+ if (m_totalRemainingSize > rangeSize)
+ m_totalRemainingSize = rangeSize;
+ } else
+ m_totalRemainingSize -= m_rangeOffset;
+}
+
+void NetworkDataTaskBlob::didReceiveResponse(Error errorCode)
+{
+ LOG(NetworkSession, "%p - NetworkDataTaskBlob::didReceiveResponse(%u)", this, static_cast<unsigned>(errorCode));
+
+ Ref<NetworkDataTaskBlob> protectedThis(*this);
+ ResourceResponse response(m_firstRequest.url(), errorCode != Error::NoError ? "text/plain" : m_blobData->contentType(), errorCode != Error::NoError ? 0 : m_totalRemainingSize, String());
+ switch (errorCode) {
+ case Error::NoError: {
+ bool isRangeRequest = m_rangeOffset != kPositionNotSpecified;
+ response.setHTTPStatusCode(isRangeRequest ? httpPartialContent : httpOK);
+ response.setHTTPStatusText(isRangeRequest ? httpPartialContentText : httpOKText);
+
+ response.setHTTPHeaderField(HTTPHeaderName::ContentType, m_blobData->contentType());
+ response.setHTTPHeaderField(HTTPHeaderName::ContentLength, String::number(m_totalRemainingSize));
+
+ if (isRangeRequest)
+ response.setHTTPHeaderField(HTTPHeaderName::ContentRange, ParsedContentRange(m_rangeOffset, m_rangeEnd, m_totalSize).headerValue());
+ // FIXME: If a resource identified with a blob: URL is a File object, user agents must use that file's name attribute,
+ // as if the response had a Content-Disposition header with the filename parameter set to the File's name attribute.
+ // Notably, this will affect a name suggested in "File Save As".
+ break;
+ }
+ case Error::RangeError:
+ response.setHTTPStatusCode(httpRequestedRangeNotSatisfiable);
+ response.setHTTPStatusText(httpRequestedRangeNotSatisfiableText);
+ break;
+ case Error::SecurityError:
+ response.setHTTPStatusCode(httpNotAllowed);
+ response.setHTTPStatusText(httpNotAllowedText);
+ break;
+ default:
+ response.setHTTPStatusCode(httpInternalError);
+ response.setHTTPStatusText(httpInternalErrorText);
+ break;
+ }
+
+ m_client->didReceiveResponseNetworkSession(WTFMove(response), [this, protectedThis = WTFMove(protectedThis), errorCode](PolicyAction policyAction) {
+ LOG(NetworkSession, "%p - NetworkDataTaskBlob::didReceiveResponse completionHandler (%u)", this, static_cast<unsigned>(policyAction));
+
+ if (m_state == State::Canceling || m_state == State::Completed) {
+ clearStream();
+ return;
+ }
+
+ if (errorCode != Error::NoError) {
+ didFinish();
+ return;
+ }
+
+ switch (policyAction) {
+ case PolicyAction::PolicyUse:
+ m_buffer.resize(bufferSize);
+ read();
+ break;
+ case PolicyAction::PolicyIgnore:
+ break;
+ case PolicyAction::PolicyDownload:
+ download();
+ break;
+ }
+ });
+}
+
+void NetworkDataTaskBlob::read()
+{
+ ASSERT(isMainThread());
+
+ // If there is no more remaining data to read, we are done.
+ if (!m_totalRemainingSize || m_readItemCount >= m_blobData->items().size()) {
+ didFinish();
+ return;
+ }
+
+ const BlobDataItem& item = m_blobData->items().at(m_readItemCount);
+ if (item.type() == BlobDataItem::Type::Data)
+ readData(item);
+ else if (item.type() == BlobDataItem::Type::File)
+ readFile(item);
+ else
+ ASSERT_NOT_REACHED();
+}
+
+void NetworkDataTaskBlob::readData(const BlobDataItem& item)
+{
+ ASSERT(item.data().data());
+
+ long long bytesToRead = item.length() - m_currentItemReadSize;
+ if (bytesToRead > m_totalRemainingSize)
+ bytesToRead = m_totalRemainingSize;
+ consumeData(reinterpret_cast<const char*>(item.data().data()->data()) + item.offset() + m_currentItemReadSize, static_cast<int>(bytesToRead));
+ m_currentItemReadSize = 0;
+}
+
+void NetworkDataTaskBlob::readFile(const BlobDataItem& item)
+{
+ ASSERT(m_client);
+ ASSERT(m_stream);
+
+ if (m_fileOpened) {
+ m_stream->read(m_buffer.data(), m_buffer.size());
+ return;
+ }
+
+ long long bytesToRead = m_itemLengthList[m_readItemCount] - m_currentItemReadSize;
+ if (bytesToRead > m_totalRemainingSize)
+ bytesToRead = static_cast<int>(m_totalRemainingSize);
+ m_stream->openForRead(item.file()->path(), item.offset() + m_currentItemReadSize, bytesToRead);
+ m_fileOpened = true;
+ m_currentItemReadSize = 0;
+}
+
+void NetworkDataTaskBlob::didOpen(bool success)
+{
+ if (m_state == State::Canceling || m_state == State::Completed || (!m_client && !isDownload())) {
+ clearStream();
+ return;
+ }
+
+ if (!success) {
+ didFail(Error::NotReadableError);
+ return;
+ }
+
+ Ref<NetworkDataTaskBlob> protectedThis(*this);
+ read();
+}
+
+void NetworkDataTaskBlob::didRead(int bytesRead)
+{
+ if (m_state == State::Canceling || m_state == State::Completed || (!m_client && !isDownload())) {
+ clearStream();
+ return;
+ }
+
+ if (bytesRead < 0) {
+ didFail(Error::NotReadableError);
+ return;
+ }
+
+ Ref<NetworkDataTaskBlob> protectedThis(*this);
+ consumeData(m_buffer.data(), bytesRead);
+}
+
+void NetworkDataTaskBlob::consumeData(const char* data, int bytesRead)
+{
+ m_totalRemainingSize -= bytesRead;
+
+ if (bytesRead) {
+ if (m_downloadFile != invalidPlatformFileHandle) {
+ if (!writeDownload(data, bytesRead))
+ return;
+ } else {
+ ASSERT(m_client);
+ m_client->didReceiveData(SharedBuffer::create(data, bytesRead));
+ }
+ }
+
+ if (m_fileOpened) {
+ // When the current item is a file item, the reading is completed only if bytesRead is 0.
+ if (!bytesRead) {
+ // Close the file.
+ m_fileOpened = false;
+ m_stream->close();
+
+ // Move to the next item.
+ m_readItemCount++;
+ }
+ } else {
+ // Otherwise, we read the current text item as a whole and move to the next item.
+ m_readItemCount++;
+ }
+
+ read();
+}
+
+void NetworkDataTaskBlob::setPendingDownloadLocation(const String& filename, const SandboxExtension::Handle& sandboxExtensionHandle, bool allowOverwrite)
+{
+ NetworkDataTask::setPendingDownloadLocation(filename, sandboxExtensionHandle, allowOverwrite);
+
+ ASSERT(!m_sandboxExtension);
+ m_sandboxExtension = SandboxExtension::create(sandboxExtensionHandle);
+ if (m_sandboxExtension)
+ m_sandboxExtension->consume();
+
+ if (allowOverwrite && fileExists(m_pendingDownloadLocation))
+ deleteFile(m_pendingDownloadLocation);
+}
+
+String NetworkDataTaskBlob::suggestedFilename() const
+{
+ if (!m_suggestedFilename.isEmpty())
+ return m_suggestedFilename;
+
+ return ASCIILiteral("unknown");
+}
+
+void NetworkDataTaskBlob::download()
+{
+ ASSERT(isDownload());
+ ASSERT(m_pendingDownloadLocation);
+
+ LOG(NetworkSession, "%p - NetworkDataTaskBlob::download to %s", this, m_pendingDownloadLocation.utf8().data());
+
+ m_downloadFile = openFile(m_pendingDownloadLocation, OpenForWrite);
+ if (m_downloadFile == invalidPlatformFileHandle) {
+ didFailDownload(cancelledError(m_firstRequest));
+ return;
+ }
+
+ auto& downloadManager = NetworkProcess::singleton().downloadManager();
+ auto download = std::make_unique<Download>(downloadManager, m_pendingDownloadID, *this, m_session->sessionID(), suggestedFilename());
+ auto* downloadPtr = download.get();
+ downloadManager.dataTaskBecameDownloadTask(m_pendingDownloadID, WTFMove(download));
+ downloadPtr->didCreateDestination(m_pendingDownloadLocation);
+
+ ASSERT(m_client);
+ m_client->didBecomeDownload();
+
+ m_buffer.resize(bufferSize);
+ read();
+}
+
+bool NetworkDataTaskBlob::writeDownload(const char* data, int bytesRead)
+{
+ ASSERT(isDownload());
+ int bytesWritten = writeToFile(m_downloadFile, data, bytesRead);
+ if (bytesWritten == -1) {
+ didFailDownload(cancelledError(m_firstRequest));
+ return false;
+ }
+
+ ASSERT(bytesWritten == bytesRead);
+ auto* download = NetworkProcess::singleton().downloadManager().download(m_pendingDownloadID);
+ ASSERT(download);
+ download->didReceiveData(bytesWritten);
+ return true;
+}
+
+void NetworkDataTaskBlob::cleanDownloadFiles()
+{
+ if (m_downloadFile != invalidPlatformFileHandle) {
+ closeFile(m_downloadFile);
+ m_downloadFile = invalidPlatformFileHandle;
+ }
+ deleteFile(m_pendingDownloadLocation);
+}
+
+void NetworkDataTaskBlob::didFailDownload(const ResourceError& error)
+{
+ LOG(NetworkSession, "%p - NetworkDataTaskBlob::didFailDownload", this);
+
+ clearStream();
+ cleanDownloadFiles();
+
+ if (m_sandboxExtension) {
+ m_sandboxExtension->revoke();
+ m_sandboxExtension = nullptr;
+ }
+
+ if (m_client)
+ m_client->didCompleteWithError(error);
+ else {
+ auto* download = NetworkProcess::singleton().downloadManager().download(m_pendingDownloadID);
+ ASSERT(download);
+ download->didFail(error, IPC::DataReference());
+ }
+}
+
+void NetworkDataTaskBlob::didFinishDownload()
+{
+ LOG(NetworkSession, "%p - NetworkDataTaskBlob::didFinishDownload", this);
+
+ ASSERT(isDownload());
+ closeFile(m_downloadFile);
+ m_downloadFile = invalidPlatformFileHandle;
+
+ if (m_sandboxExtension) {
+ m_sandboxExtension->revoke();
+ m_sandboxExtension = nullptr;
+ }
+
+ clearStream();
+ auto* download = NetworkProcess::singleton().downloadManager().download(m_pendingDownloadID);
+ ASSERT(download);
+ download->didFinish();
+}
+
+void NetworkDataTaskBlob::didFail(Error errorCode)
+{
+ ASSERT(!m_sandboxExtension);
+
+ Ref<NetworkDataTaskBlob> protectedThis(*this);
+ if (isDownload()) {
+ didFailDownload(ResourceError(webKitBlobResourceDomain, static_cast<int>(errorCode), m_firstRequest.url(), String()));
+ return;
+ }
+
+ LOG(NetworkSession, "%p - NetworkDataTaskBlob::didFail", this);
+
+ clearStream();
+ ASSERT(m_client);
+ m_client->didCompleteWithError(ResourceError(webKitBlobResourceDomain, static_cast<int>(errorCode), m_firstRequest.url(), String()));
+}
+
+void NetworkDataTaskBlob::didFinish()
+{
+ if (m_downloadFile != invalidPlatformFileHandle) {
+ didFinishDownload();
+ return;
+ }
+
+ ASSERT(!m_sandboxExtension);
+
+ LOG(NetworkSession, "%p - NetworkDataTaskBlob::didFinish", this);
+
+ clearStream();
+ ASSERT(m_client);
+ m_client->didCompleteWithError({ });
+}
+
+} // namespace WebKit
+
+#endif // USE(NETWORK_SESSION)
</ins></span></pre></div>
<a id="trunkSourceWebKit2NetworkProcessNetworkDataTaskBlobh"></a>
<div class="addfile"><h4>Added: trunk/Source/WebKit2/NetworkProcess/NetworkDataTaskBlob.h (0 => 208388)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/NetworkProcess/NetworkDataTaskBlob.h         (rev 0)
+++ trunk/Source/WebKit2/NetworkProcess/NetworkDataTaskBlob.h        2016-11-04 18:08:05 UTC (rev 208388)
</span><span class="lines">@@ -0,0 +1,121 @@
</span><ins>+/*
+ * Copyright (C) 2010 Google Inc. All rights reserved.
+ * Copyright (C) 2016 Igalia S.L.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#pragma once
+
+#if USE(NETWORK_SESSION)
+
+#include "NetworkDataTask.h"
+#include <WebCore/FileStreamClient.h>
+#include <WebCore/FileSystem.h>
+
+namespace WebCore {
+class AsyncFileStream;
+class BlobData;
+class BlobDataItem;
+}
+
+namespace WebKit {
+
+class NetworkDataTaskBlob final : public NetworkDataTask, public WebCore::FileStreamClient {
+public:
+ static Ref<NetworkDataTask> create(NetworkSession& session, NetworkDataTaskClient& client, const WebCore::ResourceRequest& request, WebCore::ContentSniffingPolicy shouldContentSniff)
+ {
+ return adoptRef(*new NetworkDataTaskBlob(session, client, request, shouldContentSniff));
+ }
+
+ ~NetworkDataTaskBlob();
+
+private:
+ NetworkDataTaskBlob(NetworkSession&, NetworkDataTaskClient&, const WebCore::ResourceRequest&, WebCore::ContentSniffingPolicy);
+
+ void suspend() override;
+ void cancel() override;
+ void resume() override;
+ void invalidateAndCancel() override;
+ NetworkDataTask::State state() const override { return m_state; }
+
+ void setPendingDownloadLocation(const String&, const SandboxExtension::Handle&, bool /*allowOverwrite*/) override;
+ String suggestedFilename() const override;
+
+ // FileStreamClient methods.
+ void didGetSize(long long) override;
+ void didOpen(bool) override;
+ void didRead(int) override;
+
+ enum class Error {
+ NoError = 0,
+ NotFoundError = 1,
+ SecurityError = 2,
+ RangeError = 3,
+ NotReadableError = 4,
+ MethodNotAllowed = 5
+ };
+
+ void clearStream();
+ void getSizeForNext();
+ void didReceiveResponse(Error = Error::NoError);
+ void seek();
+ void consumeData(const char* data, int bytesRead);
+ void read();
+ void readData(const WebCore::BlobDataItem&);
+ void readFile(const WebCore::BlobDataItem&);
+ void download();
+ bool writeDownload(const char* data, int bytesRead);
+ void cleanDownloadFiles();
+ void didFailDownload(const WebCore::ResourceError&);
+ void didFinishDownload();
+ void didFail(Error);
+ void didFinish();
+
+ enum { kPositionNotSpecified = -1 };
+
+ RefPtr<WebCore::BlobData> m_blobData;
+ std::unique_ptr<WebCore::AsyncFileStream> m_stream; // For asynchronous loading.
+ Vector<char> m_buffer;
+ Vector<long long> m_itemLengthList;
+ State m_state { State::Suspended };
+ long long m_rangeOffset { kPositionNotSpecified };
+ long long m_rangeEnd { kPositionNotSpecified };
+ long long m_rangeSuffixLength { kPositionNotSpecified };
+ long long m_totalSize { 0 };
+ long long m_totalRemainingSize { 0 };
+ long long m_currentItemReadSize { 0 };
+ unsigned m_sizeItemCount { 0 };
+ unsigned m_readItemCount { 0 };
+ bool m_fileOpened { false };
+ WebCore::PlatformFileHandle m_downloadFile { WebCore::invalidPlatformFileHandle };
+ RefPtr<SandboxExtension> m_sandboxExtension;
+};
+
+} // namespace WebKit
+
+#endif // USE(NETWORK_SESSION)
</ins></span></pre></div>
<a id="trunkSourceWebKit2NetworkProcessNetworkLoadcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/NetworkProcess/NetworkLoad.cpp (208387 => 208388)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/NetworkProcess/NetworkLoad.cpp        2016-11-04 18:02:32 UTC (rev 208387)
+++ trunk/Source/WebKit2/NetworkProcess/NetworkLoad.cpp        2016-11-04 18:08:05 UTC (rev 208388)
</span><span class="lines">@@ -67,10 +67,6 @@
</span><span class="cx"> , m_parameters(WTFMove(parameters))
</span><span class="cx"> , m_currentRequest(m_parameters.request)
</span><span class="cx"> {
</span><del>- if (m_parameters.request.url().protocolIsBlob()) {
- m_handle = ResourceHandle::create(nullptr, m_parameters.request, this, m_parameters.defersLoading, m_parameters.contentSniffingPolicy == SniffContent);
- return;
- }
</del><span class="cx"> m_task = NetworkDataTask::create(networkSession, *this, m_parameters.request, m_parameters.allowStoredCredentials, m_parameters.contentSniffingPolicy, m_parameters.shouldClearReferrerOnHTTPSToHTTPRedirect);
</span><span class="cx"> if (!m_parameters.defersLoading)
</span><span class="cx"> m_task->resume();
</span><span class="lines">@@ -101,12 +97,14 @@
</span><span class="cx"> #endif
</span><span class="cx"> if (m_task)
</span><span class="cx"> m_task->clearClient();
</span><del>-#elif USE(PROTECTION_SPACE_AUTH_CALLBACK)
</del><ins>+#else
+#if USE(PROTECTION_SPACE_AUTH_CALLBACK)
</ins><span class="cx"> if (m_handle && m_waitingForContinueCanAuthenticateAgainstProtectionSpace)
</span><span class="cx"> m_handle->continueCanAuthenticateAgainstProtectionSpace(false);
</span><span class="cx"> #endif
</span><span class="cx"> if (m_handle)
</span><span class="cx"> m_handle->clearClient();
</span><ins>+#endif
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> void NetworkLoad::setDefersLoading(bool defers)
</span><span class="lines">@@ -118,9 +116,10 @@
</span><span class="cx"> else
</span><span class="cx"> m_task->resume();
</span><span class="cx"> }
</span><del>-#endif
</del><ins>+#else
</ins><span class="cx"> if (m_handle)
</span><span class="cx"> m_handle->setDefersLoading(defers);
</span><ins>+#endif
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> void NetworkLoad::cancel()
</span><span class="lines">@@ -128,9 +127,10 @@
</span><span class="cx"> #if USE(NETWORK_SESSION)
</span><span class="cx"> if (m_task)
</span><span class="cx"> m_task->cancel();
</span><del>-#endif
</del><ins>+#else
</ins><span class="cx"> if (m_handle)
</span><span class="cx"> m_handle->cancel();
</span><ins>+#endif
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> void NetworkLoad::continueWillSendRequest(WebCore::ResourceRequest&& newRequest)
</span><span class="lines">@@ -143,27 +143,26 @@
</span><span class="cx"> #endif
</span><span class="cx">
</span><span class="cx"> #if USE(NETWORK_SESSION)
</span><del>- auto redirectCompletionHandler = std::exchange(m_redirectCompletionHandler, nullptr);
</del><ins>+ auto redirectCompletionHandler = std::exchange(m_redirectCompletionHandler, nullptr);
</ins><span class="cx"> ASSERT(redirectCompletionHandler);
</span><del>-#endif
-
</del><span class="cx"> if (m_currentRequest.isNull()) {
</span><ins>+ didCompleteWithError(cancelledError(m_currentRequest));
+ if (redirectCompletionHandler)
+ redirectCompletionHandler({ });
+ return;
+ }
+
+ if (redirectCompletionHandler)
+ redirectCompletionHandler(m_currentRequest);
+#else
+ if (m_currentRequest.isNull()) {
</ins><span class="cx"> if (m_handle)
</span><span class="cx"> m_handle->cancel();
</span><span class="cx"> didFail(m_handle.get(), cancelledError(m_currentRequest));
</span><del>-#if USE(NETWORK_SESSION)
- if (redirectCompletionHandler)
- redirectCompletionHandler({ });
-#endif
- return;
</del><span class="cx"> } else if (m_handle) {
</span><span class="cx"> auto currentRequestCopy = m_currentRequest;
</span><span class="cx"> m_handle->continueWillSendRequest(WTFMove(currentRequestCopy));
</span><span class="cx"> }
</span><del>-
-#if USE(NETWORK_SESSION)
- if (redirectCompletionHandler)
- redirectCompletionHandler(m_currentRequest);
</del><span class="cx"> #endif
</span><span class="cx"> }
</span><span class="cx">
</span><span class="lines">@@ -171,12 +170,13 @@
</span><span class="cx"> {
</span><span class="cx"> #if USE(NETWORK_SESSION)
</span><span class="cx"> if (m_responseCompletionHandler) {
</span><del>- m_responseCompletionHandler(PolicyUse);
- m_responseCompletionHandler = nullptr;
</del><ins>+ auto responseCompletionHandler = std::exchange(m_responseCompletionHandler, nullptr);
+ responseCompletionHandler(PolicyUse);
</ins><span class="cx"> }
</span><del>-#endif
</del><ins>+#else
</ins><span class="cx"> if (m_handle)
</span><span class="cx"> m_handle->continueDidReceiveResponse();
</span><ins>+#endif
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> NetworkLoadClient::ShouldContinueDidReceiveResponse NetworkLoad::sharedDidReceiveResponse(ResourceResponse&& response)
</span><span class="lines">@@ -285,6 +285,23 @@
</span><span class="cx"> NetworkProcess::singleton().authenticationManager().didReceiveAuthenticationChallenge(m_parameters.webPageID, m_parameters.webFrameID, *m_challenge, WTFMove(completionHandler));
</span><span class="cx"> }
</span><span class="cx">
</span><ins>+#if USE(PROTECTION_SPACE_AUTH_CALLBACK)
+void NetworkLoad::continueCanAuthenticateAgainstProtectionSpace(bool result)
+{
+ ASSERT(m_challengeCompletionHandler);
+ auto completionHandler = std::exchange(m_challengeCompletionHandler, nullptr);
+ if (!result) {
+ if (m_task && m_task->allowsSpecificHTTPSCertificateForHost(*m_challenge))
+ completionHandler(AuthenticationChallengeDisposition::UseCredential, serverTrustCredential(*m_challenge));
+ else
+ completionHandler(AuthenticationChallengeDisposition::RejectProtectionSpace, { });
+ return;
+ }
+
+ completeAuthenticationChallenge(WTFMove(completionHandler));
+}
+#endif
+
</ins><span class="cx"> void NetworkLoad::didReceiveResponseNetworkSession(ResourceResponse&& response, ResponseCompletionHandler&& completionHandler)
</span><span class="cx"> {
</span><span class="cx"> ASSERT(isMainThread());
</span><span class="lines">@@ -362,9 +379,9 @@
</span><span class="cx"> {
</span><span class="cx"> m_client.didFailLoading(cannotShowURLError(m_currentRequest));
</span><span class="cx"> }
</span><del>-
-#endif
</del><span class="cx">
</span><ins>+#else
+
</ins><span class="cx"> void NetworkLoad::didReceiveResponseAsync(ResourceHandle* handle, ResourceResponse&& receivedResponse)
</span><span class="cx"> {
</span><span class="cx"> ASSERT_UNUSED(handle, handle == m_handle);
</span><span class="lines">@@ -418,32 +435,13 @@
</span><span class="cx"> return;
</span><span class="cx"> }
</span><span class="cx">
</span><del>-#if !USE(NETWORK_SESSION)
</del><span class="cx"> m_waitingForContinueCanAuthenticateAgainstProtectionSpace = true;
</span><del>-#endif
</del><span class="cx"> m_client.canAuthenticateAgainstProtectionSpaceAsync(protectionSpace);
</span><span class="cx"> }
</span><del>-#endif
</del><span class="cx">
</span><del>-#if USE(PROTECTION_SPACE_AUTH_CALLBACK)
</del><span class="cx"> void NetworkLoad::continueCanAuthenticateAgainstProtectionSpace(bool result)
</span><span class="cx"> {
</span><del>-#if USE(NETWORK_SESSION)
- ASSERT_WITH_MESSAGE(!m_handle, "Blobs should never give authentication challenges");
- ASSERT(m_challengeCompletionHandler);
- auto completionHandler = std::exchange(m_challengeCompletionHandler, nullptr);
- if (!result) {
- if (m_task && m_task->allowsSpecificHTTPSCertificateForHost(*m_challenge))
- completionHandler(AuthenticationChallengeDisposition::UseCredential, serverTrustCredential(*m_challenge));
- else
- completionHandler(AuthenticationChallengeDisposition::RejectProtectionSpace, { });
- return;
- }
-
- completeAuthenticationChallenge(WTFMove(completionHandler));
-#else
</del><span class="cx"> m_waitingForContinueCanAuthenticateAgainstProtectionSpace = false;
</span><del>-#endif
</del><span class="cx"> if (m_handle)
</span><span class="cx"> m_handle->continueCanAuthenticateAgainstProtectionSpace(result);
</span><span class="cx"> }
</span><span class="lines">@@ -515,5 +513,6 @@
</span><span class="cx"> m_handle->cancel();
</span><span class="cx"> didFail(m_handle.get(), cancelledError(m_currentRequest));
</span><span class="cx"> }
</span><ins>+#endif // USE(NETWORK_SESSION)
</ins><span class="cx">
</span><span class="cx"> } // namespace WebKit
</span></span></pre></div>
<a id="trunkSourceWebKit2NetworkProcessNetworkLoadh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/NetworkProcess/NetworkLoad.h (208387 => 208388)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/NetworkProcess/NetworkLoad.h        2016-11-04 18:02:32 UTC (rev 208387)
+++ trunk/Source/WebKit2/NetworkProcess/NetworkLoad.h        2016-11-04 18:08:05 UTC (rev 208388)
</span><span class="lines">@@ -40,9 +40,11 @@
</span><span class="cx">
</span><span class="cx"> namespace WebKit {
</span><span class="cx">
</span><del>-class NetworkLoad final : private WebCore::ResourceHandleClient
</del><ins>+class NetworkLoad final :
</ins><span class="cx"> #if USE(NETWORK_SESSION)
</span><del>- , private NetworkDataTaskClient
</del><ins>+ private NetworkDataTaskClient
+#else
+ private WebCore::ResourceHandleClient
</ins><span class="cx"> #endif
</span><span class="cx"> {
</span><span class="cx"> WTF_MAKE_FAST_ALLOCATED;
</span><span class="lines">@@ -69,7 +71,8 @@
</span><span class="cx"> void setSuggestedFilename(const String&);
</span><span class="cx"> void setPendingDownload(PendingDownload&);
</span><span class="cx"> DownloadID pendingDownloadID() { return m_task->pendingDownloadID(); }
</span><del>-#endif
</del><ins>+#else
+ WebCore::ResourceHandle* handle() const { return m_handle.get(); }
</ins><span class="cx">
</span><span class="cx"> #if USE(PROTECTION_SPACE_AUTH_CALLBACK)
</span><span class="cx"> void canAuthenticateAgainstProtectionSpaceAsync(WebCore::ResourceHandle*, const WebCore::ProtectionSpace&) override;
</span><span class="lines">@@ -85,17 +88,17 @@
</span><span class="cx"> void willCacheResponseAsync(WebCore::ResourceHandle*, NSCachedURLResponse *) override;
</span><span class="cx"> #endif
</span><span class="cx"> #endif
</span><ins>+#endif // USE(NETWORK_SESSION)
</ins><span class="cx">
</span><span class="cx"> #if USE(PROTECTION_SPACE_AUTH_CALLBACK)
</span><span class="cx"> void continueCanAuthenticateAgainstProtectionSpace(bool);
</span><span class="cx"> #endif
</span><span class="cx">
</span><del>- WebCore::ResourceHandle* handle() const { return m_handle.get(); }
-
</del><span class="cx"> private:
</span><span class="cx"> NetworkLoadClient::ShouldContinueDidReceiveResponse sharedDidReceiveResponse(WebCore::ResourceResponse&&);
</span><span class="cx"> void sharedWillSendRedirectedRequest(WebCore::ResourceRequest&&, WebCore::ResourceResponse&&);
</span><span class="cx">
</span><ins>+#if !USE(NETWORK_SESSION)
</ins><span class="cx"> // ResourceHandleClient
</span><span class="cx"> void willSendRequestAsync(WebCore::ResourceHandle*, WebCore::ResourceRequest&&, WebCore::ResourceResponse&& redirectResponse) final;
</span><span class="cx"> void didSendData(WebCore::ResourceHandle*, unsigned long long bytesSent, unsigned long long totalBytesToBeSent) final;
</span><span class="lines">@@ -111,8 +114,7 @@
</span><span class="cx"> void receivedCancellation(WebCore::ResourceHandle*, const WebCore::AuthenticationChallenge&) final;
</span><span class="cx"> bool usesAsyncCallbacks() final { return true; }
</span><span class="cx"> bool loadingSynchronousXHR() final { return m_client.isSynchronous(); }
</span><del>-
-#if USE(NETWORK_SESSION)
</del><ins>+#else
</ins><span class="cx"> // NetworkDataTaskClient
</span><span class="cx"> void willPerformHTTPRedirection(WebCore::ResourceResponse&&, WebCore::ResourceRequest&&, RedirectCompletionHandler&&) final;
</span><span class="cx"> void didReceiveChallenge(const WebCore::AuthenticationChallenge&, ChallengeCompletionHandler&&) final;
</span><span class="lines">@@ -146,8 +148,8 @@
</span><span class="cx"> #else
</span><span class="cx"> bool m_waitingForContinueCanAuthenticateAgainstProtectionSpace { false };
</span><span class="cx"> RefPtr<RemoteNetworkingContext> m_networkingContext;
</span><ins>+ RefPtr<WebCore::ResourceHandle> m_handle;
</ins><span class="cx"> #endif
</span><del>- RefPtr<WebCore::ResourceHandle> m_handle;
</del><span class="cx">
</span><span class="cx"> WebCore::ResourceRequest m_currentRequest; // Updated on redirects.
</span><span class="cx"> };
</span></span></pre></div>
<a id="trunkSourceWebKit2NetworkProcessNetworkSessioncpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/NetworkProcess/NetworkSession.cpp (208387 => 208388)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/NetworkProcess/NetworkSession.cpp        2016-11-04 18:02:32 UTC (rev 208387)
+++ trunk/Source/WebKit2/NetworkProcess/NetworkSession.cpp        2016-11-04 18:08:05 UTC (rev 208388)
</span><span class="lines">@@ -28,6 +28,7 @@
</span><span class="cx">
</span><span class="cx"> #if USE(NETWORK_SESSION)
</span><span class="cx">
</span><ins>+#include "NetworkDataTask.h"
</ins><span class="cx"> #include <WebCore/NetworkStorageSession.h>
</span><span class="cx"> #include <wtf/MainThread.h>
</span><span class="cx">
</span><span class="lines">@@ -81,6 +82,12 @@
</span><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx">
</span><ins>+void NetworkSession::invalidateAndCancel()
+{
+ for (auto* task : m_dataTaskSet)
+ task->invalidateAndCancel();
+}
+
</ins><span class="cx"> } // namespace WebKit
</span><span class="cx">
</span><span class="cx"> #endif // USE(NETWORK_SESSION)
</span></span></pre></div>
<a id="trunkSourceWebKit2NetworkProcessNetworkSessionh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/NetworkProcess/NetworkSession.h (208387 => 208388)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/NetworkProcess/NetworkSession.h        2016-11-04 18:02:32 UTC (rev 208387)
+++ trunk/Source/WebKit2/NetworkProcess/NetworkSession.h        2016-11-04 18:08:05 UTC (rev 208388)
</span><span class="lines">@@ -28,6 +28,7 @@
</span><span class="cx"> #if USE(NETWORK_SESSION)
</span><span class="cx">
</span><span class="cx"> #include <WebCore/SessionID.h>
</span><ins>+#include <wtf/HashSet.h>
</ins><span class="cx"> #include <wtf/Ref.h>
</span><span class="cx"> #include <wtf/RefCounted.h>
</span><span class="cx">
</span><span class="lines">@@ -38,6 +39,7 @@
</span><span class="cx"> namespace WebKit {
</span><span class="cx">
</span><span class="cx"> class CustomProtocolManager;
</span><ins>+class NetworkDataTask;
</ins><span class="cx">
</span><span class="cx"> class NetworkSession : public RefCounted<NetworkSession> {
</span><span class="cx"> public:
</span><span class="lines">@@ -45,16 +47,21 @@
</span><span class="cx"> static NetworkSession& defaultSession();
</span><span class="cx"> virtual ~NetworkSession();
</span><span class="cx">
</span><del>- virtual void invalidateAndCancel() = 0;
</del><ins>+ virtual void invalidateAndCancel();
</ins><span class="cx"> virtual void clearCredentials() { };
</span><span class="cx">
</span><span class="cx"> WebCore::SessionID sessionID() const { return m_sessionID; }
</span><span class="cx"> WebCore::NetworkStorageSession& networkStorageSession() const;
</span><span class="cx">
</span><ins>+ void registerNetworkDataTask(NetworkDataTask& task) { m_dataTaskSet.add(&task); }
+ void unregisterNetworkDataTask(NetworkDataTask& task) { m_dataTaskSet.remove(&task); }
+
</ins><span class="cx"> protected:
</span><span class="cx"> NetworkSession(WebCore::SessionID);
</span><span class="cx">
</span><span class="cx"> WebCore::SessionID m_sessionID;
</span><ins>+
+ HashSet<NetworkDataTask*> m_dataTaskSet;
</ins><span class="cx"> };
</span><span class="cx">
</span><span class="cx"> } // namespace WebKit
</span></span></pre></div>
<a id="trunkSourceWebKit2NetworkProcesscocoaNetworkDataTaskCocoah"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/NetworkProcess/cocoa/NetworkDataTaskCocoa.h (208387 => 208388)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/NetworkProcess/cocoa/NetworkDataTaskCocoa.h        2016-11-04 18:02:32 UTC (rev 208387)
+++ trunk/Source/WebKit2/NetworkProcess/cocoa/NetworkDataTaskCocoa.h        2016-11-04 18:08:05 UTC (rev 208388)
</span><span class="lines">@@ -61,6 +61,7 @@
</span><span class="cx"> void suspend() override;
</span><span class="cx"> void cancel() override;
</span><span class="cx"> void resume() override;
</span><ins>+ void invalidateAndCancel() override { }
</ins><span class="cx"> NetworkDataTask::State state() const override;
</span><span class="cx">
</span><span class="cx"> void setPendingDownloadLocation(const String&, const SandboxExtension::Handle&, bool /*allowOverwrite*/) override;
</span></span></pre></div>
<a id="trunkSourceWebKit2NetworkProcesscocoaNetworkSessionCocoamm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/NetworkProcess/cocoa/NetworkSessionCocoa.mm (208387 => 208388)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/NetworkProcess/cocoa/NetworkSessionCocoa.mm        2016-11-04 18:02:32 UTC (rev 208387)
+++ trunk/Source/WebKit2/NetworkProcess/cocoa/NetworkSessionCocoa.mm        2016-11-04 18:08:05 UTC (rev 208388)
</span><span class="lines">@@ -466,6 +466,8 @@
</span><span class="cx">
</span><span class="cx"> void NetworkSessionCocoa::invalidateAndCancel()
</span><span class="cx"> {
</span><ins>+ NetworkSession::invalidateAndCancel();
+
</ins><span class="cx"> [m_sessionWithCredentialStorage invalidateAndCancel];
</span><span class="cx"> [m_sessionWithoutCredentialStorage invalidateAndCancel];
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebKit2NetworkProcessmacNetworkLoadMacmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/NetworkProcess/mac/NetworkLoadMac.mm (208387 => 208388)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/NetworkProcess/mac/NetworkLoadMac.mm        2016-11-04 18:02:32 UTC (rev 208387)
+++ trunk/Source/WebKit2/NetworkProcess/mac/NetworkLoadMac.mm        2016-11-04 18:08:05 UTC (rev 208388)
</span><span class="lines">@@ -26,6 +26,8 @@
</span><span class="cx"> #import "config.h"
</span><span class="cx"> #import "NetworkLoad.h"
</span><span class="cx">
</span><ins>+#if !USE(NETWORK_SESSION)
+
</ins><span class="cx"> #import <WebCore/CFNetworkSPI.h>
</span><span class="cx"> #import <WebCore/ResourceHandle.h>
</span><span class="cx">
</span><span class="lines">@@ -54,3 +56,5 @@
</span><span class="cx"> #endif // !USE(CFURLCONNECTION)
</span><span class="cx">
</span><span class="cx"> } // namespace WebKit
</span><ins>+
+#endif // !USE(NETWORK_SESSION)
</ins></span></pre></div>
<a id="trunkSourceWebKit2NetworkProcesssoupNetworkDataTaskSoupcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/NetworkProcess/soup/NetworkDataTaskSoup.cpp (208387 => 208388)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/NetworkProcess/soup/NetworkDataTaskSoup.cpp        2016-11-04 18:02:32 UTC (rev 208387)
+++ trunk/Source/WebKit2/NetworkProcess/soup/NetworkDataTaskSoup.cpp        2016-11-04 18:08:05 UTC (rev 208388)
</span><span class="lines">@@ -52,7 +52,7 @@
</span><span class="cx"> , m_shouldContentSniff(shouldContentSniff)
</span><span class="cx"> , m_timeoutSource(RunLoop::main(), this, &NetworkDataTaskSoup::timeoutFired)
</span><span class="cx"> {
</span><del>- static_cast<NetworkSessionSoup&>(m_session.get()).registerNetworkDataTask(*this);
</del><ins>+ m_session->registerNetworkDataTask(*this);
</ins><span class="cx"> if (m_scheduledFailureType != NoFailure)
</span><span class="cx"> return;
</span><span class="cx">
</span><span class="lines">@@ -80,7 +80,7 @@
</span><span class="cx"> NetworkDataTaskSoup::~NetworkDataTaskSoup()
</span><span class="cx"> {
</span><span class="cx"> clearRequest();
</span><del>- static_cast<NetworkSessionSoup&>(m_session.get()).unregisterNetworkDataTask(*this);
</del><ins>+ m_session->unregisterNetworkDataTask(*this);
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> String NetworkDataTaskSoup::suggestedFilename() const
</span><span class="lines">@@ -863,7 +863,7 @@
</span><span class="cx"> m_downloadOutputStream = adoptGRef(G_OUTPUT_STREAM(outputStream.leakRef()));
</span><span class="cx">
</span><span class="cx"> auto& downloadManager = NetworkProcess::singleton().downloadManager();
</span><del>- auto download = std::make_unique<Download>(downloadManager, m_pendingDownloadID, this, m_session->sessionID(), suggestedFilename());
</del><ins>+ auto download = std::make_unique<Download>(downloadManager, m_pendingDownloadID, *this, m_session->sessionID(), suggestedFilename());
</ins><span class="cx"> auto* downloadPtr = download.get();
</span><span class="cx"> downloadManager.dataTaskBecameDownloadTask(m_pendingDownloadID, WTFMove(download));
</span><span class="cx"> downloadPtr->didCreateDestination(m_pendingDownloadLocation);
</span></span></pre></div>
<a id="trunkSourceWebKit2NetworkProcesssoupNetworkDataTaskSouph"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/NetworkProcess/soup/NetworkDataTaskSoup.h (208387 => 208388)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/NetworkProcess/soup/NetworkDataTaskSoup.h        2016-11-04 18:02:32 UTC (rev 208387)
+++ trunk/Source/WebKit2/NetworkProcess/soup/NetworkDataTaskSoup.h        2016-11-04 18:08:05 UTC (rev 208388)
</span><span class="lines">@@ -42,8 +42,6 @@
</span><span class="cx">
</span><span class="cx"> ~NetworkDataTaskSoup();
</span><span class="cx">
</span><del>- void invalidateAndCancel();
-
</del><span class="cx"> private:
</span><span class="cx"> NetworkDataTaskSoup(NetworkSession&, NetworkDataTaskClient&, const WebCore::ResourceRequest&, WebCore::StoredCredentials, WebCore::ContentSniffingPolicy, bool shouldClearReferrerOnHTTPSToHTTPRedirect);
</span><span class="cx">
</span><span class="lines">@@ -50,6 +48,7 @@
</span><span class="cx"> void suspend() override;
</span><span class="cx"> void cancel() override;
</span><span class="cx"> void resume() override;
</span><ins>+ void invalidateAndCancel() override;
</ins><span class="cx"> NetworkDataTask::State state() const override;
</span><span class="cx">
</span><span class="cx"> void setPendingDownloadLocation(const String&, const SandboxExtension::Handle&, bool /*allowOverwrite*/) override;
</span></span></pre></div>
<a id="trunkSourceWebKit2NetworkProcesssoupNetworkSessionSoupcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/NetworkProcess/soup/NetworkSessionSoup.cpp (208387 => 208388)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/NetworkProcess/soup/NetworkSessionSoup.cpp        2016-11-04 18:02:32 UTC (rev 208387)
+++ trunk/Source/WebKit2/NetworkProcess/soup/NetworkSessionSoup.cpp        2016-11-04 18:08:05 UTC (rev 208388)
</span><span class="lines">@@ -26,10 +26,8 @@
</span><span class="cx"> #include "config.h"
</span><span class="cx"> #include "NetworkSessionSoup.h"
</span><span class="cx">
</span><del>-#include "NetworkDataTaskSoup.h"
</del><span class="cx"> #include <WebCore/NetworkStorageSession.h>
</span><span class="cx"> #include <WebCore/SoupNetworkSession.h>
</span><del>-#include <wtf/MainThread.h>
</del><span class="cx">
</span><span class="cx"> using namespace WebCore;
</span><span class="cx">
</span><span class="lines">@@ -49,10 +47,4 @@
</span><span class="cx"> return networkStorageSession().soupNetworkSession().soupSession();
</span><span class="cx"> }
</span><span class="cx">
</span><del>-void NetworkSessionSoup::invalidateAndCancel()
-{
- for (auto* task : m_dataTaskSet)
- task->invalidateAndCancel();
-}
-
</del><span class="cx"> } // namespace WebKit
</span></span></pre></div>
<a id="trunkSourceWebKit2NetworkProcesssoupNetworkSessionSouph"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/NetworkProcess/soup/NetworkSessionSoup.h (208387 => 208388)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/NetworkProcess/soup/NetworkSessionSoup.h        2016-11-04 18:02:32 UTC (rev 208387)
+++ trunk/Source/WebKit2/NetworkProcess/soup/NetworkSessionSoup.h        2016-11-04 18:08:05 UTC (rev 208388)
</span><span class="lines">@@ -26,14 +26,11 @@
</span><span class="cx"> #pragma once
</span><span class="cx">
</span><span class="cx"> #include "NetworkSession.h"
</span><del>-#include <wtf/HashSet.h>
</del><span class="cx">
</span><span class="cx"> typedef struct _SoupSession SoupSession;
</span><span class="cx">
</span><span class="cx"> namespace WebKit {
</span><span class="cx">
</span><del>-class NetworkDataTaskSoup;
-
</del><span class="cx"> class NetworkSessionSoup final : public NetworkSession {
</span><span class="cx"> public:
</span><span class="cx"> static Ref<NetworkSession> create(WebCore::SessionID sessionID)
</span><span class="lines">@@ -44,15 +41,8 @@
</span><span class="cx">
</span><span class="cx"> SoupSession* soupSession() const;
</span><span class="cx">
</span><del>- void registerNetworkDataTask(NetworkDataTaskSoup& task) { m_dataTaskSet.add(&task); }
- void unregisterNetworkDataTask(NetworkDataTaskSoup& task) { m_dataTaskSet.remove(&task); }
-
</del><span class="cx"> private:
</span><span class="cx"> NetworkSessionSoup(WebCore::SessionID);
</span><del>-
- void invalidateAndCancel() override;
-
- HashSet<NetworkDataTaskSoup*> m_dataTaskSet;
</del><span class="cx"> };
</span><span class="cx">
</span><span class="cx"> } // namespace WebKit
</span></span></pre></div>
<a id="trunkSourceWebKit2PlatformEflcmake"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/PlatformEfl.cmake (208387 => 208388)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/PlatformEfl.cmake        2016-11-04 18:02:32 UTC (rev 208387)
+++ trunk/Source/WebKit2/PlatformEfl.cmake        2016-11-04 18:08:05 UTC (rev 208388)
</span><span class="lines">@@ -6,8 +6,6 @@
</span><span class="cx">
</span><span class="cx"> NetworkProcess/Downloads/efl/DownloadSoupErrorsEfl.cpp
</span><span class="cx">
</span><del>- NetworkProcess/Downloads/soup/DownloadSoup.cpp
-
</del><span class="cx"> NetworkProcess/cache/NetworkCacheCodersSoup.cpp
</span><span class="cx"> NetworkProcess/cache/NetworkCacheDataSoup.cpp
</span><span class="cx"> NetworkProcess/cache/NetworkCacheIOChannelSoup.cpp
</span></span></pre></div>
<a id="trunkSourceWebKit2PlatformGTKcmake"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/PlatformGTK.cmake (208387 => 208388)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/PlatformGTK.cmake        2016-11-04 18:02:32 UTC (rev 208387)
+++ trunk/Source/WebKit2/PlatformGTK.cmake        2016-11-04 18:08:05 UTC (rev 208388)
</span><span class="lines">@@ -33,8 +33,6 @@
</span><span class="cx">
</span><span class="cx"> NetworkProcess/Downloads/gtk/DownloadSoupErrorsGtk.cpp
</span><span class="cx">
</span><del>- NetworkProcess/Downloads/soup/DownloadSoup.cpp
-
</del><span class="cx"> NetworkProcess/cache/NetworkCacheCodersSoup.cpp
</span><span class="cx"> NetworkProcess/cache/NetworkCacheDataSoup.cpp
</span><span class="cx"> NetworkProcess/cache/NetworkCacheIOChannelSoup.cpp
</span></span></pre></div>
<a id="trunkSourceWebKit2WebKit2xcodeprojprojectpbxproj"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebKit2.xcodeproj/project.pbxproj (208387 => 208388)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebKit2.xcodeproj/project.pbxproj        2016-11-04 18:02:32 UTC (rev 208387)
+++ trunk/Source/WebKit2/WebKit2.xcodeproj/project.pbxproj        2016-11-04 18:08:05 UTC (rev 208388)
</span><span class="lines">@@ -1043,6 +1043,8 @@
</span><span class="cx">                 532159541DBAE71D0054AA3C /* NetworkDataTask.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 532159511DBAE6FC0054AA3C /* NetworkDataTask.cpp */; };
</span><span class="cx">                 532159551DBAE7290054AA3C /* NetworkSessionCocoa.h in Headers */ = {isa = PBXBuildFile; fileRef = 532159501DBAE6D70054AA3C /* NetworkSessionCocoa.h */; };
</span><span class="cx">                 532159561DBAE72D0054AA3C /* NetworkDataTaskCocoa.h in Headers */ = {isa = PBXBuildFile; fileRef = 5321594F1DBAE6D70054AA3C /* NetworkDataTaskCocoa.h */; };
</span><ins>+                53BA47D01DC2EF5E004DF4AD /* NetworkDataTaskBlob.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 539EB5461DC2EE40009D48CF /* NetworkDataTaskBlob.cpp */; };
+                53BA47D11DC2EF5E004DF4AD /* NetworkDataTaskBlob.h in Headers */ = {isa = PBXBuildFile; fileRef = 539EB5471DC2EE40009D48CF /* NetworkDataTaskBlob.h */; };
</ins><span class="cx">                 5C052F261C6D3BD30076E919 /* AuthenticationManagerCocoa.mm in Sources */ = {isa = PBXBuildFile; fileRef = 5C052F241C6D3AB60076E919 /* AuthenticationManagerCocoa.mm */; };
</span><span class="cx">                 5C1426EC1C23F80900D41183 /* NetworkProcessCreationParameters.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5C1426E21C23F80500D41183 /* NetworkProcessCreationParameters.cpp */; };
</span><span class="cx">                 5C1426ED1C23F80900D41183 /* NetworkProcessCreationParameters.h in Headers */ = {isa = PBXBuildFile; fileRef = 5C1426E31C23F80500D41183 /* NetworkProcessCreationParameters.h */; };
</span><span class="lines">@@ -3133,6 +3135,8 @@
</span><span class="cx">                 532159501DBAE6D70054AA3C /* NetworkSessionCocoa.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = NetworkSessionCocoa.h; path = NetworkProcess/cocoa/NetworkSessionCocoa.h; sourceTree = "<group>"; };
</span><span class="cx">                 532159511DBAE6FC0054AA3C /* NetworkDataTask.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = NetworkDataTask.cpp; path = NetworkProcess/NetworkDataTask.cpp; sourceTree = "<group>"; };
</span><span class="cx">                 532159521DBAE6FC0054AA3C /* NetworkSession.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = NetworkSession.cpp; path = NetworkProcess/NetworkSession.cpp; sourceTree = "<group>"; };
</span><ins>+                539EB5461DC2EE40009D48CF /* NetworkDataTaskBlob.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = NetworkDataTaskBlob.cpp; path = NetworkProcess/NetworkDataTaskBlob.cpp; sourceTree = "<group>"; };
+                539EB5471DC2EE40009D48CF /* NetworkDataTaskBlob.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = NetworkDataTaskBlob.h; path = NetworkProcess/NetworkDataTaskBlob.h; sourceTree = "<group>"; };
</ins><span class="cx">                 579D18B71CCFE34B00B1974C /* PhotosSPI.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PhotosSPI.h; sourceTree = "<group>"; };
</span><span class="cx">                 5C052F241C6D3AB60076E919 /* AuthenticationManagerCocoa.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = AuthenticationManagerCocoa.mm; path = Authentication/cocoa/AuthenticationManagerCocoa.mm; sourceTree = "<group>"; };
</span><span class="cx">                 5C1426E21C23F80500D41183 /* NetworkProcessCreationParameters.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = NetworkProcessCreationParameters.cpp; path = NetworkProcess/NetworkProcessCreationParameters.cpp; sourceTree = "<group>"; };
</span><span class="lines">@@ -5469,6 +5473,8 @@
</span><span class="cx">                                 5CBC9B891C6524A500A8FDCF /* NetworkDataTask.h */,
</span><span class="cx">                                 839901FF1BE9A01B000F3653 /* NetworkLoad.cpp */,
</span><span class="cx">                                 839901FE1BE9A01B000F3653 /* NetworkLoad.h */,
</span><ins>+                                539EB5461DC2EE40009D48CF /* NetworkDataTaskBlob.cpp */,
+                                539EB5471DC2EE40009D48CF /* NetworkDataTaskBlob.h */,
</ins><span class="cx">                                 83D454D61BE9D3C4006C93BD /* NetworkLoadClient.h */,
</span><span class="cx">                                 839149631BEA838500D2D953 /* NetworkLoadParameters.h */,
</span><span class="cx">                                 510CC7DF16138E2900D03ED3 /* NetworkProcess.cpp */,
</span><span class="lines">@@ -7834,6 +7840,7 @@
</span><span class="cx">                                 1A0EC6C0124BBD9B007EF4A5 /* PluginProcessMessages.h in Headers */,
</span><span class="cx">                                 1A0EC75E124BC7B2007EF4A5 /* PluginProcessProxy.h in Headers */,
</span><span class="cx">                                 1A043B5E124D5E9D00FFBFB5 /* PluginProcessProxyMessages.h in Headers */,
</span><ins>+                                53BA47D11DC2EF5E004DF4AD /* NetworkDataTaskBlob.h in Headers */,
</ins><span class="cx">                                 1A043DC1124FF87500FFBFB5 /* PluginProxy.h in Headers */,
</span><span class="cx">                                 1A8EFA711252B84100F7067F /* PluginProxyMessages.h in Headers */,
</span><span class="cx">                                 1A4A9F3312B844E2008FE984 /* PluginQuirks.h in Headers */,
</span><span class="lines">@@ -9327,6 +9334,7 @@
</span><span class="cx">                                 1A2D92211281DC1B001EB962 /* PluginProxyMac.mm in Sources */,
</span><span class="cx">                                 1A8EFA701252B84100F7067F /* PluginProxyMessageReceiver.cpp in Sources */,
</span><span class="cx">                                 7CD622771739D863005BD7FF /* PluginSandboxProfile.mm in Sources */,
</span><ins>+                                53BA47D01DC2EF5E004DF4AD /* NetworkDataTaskBlob.cpp in Sources */,
</ins><span class="cx">                                 BC82844D16B5081C00A278FE /* PluginServiceEntryPoint.mm in Sources */,
</span><span class="cx">                                 1A6FB7AE11E64B6800DB1371 /* PluginView.cpp in Sources */,
</span><span class="cx">                                 E18C92F412DB9E7100CF2AEB /* PrintInfo.cpp in Sources */,
</span></span></pre>
</div>
</div>
</body>
</html>