Title: [248670] trunk/Source
Revision
248670
Author
you...@apple.com
Date
2019-08-14 06:42:37 -0700 (Wed, 14 Aug 2019)

Log Message

ThreadableBlobRegistry::blobSize should take a SessionID as parameter
https://bugs.webkit.org/show_bug.cgi?id=200671

Source/WebCore:

Reviewed by Alex Christensen.

Update FormData to compute its byte size based on a SessionID.
We keep a WK1 byte length computation for FormDataElement.
Update FormData call sites accordingly.
Update CacheStorageConnection to implement a SessionID getter.
No change of behavior.

* Modules/cache/CacheStorageConnection.cpp:
(WebCore::CacheStorageConnection::computeRealBodySize):
(WebCore::computeRealBodySize): Deleted.
* Modules/cache/CacheStorageConnection.h:
* Modules/cache/WorkerCacheStorageConnection.cpp:
(WebCore::WorkerCacheStorageConnection::sessionID const):
* Modules/cache/WorkerCacheStorageConnection.h:
* fileapi/Blob.cpp:
(WebCore::Blob::size const):
* fileapi/ThreadableBlobRegistry.cpp:
(WebCore::ThreadableBlobRegistry::blobSize):
* fileapi/ThreadableBlobRegistry.h:
* loader/cache/KeepaliveRequestTracker.cpp:
(WebCore::KeepaliveRequestTracker::tryRegisterRequest):
(WebCore::KeepaliveRequestTracker::registerRequest):
(WebCore::KeepaliveRequestTracker::unregisterRequest):
* page/CacheStorageProvider.h:
(WebCore::CacheStorageProvider::createCacheStorageConnection):
* platform/network/BlobRegistry.h:
* platform/network/FormData.cpp:
(WebCore::computeLengthInBytes):
(WebCore::FormDataElement::lengthInBytes const):
(WebCore::FormData::lengthInBytes const):
* platform/network/FormData.h:
* platform/network/cf/FormDataStreamCFNet.cpp:
(WebCore::createHTTPBodyCFReadStream):
* platform/network/curl/CurlFormDataStream.cpp:
(WebCore::m_sessionID):
(WebCore::CurlFormDataStream::computeContentLength):
(WebCore::CurlFormDataStream::CurlFormDataStream): Deleted.
* platform/network/curl/CurlFormDataStream.h:
* platform/network/curl/CurlRequest.cpp:
(WebCore::CurlRequest::CurlRequest):
* platform/network/curl/CurlRequest.h:
(WebCore::CurlRequest::create):

* xml/XMLHttpRequest.cpp:
(WebCore::XMLHttpRequest::createRequest):

Source/WebKit:

Reviewed by Alex Christensen.

Update WebCacheStorageConnection to implement sessionID getter.
Update NetworkConnectionToWebProcess to get a sessionID as parameter to blobSize computation.

* NetworkProcess/curl/NetworkDataTaskCurl.cpp:
(WebKit::NetworkDataTaskCurl::createCurlRequest):
* NetworkProcess/NetworkConnectionToWebProcess.cpp:
(WebKit::NetworkConnectionToWebProcess::blobSize):
(WebKit::NetworkConnectionToWebProcess::writeBlobsToTemporaryFiles):
* NetworkProcess/NetworkConnectionToWebProcess.h:
* NetworkProcess/NetworkConnectionToWebProcess.messages.in:
* NetworkProcess/NetworkProcessPlatformStrategies.cpp:
(WebKit::NetworkProcessPlatformStrategies::createBlobRegistry):
* WebProcess/Cache/WebCacheStorageConnection.h:
* WebProcess/FileAPI/BlobRegistryProxy.cpp:
(WebKit::BlobRegistryProxy::blobSize):
* WebProcess/FileAPI/BlobRegistryProxy.h:

Source/WebKitLegacy/mac:

Reviewed by ALex Christensen.

* WebCoreSupport/WebPlatformStrategies.mm:

Source/WebKitLegacy/win:

Reviewed by Alex Christensen.

* WebCoreSupport/WebPlatformStrategies.cpp:

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (248669 => 248670)


--- trunk/Source/WebCore/ChangeLog	2019-08-14 11:54:05 UTC (rev 248669)
+++ trunk/Source/WebCore/ChangeLog	2019-08-14 13:42:37 UTC (rev 248670)
@@ -1,3 +1,55 @@
+2019-08-14  Youenn Fablet  <you...@apple.com>
+
+        ThreadableBlobRegistry::blobSize should take a SessionID as parameter
+        https://bugs.webkit.org/show_bug.cgi?id=200671
+
+        Reviewed by Alex Christensen.
+
+        Update FormData to compute its byte size based on a SessionID.
+        We keep a WK1 byte length computation for FormDataElement.
+        Update FormData call sites accordingly.
+        Update CacheStorageConnection to implement a SessionID getter.
+        No change of behavior.
+
+        * Modules/cache/CacheStorageConnection.cpp:
+        (WebCore::CacheStorageConnection::computeRealBodySize):
+        (WebCore::computeRealBodySize): Deleted.
+        * Modules/cache/CacheStorageConnection.h:
+        * Modules/cache/WorkerCacheStorageConnection.cpp:
+        (WebCore::WorkerCacheStorageConnection::sessionID const):
+        * Modules/cache/WorkerCacheStorageConnection.h:
+        * fileapi/Blob.cpp:
+        (WebCore::Blob::size const):
+        * fileapi/ThreadableBlobRegistry.cpp:
+        (WebCore::ThreadableBlobRegistry::blobSize):
+        * fileapi/ThreadableBlobRegistry.h:
+        * loader/cache/KeepaliveRequestTracker.cpp:
+        (WebCore::KeepaliveRequestTracker::tryRegisterRequest):
+        (WebCore::KeepaliveRequestTracker::registerRequest):
+        (WebCore::KeepaliveRequestTracker::unregisterRequest):
+        * page/CacheStorageProvider.h:
+        (WebCore::CacheStorageProvider::createCacheStorageConnection):
+        * platform/network/BlobRegistry.h:
+        * platform/network/FormData.cpp:
+        (WebCore::computeLengthInBytes):
+        (WebCore::FormDataElement::lengthInBytes const):
+        (WebCore::FormData::lengthInBytes const):
+        * platform/network/FormData.h:
+        * platform/network/cf/FormDataStreamCFNet.cpp:
+        (WebCore::createHTTPBodyCFReadStream):
+        * platform/network/curl/CurlFormDataStream.cpp:
+        (WebCore::m_sessionID):
+        (WebCore::CurlFormDataStream::computeContentLength):
+        (WebCore::CurlFormDataStream::CurlFormDataStream): Deleted.
+        * platform/network/curl/CurlFormDataStream.h:
+        * platform/network/curl/CurlRequest.cpp:
+        (WebCore::CurlRequest::CurlRequest):
+        * platform/network/curl/CurlRequest.h:
+        (WebCore::CurlRequest::create):
+
+        * xml/XMLHttpRequest.cpp:
+        (WebCore::XMLHttpRequest::createRequest):
+
 2019-08-14  Antti Koivisto  <an...@apple.com>
 
         Remove TouchActionData

