Title: [260840] trunk
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
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to