Title: [177100] trunk/Source/WebKit2
Revision
177100
Author
ander...@apple.com
Date
2014-12-10 14:31:52 -0800 (Wed, 10 Dec 2014)

Log Message

Implement the rest of the transient local storage namespace code
https://bugs.webkit.org/show_bug.cgi?id=139505

Reviewed by Tim Horton.

* UIProcess/Storage/StorageManager.cpp:
(WebKit::StorageManager::TransientLocalStorageNamespace::create):
(WebKit::StorageManager::TransientLocalStorageNamespace::~TransientLocalStorageNamespace):
(WebKit::StorageManager::TransientLocalStorageNamespace::getOrCreateStorageArea):
(WebKit::StorageManager::TransientLocalStorageNamespace::clearStorageAreasMatchingOrigin):
(WebKit::StorageManager::TransientLocalStorageNamespace::clearAllStorageAreas):
(WebKit::StorageManager::TransientLocalStorageNamespace::TransientLocalStorageNamespace):
Introduce a new TransientLocalStorageNamespace that's just a glorified SecurityOrigin -> StorageArea HashMap.

(WebKit::StorageManager::StorageArea::create):
Change the return type to RefPtr.

(WebKit::StorageManager::deleteEntriesForOrigin):
(WebKit::StorageManager::deleteAllEntries):
(WebKit::StorageManager::deleteLocalStorageOriginsModifiedSince):
Use lambdas instead of bind. Delete the transient local storage as well.

(WebKit::StorageManager::createTransientLocalStorageMap):
Get a transient local storage namespace and ask it for a storage area.

(WebKit::StorageManager::getOrCreateTransientLocalStorageNamespace):
Look up the namespace from the map and create one if it doesn't exist.

(WebKit::StorageManager::deleteEntriesForOriginInternal): Deleted.
(WebKit::StorageManager::deleteAllEntriesInternal): Deleted.

* UIProcess/Storage/StorageManager.h:

Modified Paths

Diff

Modified: trunk/Source/WebKit2/ChangeLog (177099 => 177100)


--- trunk/Source/WebKit2/ChangeLog	2014-12-10 22:12:35 UTC (rev 177099)
+++ trunk/Source/WebKit2/ChangeLog	2014-12-10 22:31:52 UTC (rev 177100)
@@ -1,5 +1,40 @@
 2014-12-10  Anders Carlsson  <ander...@apple.com>
 
+        Implement the rest of the transient local storage namespace code
+        https://bugs.webkit.org/show_bug.cgi?id=139505
+
+        Reviewed by Tim Horton.
+
+        * UIProcess/Storage/StorageManager.cpp:
+        (WebKit::StorageManager::TransientLocalStorageNamespace::create):
+        (WebKit::StorageManager::TransientLocalStorageNamespace::~TransientLocalStorageNamespace):
+        (WebKit::StorageManager::TransientLocalStorageNamespace::getOrCreateStorageArea):
+        (WebKit::StorageManager::TransientLocalStorageNamespace::clearStorageAreasMatchingOrigin):
+        (WebKit::StorageManager::TransientLocalStorageNamespace::clearAllStorageAreas):
+        (WebKit::StorageManager::TransientLocalStorageNamespace::TransientLocalStorageNamespace):
+        Introduce a new TransientLocalStorageNamespace that's just a glorified SecurityOrigin -> StorageArea HashMap.
+
+        (WebKit::StorageManager::StorageArea::create):
+        Change the return type to RefPtr.
+
+        (WebKit::StorageManager::deleteEntriesForOrigin):
+        (WebKit::StorageManager::deleteAllEntries):
+        (WebKit::StorageManager::deleteLocalStorageOriginsModifiedSince):
+        Use lambdas instead of bind. Delete the transient local storage as well.
+
+        (WebKit::StorageManager::createTransientLocalStorageMap):
+        Get a transient local storage namespace and ask it for a storage area.
+
+        (WebKit::StorageManager::getOrCreateTransientLocalStorageNamespace):
+        Look up the namespace from the map and create one if it doesn't exist.
+
+        (WebKit::StorageManager::deleteEntriesForOriginInternal): Deleted.
+        (WebKit::StorageManager::deleteAllEntriesInternal): Deleted.
+
+        * UIProcess/Storage/StorageManager.h:
+
+2014-12-10  Anders Carlsson  <ander...@apple.com>
+
         Begin fixing transient local storage handling
         https://bugs.webkit.org/show_bug.cgi?id=139503
 

Modified: trunk/Source/WebKit2/UIProcess/Storage/StorageManager.cpp (177099 => 177100)


