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