Title: [288098] trunk/Tools
Revision
288098
Author
[email protected]
Date
2022-01-17 11:35:37 -0800 (Mon, 17 Jan 2022)

Log Message

Add an API test to ensure indexedDB.databases() does not create files on disk
https://bugs.webkit.org/show_bug.cgi?id=235289

Reviewed by Darin Adler.

Add test coverage.

* TestWebKitAPI/Tests/WebKitCocoa/IndexedDBPersistence.mm:

Modified Paths

Diff

Modified: trunk/Tools/ChangeLog (288097 => 288098)


--- trunk/Tools/ChangeLog	2022-01-17 18:30:16 UTC (rev 288097)
+++ trunk/Tools/ChangeLog	2022-01-17 19:35:37 UTC (rev 288098)
@@ -1,3 +1,14 @@
+2022-01-17  Sihui Liu  <[email protected]>
+
+        Add an API test to ensure indexedDB.databases() does not create files on disk
+        https://bugs.webkit.org/show_bug.cgi?id=235289
+
+        Reviewed by Darin Adler.
+
+        Add test coverage.
+
+        * TestWebKitAPI/Tests/WebKitCocoa/IndexedDBPersistence.mm:
+
 2022-01-17  Youenn Fablet  <[email protected]>
 
         Make ServiceWorkerClient.id a UUID instead of a string derived from a ScriptExecutionContextIdentifier

Modified: trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/IndexedDBPersistence.mm (288097 => 288098)


--- trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/IndexedDBPersistence.mm	2022-01-17 18:30:16 UTC (rev 288097)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/IndexedDBPersistence.mm	2022-01-17 19:35:37 UTC (rev 288098)
@@ -388,3 +388,91 @@
     loadTestPageInWebView(thirdWebView.get(), @"database is created");
 }
 
+static NSString *getDatabasesString = @"<script> \
+    function sendMessage(message) { \
+        window.webkit.messageHandlers.testHandler.postMessage(message); \
+    } \
+    function postResult(event) { \
+        sendMessage(event.data); \
+    } \
+    function postDatabases(databases) { \
+        sendMessage('databases: ' + JSON.stringify(databases)); \
+    } \
+    function loadFrame() { \
+        var frame = document.createElement('iframe'); \
+        frame.src = ''; \
+        document.body.appendChild(frame); \
+    } \
+    addEventListener('message', postResult, false); \
+    var request = indexedDB.open('IndexedDBGetDatabases'); \
+    request._onsuccess_ = function(event) { \
+        indexedDB.databases().then(postDatabases); \
+    } \
+    </script>";
+
+static const char* getDatabasesBytes = R"TESTRESOURCE(
+<script>
+function postResult(result) {
+    if (window.self !== window.top)
+        parent.postMessage(result, '*');
+    else
+        window.webkit.messageHandlers.testHandler.postMessage(result);
+}
+function postDatabases(databases) {
+    var prefix = 'main frame databases: ';
+    if (window.self !== window.top)
+        prefix = 'child frame databases: ';
+    postResult(prefix + JSON.stringify(databases));
+}
+indexedDB.databases().then(postDatabases);
+</script>
+)TESTRESOURCE";
+
+TEST(IndexedDB, IndexedDBGetDatabases)
+{
+    readyToContinue = false;
+    [[WKWebsiteDataStore defaultDataStore] removeDataOfTypes:[NSSet setWithObjects:WKWebsiteDataTypeIndexedDBDatabases, nil] modifiedSince:[NSDate distantPast] completionHandler:^() {
+        readyToContinue = true;
+    }];
+    TestWebKitAPI::Util::run(&readyToContinue);
+
+    auto handler = adoptNS([[IndexedDBMessageHandler alloc] init]);
+    auto configuration = adoptNS([[WKWebViewConfiguration alloc] init]);
+    [[configuration userContentController] addScriptMessageHandler:handler.get() name:@"testHandler"];
+    auto schemeHandler = adoptNS([[TestURLSchemeHandler alloc] init]);
+    [schemeHandler setStartURLSchemeTaskHandler:^(WKWebView *, id<WKURLSchemeTask> task) {
+        auto response = adoptNS([[NSURLResponse alloc] initWithURL:task.request.URL MIMEType:@"text/html" expectedContentLength:0 textEncodingName:nil]);
+        [task didReceiveResponse:response.get()];
+        [task didReceiveData:[NSData dataWithBytes:getDatabasesBytes length:strlen(getDatabasesBytes)]];
+        [task didFinish];
+    }];
+    [configuration setURLSchemeHandler:schemeHandler.get() forURLScheme:@"webkit"];
+
+    auto webView = adoptNS([[WKWebView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600) configuration:configuration.get()]);
+    [webView loadHTMLString:getDatabasesString baseURL:[NSURL URLWithString:@"http://apple.com"]];
+    TestWebKitAPI::Util::run(&receivedScriptMessage);
+    receivedScriptMessage = false;
+    EXPECT_WK_STREQ(@"databases: [{\"name\":\"IndexedDBGetDatabases\",\"version\":1}]", [lastScriptMessage body]);
+
+    [webView evaluateJavaScript:@"loadFrame()" completionHandler:nil];
+    TestWebKitAPI::Util::run(&receivedScriptMessage);
+    receivedScriptMessage = false;
+    EXPECT_WK_STREQ(@"child frame databases: []", [lastScriptMessage body]);
+
+    auto secondWebView = adoptNS([[WKWebView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600) configuration:configuration.get()]);
+    [secondWebView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"webkit://"]]];
+    TestWebKitAPI::Util::run(&receivedScriptMessage);
+    receivedScriptMessage = false;
+    EXPECT_WK_STREQ(@"main frame databases: []", [lastScriptMessage body]);
+
+    // Getting databases should not create files on disk.
+    NSURL *idbDirectoryURL = [[WKWebsiteDataStore defaultDataStore] _indexedDBDatabaseDirectory];
+    NSURL *versionDirectoryURL = [idbDirectoryURL URLByAppendingPathComponent:@"v1"];
+    NSURL *appleDirectoryURL = [versionDirectoryURL URLByAppendingPathComponent: @"http_apple.com_0"];
+    NSURL *appleWebkitDirectoryURL = [appleDirectoryURL URLByAppendingPathComponent: @"webkit__0"];
+    NSURL *webkitDirectoryURL = [versionDirectoryURL URLByAppendingPathComponent: @"webkit__0"];
+    auto defaultFileManager = [NSFileManager defaultManager];
+    EXPECT_TRUE([defaultFileManager fileExistsAtPath:appleDirectoryURL.path]);
+    EXPECT_FALSE([defaultFileManager fileExistsAtPath:appleWebkitDirectoryURL.path]);
+    EXPECT_FALSE([defaultFileManager fileExistsAtPath:webkitDirectoryURL.path]);
+}
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to