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;