Modified: trunk/Source/WebCore/Modules/cache/CacheStorageConnection.cpp (248669 => 248670)


--- trunk/Source/WebCore/Modules/cache/CacheStorageConnection.cpp	2019-08-14 11:54:05 UTC (rev 248669)
+++ trunk/Source/WebCore/Modules/cache/CacheStorageConnection.cpp	2019-08-14 13:42:37 UTC (rev 248670)
@@ -33,11 +33,11 @@
 namespace WebCore {
 using namespace WebCore::DOMCacheEngine;
 
-static inline uint64_t computeRealBodySize(const DOMCacheEngine::ResponseBody& body)
+uint64_t CacheStorageConnection::computeRealBodySize(const DOMCacheEngine::ResponseBody& body)
 {
     uint64_t result = 0;
     WTF::switchOn(body, [&] (const Ref<WebCore::FormData>& formData) {
-        result = formData->lengthInBytes();
+        result = formData->lengthInBytes(sessionID());
     }, [&] (const Ref<WebCore::SharedBuffer>& buffer) {
         result = buffer->size();
     }, [] (const std::nullptr_t&) {

Modified: trunk/Source/WebCore/Modules/cache/CacheStorageConnection.h (248669 => 248670)


--- trunk/Source/WebCore/Modules/cache/CacheStorageConnection.h	2019-08-14 11:54:05 UTC (rev 248669)
+++ trunk/Source/WebCore/Modules/cache/CacheStorageConnection.h	2019-08-14 13:42:37 UTC (rev 248670)
@@ -57,6 +57,11 @@
     virtual void engineRepresentation(CompletionHandler<void(const String&)>&& callback) { callback(String { }); }
     virtual void updateQuotaBasedOnSpaceUsage(const ClientOrigin&) { }
 
+    virtual PAL::SessionID sessionID() const = 0;
+
+private:
+    uint64_t computeRealBodySize(const DOMCacheEngine::ResponseBody&);
+
 protected:
     HashMap<uint64_t, uint64_t> m_opaqueResponseToSizeWithPaddingMap;
 };

Modified: trunk/Source/WebCore/Modules/cache/WorkerCacheStorageConnection.cpp (248669 => 248670)


--- trunk/Source/WebCore/Modules/cache/WorkerCacheStorageConnection.cpp	2019-08-14 11:54:05 UTC (rev 248669)
+++ trunk/Source/WebCore/Modules/cache/WorkerCacheStorageConnection.cpp	2019-08-14 13:42:37 UTC (rev 248670)
@@ -134,6 +134,11 @@
         callOnMainThread([mainThreadConnection = WTFMove(m_mainThreadConnection)]() mutable { });
 }
 
+PAL::SessionID WorkerCacheStorageConnection::sessionID() const
+{
+    return m_scope.sessionID();
+}
+
 void WorkerCacheStorageConnection::open(const ClientOrigin& origin, const String& cacheName, CacheIdentifierCallback&& callback)
 {
     uint64_t requestIdentifier = ++m_lastRequestIdentifier;

Modified: trunk/Source/WebCore/Modules/cache/WorkerCacheStorageConnection.h (248669 => 248670)


--- trunk/Source/WebCore/Modules/cache/WorkerCacheStorageConnection.h	2019-08-14 11:54:05 UTC (rev 248669)
+++ trunk/Source/WebCore/Modules/cache/WorkerCacheStorageConnection.h	2019-08-14 13:42:37 UTC (rev 248670)
@@ -55,6 +55,8 @@
     void reference(uint64_t cacheIdentifier) final;
     void dereference(uint64_t cacheIdentifier) final;
 
+    PAL::SessionID sessionID() const final;
+
     void doOpen(uint64_t requestIdentifier, const ClientOrigin&, const String& cacheName);
     void doRemove(uint64_t requestIdentifier, uint64_t cacheIdentifier);
     void doRetrieveCaches(uint64_t requestIdentifier, const ClientOrigin&, uint64_t updateCounter);

Modified: trunk/Source/WebCore/fileapi/Blob.cpp (248669 => 248670)


--- trunk/Source/WebCore/fileapi/Blob.cpp	2019-08-14 11:54:05 UTC (rev 248669)
+++ trunk/Source/WebCore/fileapi/Blob.cpp	2019-08-14 13:42:37 UTC (rev 248670)
@@ -169,7 +169,7 @@
     if (!m_size) {
         // FIXME: _javascript_ cannot represent sizes as large as unsigned long long, we need to
         // come up with an exception to throw if file size is not representable.
-        unsigned long long actualSize = ThreadableBlobRegistry::blobSize(m_internalURL);
+        unsigned long long actualSize = ThreadableBlobRegistry::blobSize(m_sessionID, m_internalURL);
         m_size = WTF::isInBounds<long long>(actualSize) ? actualSize : 0;
     }
 

Modified: trunk/Source/WebCore/fileapi/ThreadableBlobRegistry.cpp (248669 => 248670)


--- trunk/Source/WebCore/fileapi/ThreadableBlobRegistry.cpp	2019-08-14 11:54:05 UTC (rev 248669)
+++ trunk/Source/WebCore/fileapi/ThreadableBlobRegistry.cpp	2019-08-14 13:42:37 UTC (rev 248670)
@@ -128,15 +128,15 @@
     });
 }
 
