- Revision
- 260840
- Author
- pvol...@apple.com
- Date
- 2020-04-28 12:29:07 -0700 (Tue, 28 Apr 2020)
Log Message
[Cocoa] Global preferences are not accessible in the WebContent process when CFPrefs direct mode is enabled
https://bugs.webkit.org/show_bug.cgi?id=211075
Source/WebKit:
<rdar://problem/61866711>
Reviewed by Brent Fulgham.
Global preferences in the domain 'kCFPreferencesAnyApplication' are not readable in the WebContent process when CFPrefs direct mode
is enabled. Fix this by transferring a select set of global preferences to the WebContent process on startup.
API test: WebKit.GlobalPreferences
* Shared/WebProcessCreationParameters.cpp:
(WebKit::WebProcessCreationParameters::encode const):
(WebKit::WebProcessCreationParameters::decode):
* Shared/WebProcessCreationParameters.h:
* UIProcess/Cocoa/WebProcessPoolCocoa.mm:
(WebKit::WebProcessPool::platformInitializeWebProcess):
* WebProcess/cocoa/WebProcessCocoa.mm:
(WebKit::setGlobalPreferences):
(WebKit::WebProcess::platformInitializeWebProcess):
Tools:
Reviewed by Brent Fulgham.
* TestWebKitAPI/Tests/WebKit/PreferenceChanges.mm:
(TEST):
Modified Paths
Diff
Modified: trunk/Source/WebKit/ChangeLog (260839 => 260840)
--- trunk/Source/WebKit/ChangeLog 2020-04-28 19:18:42 UTC (rev 260839)
+++ trunk/Source/WebKit/ChangeLog 2020-04-28 19:29:07 UTC (rev 260840)
@@ -1,3 +1,26 @@
+2020-04-28 Per Arne Vollan <pvol...@apple.com>
+
+ [Cocoa] Global preferences are not accessible in the WebContent process when CFPrefs direct mode is enabled
+ https://bugs.webkit.org/show_bug.cgi?id=211075
+ <rdar://problem/61866711>
+
+ Reviewed by Brent Fulgham.
+
+ Global preferences in the domain 'kCFPreferencesAnyApplication' are not readable in the WebContent process when CFPrefs direct mode
+ is enabled. Fix this by transferring a select set of global preferences to the WebContent process on startup.
+
+ API test: WebKit.GlobalPreferences
+
+ * Shared/WebProcessCreationParameters.cpp:
+ (WebKit::WebProcessCreationParameters::encode const):
+ (WebKit::WebProcessCreationParameters::decode):
+ * Shared/WebProcessCreationParameters.h:
+ * UIProcess/Cocoa/WebProcessPoolCocoa.mm:
+ (WebKit::WebProcessPool::platformInitializeWebProcess):
+ * WebProcess/cocoa/WebProcessCocoa.mm:
+ (WebKit::setGlobalPreferences):
+ (WebKit::WebProcess::platformInitializeWebProcess):
+
2020-04-28 Peng Liu <peng.l...@apple.com>
Remove the WebKit.plist for Feature Flags
Modified: trunk/Source/WebKit/Shared/WebProcessCreationParameters.cpp (260839 => 260840)
--- trunk/Source/WebKit/Shared/WebProcessCreationParameters.cpp 2020-04-28 19:18:42 UTC (rev 260839)
+++ trunk/Source/WebKit/Shared/WebProcessCreationParameters.cpp 2020-04-28 19:29:07 UTC (rev 260840)
@@ -194,6 +194,7 @@
encoder << mediaExtensionHandles;
#if ENABLE(CFPREFS_DIRECT_MODE)
encoder << preferencesExtensionHandles;
+ encoder << encodedGlobalPreferences;
#endif
#endif
@@ -542,6 +543,12 @@
if (!preferencesExtensionHandles)
return false;
parameters.preferencesExtensionHandles = WTFMove(*preferencesExtensionHandles);
+
+ Optional<String> encodedGlobalPreferences;
+ decoder >> encodedGlobalPreferences;
+ if (!encodedGlobalPreferences)
+ return false;
+ parameters.encodedGlobalPreferences = WTFMove(*encodedGlobalPreferences);
#endif
#endif
Modified: trunk/Source/WebKit/Shared/WebProcessCreationParameters.h (260839 => 260840)
--- trunk/Source/WebKit/Shared/WebProcessCreationParameters.h 2020-04-28 19:18:42 UTC (rev 260839)
+++ trunk/Source/WebKit/Shared/WebProcessCreationParameters.h 2020-04-28 19:29:07 UTC (rev 260840)
@@ -231,6 +231,7 @@
SandboxExtension::HandleArray mediaExtensionHandles; // FIXME(207716): Remove when GPU process is complete.
#if ENABLE(CFPREFS_DIRECT_MODE)
Optional<SandboxExtension::HandleArray> preferencesExtensionHandles;
+ String encodedGlobalPreferences;
#endif
#endif
Modified: trunk/Source/WebKit/UIProcess/Cocoa/WebProcessPoolCocoa.mm (260839 => 260840)
--- trunk/Source/WebKit/UIProcess/Cocoa/WebProcessPoolCocoa.mm 2020-04-28 19:18:42 UTC (rev 260839)
+++ trunk/Source/WebKit/UIProcess/Cocoa/WebProcessPoolCocoa.mm 2020-04-28 19:29:07 UTC (rev 260840)
@@ -454,7 +454,8 @@
SandboxExtension::createHandleForMachLookup(services[i], WTF::nullopt, parameters.mediaExtensionHandles[i]);
}
-#if ENABLE(CFPREFS_DIRECT_MODE) && PLATFORM(IOS_FAMILY)
+#if ENABLE(CFPREFS_DIRECT_MODE)
+#if PLATFORM(IOS_FAMILY)
if (_AXSApplicationAccessibilityEnabled()) {
SandboxExtension::HandleArray preferencesExtensionHandles;
@@ -472,6 +473,29 @@
parameters.preferencesExtensionHandles = WTFMove(preferencesExtensionHandles);
}
#endif
+
+ auto globalPreferencesDictionary = adoptCF(CFDictionaryCreateMutable(kCFAllocatorDefault, 0, nullptr, nullptr));
+ static CFStringRef keys[] = {
+ CFSTR("AppleLanguages"),
+ CFSTR("AppleLanguagesSchemaVersion"),
+ CFSTR("AppleLocale")
+ };
+ for (size_t i = 0; i < std::size(keys); ++i) {
+ auto value = adoptCF(CFPreferencesCopyAppValue(keys[i], CFSTR("kCFPreferencesAnyApplication")));
+ if (!value)
+ continue;
+ CFDictionaryAddValue(globalPreferencesDictionary.get(), keys[i], value.get());
+ }
+ if (CFDictionaryGetCount(globalPreferencesDictionary.get()) > 0) {
+ NSError *e = nil;
+ auto data = "" archivedDataWithRootObject:(__bridge NSMutableDictionary *)globalPreferencesDictionary.get() requiringSecureCoding:YES error:&e]);
+ if (e) {
+ ASSERT_NOT_REACHED();
+ WTFLogAlways("Failed to archive global preferences dictionary with NSKeyedArchiver.");
+ } else
+ parameters.encodedGlobalPreferences = String([data base64EncodedStringWithOptions:0]);
+ }
+#endif
}
void WebProcessPool::platformInitializeNetworkProcess(NetworkProcessCreationParameters& parameters)
Modified: trunk/Source/WebKit/WebProcess/cocoa/WebProcessCocoa.mm (260839 => 260840)
--- trunk/Source/WebKit/WebProcess/cocoa/WebProcessCocoa.mm 2020-04-28 19:18:42 UTC (rev 260839)
+++ trunk/Source/WebKit/WebProcess/cocoa/WebProcessCocoa.mm 2020-04-28 19:29:07 UTC (rev 260840)
@@ -165,8 +165,37 @@
}
#endif
+#if ENABLE(CFPREFS_DIRECT_MODE)
+static void setGlobalPreferences(const String& encodedGlobalPreferences)
+{
+ if (encodedGlobalPreferences.isEmpty())
+ return;
+
+ auto encodedData = adoptNS([[NSData alloc] initWithBase64EncodedString:encodedGlobalPreferences options:0]);
+ if (!encodedData)
+ return;
+
+ NSError *err = nil;
+ auto classes = [NSSet setWithArray:@[[NSString class], [NSNumber class], [NSDate class], [NSDictionary class], [NSArray class], [NSData class]]];
+ id globalPreferencesDictionary = [NSKeyedUnarchiver unarchivedObjectOfClasses:classes fromData:encodedData.get() error:&err];
+ if (err) {
+ ASSERT_NOT_REACHED();
+ WTFLogAlways("Failed to unarchive global preferences dictionary with NSKeyedUnarchiver.");
+ return;
+ }
+ [globalPreferencesDictionary enumerateKeysAndObjectsUsingBlock: ^(NSString *key, id value, BOOL* stop) {
+ if (value)
+ CFPreferencesSetAppValue(static_cast<CFStringRef>(key), static_cast<CFPropertyListRef>(value), CFSTR("kCFPreferencesAnyApplication"));
+ }];
+}
+#endif
+
void WebProcess::platformInitializeWebProcess(WebProcessCreationParameters& parameters)
{
+#if ENABLE(CFPREFS_DIRECT_MODE)
+ setGlobalPreferences(parameters.encodedGlobalPreferences);
+#endif
+
// Map Launch Services database. This should be done as early as possible, as the mapping will fail
// if 'com.apple.lsd.mapdb' is being accessed before this.
if (parameters.mapDBExtensionHandle) {
@@ -179,7 +208,6 @@
ASSERT_UNUSED(ok, ok);
}
-
#if PLATFORM(IOS_FAMILY)
if (parameters.runningboardExtensionHandle) {
auto extension = SandboxExtension::create(WTFMove(*parameters.runningboardExtensionHandle));
Modified: trunk/Tools/ChangeLog (260839 => 260840)
--- trunk/Tools/ChangeLog 2020-04-28 19:18:42 UTC (rev 260839)
+++ trunk/Tools/ChangeLog 2020-04-28 19:29:07 UTC (rev 260840)
@@ -1,3 +1,13 @@
+2020-04-28 Per Arne Vollan <pvol...@apple.com>
+
+ [Cocoa] Global preferences are not accessible in the WebContent process when CFPrefs direct mode is enabled
+ https://bugs.webkit.org/show_bug.cgi?id=211075
+
+ Reviewed by Brent Fulgham.
+
+ * TestWebKitAPI/Tests/WebKit/PreferenceChanges.mm:
+ (TEST):
+
2020-04-28 Jonathan Bedard <jbed...@apple.com>
results.webkit.org: A suite running multiple times in a commit for a single configuration may overwrite upload metadata
Modified: trunk/Tools/TestWebKitAPI/Tests/WebKit/PreferenceChanges.mm (260839 => 260840)
--- trunk/Tools/TestWebKitAPI/Tests/WebKit/PreferenceChanges.mm 2020-04-28 19:18:42 UTC (rev 260839)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKit/PreferenceChanges.mm 2020-04-28 19:29:07 UTC (rev 260840)
@@ -276,4 +276,36 @@
TestWebKitAPI::Util::run(&done);
}
+TEST(WebKit, GlobalPreferences)
+{
+ NSString *globalDomain = @"kCFPreferencesAnyApplication";
+ NSString *globalKey = @"AppleLanguages";
+
+ NSArray *languages = @[@"en-US", @"nb-US"];
+
+ CFPreferencesSetAppValue(static_cast<CFStringRef>(globalKey), static_cast<CFArrayRef>(languages), static_cast<CFStringRef>(globalDomain));
+
+ auto userDefaults = adoptNS([[NSUserDefaults alloc] initWithSuiteName:globalDomain]);
+ [userDefaults.get() setObject:languages forKey:globalKey];
+
+ auto configuration = adoptNS([[WKWebViewConfiguration alloc] init]);
+ WKRetainPtr<WKContextRef> context = adoptWK(TestWebKitAPI::Util::createContextForInjectedBundleTest("InternalsInjectedBundleTest"));
+ configuration.get().processPool = (WKProcessPool *)context.get();
+ auto webView = adoptNS([[TestWKWebView alloc] initWithFrame:NSMakeRect(0, 0, 300, 300) configuration:configuration.get() addToWindow:YES]);
+
+ auto preferenceValue = [&] {
+ NSString *js = [NSString stringWithFormat:@"window.internals.encodedPreferenceValue(\"%@\",\"%@\")", globalDomain, globalKey];
+ return [webView stringByEvaluatingJavaScript:js];
+ };
+
+ auto encodedString = preferenceValue();
+ auto encodedData = adoptNS([[NSData alloc] initWithBase64EncodedString:encodedString options:0]);
+ ASSERT_TRUE(encodedData);
+ NSError *err = nil;
+ auto object = retainPtr([NSKeyedUnarchiver unarchivedObjectOfClass:[NSObject class] fromData:encodedData.get() error:&err]);
+ ASSERT_TRUE(!err);
+ ASSERT_TRUE(object);
+ ASSERT_TRUE([object isEqual:languages]);
+}
+
#endif // WK_HAVE_C_SPI