--- trunk/Source/WebKit2/UIProcess/Storage/StorageManager.cpp	2014-12-10 22:12:35 UTC (rev 177099)
+++ trunk/Source/WebKit2/UIProcess/Storage/StorageManager.cpp	2014-12-10 22:31:52 UTC (rev 177100)
@@ -46,7 +46,7 @@
 
 class StorageManager::StorageArea : public ThreadSafeRefCounted<StorageManager::StorageArea> {
 public:
-    static PassRefPtr<StorageArea> create(LocalStorageNamespace*, PassRefPtr<SecurityOrigin>, unsigned quotaInBytes);
+    static RefPtr<StorageArea> create(LocalStorageNamespace*, PassRefPtr<SecurityOrigin>, unsigned quotaInBytes);
     ~StorageArea();
 
     SecurityOrigin* securityOrigin() const { return m_securityOrigin.get(); }
@@ -106,7 +106,55 @@
     HashMap<RefPtr<SecurityOrigin>, StorageArea*> m_storageAreaMap;
 };
 
-PassRefPtr<StorageManager::StorageArea> StorageManager::StorageArea::create(LocalStorageNamespace* localStorageNamespace, PassRefPtr<SecurityOrigin> securityOrigin, unsigned quotaInBytes)
+class StorageManager::TransientLocalStorageNamespace : public ThreadSafeRefCounted<TransientLocalStorageNamespace> {
+public:
+    static RefPtr<TransientLocalStorageNamespace> create()
+    {
+        return adoptRef(new TransientLocalStorageNamespace());
+    }
+
+    ~TransientLocalStorageNamespace()
+    {
+    }
+
+    RefPtr<StorageArea> getOrCreateStorageArea(PassRefPtr<SecurityOrigin> securityOrigin)
+    {
+        auto& slot = m_storageAreaMap.add(securityOrigin.get(), nullptr).iterator->value;
+        if (slot)
+            return slot;
+
+        auto storageArea = StorageArea::create(nullptr, securityOrigin, m_quotaInBytes);
+        slot = storageArea.get();
+
+        return storageArea;
+    }
+
+    void clearStorageAreasMatchingOrigin(const SecurityOrigin& securityOrigin)
+    {
+        for (auto& storageArea : m_storageAreaMap.values()) {
+            if (storageArea->securityOrigin()->equal(&securityOrigin))
+                storageArea->clear();
+        }
+    }
+
+    void clearAllStorageAreas()
+    {
+        for (auto& storageArea : m_storageAreaMap.values())
+            storageArea->clear();
+    }
+
+private:
+    explicit TransientLocalStorageNamespace()
+    {
+    }
+
+    const unsigned m_quotaInBytes = 5 * 1024 * 1024;
+
+    // We don't hold an explicit reference to the StorageAreas; they are kept alive by the m_storageAreasByConnection map in StorageManager.
+    HashMap<RefPtr<SecurityOrigin>, StorageArea*> m_storageAreaMap;
+};
+
+RefPtr<StorageManager::StorageArea> StorageManager::StorageArea::create(LocalStorageNamespace* localStorageNamespace, PassRefPtr<SecurityOrigin> securityOrigin, unsigned quotaInBytes)
 {
     return adoptRef(new StorageArea(localStorageNamespace, securityOrigin, quotaInBytes));
 }
@@ -446,12 +494,33 @@
 
 void StorageManager::deleteEntriesForOrigin(const SecurityOrigin& securityOrigin)
 {
-    m_queue->dispatch(bind(&StorageManager::deleteEntriesForOriginInternal, this, RefPtr<SecurityOrigin>(const_cast<SecurityOrigin*>(&securityOrigin))));
+    RefPtr<StorageManager> storageManager(this);
+
+    RefPtr<SecurityOrigin> copiedOrigin = securityOrigin.isolatedCopy();
+    m_queue->dispatch([storageManager, copiedOrigin] {
+        for (auto& localStorageNamespace : storageManager->m_localStorageNamespaces.values())
+            localStorageNamespace->clearStorageAreasMatchingOrigin(copiedOrigin.get());
+
+        for (auto& transientLocalStorageNamespace : storageManager->m_transientLocalStorageNamespaces.values())
+            transientLocalStorageNamespace->clearStorageAreasMatchingOrigin(*copiedOrigin);
+
+        storageManager->m_localStorageDatabaseTracker->deleteDatabaseWithOrigin(copiedOrigin.get());
+    });
 }
 
 void StorageManager::deleteAllEntries()
 {
-    m_queue->dispatch(bind(&StorageManager::deleteAllEntriesInternal, this));
+    RefPtr<StorageManager> storageManager(this);
+
+    m_queue->dispatch([storageManager] {
+        for (auto& localStorageNamespace : storageManager->m_localStorageNamespaces.values())
+            localStorageNamespace->clearAllStorageAreas();
+
+        for (auto& transientLocalStorageNamespace : storageManager->m_transientLocalStorageNamespaces.values())
+            transientLocalStorageNamespace->clearAllStorageAreas();
+
+        storageManager->m_localStorageDatabaseTracker->deleteAllDatabases();
+    });
 }
 
 void StorageManager::deleteLocalStorageOriginsModifiedSince(time_t time, std::function<void ()> completionHandler)
