Title: [221454] trunk/Source
Revision
221454
Author
commit-qu...@webkit.org
Date
2017-08-31 16:20:03 -0700 (Thu, 31 Aug 2017)

Log Message

Update CacheStorage caches only if it is updated
https://bugs.webkit.org/show_bug.cgi?id=176135

Patch by Youenn Fablet <you...@apple.com> on 2017-08-31
Reviewed by Alex Christensen.

Source/WebCore:

Covered by existing tests.

When retrieving caches from the engine, CacheStorage gets an update counter.
When this counter is different from the previous received one, CacheStorage will update its cache list.
Otherwise it will skip this update step.

* Modules/cache/CacheStorage.cpp:
(WebCore::CacheStorage::retrieveCaches):
* Modules/cache/CacheStorage.h:
* Modules/cache/CacheStorageConnection.cpp:
(WebCore::CacheStorageConnection::retrieveCaches):
* Modules/cache/CacheStorageConnection.h:
(WebCore::CacheStorageConnection::doRetrieveCaches):
* Modules/cache/DOMCache.cpp:
(WebCore::DOMCache::CacheInfos::isolatedCopy):
* Modules/cache/DOMCache.h:
(WebCore::DOMCache::CacheInfos::encode const):
(WebCore::DOMCache::CacheInfos::decode):
* Modules/cache/WorkerCacheStorageConnection.cpp:
(WebCore::WorkerCacheStorageConnection::doRetrieveCaches):
* Modules/cache/WorkerCacheStorageConnection.h:

Source/WebKit:

For each change to CacheStorageEngineCaches list of cache, CacheStorageEngineCaches increments a counter.
When sending the list of caches, CacheStorageEngineCaches will compare its counter with the one provided.
If they sare the same, CacheStorageEngineCaches will return nothing.
Otherwise it returns the whole list of caches.

* NetworkProcess/cache/CacheStorageEngine.cpp:
(WebKit::CacheStorage::Engine::retrieveCaches):
* NetworkProcess/cache/CacheStorageEngine.h:
* NetworkProcess/cache/CacheStorageEngineCaches.cpp:
(WebKit::CacheStorage::Caches::initialize):
(WebKit::CacheStorage::Caches::open):
(WebKit::CacheStorage::Caches::remove):
(WebKit::CacheStorage::Caches::clearMemoryRepresentation):
(WebKit::CacheStorage::Caches::cacheInfos const):
* NetworkProcess/cache/CacheStorageEngineCaches.h:
(WebKit::CacheStorage::Caches::updateCounter const):
* NetworkProcess/cache/CacheStorageEngineConnection.cpp:
(WebKit::CacheStorageEngineConnection::caches):
* NetworkProcess/cache/CacheStorageEngineConnection.h:
* NetworkProcess/cache/CacheStorageEngineConnection.messages.in:
* WebProcess/Cache/WebCacheStorageConnection.cpp:
(WebKit::WebCacheStorageConnection::doRetrieveCaches):
* WebProcess/Cache/WebCacheStorageConnection.h:

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (221453 => 221454)


--- trunk/Source/WebCore/ChangeLog	2017-08-31 23:19:31 UTC (rev 221453)
+++ trunk/Source/WebCore/ChangeLog	2017-08-31 23:20:03 UTC (rev 221454)
@@ -1,3 +1,32 @@
+2017-08-31  Youenn Fablet  <you...@apple.com>
+
+        Update CacheStorage caches only if it is updated
+        https://bugs.webkit.org/show_bug.cgi?id=176135
+
+        Reviewed by Alex Christensen.
+
+        Covered by existing tests.
+
+        When retrieving caches from the engine, CacheStorage gets an update counter.
+        When this counter is different from the previous received one, CacheStorage will update its cache list.
+        Otherwise it will skip this update step.
+
+        * Modules/cache/CacheStorage.cpp:
+        (WebCore::CacheStorage::retrieveCaches):
+        * Modules/cache/CacheStorage.h:
+        * Modules/cache/CacheStorageConnection.cpp:
+        (WebCore::CacheStorageConnection::retrieveCaches):
+        * Modules/cache/CacheStorageConnection.h:
+        (WebCore::CacheStorageConnection::doRetrieveCaches):
+        * Modules/cache/DOMCache.cpp:
+        (WebCore::DOMCache::CacheInfos::isolatedCopy):
+        * Modules/cache/DOMCache.h:
+        (WebCore::DOMCache::CacheInfos::encode const):
+        (WebCore::DOMCache::CacheInfos::decode):
+        * Modules/cache/WorkerCacheStorageConnection.cpp:
+        (WebCore::WorkerCacheStorageConnection::doRetrieveCaches):
+        * Modules/cache/WorkerCacheStorageConnection.h:
+
 2017-08-31  Eric Carlson  <eric.carl...@apple.com>
 
         Switch HTMLMediaElement to release logging

