Title: [282364] trunk/Source/WebKit
Revision
282364
Author
[email protected]
Date
2021-09-13 15:01:40 -0700 (Mon, 13 Sep 2021)

Log Message

Send preference updates to the GPU process
https://bugs.webkit.org/show_bug.cgi?id=230159
<rdar://81049367>

Reviewed by Brent Fulgham.

Like the WebContent process, the GPU process should also receive preference updates since it is blocking the preference service in the sandbox.
The common code to set a preference is being moved to the AuxiliaryProcess base class, so that also the GPU process can make use of it. When
the UI process is sending preference update messages to all the WebContent processes, it will now also send to the GPU process.

* GPUProcess/GPUProcess.h:
* GPUProcess/GPUProcess.messages.in:
* GPUProcess/cocoa/GPUProcessCocoa.mm:
(WebKit::GPUProcess::notifyPreferencesChanged):
* Shared/AuxiliaryProcess.h:
* Shared/Cocoa/AuxiliaryProcessCocoa.mm:
(WebKit::AuxiliaryProcess::decodePreferenceValue):
(WebKit::AuxiliaryProcess::setPreferenceValue):
* UIProcess/Cocoa/WebProcessPoolCocoa.mm:
(WebKit::WebProcessPool::notifyPreferencesChanged):
* WebProcess/cocoa/WebProcessCocoa.mm:
(WebKit::handlePreferenceChange):
(WebKit::WebProcess::notifyPreferencesChanged):
(WebKit::setPreferenceValue): Deleted.

Modified Paths

Diff

Modified: trunk/Source/WebKit/ChangeLog (282363 => 282364)


--- trunk/Source/WebKit/ChangeLog	2021-09-13 21:55:35 UTC (rev 282363)
+++ trunk/Source/WebKit/ChangeLog	2021-09-13 22:01:40 UTC (rev 282364)
@@ -1,3 +1,30 @@
+2021-09-13  Per Arne Vollan  <[email protected]>
+
+        Send preference updates to the GPU process
+        https://bugs.webkit.org/show_bug.cgi?id=230159
+        <rdar://81049367>
+
+        Reviewed by Brent Fulgham.
+
+        Like the WebContent process, the GPU process should also receive preference updates since it is blocking the preference service in the sandbox.
+        The common code to set a preference is being moved to the AuxiliaryProcess base class, so that also the GPU process can make use of it. When
+        the UI process is sending preference update messages to all the WebContent processes, it will now also send to the GPU process.
+
+        * GPUProcess/GPUProcess.h:
+        * GPUProcess/GPUProcess.messages.in:
+        * GPUProcess/cocoa/GPUProcessCocoa.mm:
+        (WebKit::GPUProcess::notifyPreferencesChanged):
+        * Shared/AuxiliaryProcess.h:
+        * Shared/Cocoa/AuxiliaryProcessCocoa.mm:
+        (WebKit::AuxiliaryProcess::decodePreferenceValue):
+        (WebKit::AuxiliaryProcess::setPreferenceValue):
+        * UIProcess/Cocoa/WebProcessPoolCocoa.mm:
+        (WebKit::WebProcessPool::notifyPreferencesChanged):
+        * WebProcess/cocoa/WebProcessCocoa.mm:
+        (WebKit::handlePreferenceChange):
+        (WebKit::WebProcess::notifyPreferencesChanged):
+        (WebKit::setPreferenceValue): Deleted.
+
 2021-09-13  Tyler Wilcock  <[email protected]>
 
         AX: Make PDFs loaded via <embed> accessible

Modified: trunk/Source/WebKit/GPUProcess/GPUProcess.h (282363 => 282364)


--- trunk/Source/WebKit/GPUProcess/GPUProcess.h	2021-09-13 21:55:35 UTC (rev 282363)
+++ trunk/Source/WebKit/GPUProcess/GPUProcess.h	2021-09-13 22:01:40 UTC (rev 282364)
@@ -155,6 +155,10 @@
     void setVorbisDecoderEnabled(bool);
 #endif
 
+#if ENABLE(CFPREFS_DIRECT_MODE)
+    void notifyPreferencesChanged(const String& domain, const String& key, const std::optional<String>& encodedValue);
+#endif
+
     // Connections to WebProcesses.
     HashMap<WebCore::ProcessIdentifier, Ref<GPUConnectionToWebProcess>> m_webProcessConnections;
     MonotonicTime m_creationTime { MonotonicTime::now() };

Modified: trunk/Source/WebKit/GPUProcess/GPUProcess.messages.in (282363 => 282364)


