Title: [262497] trunk
Revision
262497
Author
cdu...@apple.com
Date
2020-06-03 11:40:47 -0700 (Wed, 03 Jun 2020)

Log Message

WebProcessPool::notifyPreferencesChanged() is unsafely called on a background thread
https://bugs.webkit.org/show_bug.cgi?id=212697
<rdar://problem/63876652>

Reviewed by Per Arne Vollan.

Make sure we dispatch to the main thread in [WKPreferenceObserver preferenceDidChange] before
we iterate over the process pools and call WebProcessPool::notifyPreferencesChanged() on each
one.

* UIProcess/Cocoa/PreferenceObserver.mm:
(-[WKPreferenceObserver preferenceDidChange:key:encodedValue:]):

Modified Paths

Diff

Modified: trunk/Source/WebKit/ChangeLog (262496 => 262497)


--- trunk/Source/WebKit/ChangeLog	2020-06-03 18:39:02 UTC (rev 262496)
+++ trunk/Source/WebKit/ChangeLog	2020-06-03 18:40:47 UTC (rev 262497)
@@ -1,3 +1,18 @@
+2020-06-03  Chris Dumez  <cdu...@apple.com>
+
+        WebProcessPool::notifyPreferencesChanged() is unsafely called on a background thread
+        https://bugs.webkit.org/show_bug.cgi?id=212697
+        <rdar://problem/63876652>
+
+        Reviewed by Per Arne Vollan.
+
+        Make sure we dispatch to the main thread in [WKPreferenceObserver preferenceDidChange] before
+        we iterate over the process pools and call WebProcessPool::notifyPreferencesChanged() on each
+        one.
+
+        * UIProcess/Cocoa/PreferenceObserver.mm:
+        (-[WKPreferenceObserver preferenceDidChange:key:encodedValue:]):
+
 2020-06-03  Brent Fulgham  <bfulg...@apple.com>
 
         [iOS] Reduce sandbox logging by permitting necessary sysctl

Modified: trunk/Source/WebKit/UIProcess/Cocoa/PreferenceObserver.mm (262496 => 262497)


--- trunk/Source/WebKit/UIProcess/Cocoa/PreferenceObserver.mm	2020-06-03 18:39:02 UTC (rev 262496)
+++ trunk/Source/WebKit/UIProcess/Cocoa/PreferenceObserver.mm	2020-06-03 18:40:47 UTC (rev 262497)
@@ -155,11 +155,14 @@
 - (void)preferenceDidChange:(NSString *)domain key:(NSString *)key encodedValue:(NSString *)encodedValue
 {
 #if ENABLE(CFPREFS_DIRECT_MODE)
-    Optional<String> encodedString;
-    if (encodedValue)
-        encodedString = String(encodedValue);
-    for (auto* processPool : WebKit::WebProcessPool::allProcessPools())
-        processPool->notifyPreferencesChanged(domain, key, encodedString);
+    dispatch_async(dispatch_get_main_queue(), ^{
+        Optional<String> encodedString;
+        if (encodedValue)
+            encodedString = String(encodedValue);
+
+        for (auto* processPool : WebKit::WebProcessPool::allProcessPools())
+            processPool->notifyPreferencesChanged(domain, key, encodedString);
+    });
 #endif
 }
 @end

Modified: trunk/Tools/TestWebKitAPI/Tests/WebKit/PreferenceChanges.mm (262496 => 262497)


--- trunk/Tools/TestWebKitAPI/Tests/WebKit/PreferenceChanges.mm	2020-06-03 18:39:02 UTC (rev 262496)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKit/PreferenceChanges.mm	2020-06-03 18:40:47 UTC (rev 262497)
@@ -50,6 +50,15 @@
 static const CFStringRef testKey = CFSTR("testkey");
 static const CFStringRef testDomain = CFSTR("kCFPreferencesAnyApplication");
 
+static void waitForPreferenceSynchronization()
+{
+    __block bool didSynchronize = false;
+    dispatch_async(dispatch_get_main_queue(), ^{
+        didSynchronize = true;
+    });
+    TestWebKitAPI::Util::run(&didSynchronize);
+}
+
 TEST(WebKit, PreferenceObserver)
 {
     done = false;
@@ -94,6 +103,7 @@
     auto webView = adoptNS([[TestWKWebView alloc] initWithFrame:NSMakeRect(0, 0, 300, 300) configuration:configuration.get() addToWindow:YES]);
 
     auto preferenceValue = [&] {
+        waitForPreferenceSynchronization();
         NSString *js = [NSString stringWithFormat:@"window.internals.readPreferenceInteger(\"%@\",\"%@\")", (NSString *)testDomain, (NSString *)testKey];
         return [webView stringByEvaluatingJavaScript:js].intValue;
     };
@@ -120,6 +130,7 @@
     auto webView = adoptNS([[TestWKWebView alloc] initWithFrame:NSMakeRect(0, 0, 300, 300) configuration:configuration.get() addToWindow:YES]);
 
     auto preferenceValue = [&] {
+        waitForPreferenceSynchronization();
         NSString *js = [NSString stringWithFormat:@"window.internals.encodedPreferenceValue(\"%@\",\"%@\")", (NSString *)testDomain, (NSString *)testKey];
         return [webView stringByEvaluatingJavaScript:js];
     };
@@ -157,6 +168,7 @@
     auto webView = adoptNS([[TestWKWebView alloc] initWithFrame:NSMakeRect(0, 0, 300, 300) configuration:configuration.get() addToWindow:YES]);
 
     auto preferenceValue = [&] {
+        waitForPreferenceSynchronization();
         NSString *js = [NSString stringWithFormat:@"window.internals.encodedPreferenceValue(\"%@\",\"%@\")", (NSString *)testDomain, (NSString *)testKey];
         return [webView stringByEvaluatingJavaScript:js];
     };
@@ -195,6 +207,7 @@
     auto webView = adoptNS([[TestWKWebView alloc] initWithFrame:NSMakeRect(0, 0, 300, 300) configuration:configuration.get() addToWindow:YES]);
 
     auto preferenceValue = [&] {
+        waitForPreferenceSynchronization();
         NSString *js = [NSString stringWithFormat:@"window.internals.encodedPreferenceValue(\"%@\",\"%@\")", (NSString *)testDomain, (NSString *)testKey];
         return [webView stringByEvaluatingJavaScript:js];
     };
@@ -229,6 +242,7 @@
     auto webView = adoptNS([[TestWKWebView alloc] initWithFrame:NSMakeRect(0, 0, 300, 300) configuration:configuration.get() addToWindow:YES]);
 
     auto preferenceValue = [&] {
+        waitForPreferenceSynchronization();
         NSString *js = [NSString stringWithFormat:@"window.internals.encodedPreferenceValue(\"%@\",\"%@\")", (NSString *)testDomain, (NSString *)testKey];
         return [webView stringByEvaluatingJavaScript:js];
     };
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to