Title: [266244] trunk
Revision
266244
Author
sihui_...@apple.com
Date
2020-08-27 10:17:40 -0700 (Thu, 27 Aug 2020)

Log Message

REGRESSION (r264790): IndexedDB may abort transactions of in-memory databases
https://bugs.webkit.org/show_bug.cgi?id=215855
<rdar://problem/67418574>

Reviewed by Youenn Fablet.

Source/WebCore:

We don't abort transactions on in-memory database before process suspension because they don't hold database
file lock. Before r264790, only ephemeral session would use in-memory databases, so we only checked session. Now
persistent session also uses in-memory databases for third-party storage, so we need to add another check.

API test: IndexedDB.SuspendImminentlyForThirdPartyDatabases

* Modules/indexeddb/server/IDBServer.cpp:
(WebCore::IDBServer::IDBServer::stopDatabaseActivitiesOnMainThread):

Tools:

* TestWebKitAPI/Tests/WebKitCocoa/IndexedDBSuspendImminently.mm:
(postResult):
(catch):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (266243 => 266244)


--- trunk/Source/WebCore/ChangeLog	2020-08-27 17:13:07 UTC (rev 266243)
+++ trunk/Source/WebCore/ChangeLog	2020-08-27 17:17:40 UTC (rev 266244)
@@ -1,3 +1,20 @@
+2020-08-27  Sihui Liu  <sihui_...@apple.com>
+
+        REGRESSION (r264790): IndexedDB may abort transactions of in-memory databases
+        https://bugs.webkit.org/show_bug.cgi?id=215855
+        <rdar://problem/67418574>
+
+        Reviewed by Youenn Fablet.
+
+        We don't abort transactions on in-memory database before process suspension because they don't hold database 
+        file lock. Before r264790, only ephemeral session would use in-memory databases, so we only checked session. Now
+        persistent session also uses in-memory databases for third-party storage, so we need to add another check.
+
+        API test: IndexedDB.SuspendImminentlyForThirdPartyDatabases
+
+        * Modules/indexeddb/server/IDBServer.cpp:
+        (WebCore::IDBServer::IDBServer::stopDatabaseActivitiesOnMainThread):
+
 2020-08-27  Youenn Fablet  <you...@apple.com>
 
         Fix propagation of errors in TransformStream

Modified: trunk/Source/WebCore/Modules/indexeddb/server/IDBServer.cpp (266243 => 266244)


--- trunk/Source/WebCore/Modules/indexeddb/server/IDBServer.cpp	2020-08-27 17:13:07 UTC (rev 266243)
+++ trunk/Source/WebCore/Modules/indexeddb/server/IDBServer.cpp	2020-08-27 17:17:40 UTC (rev 266244)
@@ -757,12 +757,15 @@
     ASSERT(isMainThread());
     ASSERT(m_lock.isHeld());
 
-    // Only stop non-ephemeral IDBServers that can hold locked database files.
+    // Only stop non-ephemeral IDBServer that can hold database file lock.
     if (m_sessionID.isEphemeral())
         return;
 
-    for (auto& database : m_uniqueIDBDatabaseMap.values())
-        database->abortActiveTransactions();
+    for (auto& database : m_uniqueIDBDatabaseMap.values()) {
+        // Only stop databases with non-ephemeral backing store that can hold database file lock.
+        if (!database->identifier().isTransient())
+            database->abortActiveTransactions();
+    }
 }
 
 } // namespace IDBServer

Modified: trunk/Tools/ChangeLog (266243 => 266244)


--- trunk/Tools/ChangeLog	2020-08-27 17:13:07 UTC (rev 266243)
+++ trunk/Tools/ChangeLog	2020-08-27 17:17:40 UTC (rev 266244)
@@ -1,3 +1,15 @@
+2020-08-27  Sihui Liu  <sihui_...@apple.com>
+
+        REGRESSION (r264790): IndexedDB may abort transactions of in-memory databases
+        https://bugs.webkit.org/show_bug.cgi?id=215855
+        <rdar://problem/67418574>
+
+        Reviewed by Youenn Fablet.
+
+        * TestWebKitAPI/Tests/WebKitCocoa/IndexedDBSuspendImminently.mm:
+        (postResult):
+        (catch):
+
 2020-08-27  Youenn Fablet  <you...@apple.com>
 
         Add support for TransformStream

Modified: trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/IndexedDBSuspendImminently.mm (266243 => 266244)


--- trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/IndexedDBSuspendImminently.mm	2020-08-27 17:13:07 UTC (rev 266243)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/IndexedDBSuspendImminently.mm	2020-08-27 17:17:40 UTC (rev 266244)
@@ -27,6 +27,7 @@
 
 #import "PlatformUtilities.h"
 #import "Test.h"
+#import "TestURLSchemeHandler.h"
 
 #import <WebKit/WKProcessPoolPrivate.h>
 #import <WebKit/WKUserContentControllerPrivate.h>
@@ -94,4 +95,73 @@
     runTestAndCheckResult(@"Expected Success After Resume");
 }
 
+static NSString *mainFrameString = @"<script> \
+    function postResult(event) { \
+        window.webkit.messageHandlers.testHandler.postMessage(event.data); \
+    } \
+    addEventListener('message', postResult, false); \
+    </script> \
+    <iframe src=''>";
+
+static const char* iframeBytes = R"TESTRESOURCE(
+<script>
+function postResult(result) {
+    if (window.parent != window.top) {
+        parent.postMessage(result, '*');
+    } else {
+        window.webkit.messageHandlers.testHandler.postMessage(result);
+    }
+}
+
+try {
+    var request = window.indexedDB.open('IndexedDBSuspendImminentlyForThirdPartyDatabases');
+    request._onupgradeneeded_ = function(event) {
+        var db = event.target.result;
+        var os = db.createObjectStore('TestObjectStore');
+        var transaction = event.target.transaction;
+        transaction._onabort_ = function(event) {
+            postResult('transaction is aborted');
+        }
+        transaction._oncomplete_ = function(event) {
+            postResult('transaction is completed');
+        }
+
+        postResult('database is created');
+
+        for (let i = 0; i < 1000; i ++)
+            os.put('TestValue', 'TestKey');
+    }
+    request._onerror_ = function(event) {
+        postResult('database error: ' + event.target.error.name + ' - ' + event.target.error.message);
+    }
+} catch(err) {
+    postResult('database error: ' + err.name + ' - ' + err.message);
+}
+</script>
+)TESTRESOURCE";
+
+TEST(IndexedDB, SuspendImminentlyForThirdPartyDatabases)
+{
+    auto configuration = adoptNS([[WKWebViewConfiguration alloc] init]);
+    auto handler = adoptNS([[IndexedDBSuspendImminentlyMessageHandler 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:iframeBytes length:strlen(iframeBytes)]];
+        [task didFinish];
+    }];
+    [configuration setURLSchemeHandler:schemeHandler.get() forURLScheme:@"iframe"];
+
+    auto webView = adoptNS([[WKWebView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600) configuration:configuration.get()]);
+    [webView loadHTMLString:mainFrameString baseURL:[NSURL URLWithString:@"http://webkit.org"]];
+    runTestAndCheckResult(@"database is created");
+
+    [configuration.get().processPool _sendNetworkProcessWillSuspendImminently];
+    [configuration.get().processPool _sendNetworkProcessDidResume];
+
+    runTestAndCheckResult(@"transaction is completed");
+}
+
 #endif // PLATFORM(IOS_FAMILY)
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to