--- trunk/Source/WebKit/GPUProcess/GPUProcess.messages.in	2021-09-13 21:55:35 UTC (rev 282363)
+++ trunk/Source/WebKit/GPUProcess/GPUProcess.messages.in	2021-09-13 22:01:40 UTC (rev 282364)
@@ -63,6 +63,10 @@
 #if ENABLE(VORBIS)
     SetVorbisDecoderEnabled(bool enabled);
 #endif
+
+#if ENABLE(CFPREFS_DIRECT_MODE)
+    NotifyPreferencesChanged(String domain, String key, std::optional<String> encodedValue)
+#endif
 }
 
 #endif // ENABLE(GPU_PROCESS)

Modified: trunk/Source/WebKit/GPUProcess/cocoa/GPUProcessCocoa.mm (282363 => 282364)


--- trunk/Source/WebKit/GPUProcess/cocoa/GPUProcessCocoa.mm	2021-09-13 21:55:35 UTC (rev 282363)
+++ trunk/Source/WebKit/GPUProcess/cocoa/GPUProcessCocoa.mm	2021-09-13 22:01:40 UTC (rev 282364)
@@ -66,6 +66,19 @@
 
 #endif // USE(OS_STATE)
 
+#if ENABLE(CFPREFS_DIRECT_MODE)
+void GPUProcess::notifyPreferencesChanged(const String& domain, const String& key, const std::optional<String>& encodedValue)
+{
+    id value = nil;
+    if (encodedValue) {
+        value = decodePreferenceValue(encodedValue);
+        if (!value)
+            return;
+    }
+    setPreferenceValue(domain, key, value);
+}
+#endif
+
 } // namespace WebKit
 
 #endif // ENABLE(GPU_PROCESS) && PLATFORM(COCOA)

Modified: trunk/Source/WebKit/Shared/AuxiliaryProcess.h (282363 => 282364)


--- trunk/Source/WebKit/Shared/AuxiliaryProcess.h	2021-09-13 21:55:35 UTC (rev 282363)
+++ trunk/Source/WebKit/Shared/AuxiliaryProcess.h	2021-09-13 22:01:40 UTC (rev 282364)
@@ -134,6 +134,12 @@
 
     static std::optional<std::pair<IPC::Connection::Identifier, IPC::Attachment>> createIPCConnectionPair();
 
+protected:
+#if ENABLE(CFPREFS_DIRECT_MODE)
+    static id decodePreferenceValue(const std::optional<String>& encodedValue);
+    static void setPreferenceValue(const String& domain, const String& key, id value);
+#endif
+
 private:
     virtual bool shouldOverrideQuarantine() { return true; }
 

Modified: trunk/Source/WebKit/Shared/Cocoa/AuxiliaryProcessCocoa.mm (282363 => 282364)


--- trunk/Source/WebKit/Shared/Cocoa/AuxiliaryProcessCocoa.mm	2021-09-13 21:55:35 UTC (rev 282363)
+++ trunk/Source/WebKit/Shared/Cocoa/AuxiliaryProcessCocoa.mm	2021-09-13 22:01:40 UTC (rev 282364)
@@ -130,4 +130,36 @@
 
 #endif // USE(OS_STATE)
 
+#if ENABLE(CFPREFS_DIRECT_MODE)
+id AuxiliaryProcess::decodePreferenceValue(const std::optional<String>& encodedValue)
+{
+    if (!encodedValue)
+        return nil;
+    
+    auto encodedData = adoptNS([[NSData alloc] initWithBase64EncodedString:*encodedValue options:0]);
+    if (!encodedData)
+        return nil;
+    NSError *err = nil;
+    auto classes = [NSSet setWithArray:@[[NSString class], [NSNumber class], [NSDate class], [NSDictionary class], [NSArray class], [NSData class]]];
+    id value = [NSKeyedUnarchiver unarchivedObjectOfClasses:classes fromData:encodedData.get() error:&err];
+    ASSERT(!err);
+    if (err)
+        return nil;
+
+    return value;
+}
+
+void AuxiliaryProcess::setPreferenceValue(const String& domain, const String& key, id value)
+{
+    if (domain.isEmpty()) {
+        CFPreferencesSetValue(key.createCFString().get(), (__bridge CFPropertyListRef)value, kCFPreferencesAnyApplication, kCFPreferencesCurrentUser, kCFPreferencesAnyHost);
+#if ASSERT_ENABLED
+        id valueAfterSetting = [[NSUserDefaults standardUserDefaults] objectForKey:key];
+        ASSERT(valueAfterSetting == value || [valueAfterSetting isEqual:value] || key == "AppleLanguages");
+#endif
+    } else
+        CFPreferencesSetValue(key.createCFString().get(), (__bridge CFPropertyListRef)value, domain.createCFString().get(), kCFPreferencesCurrentUser, kCFPreferencesAnyHost);
+}
+#endif // ENABLE(CFPREFS_DIRECT_MODE)
+
 } // namespace WebKit