-unsigned long long ThreadableBlobRegistry::blobSize(const URL& url)
+unsigned long long ThreadableBlobRegistry::blobSize(PAL::SessionID sessionID, const URL& url)
 {
     if (isMainThread())
-        return blobRegistry().blobSize(url);
+        return blobRegistry().blobSize(sessionID, url);
 
     unsigned long long resultSize;
     BinarySemaphore semaphore;
-    callOnMainThread([url = "" &semaphore, &resultSize] {
-        resultSize = blobRegistry().blobSize(url);
+    callOnMainThread([sessionID, url = "" &semaphore, &resultSize] {
+        resultSize = blobRegistry().blobSize(sessionID, url);
         semaphore.signal();
     });
     semaphore.wait();

Modified: trunk/Source/WebCore/fileapi/ThreadableBlobRegistry.h (248669 => 248670)


--- trunk/Source/WebCore/fileapi/ThreadableBlobRegistry.h	2019-08-14 11:54:05 UTC (rev 248669)
+++ trunk/Source/WebCore/fileapi/ThreadableBlobRegistry.h	2019-08-14 13:42:37 UTC (rev 248670)
@@ -47,7 +47,7 @@
     static void registerBlobURLForSlice(PAL::SessionID, const URL& newURL, const URL& srcURL, long long start, long long end);
     static void unregisterBlobURL(PAL::SessionID, const URL&);
 
-    static unsigned long long blobSize(const URL&);
+    static unsigned long long blobSize(PAL::SessionID, const URL&);
 
     // Returns the origin for the given blob URL. This is because we are not able to embed the unique security origin or the origin of file URL
     // in the blob URL.

Modified: trunk/Source/WebCore/loader/cache/KeepaliveRequestTracker.cpp (248669 => 248670)


--- trunk/Source/WebCore/loader/cache/KeepaliveRequestTracker.cpp	2019-08-14 11:54:05 UTC (rev 248669)
+++ trunk/Source/WebCore/loader/cache/KeepaliveRequestTracker.cpp	2019-08-14 13:42:37 UTC (rev 248670)
@@ -44,7 +44,7 @@
     if (!body)
         return true;
 
-    uint64_t bodySize = body->lengthInBytes();
+    uint64_t bodySize = body->lengthInBytes(resource.sessionID());
     if (m_inflightKeepaliveBytes + bodySize > maxInflightKeepaliveBytes)
         return false;
 
@@ -60,7 +60,7 @@
         return;
     ASSERT(!m_inflightKeepaliveRequests.contains(&resource));
     m_inflightKeepaliveRequests.append(&resource);
-    m_inflightKeepaliveBytes += body->lengthInBytes();
+    m_inflightKeepaliveBytes += body->lengthInBytes(resource.sessionID());
     ASSERT(m_inflightKeepaliveBytes <= maxInflightKeepaliveBytes);
 
     resource.addClient(*this);
@@ -87,7 +87,7 @@
     resource.removeClient(*this);
     bool wasRemoved = m_inflightKeepaliveRequests.removeFirst(&resource);
     ASSERT_UNUSED(wasRemoved, wasRemoved);
-    m_inflightKeepaliveBytes -= resource.resourceRequest().httpBody()->lengthInBytes();
+    m_inflightKeepaliveBytes -= resource.resourceRequest().httpBody()->lengthInBytes(resource.sessionID());
     ASSERT(m_inflightKeepaliveBytes <= maxInflightKeepaliveBytes);
 }
 

Modified: trunk/Source/WebCore/page/CacheStorageProvider.h (248669 => 248670)


--- trunk/Source/WebCore/page/CacheStorageProvider.h	2019-08-14 11:54:05 UTC (rev 248669)
+++ trunk/Source/WebCore/page/CacheStorageProvider.h	2019-08-14 13:42:37 UTC (rev 248670)
@@ -35,9 +35,14 @@
 public:
     class DummyCacheStorageConnection final : public WebCore::CacheStorageConnection {
     public:
-        static Ref<DummyCacheStorageConnection> create() { return adoptRef(*new DummyCacheStorageConnection); }
+        static Ref<DummyCacheStorageConnection> create(PAL::SessionID sessionID) { return adoptRef(*new DummyCacheStorageConnection(sessionID)); }
 
     private:
+        explicit DummyCacheStorageConnection(PAL::SessionID sessionID)
+            : m_sessionID(sessionID)
+        {
+        }
+
         void open(const ClientOrigin&, const String&, DOMCacheEngine::CacheIdentifierCallback&&) final { }
         void remove(uint64_t, DOMCacheEngine::CacheIdentifierCallback&&) final { }
         void retrieveCaches(const ClientOrigin&, uint64_t, DOMCacheEngine::CacheInfosCallback&&) final { }
@@ -46,10 +51,13 @@
         void batchPutOperation(uint64_t, Vector<DOMCacheEngine::Record>&&, DOMCacheEngine::RecordIdentifiersCallback&&) final { }
         void reference(uint64_t) final { }
         void dereference(uint64_t) final { }
+        PAL::SessionID sessionID() const final { return m_sessionID; }
+
+        PAL::SessionID m_sessionID;
     };
 
     static Ref<CacheStorageProvider> create() { return adoptRef(*new CacheStorageProvider); }
-    virtual Ref<CacheStorageConnection> createCacheStorageConnection(PAL::SessionID) { return DummyCacheStorageConnection::create(); }
+    virtual Ref<CacheStorageConnection> createCacheStorageConnection(PAL::SessionID sessionID) { return DummyCacheStorageConnection::create(sessionID); }
     virtual ~CacheStorageProvider() { };
 
 protected:

Modified: trunk/Source/WebCore/platform/network/BlobRegistry.h (248669 => 248670)


--- trunk/Source/WebCore/platform/network/BlobRegistry.h	2019-08-14 11:54:05 UTC (rev 248669)
+++ trunk/Source/WebCore/platform/network/BlobRegistry.h	2019-08-14 13:42:37 UTC (rev 248670)
@@ -64,7 +64,7 @@
 
     virtual void unregisterBlobURL(PAL::SessionID, const URL&) = 0;
 
-    virtual unsigned long long blobSize(const URL&) = 0;
+    virtual unsigned long long blobSize(PAL::SessionID, const URL&) = 0;
 
     virtual void writeBlobsToTemporaryFiles(PAL::SessionID, const Vector<String>& blobURLs, CompletionHandler<void(Vector<String>&& filePaths)>&&) = 0;
 

Modified: trunk/Source/WebCore/platform/network/FormData.cpp (248669 => 248670)


--- trunk/Source/WebCore/platform/network/FormData.cpp	2019-08-14 11:54:05 UTC (rev 248669)
+++ trunk/Source/WebCore/platform/network/FormData.cpp	2019-08-14 13:42:37 UTC (rev 248670)
@@ -124,9 +124,9 @@
     return formData;
 }
 
-uint64_t FormDataElement::lengthInBytes() const
+static inline uint64_t computeLengthInBytes(const FormDataElement& element, const Function<uint64_t(const URL&)>& blobSize)
 {
-    return switchOn(data,
+    return switchOn(element.data,
         [] (const Vector<char>& bytes) {
             return static_cast<uint64_t>(bytes.size());
         }, [] (const FormDataElement::EncodedFileData& fileData) {
@@ -136,12 +136,26 @@
             if (FileSystem::getFileSize(fileData.filename, fileSize))
                 return static_cast<uint64_t>(fileSize);
             return static_cast<uint64_t>(0);
-        }, [] (const FormDataElement::EncodedBlobData& blobData) {
-            return ThreadableBlobRegistry::blobSize(blobData.url);
+        }, [&blobSize] (const FormDataElement::EncodedBlobData& blobData) {
+            return blobSize(blobData.url);
         }
     );
 }
 
+uint64_t FormDataElement::lengthInBytes(BlobRegistryImpl* blobRegistry) const
+{
+    return computeLengthInBytes(*this, [&](auto& url) {
+        return blobRegistry ? blobRegistry->blobSize(url) : 0;
+    });
+}
+
+uint64_t FormDataElement::lengthInBytes(PAL::SessionID sessionID) const
+{
+    return computeLengthInBytes(*this, [&](auto& url) {
+        return blobRegistry().blobSize(sessionID, url);
+    });
+}
+
 FormDataElement FormDataElement::isolatedCopy() const
 {
     return switchOn(data,
@@ -380,12 +394,12 @@
         FileSystem::deleteFile(file);
 }
 
-uint64_t FormData::lengthInBytes() const
+uint64_t FormData::lengthInBytes(PAL::SessionID sessionID) const
 {
     if (!m_lengthInBytes) {
         uint64_t length = 0;
         for (auto& element : m_elements)
-            length += element.lengthInBytes();
+            length += element.lengthInBytes(sessionID);
         m_lengthInBytes = length;
     }
     return *m_lengthInBytes;

Modified: trunk/Source/WebCore/platform/network/FormData.h (248669 => 248670)


--- trunk/Source/WebCore/platform/network/FormData.h	2019-08-14 11:54:05 UTC (rev 248669)
+++ trunk/Source/WebCore/platform/network/FormData.h	2019-08-14 13:42:37 UTC (rev 248670)
@@ -20,6 +20,7 @@
 #pragma once
 
 #include "BlobData.h"
+#include <pal/SessionID.h>
 #include <wtf/Forward.h>
 #include <wtf/RefCounted.h>
 #include <wtf/URL.h>
@@ -50,7 +51,8 @@
     explicit FormDataElement(const URL& blobURL)
         : data(EncodedBlobData { blobURL }) { }
 
-    uint64_t lengthInBytes() const;
+    uint64_t lengthInBytes(BlobRegistryImpl*) const;
+    uint64_t lengthInBytes(PAL::SessionID) const;
 
     FormDataElement isolatedCopy() const;
 
@@ -249,7 +251,7 @@
         return FormURLEncoded;
     }
 
-    uint64_t lengthInBytes() const;
+    uint64_t lengthInBytes(PAL::SessionID) const;
 
     WEBCORE_EXPORT URL asBlobURL() const;
 

Modified: trunk/Source/WebCore/platform/network/cf/FormDataStreamCFNet.cpp (248669 => 248670)


--- trunk/Source/WebCore/platform/network/cf/FormDataStreamCFNet.cpp	2019-08-14 11:54:05 UTC (rev 248669)
+++ trunk/Source/WebCore/platform/network/cf/FormDataStreamCFNet.cpp	2019-08-14 13:42:37 UTC (rev 248670)
@@ -378,7 +378,7 @@
     // Precompute the content length so CFNetwork doesn't use chunked mode.
     unsigned long long length = 0;
     for (auto& element : dataForUpload.data().elements())
-        length += element.lengthInBytes();
+        length += element.lengthInBytes(blobRegistry().blobRegistryImpl());
 
     FormCreationContext* formContext = new FormCreationContext { WTFMove(dataForUpload), length };
     CFReadStreamCallBacksV1 callBacks = { 1, formCreate, formFinalize, nullptr, formOpen, nullptr, formRead, nullptr, formCanRead, formClose, formCopyProperty, nullptr, nullptr, formSchedule, formUnschedule };

Modified: trunk/Source/WebCore/platform/network/curl/CurlDownload.cpp (248669 => 248670)


--- trunk/Source/WebCore/platform/network/curl/CurlDownload.cpp	2019-08-14 11:54:05 UTC (rev 248669)
+++ trunk/Source/WebCore/platform/network/curl/CurlDownload.cpp	2019-08-14 13:42:37 UTC (rev 248670)
@@ -76,7 +76,8 @@
 
 Ref<CurlRequest> CurlDownload::createCurlRequest(ResourceRequest& request)
 {
-    auto curlRequest = CurlRequest::create(request, *this);
+    // FIXME: Use a correct sessionID.
+    auto curlRequest = CurlRequest::create(request, *this, PAL::SessionID::emptySessionID());
     return curlRequest;
 }
 

Modified: trunk/Source/WebCore/platform/network/curl/CurlFormDataStream.cpp (248669 => 248670)


--- trunk/Source/WebCore/platform/network/curl/CurlFormDataStream.cpp	2019-08-14 11:54:05 UTC (rev 248669)
+++ trunk/Source/WebCore/platform/network/curl/CurlFormDataStream.cpp	2019-08-14 13:42:37 UTC (rev 248670)
@@ -41,7 +41,8 @@
 
 namespace WebCore {
 
-CurlFormDataStream::CurlFormDataStream(const FormData* formData)
+CurlFormDataStream::CurlFormDataStream(const FormData* formData, PAL::SessionID sessionID)
+    : m_sessionID(sessionID)
 {
     ASSERT(isMainThread());
 
@@ -103,7 +104,7 @@
     m_isContentLengthUpdated = true;
 
     for (const auto& element : m_formData->elements())
-        m_totalSize += element.lengthInBytes();
+        m_totalSize += element.lengthInBytes(m_sessionID);
 }
 
 Optional<size_t> CurlFormDataStream::read(char* buffer, size_t size)

Modified: trunk/Source/WebCore/platform/network/curl/CurlFormDataStream.h (248669 => 248670)


--- trunk/Source/WebCore/platform/network/curl/CurlFormDataStream.h	2019-08-14 11:54:05 UTC (rev 248669)
+++ trunk/Source/WebCore/platform/network/curl/CurlFormDataStream.h	2019-08-14 13:42:37 UTC (rev 248670)
@@ -34,7 +34,7 @@
 
 class CurlFormDataStream {
 public:
-    CurlFormDataStream(const FormData*);
+    CurlFormDataStream(const FormData*, PAL::SessionID);
     WEBCORE_EXPORT ~CurlFormDataStream();
 
     void clean();
@@ -54,6 +54,7 @@
     Optional<size_t> readFromFile(const FormDataElement::EncodedFileData&, char*, size_t);
     Optional<size_t> readFromData(const Vector<char>&, char*, size_t);
 
+    PAL::SessionID m_sessionID;
     RefPtr<FormData> m_formData;
 
     std::unique_ptr<Vector<char>> m_postData;

Modified: trunk/Source/WebCore/platform/network/curl/CurlRequest.cpp (248669 => 248670)


--- trunk/Source/WebCore/platform/network/curl/CurlRequest.cpp	2019-08-14 11:54:05 UTC (rev 248669)
+++ trunk/Source/WebCore/platform/network/curl/CurlRequest.cpp	2019-08-14 13:42:37 UTC (rev 248670)
@@ -41,13 +41,13 @@
 
 namespace WebCore {
 
-CurlRequest::CurlRequest(const ResourceRequest&request, CurlRequestClient* client, ShouldSuspend shouldSuspend, EnableMultipart enableMultipart, CaptureNetworkLoadMetrics captureExtraMetrics, MessageQueue<Function<void()>>* messageQueue)
+CurlRequest::CurlRequest(const ResourceRequest&request, CurlRequestClient* client, PAL::SessionID sessionID, ShouldSuspend shouldSuspend, EnableMultipart enableMultipart, CaptureNetworkLoadMetrics captureExtraMetrics, MessageQueue<Function<void()>>* messageQueue)
     : m_client(client)
     , m_messageQueue(messageQueue)
     , m_request(request.isolatedCopy())
     , m_shouldSuspend(shouldSuspend == ShouldSuspend::Yes)
     , m_enableMultipart(enableMultipart == EnableMultipart::Yes)
-    , m_formDataStream(m_request.httpBody())
+    , m_formDataStream(m_request.httpBody(), sessionID)
     , m_captureExtraMetrics(captureExtraMetrics == CaptureNetworkLoadMetrics::Extended)
 {
     ASSERT(isMainThread());

Modified: trunk/Source/WebCore/platform/network/curl/CurlRequest.h (248669 => 248670)


--- trunk/Source/WebCore/platform/network/curl/CurlRequest.h	2019-08-14 11:54:05 UTC (rev 248669)
+++ trunk/Source/WebCore/platform/network/curl/CurlRequest.h	2019-08-14 13:42:37 UTC (rev 248670)
@@ -32,6 +32,7 @@
 #include "CurlResponse.h"
 #include "ProtectionSpace.h"
 #include "ResourceRequest.h"
+#include <pal/SessionID.h>
 #include <wtf/FileSystem.h>
 #include <wtf/MessageQueue.h>
 #include <wtf/MonotonicTime.h>
@@ -63,9 +64,9 @@
         Extended
     };
 
-    static Ref<CurlRequest> create(const ResourceRequest& request, CurlRequestClient& client, ShouldSuspend shouldSuspend = ShouldSuspend::No, EnableMultipart enableMultipart = EnableMultipart::No, CaptureNetworkLoadMetrics captureMetrics = CaptureNetworkLoadMetrics::Basic, MessageQueue<Function<void()>>* messageQueue = nullptr)
+    static Ref<CurlRequest> create(const ResourceRequest& request, CurlRequestClient& client, PAL::SessionID sessionID, ShouldSuspend shouldSuspend = ShouldSuspend::No, EnableMultipart enableMultipart = EnableMultipart::No, CaptureNetworkLoadMetrics captureMetrics = CaptureNetworkLoadMetrics::Basic, MessageQueue<Function<void()>>* messageQueue = nullptr)
     {
-        return adoptRef(*new CurlRequest(request, &client, shouldSuspend, enableMultipart, captureMetrics, messageQueue));
+        return adoptRef(*new CurlRequest(request, &client, sessionID, shouldSuspend, enableMultipart, captureMetrics, messageQueue));
     }
 
     virtual ~CurlRequest() = default;
@@ -105,7 +106,7 @@
         FinishTransfer
     };
 
-    CurlRequest(const ResourceRequest&, CurlRequestClient*, ShouldSuspend, EnableMultipart, CaptureNetworkLoadMetrics, MessageQueue<Function<void()>>*);
+    CurlRequest(const ResourceRequest&, CurlRequestClient*, PAL::SessionID, ShouldSuspend, EnableMultipart, CaptureNetworkLoadMetrics, MessageQueue<Function<void()>>*);
 
     void retain() override { ref(); }
     void release() override { deref(); }

Modified: trunk/Source/WebCore/platform/network/curl/ResourceHandleCurl.cpp (248669 => 248670)


--- trunk/Source/WebCore/platform/network/curl/ResourceHandleCurl.cpp	2019-08-14 11:54:05 UTC (rev 248669)
+++ trunk/Source/WebCore/platform/network/curl/ResourceHandleCurl.cpp	2019-08-14 13:42:37 UTC (rev 248670)
@@ -154,7 +154,8 @@
     }
 
     CurlRequest::ShouldSuspend shouldSuspend = d->m_defersLoading ? CurlRequest::ShouldSuspend::Yes : CurlRequest::ShouldSuspend::No;
-    auto curlRequest = CurlRequest::create(request, *delegate(), shouldSuspend, CurlRequest::EnableMultipart::Yes, CurlRequest::CaptureNetworkLoadMetrics::Basic, d->m_messageQueue);
+    // FIXME: Use a correct sessionID.
+    auto curlRequest = CurlRequest::create(request, *delegate(), PAL::SessionID::emptySessionID(), shouldSuspend, CurlRequest::EnableMultipart::Yes, CurlRequest::CaptureNetworkLoadMetrics::Basic, d->m_messageQueue);
     
     return curlRequest;
 }

Modified: trunk/Source/WebCore/xml/XMLHttpRequest.cpp (248669 => 248670)


--- trunk/Source/WebCore/xml/XMLHttpRequest.cpp	2019-08-14 11:54:05 UTC (rev 248669)
+++ trunk/Source/WebCore/xml/XMLHttpRequest.cpp	2019-08-14 13:42:37 UTC (rev 248670)
@@ -621,7 +621,7 @@
     if (m_async) {
         m_progressEventThrottle.dispatchProgressEvent(eventNames().loadstartEvent);
         if (!m_uploadComplete && m_uploadListenerFlag)
-            m_upload->dispatchProgressEvent(eventNames().loadstartEvent, 0, request.httpBody()->lengthInBytes());
+            m_upload->dispatchProgressEvent(eventNames().loadstartEvent, 0, request.httpBody()->lengthInBytes(scriptExecutionContext()->sessionID()));
 
         if (readyState() != OPENED || !m_sendFlag || m_loader)
             return { };

Modified: trunk/Source/WebKit/ChangeLog (248669 => 248670)


--- trunk/Source/WebKit/ChangeLog	2019-08-14 11:54:05 UTC (rev 248669)
+++ trunk/Source/WebKit/ChangeLog	2019-08-14 13:42:37 UTC (rev 248670)
@@ -1,5 +1,29 @@
 2019-08-14  Youenn Fablet  <you...@apple.com>
 
+        ThreadableBlobRegistry::blobSize should take a SessionID as parameter
+        https://bugs.webkit.org/show_bug.cgi?id=200671
+
+        Reviewed by Alex Christensen.
+
+        Update WebCacheStorageConnection to implement sessionID getter.
+        Update NetworkConnectionToWebProcess to get a sessionID as parameter to blobSize computation.
+
+        * NetworkProcess/curl/NetworkDataTaskCurl.cpp:
+        (WebKit::NetworkDataTaskCurl::createCurlRequest):
+        * NetworkProcess/NetworkConnectionToWebProcess.cpp:
+        (WebKit::NetworkConnectionToWebProcess::blobSize):
+        (WebKit::NetworkConnectionToWebProcess::writeBlobsToTemporaryFiles):
+        * NetworkProcess/NetworkConnectionToWebProcess.h:
+        * NetworkProcess/NetworkConnectionToWebProcess.messages.in:
+        * NetworkProcess/NetworkProcessPlatformStrategies.cpp:
+        (WebKit::NetworkProcessPlatformStrategies::createBlobRegistry):
+        * WebProcess/Cache/WebCacheStorageConnection.h:
+        * WebProcess/FileAPI/BlobRegistryProxy.cpp:
+        (WebKit::BlobRegistryProxy::blobSize):
+        * WebProcess/FileAPI/BlobRegistryProxy.h:
+
+2019-08-14  Youenn Fablet  <you...@apple.com>
+
         Remove SessionID default constructor
         https://bugs.webkit.org/show_bug.cgi?id=200669
 

Modified: trunk/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.cpp (248669 => 248670)


--- trunk/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.cpp	2019-08-14 11:54:05 UTC (rev 248669)
+++ trunk/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.cpp	2019-08-14 13:42:37 UTC (rev 248670)
@@ -627,13 +627,10 @@
     session->blobRegistry().unregisterBlobURL(url);
 }
 
-void NetworkConnectionToWebProcess::blobSize(const URL& url, CompletionHandler<void(uint64_t)>&& completionHandler)
+void NetworkConnectionToWebProcess::blobSize(PAL::SessionID sessionID, const URL& url, CompletionHandler<void(uint64_t)>&& completionHandler)
 {
-    auto* blobRegistry = networkProcess().blobRegistry(*this);
-    if (!blobRegistry)
-        return;
-
-    completionHandler(blobRegistry->blobSize(url));
+    auto* session = networkProcess().networkSession(sessionID);
+    completionHandler(session ? session->blobRegistry().blobSize(url) : 0);
 }
 
 void NetworkConnectionToWebProcess::writeBlobsToTemporaryFiles(PAL::SessionID sessionID, const Vector<String>& blobURLs, CompletionHandler<void(Vector<String>&&)>&& completionHandler)
@@ -640,7 +637,7 @@
 {
     auto* session = networkProcess().networkSession(sessionID);
     if (!session)
-        return;
+        return completionHandler({ });
 
     Vector<RefPtr<BlobDataFileReference>> fileReferences;
     for (auto& url : blobURLs)

Modified: trunk/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.h (248669 => 248670)


--- trunk/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.h	2019-08-14 11:54:05 UTC (rev 248669)
+++ trunk/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.h	2019-08-14 13:42:37 UTC (rev 248670)
@@ -186,7 +186,7 @@
     void registerBlobURLFromURL(PAL::SessionID, const URL&, const URL& srcURL);
     void registerBlobURLOptionallyFileBacked(PAL::SessionID, const URL&, const URL& srcURL, const String& fileBackedPath, const String& contentType);
     void registerBlobURLForSlice(PAL::SessionID, const URL&, const URL& srcURL, int64_t start, int64_t end);
-    void blobSize(const URL&, CompletionHandler<void(uint64_t)>&&);
+    void blobSize(PAL::SessionID, const URL&, CompletionHandler<void(uint64_t)>&&);
     void unregisterBlobURL(PAL::SessionID, const URL&);
     void writeBlobsToTemporaryFiles(PAL::SessionID, const Vector<String>& blobURLs, CompletionHandler<void(Vector<String>&&)>&&);
 

Modified: trunk/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.messages.in (248669 => 248670)


--- trunk/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.messages.in	2019-08-14 11:54:05 UTC (rev 248669)
+++ trunk/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.messages.in	2019-08-14 13:42:37 UTC (rev 248670)
@@ -47,7 +47,7 @@
     RegisterBlobURLOptionallyFileBacked(PAL::SessionID sessionID, URL url, URL srcURL, String fileBackedPath, String contentType)
     RegisterBlobURLForSlice(PAL::SessionID sessionID, URL url, URL srcURL, int64_t start, int64_t end)
     UnregisterBlobURL(PAL::SessionID sessionID, URL url)
-    BlobSize(URL url) -> (uint64_t resultSize) Synchronous
+    BlobSize(PAL::SessionID sessionID, URL url) -> (uint64_t resultSize) Synchronous
     WriteBlobsToTemporaryFiles(PAL::SessionID sessionID, Vector<String> blobURLs) -> (Vector<String> fileNames) Async
 
     SetCaptureExtraNetworkLoadMetricsEnabled(bool enabled)

Modified: trunk/Source/WebKit/NetworkProcess/NetworkProcessPlatformStrategies.cpp (248669 => 248670)


--- trunk/Source/WebKit/NetworkProcess/NetworkProcessPlatformStrategies.cpp	2019-08-14 11:54:05 UTC (rev 248669)
+++ trunk/Source/WebKit/NetworkProcess/NetworkProcessPlatformStrategies.cpp	2019-08-14 13:42:37 UTC (rev 248670)
@@ -58,7 +58,7 @@
         void registerBlobURLOptionallyFileBacked(PAL::SessionID, const URL&, const URL& srcURL, RefPtr<BlobDataFileReference>&&, const String& contentType) final { ASSERT_NOT_REACHED(); }
         void registerBlobURLForSlice(PAL::SessionID, const URL&, const URL& srcURL, long long start, long long end) final { ASSERT_NOT_REACHED(); }
         void unregisterBlobURL(PAL::SessionID, const URL&) final { ASSERT_NOT_REACHED(); }
-        unsigned long long blobSize(const URL&) final { ASSERT_NOT_REACHED(); return 0; }
+        unsigned long long blobSize(PAL::SessionID, const URL&) final { ASSERT_NOT_REACHED(); return 0; }
         void writeBlobsToTemporaryFiles(PAL::SessionID, const Vector<String>& blobURLs, CompletionHandler<void(Vector<String>&& filePaths)>&&) final { ASSERT_NOT_REACHED(); }
     };
     static NeverDestroyed<EmptyBlobRegistry> blobRegistry;

Modified: trunk/Source/WebKit/NetworkProcess/curl/NetworkDataTaskCurl.cpp (248669 => 248670)


--- trunk/Source/WebKit/NetworkProcess/curl/NetworkDataTaskCurl.cpp	2019-08-14 11:54:05 UTC (rev 248669)
+++ trunk/Source/WebKit/NetworkProcess/curl/NetworkDataTaskCurl.cpp	2019-08-14 13:42:37 UTC (rev 248670)
@@ -128,7 +128,7 @@
     // Creates a CurlRequest in suspended state.
     // Then, NetworkDataTaskCurl::resume() will be called and communication resumes.
     const auto captureMetrics = shouldCaptureExtraNetworkLoadMetrics() ? CurlRequest::CaptureNetworkLoadMetrics::Extended : CurlRequest::CaptureNetworkLoadMetrics::Basic;
-    return CurlRequest::create(request, *this, CurlRequest::ShouldSuspend::Yes, CurlRequest::EnableMultipart::No, captureMetrics);
+    return CurlRequest::create(request, *this, m_session->sessionID(), CurlRequest::ShouldSuspend::Yes, CurlRequest::EnableMultipart::No, captureMetrics);
 }
 
 void NetworkDataTaskCurl::curlDidSendData(CurlRequest&, unsigned long long totalBytesSent, unsigned long long totalBytesExpectedToSend)

Modified: trunk/Source/WebKit/WebProcess/Cache/WebCacheStorageConnection.h (248669 => 248670)


--- trunk/Source/WebKit/WebProcess/Cache/WebCacheStorageConnection.h	2019-08-14 11:54:05 UTC (rev 248669)
+++ trunk/Source/WebKit/WebProcess/Cache/WebCacheStorageConnection.h	2019-08-14 13:42:37 UTC (rev 248670)
@@ -67,6 +67,8 @@
     void engineRepresentation(CompletionHandler<void(const String&)>&&) final;
     void updateQuotaBasedOnSpaceUsage(const WebCore::ClientOrigin&) final;
 
+    PAL::SessionID sessionID() const final { return m_sessionID; }
+
     WebCacheStorageProvider& m_provider;
     PAL::SessionID m_sessionID;
 };

Modified: trunk/Source/WebKit/WebProcess/FileAPI/BlobRegistryProxy.cpp (248669 => 248670)


--- trunk/Source/WebKit/WebProcess/FileAPI/BlobRegistryProxy.cpp	2019-08-14 11:54:05 UTC (rev 248669)
+++ trunk/Source/WebKit/WebProcess/FileAPI/BlobRegistryProxy.cpp	2019-08-14 13:42:37 UTC (rev 248670)
@@ -73,10 +73,10 @@
     WebProcess::singleton().ensureNetworkProcessConnection().connection().send(Messages::NetworkConnectionToWebProcess::RegisterBlobURLForSlice(sessionID, url, srcURL, start, end), 0);
 }
 
