Diff
Modified: trunk/Source/WebKit2/ChangeLog (184515 => 184516)
--- trunk/Source/WebKit2/ChangeLog 2015-05-18 22:16:59 UTC (rev 184515)
+++ trunk/Source/WebKit2/ChangeLog 2015-05-18 22:39:00 UTC (rev 184516)
@@ -1,3 +1,34 @@
+2015-05-18 Anders Carlsson <[email protected]>
+
+ WKWebsiteDataStore should fully support session storage
+ https://bugs.webkit.org/show_bug.cgi?id=145145
+ rdar://problem/10690447
+
+ Reviewed by Sam Weinig.
+
+ Add a session store data type and handle it when clearing and fetching data.
+
+ * Shared/WebsiteData/WebsiteDataTypes.h:
+ * UIProcess/API/Cocoa/WKWebsiteDataRecord.h:
+ * UIProcess/API/Cocoa/WKWebsiteDataRecord.mm:
+ (dataTypesToString):
+ * UIProcess/API/Cocoa/WKWebsiteDataRecordInternal.h:
+ (WebKit::toWebsiteDataTypes):
+ (WebKit::toWKWebsiteDataTypes):
+ * UIProcess/API/Cocoa/WKWebsiteDataStore.mm:
+ (+[WKWebsiteDataStore allWebsiteDataTypes]):
+ * UIProcess/Storage/StorageManager.cpp:
+ (WebKit::StorageManager::SessionStorageNamespace::origins):
+ (WebKit::StorageManager::SessionStorageNamespace::clearStorageAreasMatchingOrigin):
+ (WebKit::StorageManager::SessionStorageNamespace::clearAllStorageAreas):
+ (WebKit::StorageManager::getSessionStorageOrigins):
+ (WebKit::StorageManager::deleteSessionStorageOrigins):
+ (WebKit::StorageManager::deleteSessionStorageEntriesForOrigins):
+ * UIProcess/Storage/StorageManager.h:
+ * UIProcess/WebsiteData/WebsiteDataStore.cpp:
+ (WebKit::WebsiteDataStore::fetchData):
+ (WebKit::WebsiteDataStore::removeData):
+
2015-05-18 Brady Eidson <[email protected]>
Followup to: Networking process on iOS can be suspended and never exit
Modified: trunk/Source/WebKit2/Shared/WebsiteData/WebsiteDataTypes.h (184515 => 184516)
--- trunk/Source/WebKit2/Shared/WebsiteData/WebsiteDataTypes.h 2015-05-18 22:16:59 UTC (rev 184515)
+++ trunk/Source/WebKit2/Shared/WebsiteData/WebsiteDataTypes.h 2015-05-18 22:39:00 UTC (rev 184516)
@@ -33,9 +33,10 @@
WebsiteDataTypeDiskCache = 1 << 1,
WebsiteDataTypeMemoryCache = 1 << 2,
WebsiteDataTypeOfflineWebApplicationCache = 1 << 3,
- WebsiteDataTypeLocalStorage = 1 << 4,
- WebsiteDataTypeWebSQLDatabases = 1 << 5,
- WebsiteDataTypeIndexedDBDatabases = 1 << 6,
+ WebsiteDataTypeSessionStorage = 1 << 4,
+ WebsiteDataTypeLocalStorage = 1 << 5,
+ WebsiteDataTypeWebSQLDatabases = 1 << 6,
+ WebsiteDataTypeIndexedDBDatabases = 1 << 7,
};
};
Modified: trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebsiteDataRecord.h (184515 => 184516)
--- trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebsiteDataRecord.h 2015-05-18 22:16:59 UTC (rev 184515)
+++ trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebsiteDataRecord.h 2015-05-18 22:39:00 UTC (rev 184516)
@@ -43,6 +43,9 @@
/*! @constant WKWebsiteDataTypeCookies Cookies. */
WK_EXTERN NSString * const WKWebsiteDataTypeCookies WK_AVAILABLE(WK_MAC_TBA, WK_IOS_TBA);
+/*! @constant WKWebsiteDataTypeSessionStorage HTML session storage. */
+WK_EXTERN NSString * const WKWebsiteDataTypeSessionStorage WK_AVAILABLE(WK_MAC_TBA, WK_IOS_TBA);
+
/*! @constant WKWebsiteDataTypeLocalStorage HTML local storage. */
WK_EXTERN NSString * const WKWebsiteDataTypeLocalStorage WK_AVAILABLE(WK_MAC_TBA, WK_IOS_TBA);
Modified: trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebsiteDataRecord.mm (184515 => 184516)
--- trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebsiteDataRecord.mm 2015-05-18 22:16:59 UTC (rev 184515)
+++ trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebsiteDataRecord.mm 2015-05-18 22:39:00 UTC (rev 184516)
@@ -33,6 +33,8 @@
NSString * const WKWebsiteDataTypeOfflineWebApplicationCache = @"WKWebsiteDataTypeOfflineWebApplicationCache";
NSString * const WKWebsiteDataTypeCookies = @"WKWebsiteDataTypeCookies";
+NSString * const WKWebsiteDataTypeSessionStorage = @"WKWebsiteDataTypeSessionStorage";
+
NSString * const WKWebsiteDataTypeLocalStorage = @"WKWebsiteDataTypeLocalStorage";
NSString * const WKWebsiteDataTypeWebSQLDatabases = @"WKWebsiteDataTypeWebSQLDatabases";
NSString * const WKWebsiteDataTypeIndexedDBDatabases = @"WKWebsiteDataTypeIndexedDBDatabases";
@@ -58,6 +60,8 @@
[array addObject:@"Offline Web Application Cache"];
if ([dataTypes containsObject:WKWebsiteDataTypeCookies])
[array addObject:@"Cookies"];
+ if ([dataTypes containsObject:WKWebsiteDataTypeSessionStorage])
+ [array addObject:@"Session Storage"];
if ([dataTypes containsObject:WKWebsiteDataTypeLocalStorage])
[array addObject:@"Local Storage"];
if ([dataTypes containsObject:WKWebsiteDataTypeWebSQLDatabases])
Modified: trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebsiteDataRecordInternal.h (184515 => 184516)
--- trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebsiteDataRecordInternal.h 2015-05-18 22:16:59 UTC (rev 184515)
+++ trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebsiteDataRecordInternal.h 2015-05-18 22:39:00 UTC (rev 184516)
@@ -52,6 +52,8 @@
websiteDataTypes |= WebsiteDataTypes::WebsiteDataTypeMemoryCache;
if ([wkWebsiteDataTypes containsObject:WKWebsiteDataTypeOfflineWebApplicationCache])
websiteDataTypes |= WebsiteDataTypes::WebsiteDataTypeOfflineWebApplicationCache;
+ if ([wkWebsiteDataTypes containsObject:WKWebsiteDataTypeSessionStorage])
+ websiteDataTypes |= WebsiteDataTypes::WebsiteDataTypeSessionStorage;
if ([wkWebsiteDataTypes containsObject:WKWebsiteDataTypeLocalStorage])
websiteDataTypes |= WebsiteDataTypes::WebsiteDataTypeLocalStorage;
if ([wkWebsiteDataTypes containsObject:WKWebsiteDataTypeWebSQLDatabases])
@@ -76,6 +78,8 @@
[wkWebsiteDataTypes addObject:WKWebsiteDataTypeMemoryCache];
if (websiteDataTypes & WebsiteDataTypes::WebsiteDataTypeOfflineWebApplicationCache)
[wkWebsiteDataTypes addObject:WKWebsiteDataTypeOfflineWebApplicationCache];
+ if (websiteDataTypes & WebsiteDataTypes::WebsiteDataTypeSessionStorage)
+ [wkWebsiteDataTypes addObject:WKWebsiteDataTypeSessionStorage];
if (websiteDataTypes & WebsiteDataTypes::WebsiteDataTypeLocalStorage)
[wkWebsiteDataTypes addObject:WKWebsiteDataTypeLocalStorage];
if (websiteDataTypes & WebsiteDataTypes::WebsiteDataTypeWebSQLDatabases)
Modified: trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebsiteDataStore.mm (184515 => 184516)
--- trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebsiteDataStore.mm 2015-05-18 22:16:59 UTC (rev 184515)
+++ trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebsiteDataStore.mm 2015-05-18 22:39:00 UTC (rev 184516)
@@ -60,7 +60,7 @@
static dispatch_once_t onceToken;
static NSSet *allWebsiteDataTypes;
dispatch_once(&onceToken, ^{
- allWebsiteDataTypes = [[NSSet alloc] initWithArray:@[ WKWebsiteDataTypeDiskCache, WKWebsiteDataTypeMemoryCache, WKWebsiteDataTypeOfflineWebApplicationCache, WKWebsiteDataTypeCookies, WKWebsiteDataTypeLocalStorage, WKWebsiteDataTypeWebSQLDatabases ]];
+ allWebsiteDataTypes = [[NSSet alloc] initWithArray:@[ WKWebsiteDataTypeDiskCache, WKWebsiteDataTypeMemoryCache, WKWebsiteDataTypeOfflineWebApplicationCache, WKWebsiteDataTypeCookies, WKWebsiteDataTypeSessionStorage, WKWebsiteDataTypeLocalStorage, WKWebsiteDataTypeWebSQLDatabases ]];
});
return allWebsiteDataTypes;
Modified: trunk/Source/WebKit2/UIProcess/Storage/StorageManager.cpp (184515 => 184516)
--- trunk/Source/WebKit2/UIProcess/Storage/StorageManager.cpp 2015-05-18 22:16:59 UTC (rev 184515)
+++ trunk/Source/WebKit2/UIProcess/Storage/StorageManager.cpp 2015-05-18 22:39:00 UTC (rev 184516)
@@ -380,6 +380,32 @@
void cloneTo(SessionStorageNamespace& newSessionStorageNamespace);
+ Vector<RefPtr<SecurityOrigin>> origins() const
+ {
+ Vector<RefPtr<SecurityOrigin>> origins;
+
+ for (const auto& storageArea : m_storageAreaMap.values()) {
+ if (!storageArea->items().isEmpty())
+ origins.append(storageArea->securityOrigin());
+ }
+
+ return origins;
+ }
+
+ 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 SessionStorageNamespace(unsigned quotaInBytes);
@@ -526,6 +552,55 @@
});
}
+void StorageManager::getSessionStorageOrigins(std::function<void (HashSet<RefPtr<WebCore::SecurityOrigin>>&&)> completionHandler)
+{
+ RefPtr<StorageManager> storageManager(this);
+
+ m_queue->dispatch([storageManager, completionHandler] {
+ HashSet<RefPtr<SecurityOrigin>> origins;
+
+ for (const auto& sessionStorageNamespace : storageManager->m_sessionStorageNamespaces.values()) {
+ for (auto& origin : sessionStorageNamespace->origins())
+ origins.add(WTF::move(origin));
+ }
+
+ RunLoop::main().dispatch([origins, completionHandler]() mutable {
+ completionHandler(WTF::move(origins));
+ });
+ });
+}
+
+void StorageManager::deleteSessionStorageOrigins(std::function<void ()> completionHandler)
+{
+ RefPtr<StorageManager> storageManager(this);
+
+ m_queue->dispatch([storageManager, completionHandler] {
+ for (auto& sessionStorageNamespace : storageManager->m_sessionStorageNamespaces.values())
+ sessionStorageNamespace->clearAllStorageAreas();
+
+ RunLoop::main().dispatch(completionHandler);
+ });
+}
+
+void StorageManager::deleteSessionStorageEntriesForOrigins(const Vector<RefPtr<WebCore::SecurityOrigin>>& origins, std::function<void ()> completionHandler)
+{
+ Vector<RefPtr<WebCore::SecurityOrigin>> copiedOrigins;
+ copiedOrigins.reserveInitialCapacity(origins.size());
+
+ for (auto& origin : origins)
+ copiedOrigins.uncheckedAppend(origin->isolatedCopy());
+
+ RefPtr<StorageManager> storageManager(this);
+ m_queue->dispatch([storageManager, copiedOrigins, completionHandler] {
+ for (auto& origin : copiedOrigins) {
+ for (auto& sessionStorageNamespace : storageManager->m_sessionStorageNamespaces.values())
+ sessionStorageNamespace->clearStorageAreasMatchingOrigin(*origin);
+ }
+
+ RunLoop::main().dispatch(completionHandler);
+ });
+}
+
void StorageManager::getLocalStorageOrigins(std::function<void (HashSet<RefPtr<WebCore::SecurityOrigin>>&&)> completionHandler)
{
RefPtr<StorageManager> storageManager(this);
Modified: trunk/Source/WebKit2/UIProcess/Storage/StorageManager.h (184515 => 184516)
--- trunk/Source/WebKit2/UIProcess/Storage/StorageManager.h 2015-05-18 22:16:59 UTC (rev 184515)
+++ trunk/Source/WebKit2/UIProcess/Storage/StorageManager.h 2015-05-18 22:39:00 UTC (rev 184516)
@@ -59,6 +59,10 @@
void processDidCloseConnection(WebProcessProxy&, IPC::Connection&);
void applicationWillTerminate();
+ void getSessionStorageOrigins(std::function<void (HashSet<RefPtr<WebCore::SecurityOrigin>>&&)> completionHandler);
+ void deleteSessionStorageOrigins(std::function<void ()> completionHandler);
+ void deleteSessionStorageEntriesForOrigins(const Vector<RefPtr<WebCore::SecurityOrigin>>&, std::function<void ()> completionHandler);
+
void getLocalStorageOrigins(std::function<void (HashSet<RefPtr<WebCore::SecurityOrigin>>&&)> completionHandler);
void getLocalStorageDetailsByOrigin(std::function<void (Vector<LocalStorageDetails>)> completionHandler);
void deleteLocalStorageEntriesForOrigin(const WebCore::SecurityOrigin&);
Modified: trunk/Source/WebKit2/UIProcess/WebsiteData/WebsiteDataStore.cpp (184515 => 184516)
--- trunk/Source/WebKit2/UIProcess/WebsiteData/WebsiteDataStore.cpp 2015-05-18 22:16:59 UTC (rev 184515)
+++ trunk/Source/WebKit2/UIProcess/WebsiteData/WebsiteDataStore.cpp 2015-05-18 22:39:00 UTC (rev 184516)
@@ -266,6 +266,19 @@
}
}
+ if (dataTypes & WebsiteDataTypeSessionStorage && m_storageManager) {
+ callbackAggregator->addPendingCallback();
+
+ m_storageManager->getSessionStorageOrigins([callbackAggregator](HashSet<RefPtr<WebCore::SecurityOrigin>>&& origins) {
+ WebsiteData websiteData;
+
+ while (!origins.isEmpty())
+ websiteData.entries.append(WebsiteData::Entry { origins.takeAny(), WebsiteDataTypeSessionStorage });
+
+ callbackAggregator->removePendingCallback(WTF::move(websiteData));
+ });
+ }
+
if (dataTypes & WebsiteDataTypeLocalStorage && m_storageManager) {
callbackAggregator->addPendingCallback();
@@ -455,6 +468,14 @@
}
}
+ if (dataTypes & WebsiteDataTypeSessionStorage && m_storageManager) {
+ callbackAggregator->addPendingCallback();
+
+ m_storageManager->deleteSessionStorageOrigins([callbackAggregator] {
+ callbackAggregator->removePendingCallback();
+ });
+ }
+
if (dataTypes & WebsiteDataTypeLocalStorage && m_storageManager) {
callbackAggregator->addPendingCallback();
@@ -614,6 +635,14 @@
}
}
+ if (dataTypes & WebsiteDataTypeSessionStorage && m_storageManager) {
+ callbackAggregator->addPendingCallback();
+
+ m_storageManager->deleteSessionStorageEntriesForOrigins(origins, [callbackAggregator] {
+ callbackAggregator->removePendingCallback();
+ });
+ }
+
if (dataTypes & WebsiteDataTypeLocalStorage && m_storageManager) {
callbackAggregator->addPendingCallback();