Modified: trunk/Source/WebKit/UIProcess/Cocoa/WebProcessPoolCocoa.mm (282363 => 282364)


--- trunk/Source/WebKit/UIProcess/Cocoa/WebProcessPoolCocoa.mm	2021-09-13 21:55:35 UTC (rev 282363)
+++ trunk/Source/WebKit/UIProcess/Cocoa/WebProcessPoolCocoa.mm	2021-09-13 22:01:40 UTC (rev 282364)
@@ -96,6 +96,10 @@
 #import <WebCore/SystemBattery.h>
 #endif
 
+#if ENABLE(GPU_PROCESS)
+#import "GPUProcessMessages.h"
+#endif
+
 #if HAVE(MEDIA_ACCESSIBILITY_FRAMEWORK)
 #include <WebCore/CaptionUserPreferencesMediaAF.h>
 #include <WebCore/MediaAccessibilitySoftLink.h>
@@ -983,6 +987,11 @@
 {
     for (auto process : m_processes)
         process->send(Messages::WebProcess::NotifyPreferencesChanged(domain, key, encodedValue), 0);
+
+#if ENABLE(GPU_PROCESS)
+    if (auto* gpuProcess = GPUProcessProxy::singletonIfCreated())
+        gpuProcess->send(Messages::GPUProcess::NotifyPreferencesChanged(domain, key, encodedValue), 0);
+#endif
 }
 #endif
 

Modified: trunk/Source/WebKit/WebProcess/cocoa/WebProcessCocoa.mm (282363 => 282364)


--- trunk/Source/WebKit/WebProcess/cocoa/WebProcessCocoa.mm	2021-09-13 21:55:35 UTC (rev 282363)
+++ trunk/Source/WebKit/WebProcess/cocoa/WebProcessCocoa.mm	2021-09-13 22:01:40 UTC (rev 282364)
@@ -1131,17 +1131,8 @@
     }
 }
 
-static void setPreferenceValue(const String& domain, const String& key, id value)
+static void handlePreferenceChange(const String& domain, const String& key, id value)
 {
-    if (domain.isEmpty()) {
-        CFPreferencesSetValue(key.createCFString().get(), (__bridge CFPropertyListRef)value, kCFPreferencesAnyApplication, kCFPreferencesCurrentUser, kCFPreferencesAnyHost);
-#if ASSERT_ENABLED
-        id valueAfterSetting = [[NSUserDefaults standardUserDefaults] objectForKey:key];
-        ASSERT(valueAfterSetting == value || [valueAfterSetting isEqual:value] || key == "AppleLanguages");
-#endif
-    } else
-        CFPreferencesSetValue(key.createCFString().get(), (__bridge CFPropertyListRef)value, domain.createCFString().get(), kCFPreferencesCurrentUser, kCFPreferencesAnyHost);
-
     if (key == "AppleLanguages") {
         // We need to set AppleLanguages for the volatile domain, similarly to what we do in XPCServiceMain.mm.
         NSDictionary *existingArguments = [[NSUserDefaults standardUserDefaults] volatileDomainForName:NSArgumentDomain];
@@ -1171,26 +1162,20 @@
     if (CFEqual(cfKey.get(), kAXInterfaceReduceMotionKey) || CFEqual(cfKey.get(), kAXInterfaceIncreaseContrastKey) || key == invertColorsPreferenceKey())
         [NSWorkspace _invalidateAccessibilityDisplayValues];
 #endif
+
+    dispatchSimulatedNotificationsForPreferenceChange(key);
 }
 
 void WebProcess::notifyPreferencesChanged(const String& domain, const String& key, const std::optional<String>& encodedValue)
 {
-    if (!encodedValue) {
-        setPreferenceValue(domain, key, nil);
-        dispatchSimulatedNotificationsForPreferenceChange(key);
-        return;
+    id value = nil;
+    if (encodedValue) {
+        value = decodePreferenceValue(encodedValue);
+        if (!value)
+            return;
     }
-    auto encodedData = adoptNS([[NSData alloc] initWithBase64EncodedString:*encodedValue 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 object = [NSKeyedUnarchiver unarchivedObjectOfClasses:classes fromData:encodedData.get() error:&err];
-    ASSERT(!err);
-    if (err)
-        return;
-    setPreferenceValue(domain, key, object);
-    dispatchSimulatedNotificationsForPreferenceChange(key);
+    setPreferenceValue(domain, key, value);
+    handlePreferenceChange(domain, key, value);
 }
 
 void WebProcess::unblockPreferenceService(Vector<SandboxExtension::Handle>&& handleArray)
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to