-unsigned long long BlobRegistryProxy::blobSize(const URL& url)
+unsigned long long BlobRegistryProxy::blobSize(PAL::SessionID sessionID, const URL& url)
 {
     uint64_t resultSize;
-    if (!WebProcess::singleton().ensureNetworkProcessConnection().connection().sendSync(Messages::NetworkConnectionToWebProcess::BlobSize(url), Messages::NetworkConnectionToWebProcess::BlobSize::Reply(resultSize), 0))
+    if (!WebProcess::singleton().ensureNetworkProcessConnection().connection().sendSync(Messages::NetworkConnectionToWebProcess::BlobSize(sessionID, url), Messages::NetworkConnectionToWebProcess::BlobSize::Reply(resultSize), 0))
         return 0;
     return resultSize;
 }

Modified: trunk/Source/WebKit/WebProcess/FileAPI/BlobRegistryProxy.h (248669 => 248670)


--- trunk/Source/WebKit/WebProcess/FileAPI/BlobRegistryProxy.h	2019-08-14 11:54:05 UTC (rev 248669)
+++ trunk/Source/WebKit/WebProcess/FileAPI/BlobRegistryProxy.h	2019-08-14 13:42:37 UTC (rev 248670)
@@ -37,7 +37,7 @@
     void registerBlobURLOptionallyFileBacked(PAL::SessionID, const URL&, const URL& srcURL, RefPtr<WebCore::BlobDataFileReference>&&, const String& contentType) final;
     void unregisterBlobURL(PAL::SessionID, const URL&) final;
     void registerBlobURLForSlice(PAL::SessionID, const URL&, const URL& srcURL, long long start, long long end) final;
