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