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];
};