-    unsigned long long blobSize(const URL&) final;
+    unsigned long long blobSize(PAL::SessionID, const URL&) final;
     void writeBlobsToTemporaryFiles(PAL::SessionID, const Vector<String>& blobURLs, CompletionHandler<void(Vector<String>&& filePaths)>&&) final;
 };
 

Modified: trunk/Source/WebKitLegacy/mac/ChangeLog (248669 => 248670)


--- trunk/Source/WebKitLegacy/mac/ChangeLog	2019-08-14 11:54:05 UTC (rev 248669)
+++ trunk/Source/WebKitLegacy/mac/ChangeLog	2019-08-14 13:42:37 UTC (rev 248670)
@@ -1,3 +1,12 @@
+2019-08-14  Youenn Fablet  <you...@apple.com>
+
+        ThreadableBlobRegistry::blobSize should take a SessionID as parameter
+        https://bugs.webkit.org/show_bug.cgi?id=200671
+
+        Reviewed by ALex Christensen.
+
+        * WebCoreSupport/WebPlatformStrategies.mm:
+
 2019-08-13  Youenn Fablet  <you...@apple.com>
 
         Blob registries should be keyed by session IDs

Modified: trunk/Source/WebKitLegacy/mac/WebCoreSupport/WebPlatformStrategies.mm (248669 => 248670)