Modified: trunk/Source/WebCore/Modules/cache/CacheStorage.cpp (221453 => 221454)


--- trunk/Source/WebCore/Modules/cache/CacheStorage.cpp	2017-08-31 23:19:31 UTC (rev 221453)
+++ trunk/Source/WebCore/Modules/cache/CacheStorage.cpp	2017-08-31 23:20:03 UTC (rev 221454)
@@ -119,7 +119,7 @@
         return;
 
     setPendingActivity(this);
-    m_connection->retrieveCaches(origin, [this, callback = WTFMove(callback)](CacheInfosOrError&& result) {
+    m_connection->retrieveCaches(origin, m_updateCounter, [this, callback = WTFMove(callback)](CacheInfosOrError&& result) {
         if (!m_isStopped) {
             // FIXME: We should probably propagate that error up to the promise based operation.
             ASSERT(result.hasValue());
@@ -127,17 +127,23 @@
                 callback();
                 return;
             }
+
             auto& cachesInfo = result.value();
 
-            ASSERT(scriptExecutionContext());
-            m_caches.removeAllMatching([&](auto& cache) {
-                return cachesInfo.findMatching([&](const auto& info) { return info.identifier == cache->identifier(); }) == notFound;
-            });
-            for (auto& info : cachesInfo) {
-                if (m_caches.findMatching([&](const auto& cache) { return info.identifier == cache->identifier(); }) == notFound)
-                    m_caches.append(Cache::create(*scriptExecutionContext(), WTFMove(info.name), info.identifier, m_connection.copyRef()));
+            if (m_updateCounter != cachesInfo.updateCounter) {
+                m_updateCounter = cachesInfo.updateCounter;
+
+                ASSERT(scriptExecutionContext());
+
+                Vector<Ref<Cache>> caches;
+                caches.reserveInitialCapacity(cachesInfo.infos.size());
+                for (auto& info : cachesInfo.infos) {
+                    auto position = m_caches.findMatching([&](const auto& cache) { return info.identifier == cache->identifier(); });
+                    caches.uncheckedAppend(position != notFound ? m_caches[position].copyRef() : Cache::create(*scriptExecutionContext(), WTFMove(info.name), info.identifier, m_connection.copyRef()));
+                }
+                m_caches = WTFMove(caches);
+
             }
-
             callback();
         }
         unsetPendingActivity(this);

Modified: trunk/Source/WebCore/Modules/cache/CacheStorage.h (221453 => 221454)


--- trunk/Source/WebCore/Modules/cache/CacheStorage.h	2017-08-31 23:19:31 UTC (rev 221453)
+++ trunk/Source/WebCore/Modules/cache/CacheStorage.h	2017-08-31 23:20:03 UTC (rev 221454)
@@ -56,6 +56,7 @@
     String origin() const;
 
     Vector<Ref<Cache>> m_caches;
+    uint64_t m_updateCounter { 0 };
     Ref<CacheStorageConnection> m_connection;
     bool m_isStopped { false };
 };

Modified: trunk/Source/WebCore/Modules/cache/CacheStorageConnection.cpp (221453 => 221454)


--- trunk/Source/WebCore/Modules/cache/CacheStorageConnection.cpp	2017-08-31 23:19:31 UTC (rev 221453)
+++ trunk/Source/WebCore/Modules/cache/CacheStorageConnection.cpp	2017-08-31 23:20:03 UTC (rev 221454)
@@ -47,12 +47,12 @@
     doRemove(requestIdentifier, cacheIdentifier);
 }
 
-void CacheStorageConnection::retrieveCaches(const String& origin, CacheInfosCallback&& callback)
+void CacheStorageConnection::retrieveCaches(const String& origin, uint64_t updateCounter, CacheInfosCallback&& callback)
 {
     uint64_t requestIdentifier = ++m_lastRequestIdentifier;
     m_retrieveCachesPendingRequests.add(requestIdentifier, WTFMove(callback));
 
-    doRetrieveCaches(requestIdentifier, origin);
+    doRetrieveCaches(requestIdentifier, origin, updateCounter);
 }
 
 void CacheStorageConnection::retrieveRecords(uint64_t cacheIdentifier, RecordsCallback&& callback)

Modified: trunk/Source/WebCore/Modules/cache/CacheStorageConnection.h (221453 => 221454)


--- trunk/Source/WebCore/Modules/cache/CacheStorageConnection.h	2017-08-31 23:19:31 UTC (rev 221453)
+++ trunk/Source/WebCore/Modules/cache/CacheStorageConnection.h	2017-08-31 23:20:03 UTC (rev 221454)
@@ -39,7 +39,7 @@
 
     void open(const String& origin, const String& cacheName, DOMCache::CacheIdentifierCallback&&);
     void remove(uint64_t cacheIdentifier, DOMCache::CacheIdentifierCallback&&);
-    void retrieveCaches(const String& origin, DOMCache::CacheInfosCallback&&);
+    void retrieveCaches(const String& origin, uint64_t updateCounter, DOMCache::CacheInfosCallback&&);
 
     void retrieveRecords(uint64_t cacheIdentifier, DOMCache::RecordsCallback&&);
     void batchDeleteOperation(uint64_t cacheIdentifier, const ResourceRequest&, CacheQueryOptions&&, DOMCache::RecordIdentifiersCallback&&);
@@ -62,7 +62,7 @@
 private:
     virtual void doOpen(uint64_t requestIdentifier, const String& /* origin */, const String& /* cacheName */) { openCompleted(requestIdentifier, makeUnexpected(DOMCache::Error::NotImplemented)); }
     virtual void doRemove(uint64_t requestIdentifier, uint64_t /* cacheIdentifier */) { removeCompleted(requestIdentifier, makeUnexpected(DOMCache::Error::NotImplemented)); }
-    virtual void doRetrieveCaches(uint64_t requestIdentifier, const String& /* origin */) { updateCaches(requestIdentifier, { }); }
+    virtual void doRetrieveCaches(uint64_t requestIdentifier, const String& /* origin */, uint64_t /* updateCounter */) { updateCaches(requestIdentifier, { }); }
 
     virtual void doRetrieveRecords(uint64_t requestIdentifier, uint64_t /* cacheIdentifier */) { updateRecords(requestIdentifier, { }); }
     virtual void doBatchDeleteOperation(uint64_t requestIdentifier, uint64_t /* cacheIdentifier */, const ResourceRequest&, CacheQueryOptions&&) { deleteRecordsCompleted(requestIdentifier, makeUnexpected(DOMCache::Error::NotImplemented)); }

Modified: trunk/Source/WebCore/Modules/cache/DOMCache.cpp (221453 => 221454)


--- trunk/Source/WebCore/Modules/cache/DOMCache.cpp	2017-08-31 23:19:31 UTC (rev 221453)
+++ trunk/Source/WebCore/Modules/cache/DOMCache.cpp	2017-08-31 23:20:03 UTC (rev 221454)
@@ -109,6 +109,15 @@
     return Record { identifier, updateResponseCounter, requestHeadersGuard, request, options, referrer, responseHeadersGuard, response, copyResponseBody(responseBody) };
 }
 
+CacheInfos CacheInfos::isolatedCopy()
+{
+    Vector<CacheInfo> isolatedCaches;
+    isolatedCaches.reserveInitialCapacity(infos.size());
+    for (const auto& info : infos)
+        isolatedCaches.uncheckedAppend(CacheInfo { info.identifier, info.name.isolatedCopy() });
+    return { WTFMove(isolatedCaches), updateCounter };
+}
+
 } // namespace DOMCache
 
 } // namespace WebCore