@@ -466,6 +535,9 @@
                 localStorageNamespace->clearStorageAreasMatchingOrigin(origin.get());
         }
 
+        for (auto& transientLocalStorageNamespace : storageManager->m_transientLocalStorageNamespaces.values())
+            transientLocalStorageNamespace->clearAllStorageAreas();
+
         RunLoop::main().dispatch(completionHandler);
     });
 }
@@ -496,7 +568,20 @@
 
 void StorageManager::createTransientLocalStorageMap(IPC::Connection* connection, uint64_t storageMapID, uint64_t storageNamespaceID, const SecurityOriginData& topLevelOriginData, const SecurityOriginData& securityOriginData)
 {
-    // FIXME: Implement this.
+    // FIXME: This should be a message check.
+    ASSERT(m_storageAreasByConnection.isValidKey({ connection, storageMapID }));
+
+    auto& slot = m_storageAreasByConnection.add({ connection, storageMapID }, nullptr).iterator->value;
+
+    // FIXME: This should be a message check.
+    ASSERT(!slot);
+
+    TransientLocalStorageNamespace* transientLocalStorageNamespace = getOrCreateTransientLocalStorageNamespace(storageNamespaceID, *topLevelOriginData.securityOrigin());
+
+    auto storageArea = transientLocalStorageNamespace->getOrCreateStorageArea(securityOriginData.securityOrigin());
+    storageArea->addListener(connection, storageMapID);
+
+    slot = WTF::move(storageArea);
 }
 
 void StorageManager::createSessionStorageMap(IPC::Connection* connection, uint64_t storageMapID, uint64_t storageNamespaceID, const SecurityOriginData& securityOriginData)
@@ -686,21 +771,16 @@
     return result.iterator->value.get();
 }
 
-void StorageManager::deleteEntriesForOriginInternal(SecurityOrigin* securityOrigin)
+StorageManager::TransientLocalStorageNamespace* StorageManager::getOrCreateTransientLocalStorageNamespace(uint64_t storageNamespaceID, WebCore::SecurityOrigin& topLevelOrigin)
 {
-    for (auto it = m_localStorageNamespaces.begin(), end = m_localStorageNamespaces.end(); it != end; ++it)
-        it->value->clearStorageAreasMatchingOrigin(securityOrigin);
+    if (!m_transientLocalStorageNamespaces.isValidKey({ storageNamespaceID, &topLevelOrigin }))
+        return nullptr;
 
-    m_localStorageDatabaseTracker->deleteDatabaseWithOrigin(securityOrigin);
-}
+    auto& slot = m_transientLocalStorageNamespaces.add({ storageNamespaceID, &topLevelOrigin }, nullptr).iterator->value;
+    if (!slot)
+        slot = TransientLocalStorageNamespace::create();
 
-void StorageManager::deleteAllEntriesInternal()
-{
-    for (auto it = m_localStorageNamespaces.begin(), end = m_localStorageNamespaces.end(); it != end; ++it)
-        it->value->clearAllStorageAreas();
-
-    m_localStorageDatabaseTracker->deleteAllDatabases();
+    return slot.get();
 }
 
-
 } // namespace WebKit

Modified: trunk/Source/WebKit2/UIProcess/Storage/StorageManager.h (177099 => 177100)


--- trunk/Source/WebKit2/UIProcess/Storage/StorageManager.h	2014-12-10 22:12:35 UTC (rev 177099)
+++ trunk/Source/WebKit2/UIProcess/Storage/StorageManager.h	2014-12-10 22:31:52 UTC (rev 177100)
@@ -98,14 +98,16 @@
     class LocalStorageNamespace;
     LocalStorageNamespace* getOrCreateLocalStorageNamespace(uint64_t storageNamespaceID);
 
-    void deleteEntriesForOriginInternal(WebCore::SecurityOrigin*);
-    void deleteAllEntriesInternal();
+    class TransientLocalStorageNamespace;
+    TransientLocalStorageNamespace* getOrCreateTransientLocalStorageNamespace(uint64_t storageNamespaceID, WebCore::SecurityOrigin& topLevelOrigin);
 
     RefPtr<WorkQueue> m_queue;
 
     RefPtr<LocalStorageDatabaseTracker> m_localStorageDatabaseTracker;
     HashMap<uint64_t, RefPtr<LocalStorageNamespace>> m_localStorageNamespaces;
 
+    HashMap<std::pair<uint64_t, RefPtr<WebCore::SecurityOrigin>>, RefPtr<TransientLocalStorageNamespace>> m_transientLocalStorageNamespaces;
+
     class SessionStorageNamespace;
     HashMap<uint64_t, RefPtr<SessionStorageNamespace>> m_sessionStorageNamespaces;
 
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to