--- trunk/Source/WebKitLegacy/mac/WebCoreSupport/WebPlatformStrategies.mm	2019-08-14 11:54:05 UTC (rev 248669)
+++ trunk/Source/WebKitLegacy/mac/WebCoreSupport/WebPlatformStrategies.mm	2019-08-14 13:42:37 UTC (rev 248670)
@@ -70,7 +70,7 @@
     void registerBlobURLOptionallyFileBacked(PAL::SessionID, const URL& url, const URL& srcURL, RefPtr<BlobDataFileReference>&& reference, const String& contentType) final { m_blobRegistry.registerBlobURLOptionallyFileBacked(url, srcURL, WTFMove(reference), contentType); }
     void registerBlobURLForSlice(PAL::SessionID, const URL& url, const URL& srcURL, long long start, long long end) final { m_blobRegistry.registerBlobURLForSlice(url, srcURL, start, end); }
     void unregisterBlobURL(PAL::SessionID, const URL& url) final { m_blobRegistry.unregisterBlobURL(url); }
-    unsigned long long blobSize(const URL& url) final { return m_blobRegistry.blobSize(url); }
+    unsigned long long blobSize(PAL::SessionID, const URL& url) final { return m_blobRegistry.blobSize(url); }
     void writeBlobsToTemporaryFiles(PAL::SessionID, const Vector<String>& blobURLs, CompletionHandler<void(Vector<String>&& filePaths)>&& completionHandler) final { m_blobRegistry.writeBlobsToTemporaryFiles(blobURLs, WTFMove(completionHandler)); }
 
     BlobRegistryImpl* blobRegistryImpl() final { return &m_blobRegistry; }