Modified: trunk/Source/WebCore/Modules/cache/DOMCache.h (221453 => 221454)


--- trunk/Source/WebCore/Modules/cache/DOMCache.h	2017-08-31 23:19:31 UTC (rev 221453)
+++ trunk/Source/WebCore/Modules/cache/DOMCache.h	2017-08-31 23:20:03 UTC (rev 221454)
@@ -73,6 +73,16 @@
     String name;
 };
 
+struct CacheInfos {
+    CacheInfos isolatedCopy();
+
+    template<class Encoder> void encode(Encoder&) const;
+    template<class Decoder> static bool decode(Decoder&, CacheInfos&);
+
+    Vector<CacheInfo> infos;
+    uint64_t updateCounter;
+};
+
 using CacheIdentifierOrError = Expected<uint64_t, Error>;
 using CacheIdentifierCallback = WTF::Function<void(const CacheIdentifierOrError&)>;
 
@@ -79,7 +89,8 @@
 using RecordIdentifiersOrError = Expected<Vector<uint64_t>, Error>;
 using RecordIdentifiersCallback = WTF::Function<void(RecordIdentifiersOrError&&)>;
 
-using CacheInfosOrError = Expected<Vector<WebCore::DOMCache::CacheInfo>, Error>;
+
+using CacheInfosOrError = Expected<CacheInfos, Error>;
 using CacheInfosCallback = WTF::Function<void(CacheInfosOrError&&)>;
 
 using RecordsOrError = Expected<Vector<Record>, Error>;
