Regression (r286936): SessionStorage data is not cleared when deleting website data by modification time
https://bugs.webkit.org/show_bug.cgi?id=235542

Reviewed by Chris Dumez.

Source/WebKit:

The old behavior before r286936 is to delete SessionStorage data regardless of the modifiedSince parameter.
r286936 made it check modifiedSince and perform deleteion when modifiedSince time is -Walltime::infinity. This
patch corrects it by deleting SessionStorage data when modifiedSince time is in the past.

API test: SessionStorage.ClearByModificationTime

* NetworkProcess/storage/OriginStorageManager.cpp:
(WebKit::OriginStorageManager::StorageBucket::deleteData):

Tools:

* TestWebKitAPI/Tests/WebKitCocoa/SessionStorage.mm:
(TEST):


git-svn-id: http://svn.webkit.org/repository/webkit/trunk@288478 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/Source/WebKit/ChangeLog b/Source/WebKit/ChangeLog
index 0a816cf..8426db7 100644
--- a/Source/WebKit/ChangeLog
+++ b/Source/WebKit/ChangeLog
@@ -1,3 +1,19 @@
+2022-01-24  Sihui Liu  <sihui_liu@apple.com>
+
+        Regression (r286936): SessionStorage data is not cleared when deleting website data by modification time
+        https://bugs.webkit.org/show_bug.cgi?id=235542
+
+        Reviewed by Chris Dumez.
+
+        The old behavior before r286936 is to delete SessionStorage data regardless of the modifiedSince parameter.
+        r286936 made it check modifiedSince and perform deleteion when modifiedSince time is -Walltime::infinity. This 
+        patch corrects it by deleting SessionStorage data when modifiedSince time is in the past.
+
+        API test: SessionStorage.ClearByModificationTime
+
+        * NetworkProcess/storage/OriginStorageManager.cpp:
+        (WebKit::OriginStorageManager::StorageBucket::deleteData):
+
 2022-01-24  Ada Chan  <adachan@apple.com>
 
         Soft link ARKit in a separate ARKitSoftLink file
diff --git a/Source/WebKit/NetworkProcess/storage/OriginStorageManager.cpp b/Source/WebKit/NetworkProcess/storage/OriginStorageManager.cpp
index 70b000b..d07c522 100644
--- a/Source/WebKit/NetworkProcess/storage/OriginStorageManager.cpp
+++ b/Source/WebKit/NetworkProcess/storage/OriginStorageManager.cpp
@@ -174,7 +174,7 @@
         if (types.contains(WebsiteDataType::LocalStorage))
             deleteLocalStorageData(modifiedSinceTime);
 
-        if (types.contains(WebsiteDataType::SessionStorage) && modifiedSinceTime == -WallTime::infinity())
+        if (types.contains(WebsiteDataType::SessionStorage) && modifiedSinceTime < WallTime::now())
             deleteSessionStorageData();
     }
 
diff --git a/Tools/ChangeLog b/Tools/ChangeLog
index 2a24933..a1b22af 100644
--- a/Tools/ChangeLog
+++ b/Tools/ChangeLog
@@ -1,3 +1,13 @@
+2022-01-24  Sihui Liu  <sihui_liu@apple.com>
+
+        Regression (r286936): SessionStorage data is not cleared when deleting website data by modification time
+        https://bugs.webkit.org/show_bug.cgi?id=235542
+
+        Reviewed by Chris Dumez.
+
+        * TestWebKitAPI/Tests/WebKitCocoa/SessionStorage.mm:
+        (TEST):
+
 2022-01-24  Wenson Hsieh  <wenson_hsieh@apple.com>
 
         [macOS] Update Pasteboard::read to prioritize native representations over TIFF
diff --git a/Tools/TestWebKitAPI/Tests/WebKitCocoa/SessionStorage.mm b/Tools/TestWebKitAPI/Tests/WebKitCocoa/SessionStorage.mm
index a08275e..d4715d0 100644
--- a/Tools/TestWebKitAPI/Tests/WebKitCocoa/SessionStorage.mm
+++ b/Tools/TestWebKitAPI/Tests/WebKitCocoa/SessionStorage.mm
@@ -117,3 +117,32 @@
 {
     runSessionStorageInNewWindowTest(@"a = document.createElement('a'); a.href = document.URL; a.target = 'newWindow'; a.rel='noopener'; a.click()", ShouldSessionBeCloned::No);
 }
+
+TEST(SessionStorage, ClearByModificationTime)
+{
+    auto configuration = adoptNS([[WKWebViewConfiguration alloc] init]);
+    auto webView = adoptNS([[TestWKWebView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600) configuration:configuration.get()]);
+    [webView synchronouslyLoadHTMLString:@"<script>sessionStorage.setItem('key', 'value')</script>" baseURL:[NSURL URLWithString:@"http://webkit.org"]];
+
+    auto websiteDataTypes = adoptNS([[NSSet alloc] initWithArray:@[WKWebsiteDataTypeSessionStorage]]);
+    readyToContinue = false;
+    [[WKWebsiteDataStore defaultDataStore] fetchDataRecordsOfTypes:websiteDataTypes.get() completionHandler:^(NSArray<WKWebsiteDataRecord *> *dataRecords) {
+        EXPECT_EQ(1u, dataRecords.count);
+        EXPECT_WK_STREQ("webkit.org", [[dataRecords firstObject] displayName]);
+        readyToContinue = true;
+    }];
+    TestWebKitAPI::Util::run(&readyToContinue);
+
+    readyToContinue = false;
+    [[WKWebsiteDataStore defaultDataStore] removeDataOfTypes:websiteDataTypes.get() modifiedSince:[NSDate distantPast] completionHandler:^() {
+        readyToContinue = true;
+    }];
+    TestWebKitAPI::Util::run(&readyToContinue);
+
+    readyToContinue = false;
+    [[WKWebsiteDataStore defaultDataStore] fetchDataRecordsOfTypes:websiteDataTypes.get() completionHandler:^(NSArray<WKWebsiteDataRecord *> *dataRecords) {
+        EXPECT_EQ(0u, dataRecords.count);
+        readyToContinue = true;
+    }];
+    TestWebKitAPI::Util::run(&readyToContinue);
+}