Modified: trunk/Source/WebKitLegacy/win/ChangeLog (248669 => 248670)


--- trunk/Source/WebKitLegacy/win/ChangeLog	2019-08-14 11:54:05 UTC (rev 248669)
+++ trunk/Source/WebKitLegacy/win/ChangeLog	2019-08-14 13:42:37 UTC (rev 248670)
@@ -1,3 +1,12 @@
+2019-08-14  Youenn Fablet  <you...@apple.com>
+
+        ThreadableBlobRegistry::blobSize should take a SessionID as parameter
+        https://bugs.webkit.org/show_bug.cgi?id=200671
+
+        Reviewed by Alex Christensen.
+
+        * WebCoreSupport/WebPlatformStrategies.cpp:
+
 2019-08-13  Youenn Fablet  <you...@apple.com>
 
         Blob registries should be keyed by session IDs

Modified: trunk/Source/WebKitLegacy/win/WebCoreSupport/WebPlatformStrategies.cpp (248669 => 248670)


--- trunk/Source/WebKitLegacy/win/WebCoreSupport/WebPlatformStrategies.cpp	2019-08-14 11:54:05 UTC (rev 248669)
+++ trunk/Source/WebKitLegacy/win/WebCoreSupport/WebPlatformStrategies.cpp	2019-08-14 13:42:37 UTC (rev 248670)
@@ -68,7 +68,7 @@
     void registerBlobURLOptionallyFileBacked(PAL::SessionID, const URL& url, const URL& srcURL, RefPtr<BlobDataFileReference>&& reference, const String& contentType) final { m_blobRegistry.registerBlobURLOptionallyFileBacked(url, srcURL, WTFMove(reference), contentType); }
     void registerBlobURLForSlice(PAL::SessionID, const URL& url, const URL& srcURL, long long start, long long end) final { m_blobRegistry.registerBlobURLForSlice(url, srcURL, start, end); }
     void unregisterBlobURL(PAL::SessionID, const URL& url) final { m_blobRegistry.unregisterBlobURL(url); }
-    unsigned long long blobSize(const URL& url) final { return m_blobRegistry.blobSize(url); }
+    unsigned long long blobSize(PAL::SessionID, const URL& url) final { return m_blobRegistry.blobSize(url); }
     void writeBlobsToTemporaryFiles(PAL::SessionID, const Vector<String>& blobURLs, CompletionHandler<void(Vector<String>&& filePaths)>&& completionHandler) final { m_blobRegistry.writeBlobsToTemporaryFiles(blobURLs, WTFMove(completionHandler)); }
 
     BlobRegistryImpl* blobRegistryImpl() final { return &m_blobRegistry; }
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to