@@ -87,6 +98,19 @@
 
 using CompletionCallback = WTF::Function<void(std::optional<Error>&&)>;
 
+template<class Encoder> inline void CacheInfos::encode(Encoder& encoder) const
+{
+    encoder << infos;
+    encoder << updateCounter;
+}
+
+template<class Decoder> inline bool CacheInfos::decode(Decoder& decoder, CacheInfos& cacheInfos)
+{
+    if (!decoder.decode(cacheInfos.infos))
+        return false;
+    return decoder.decode(cacheInfos.updateCounter);
+}
+
 } // namespace DOMCache
 
 } // namespace WebCore

Modified: trunk/Source/WebCore/Modules/cache/WorkerCacheStorageConnection.cpp (221453 => 221454)


--- trunk/Source/WebCore/Modules/cache/WorkerCacheStorageConnection.cpp	2017-08-31 23:19:31 UTC (rev 221453)
+++ trunk/Source/WebCore/Modules/cache/WorkerCacheStorageConnection.cpp	2017-08-31 23:20:03 UTC (rev 221454)
@@ -142,23 +142,19 @@
     });
 }
 
-void WorkerCacheStorageConnection::doRetrieveCaches(uint64_t requestIdentifier, const String& origin)
+void WorkerCacheStorageConnection::doRetrieveCaches(uint64_t requestIdentifier, const String& origin, uint64_t updateCounter)
 {
-    m_proxy.postTaskToLoader([this, protectedThis = makeRef(*this), requestIdentifier, origin = origin.isolatedCopy()](ScriptExecutionContext&) mutable {
+    m_proxy.postTaskToLoader([this, protectedThis = makeRef(*this), requestIdentifier, origin = origin.isolatedCopy(), updateCounter](ScriptExecutionContext&) mutable {
         ASSERT(isMainThread());
         ASSERT(m_mainThreadConnection);
 
-        m_mainThreadConnection->retrieveCaches(origin, [this, protectedThis = WTFMove(protectedThis), requestIdentifier](CacheInfosOrError&& result) mutable {
+        m_mainThreadConnection->retrieveCaches(origin, updateCounter, [this, protectedThis = WTFMove(protectedThis), requestIdentifier](CacheInfosOrError&& result) mutable {
             CacheInfosOrError isolatedResult;
             if (!result.hasValue())
                 isolatedResult = WTFMove(result);
-            else {
-                Vector<CacheInfo> isolatedCaches;
-                isolatedCaches.reserveInitialCapacity(result.value().size());
-                for (const auto& cache : result.value())
-                    isolatedCaches.uncheckedAppend(CacheInfo { cache.identifier, cache.name.isolatedCopy() });
-                isolatedResult = WTFMove(isolatedCaches);
-            }
+            else
+                isolatedResult = result.value().isolatedCopy();
+
             m_proxy.postTaskForModeToWorkerGlobalScope([this, protectedThis = WTFMove(protectedThis), requestIdentifier, result = WTFMove(isolatedResult)](ScriptExecutionContext& context) mutable {
                 ASSERT_UNUSED(context, context.isWorkerGlobalScope());
                 updateCaches(requestIdentifier, WTFMove(result));

Modified: trunk/Source/WebCore/Modules/cache/WorkerCacheStorageConnection.h (221453 => 221454)


--- trunk/Source/WebCore/Modules/cache/WorkerCacheStorageConnection.h	2017-08-31 23:19:31 UTC (rev 221453)
+++ trunk/Source/WebCore/Modules/cache/WorkerCacheStorageConnection.h	2017-08-31 23:20:03 UTC (rev 221454)
@@ -44,7 +44,7 @@
     // WebCore::CacheStorageConnection
     void doOpen(uint64_t requestIdentifier, const String& origin, const String& cacheName) final;
     void doRemove(uint64_t requestIdentifier, uint64_t cacheIdentifier) final;
-    void doRetrieveCaches(uint64_t requestIdentifier, const String& origin) final;
+    void doRetrieveCaches(uint64_t requestIdentifier, const String& origin, uint64_t updateCounter) final;
 
     void doRetrieveRecords(uint64_t requestIdentifier, uint64_t cacheIdentifier) final;
     void doBatchDeleteOperation(uint64_t requestIdentifier, uint64_t cacheIdentifier, const WebCore::ResourceRequest&, WebCore::CacheQueryOptions&&) final;

Modified: trunk/Source/WebKit/ChangeLog (221453 => 221454)


--- trunk/Source/WebKit/ChangeLog	2017-08-31 23:19:31 UTC (rev 221453)
+++ trunk/Source/WebKit/ChangeLog	2017-08-31 23:20:03 UTC (rev 221454)
@@ -1,5 +1,36 @@
 2017-08-31  Youenn Fablet  <you...@apple.com>
 
+        Update CacheStorage caches only if it is updated
+        https://bugs.webkit.org/show_bug.cgi?id=176135
+
+        Reviewed by Alex Christensen.
+
+        For each change to CacheStorageEngineCaches list of cache, CacheStorageEngineCaches increments a counter.
+        When sending the list of caches, CacheStorageEngineCaches will compare its counter with the one provided.
+        If they sare the same, CacheStorageEngineCaches will return nothing.
+        Otherwise it returns the whole list of caches.
+
+        * NetworkProcess/cache/CacheStorageEngine.cpp:
+        (WebKit::CacheStorage::Engine::retrieveCaches):
+        * NetworkProcess/cache/CacheStorageEngine.h:
+        * NetworkProcess/cache/CacheStorageEngineCaches.cpp:
+        (WebKit::CacheStorage::Caches::initialize):
+        (WebKit::CacheStorage::Caches::open):
+        (WebKit::CacheStorage::Caches::remove):
+        (WebKit::CacheStorage::Caches::clearMemoryRepresentation):
+        (WebKit::CacheStorage::Caches::cacheInfos const):
+        * NetworkProcess/cache/CacheStorageEngineCaches.h:
+        (WebKit::CacheStorage::Caches::updateCounter const):
+        * NetworkProcess/cache/CacheStorageEngineConnection.cpp:
+        (WebKit::CacheStorageEngineConnection::caches):
+        * NetworkProcess/cache/CacheStorageEngineConnection.h:
+        * NetworkProcess/cache/CacheStorageEngineConnection.messages.in:
+        * WebProcess/Cache/WebCacheStorageConnection.cpp:
+        (WebKit::WebCacheStorageConnection::doRetrieveCaches):
+        * WebProcess/Cache/WebCacheStorageConnection.h:
+
+2017-08-31  Youenn Fablet  <you...@apple.com>
+
         Introduce CacheStorageEngineCache to handle cache records
         https://bugs.webkit.org/show_bug.cgi?id=176137
 

Modified: trunk/Source/WebKit/NetworkProcess/cache/CacheStorageEngine.cpp (221453 => 221454)


--- trunk/Source/WebKit/NetworkProcess/cache/CacheStorageEngine.cpp	2017-08-31 23:19:31 UTC (rev 221453)
+++ trunk/Source/WebKit/NetworkProcess/cache/CacheStorageEngine.cpp	2017-08-31 23:20:03 UTC (rev 221454)
@@ -127,15 +127,15 @@
     });
 }
 
-void Engine::retrieveCaches(const String& origin, CacheInfosCallback&& callback)
+void Engine::retrieveCaches(const String& origin, uint64_t updateCounter, CacheInfosCallback&& callback)
 {
-    readCachesFromDisk(origin, [callback = WTFMove(callback)](CachesOrError&& cachesOrError) mutable {
+    readCachesFromDisk(origin, [updateCounter, callback = WTFMove(callback)](CachesOrError&& cachesOrError) mutable {
         if (!cachesOrError.hasValue()) {
             callback(makeUnexpected(cachesOrError.error()));
             return;
         }
 
-        callback(cachesOrError.value().get().cacheInfos());
+        callback(cachesOrError.value().get().cacheInfos(updateCounter));
     });
 }
 

Modified: trunk/Source/WebKit/NetworkProcess/cache/CacheStorageEngine.h (221453 => 221454)


--- trunk/Source/WebKit/NetworkProcess/cache/CacheStorageEngine.h	2017-08-31 23:19:31 UTC (rev 221453)
+++ trunk/Source/WebKit/NetworkProcess/cache/CacheStorageEngine.h	2017-08-31 23:20:03 UTC (rev 221454)
@@ -55,7 +55,7 @@
 
     void open(const String& origin, const String& cacheName, WebCore::DOMCache::CacheIdentifierCallback&&);
     void remove(uint64_t cacheIdentifier, WebCore::DOMCache::CacheIdentifierCallback&&);
-    void retrieveCaches(const String& origin, WebCore::DOMCache::CacheInfosCallback&&);
+    void retrieveCaches(const String& origin, uint64_t updateCounter, WebCore::DOMCache::CacheInfosCallback&&);
 
     void retrieveRecords(uint64_t cacheIdentifier, WebCore::DOMCache::RecordsCallback&&);
     void putRecords(uint64_t cacheIdentifier, Vector<WebCore::DOMCache::Record>&&, WebCore::DOMCache::RecordIdentifiersCallback&&);

Modified: trunk/Source/WebKit/NetworkProcess/cache/CacheStorageEngineCaches.cpp (221453 => 221454)


--- trunk/Source/WebKit/NetworkProcess/cache/CacheStorageEngineCaches.cpp	2017-08-31 23:19:31 UTC (rev 221453)
+++ trunk/Source/WebKit/NetworkProcess/cache/CacheStorageEngineCaches.cpp	2017-08-31 23:20:03 UTC (rev 221454)
@@ -75,6 +75,8 @@
     }
     m_storage = storage.releaseNonNull();
     readCachesFromDisk([this, callback = WTFMove(callback)](Expected<Vector<Cache>, Error>&& result) {
+        makeDirty();
+
         if (!result.hasValue()) {
             callback(result.error());
 
@@ -99,7 +101,7 @@
     m_rootPath = { };
 }
 
-Cache* Caches::find(const String& name)
+const Cache* Caches::find(const String& name) const
 {
     auto position = m_caches.findMatching([&](const auto& item) { return item.name() == name; });
     return (position != notFound) ? &m_caches[position] : nullptr;
@@ -119,6 +121,8 @@
 {
     ASSERT(m_engine);
 
+    makeDirty();
+
     uint64_t cacheIdentifier = m_engine->nextCacheIdentifier();
     m_caches.append(Cache { cacheIdentifier, WTFMove(name) });
     writeCachesToDisk([callback = WTFMove(callback), cacheIdentifier](std::optional<Error>&& error) mutable {
@@ -142,9 +146,12 @@
         return;
     }
 
+    makeDirty();
+
     auto cache = WTFMove(m_caches[position]);
     m_caches.remove(position);
     m_removedCaches.append(WTFMove(cache));
+    ++m_updateCounter;
 
     writeCachesToDisk(WTFMove(callback));
 }
@@ -242,18 +249,27 @@
 
 void Caches::clearMemoryRepresentation()
 {
+    makeDirty();
     m_caches.clear();
     m_isInitialized = false;
     m_storage = nullptr;
 }
 
-Vector<CacheInfo> Caches::cacheInfos() const
+bool Caches::isDirty(uint64_t updateCounter) const
 {
+    ASSERT(m_updateCounter >= updateCounter);
+    return m_updateCounter != updateCounter;
+}
+
+CacheInfos Caches::cacheInfos(uint64_t updateCounter) const
+{
     Vector<CacheInfo> cacheInfos;
-    cacheInfos.reserveInitialCapacity(m_caches.size());
-    for (auto& cache : m_caches)
-        cacheInfos.uncheckedAppend(CacheInfo { cache.identifier(), cache.name() });
-    return cacheInfos;
+    if (isDirty(updateCounter)) {
+        cacheInfos.reserveInitialCapacity(m_caches.size());
+        for (auto& cache : m_caches)
+            cacheInfos.uncheckedAppend(CacheInfo { cache.identifier(), cache.name() });
+    }
+    return { WTFMove(cacheInfos), m_updateCounter };
 }
 
 } // namespace CacheStorage

Modified: trunk/Source/WebKit/NetworkProcess/cache/CacheStorageEngineCaches.h (221453 => 221454)


--- trunk/Source/WebKit/NetworkProcess/cache/CacheStorageEngineCaches.h	2017-08-31 23:19:31 UTC (rev 221453)
+++ trunk/Source/WebKit/NetworkProcess/cache/CacheStorageEngineCaches.h	2017-08-31 23:20:03 UTC (rev 221454)
@@ -39,20 +39,18 @@
     static Ref<Caches> create(Engine& engine, const String& origin) { return adoptRef(*new Caches { engine, origin }); }
 
     void initialize(WebCore::DOMCache::CompletionCallback&&);
+    void open(String&& name, WebCore::DOMCache::CacheIdentifierCallback&&);
+    void remove(uint64_t identifier, WebCore::DOMCache::CompletionCallback&&);
+    void clearMemoryRepresentation();
 
+    void detach();
+
     bool isInitialized() const { return m_isInitialized; }
+    WebCore::DOMCache::CacheInfos cacheInfos(uint64_t updateCounter) const;
 
-    Cache* find(const String& name);
+    const Cache* find(const String& name) const;
     Cache* find(uint64_t identifier);
 
-    void open(String&& name, WebCore::DOMCache::CacheIdentifierCallback&&);
-    void remove(uint64_t identifier, WebCore::DOMCache::CompletionCallback&&);
-
-    Vector<WebCore::DOMCache::CacheInfo> cacheInfos() const;
-
-    void clearMemoryRepresentation();
-    void detach();
-
 private:
     Caches(Engine&, const String& rootPath);
 
@@ -61,8 +59,12 @@
 
     bool shouldPersist() const { return !m_rootPath.isNull(); }
 
+    void makeDirty() { ++m_updateCounter; }
+    bool isDirty(uint64_t updateCounter) const;
+
     bool m_isInitialized { false };
     Engine* m_engine { nullptr };
+    uint64_t m_updateCounter { 0 };
     String m_rootPath;
     Vector<Cache> m_caches;
     Vector<Cache> m_removedCaches;

Modified: trunk/Source/WebKit/NetworkProcess/cache/CacheStorageEngineConnection.cpp (221453 => 221454)


--- trunk/Source/WebKit/NetworkProcess/cache/CacheStorageEngineConnection.cpp	2017-08-31 23:19:31 UTC (rev 221453)
+++ trunk/Source/WebKit/NetworkProcess/cache/CacheStorageEngineConnection.cpp	2017-08-31 23:20:03 UTC (rev 221454)
@@ -56,9 +56,9 @@
     });
 }
 
-void CacheStorageEngineConnection::caches(PAL::SessionID sessionID, uint64_t requestIdentifier, const String& origin)
+void CacheStorageEngineConnection::caches(PAL::SessionID sessionID, uint64_t requestIdentifier, const String& origin, uint64_t updateCounter)
 {
-    Engine::from(sessionID).retrieveCaches(origin, [protectedThis = makeRef(*this), this, sessionID, origin, requestIdentifier](CacheInfosOrError&& result) {
+    Engine::from(sessionID).retrieveCaches(origin, updateCounter, [protectedThis = makeRef(*this), this, sessionID, origin, requestIdentifier](CacheInfosOrError&& result) {
         m_connection.connection().send(Messages::WebCacheStorageConnection::UpdateCaches(requestIdentifier, result), sessionID.sessionID());
     });
 }

Modified: trunk/Source/WebKit/NetworkProcess/cache/CacheStorageEngineConnection.h (221453 => 221454)


--- trunk/Source/WebKit/NetworkProcess/cache/CacheStorageEngineConnection.h	2017-08-31 23:19:31 UTC (rev 221453)
+++ trunk/Source/WebKit/NetworkProcess/cache/CacheStorageEngineConnection.h	2017-08-31 23:20:03 UTC (rev 221454)
@@ -52,7 +52,7 @@
 
     void open(PAL::SessionID, uint64_t openRequestIdentifier, const String& origin, const String& cacheName);
     void remove(PAL::SessionID, uint64_t removeRequestIdentifier, uint64_t cacheIdentifier);
-    void caches(PAL::SessionID, uint64_t retrieveCachesIdentifier, const String& origin);
+    void caches(PAL::SessionID, uint64_t retrieveCachesIdentifier, const String& origin, uint64_t updateCounter);
 
     void clearMemoryRepresentation(PAL::SessionID, const String& origin);
 

Modified: trunk/Source/WebKit/NetworkProcess/cache/CacheStorageEngineConnection.messages.in (221453 => 221454)


--- trunk/Source/WebKit/NetworkProcess/cache/CacheStorageEngineConnection.messages.in	2017-08-31 23:19:31 UTC (rev 221453)
+++ trunk/Source/WebKit/NetworkProcess/cache/CacheStorageEngineConnection.messages.in	2017-08-31 23:20:03 UTC (rev 221454)
@@ -23,7 +23,7 @@
 messages -> CacheStorageEngineConnection {
     Open(PAL::SessionID sessionID, uint64_t requestIdentifier, String origin, String cacheName);
     Remove(PAL::SessionID sessionID, uint64_t requestIdentifier, uint64_t cacheIdentifier);
-    Caches(PAL::SessionID sessionID, uint64_t requestIdentifier, String origin);
+    Caches(PAL::SessionID sessionID, uint64_t requestIdentifier, String origin, uint64_t updateCounter);
 
     ClearMemoryRepresentation(PAL::SessionID sessionID, String origin);
 

Modified: trunk/Source/WebKit/WebProcess/Cache/WebCacheStorageConnection.cpp (221453 => 221454)


--- trunk/Source/WebKit/WebProcess/Cache/WebCacheStorageConnection.cpp	2017-08-31 23:19:31 UTC (rev 221453)
+++ trunk/Source/WebKit/WebProcess/Cache/WebCacheStorageConnection.cpp	2017-08-31 23:20:03 UTC (rev 221454)
@@ -66,9 +66,9 @@
     connection().send(Messages::CacheStorageEngineConnection::Remove(m_sessionID, requestIdentifier, cacheIdentifier), 0);
 }
 
-void WebCacheStorageConnection::doRetrieveCaches(uint64_t requestIdentifier, const String& origin)
+void WebCacheStorageConnection::doRetrieveCaches(uint64_t requestIdentifier, const String& origin, uint64_t updateCounter)
 {
-    connection().send(Messages::CacheStorageEngineConnection::Caches(m_sessionID, requestIdentifier, origin), 0);
+    connection().send(Messages::CacheStorageEngineConnection::Caches(m_sessionID, requestIdentifier, origin, updateCounter), 0);
 }
 
 void WebCacheStorageConnection::doRetrieveRecords(uint64_t requestIdentifier, uint64_t cacheIdentifier)

Modified: trunk/Source/WebKit/WebProcess/Cache/WebCacheStorageConnection.h (221453 => 221454)


--- trunk/Source/WebKit/WebProcess/Cache/WebCacheStorageConnection.h	2017-08-31 23:19:31 UTC (rev 221453)
+++ trunk/Source/WebKit/WebProcess/Cache/WebCacheStorageConnection.h	2017-08-31 23:20:03 UTC (rev 221454)
@@ -54,7 +54,7 @@
     // WebCore::CacheStorageConnection
     void doOpen(uint64_t requestIdentifier, const String& origin, const String& cacheName) final;
     void doRemove(uint64_t requestIdentifier, uint64_t cacheIdentifier) final;
-    void doRetrieveCaches(uint64_t requestIdentifier, const String& origin) final;
+    void doRetrieveCaches(uint64_t requestIdentifier, const String& origin, uint64_t updateCounter) final;
 
     void doRetrieveRecords(uint64_t requestIdentifier, uint64_t cacheIdentifier) final;
     void doBatchDeleteOperation(uint64_t requestIdentifier, uint64_t cacheIdentifier, const WebCore::ResourceRequest&, WebCore::CacheQueryOptions&&) final;
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to