Title: [277906] trunk/Source/WebKit
Revision
277906
Author
wei...@apple.com
Date
2021-05-21 19:23:42 -0700 (Fri, 21 May 2021)

Log Message

Make CGColorSpaceRef argument coding match other CF objects and use CGColorSpaceCreateWithPropertyList for fallback
https://bugs.webkit.org/show_bug.cgi?id=226112

Reviewed by Darin Adler.

This is a precursor to some color space type unification. This change:

- Modernizes CF arugment coders to use ArgumentCoder specialization. It also means
  we now support encoding CF types both as plain types and RetainPtr<> types, with
  decoding being kept only supporing RetainPtr<>s, as decoding into non-smart pointer
  is not very useful.
- Move CGColorSpaceRef coding to ArgumentCodersCF and use CGColorSpaceCopyPropertyList
  and CGColorSpaceCreateWithPropertyList as the fallback coding (if there is no name),
  matching what other libraries on macOS and iOS do.
- Switch ColorSpaceData to be a struct wrapping an Optional<RetainPtr<CGColorSpaceRef>>
  and use the new shared coding. This will be replaced entirely in subsequent changes
  so I didn't want to change this too much now.

* NetworkProcess/NetworkProcessCreationParameters.cpp:
(WebKit::NetworkProcessCreationParameters::encode const):
(WebKit::NetworkProcessCreationParameters::decode):
* NetworkProcess/NetworkSessionCreationParameters.cpp:
(WebKit::NetworkSessionCreationParameters::encode const):
(WebKit::NetworkSessionCreationParameters::decode):
* Shared/Cocoa/ArgumentCodersCocoa.mm:
(IPC::encodeDataInternal):
(IPC::decodeDataInternal):
(IPC::encodeDateInternal):
(IPC::decodeDateInternal):
(IPC::encodeNumberInternal):
(IPC::decodeNumberInternal):
(IPC::encodeSecureCodingInternal):
(IPC::decodeSecureCodingInternal):
(IPC::encodeStringInternal):
(IPC::decodeStringInternal):
(IPC::encodeURLInternal):
(IPC::decodeURLInternal):
* Shared/Cocoa/WebCoreArgumentCodersCocoa.mm:
(IPC::ArgumentCoder<Ref<Font>>::encodePlatformData):
(IPC::ArgumentCoder<Ref<Font>>::decodePlatformData):
* Shared/FontInfo.cpp:
(WebKit::FontInfo::encode const):
(WebKit::FontInfo::decode):
* Shared/Plugins/PluginProcessCreationParameters.cpp:
(WebKit::PluginProcessCreationParameters::encode const):
(WebKit::PluginProcessCreationParameters::decode):
* Shared/WebProcessCreationParameters.cpp:
(WebKit::WebProcessCreationParameters::encode const):
(WebKit::WebProcessCreationParameters::decode):
* Shared/cf/ArgumentCodersCF.cpp:
(IPC::typeFromCFTypeRef):
(IPC::ArgumentCoder<CFTypeRef>::encode):
(IPC::ArgumentCoder<RetainPtr<CFTypeRef>>::decode):
(IPC::ArgumentCoder<CFArrayRef>::encode):
(IPC::ArgumentCoder<RetainPtr<CFArrayRef>>::decode):
(IPC::ArgumentCoder<CFBooleanRef>::encode):
(IPC::ArgumentCoder<RetainPtr<CFBooleanRef>>::decode):
(IPC::ArgumentCoder<CFDataRef>::encode):
(IPC::ArgumentCoder<RetainPtr<CFDataRef>>::decode):
(IPC::ArgumentCoder<CFDateRef>::encode):
(IPC::ArgumentCoder<RetainPtr<CFDateRef>>::decode):
(IPC::ArgumentCoder<CFDictionaryRef>::encode):
(IPC::ArgumentCoder<RetainPtr<CFDictionaryRef>>::decode):
(IPC::ArgumentCoder<CFNumberRef>::encode):
(IPC::ArgumentCoder<RetainPtr<CFNumberRef>>::decode):
(IPC::ArgumentCoder<CFStringRef>::encode):
(IPC::ArgumentCoder<RetainPtr<CFStringRef>>::decode):
(IPC::ArgumentCoder<CFURLRef>::encode):
(IPC::ArgumentCoder<RetainPtr<CFURLRef>>::decode):
(IPC::ArgumentCoder<CGColorSpaceRef>::encode):
(IPC::ArgumentCoder<RetainPtr<CGColorSpaceRef>>::decode):
(IPC::ArgumentCoder<SecCertificateRef>::encode):
(IPC::ArgumentCoder<RetainPtr<SecCertificateRef>>::decode):
(IPC::ArgumentCoder<SecKeychainItemRef>::encode):
(IPC::ArgumentCoder<RetainPtr<SecKeychainItemRef>>::decode):
(IPC::ArgumentCoder<SecAccessControlRef>::encode):
(IPC::ArgumentCoder<RetainPtr<SecAccessControlRef>>::decode):
(IPC::ArgumentCoder<SecTrustRef>::encode):
(IPC::ArgumentCoder<RetainPtr<SecTrustRef>>::decode):
(IPC::encode): Deleted.
(IPC::decode): Deleted.
* Shared/cf/ArgumentCodersCF.h:
(IPC::CFRetainPtrArgumentCoder::encode):
* Shared/mac/ColorSpaceData.mm:
(WebKit::ColorSpaceData::encode const):
(WebKit::ColorSpaceData::decode):
(): Deleted.
* Shared/mac/SecItemRequestData.cpp:
(WebKit::SecItemRequestData::encode const):
(WebKit::SecItemRequestData::decode):
* Shared/mac/SecItemResponseData.cpp:
(WebKit::SecItemResponseData::encode const):
(WebKit::SecItemResponseData::decode):
* Shared/mac/WebCoreArgumentCodersMac.mm:
(IPC::ArgumentCoder<WebCore::CertificateInfo>::encode):
(IPC::ArgumentCoder<WebCore::CertificateInfo>::decode):
(IPC::encodeNSError):
(IPC::decodeNSError):
(IPC::ArgumentCoder<WebCore::ContentFilterUnblockHandler>::encode):
(IPC::ArgumentCoder<WebCore::ContentFilterUnblockHandler>::decode):

Modified Paths

Diff

Modified: trunk/Source/WebKit/ChangeLog (277905 => 277906)


--- trunk/Source/WebKit/ChangeLog	2021-05-22 02:07:17 UTC (rev 277905)
+++ trunk/Source/WebKit/ChangeLog	2021-05-22 02:23:42 UTC (rev 277906)
@@ -1,3 +1,106 @@
+2021-05-21  Sam Weinig  <wei...@apple.com>
+
+        Make CGColorSpaceRef argument coding match other CF objects and use CGColorSpaceCreateWithPropertyList for fallback
+        https://bugs.webkit.org/show_bug.cgi?id=226112
+
+        Reviewed by Darin Adler.
+
+        This is a precursor to some color space type unification. This change:
+        
+        - Modernizes CF arugment coders to use ArgumentCoder specialization. It also means
+          we now support encoding CF types both as plain types and RetainPtr<> types, with
+          decoding being kept only supporing RetainPtr<>s, as decoding into non-smart pointer
+          is not very useful.
+        - Move CGColorSpaceRef coding to ArgumentCodersCF and use CGColorSpaceCopyPropertyList
+          and CGColorSpaceCreateWithPropertyList as the fallback coding (if there is no name),
+          matching what other libraries on macOS and iOS do.
+        - Switch ColorSpaceData to be a struct wrapping an Optional<RetainPtr<CGColorSpaceRef>>
+          and use the new shared coding. This will be replaced entirely in subsequent changes
+          so I didn't want to change this too much now.
+
+        * NetworkProcess/NetworkProcessCreationParameters.cpp:
+        (WebKit::NetworkProcessCreationParameters::encode const):
+        (WebKit::NetworkProcessCreationParameters::decode):
+        * NetworkProcess/NetworkSessionCreationParameters.cpp:
+        (WebKit::NetworkSessionCreationParameters::encode const):
+        (WebKit::NetworkSessionCreationParameters::decode):
+        * Shared/Cocoa/ArgumentCodersCocoa.mm:
+        (IPC::encodeDataInternal):
+        (IPC::decodeDataInternal):
+        (IPC::encodeDateInternal):
+        (IPC::decodeDateInternal):
+        (IPC::encodeNumberInternal):
+        (IPC::decodeNumberInternal):
+        (IPC::encodeSecureCodingInternal):
+        (IPC::decodeSecureCodingInternal):
+        (IPC::encodeStringInternal):
+        (IPC::decodeStringInternal):
+        (IPC::encodeURLInternal):
+        (IPC::decodeURLInternal):
+        * Shared/Cocoa/WebCoreArgumentCodersCocoa.mm:
+        (IPC::ArgumentCoder<Ref<Font>>::encodePlatformData):
+        (IPC::ArgumentCoder<Ref<Font>>::decodePlatformData):
+        * Shared/FontInfo.cpp:
+        (WebKit::FontInfo::encode const):
+        (WebKit::FontInfo::decode):
+        * Shared/Plugins/PluginProcessCreationParameters.cpp:
+        (WebKit::PluginProcessCreationParameters::encode const):
+        (WebKit::PluginProcessCreationParameters::decode):
+        * Shared/WebProcessCreationParameters.cpp:
+        (WebKit::WebProcessCreationParameters::encode const):
+        (WebKit::WebProcessCreationParameters::decode):
+        * Shared/cf/ArgumentCodersCF.cpp:
+        (IPC::typeFromCFTypeRef):
+        (IPC::ArgumentCoder<CFTypeRef>::encode):
+        (IPC::ArgumentCoder<RetainPtr<CFTypeRef>>::decode):
+        (IPC::ArgumentCoder<CFArrayRef>::encode):
+        (IPC::ArgumentCoder<RetainPtr<CFArrayRef>>::decode):
+        (IPC::ArgumentCoder<CFBooleanRef>::encode):
+        (IPC::ArgumentCoder<RetainPtr<CFBooleanRef>>::decode):
+        (IPC::ArgumentCoder<CFDataRef>::encode):
+        (IPC::ArgumentCoder<RetainPtr<CFDataRef>>::decode):
+        (IPC::ArgumentCoder<CFDateRef>::encode):
+        (IPC::ArgumentCoder<RetainPtr<CFDateRef>>::decode):
+        (IPC::ArgumentCoder<CFDictionaryRef>::encode):
+        (IPC::ArgumentCoder<RetainPtr<CFDictionaryRef>>::decode):
+        (IPC::ArgumentCoder<CFNumberRef>::encode):
+        (IPC::ArgumentCoder<RetainPtr<CFNumberRef>>::decode):
+        (IPC::ArgumentCoder<CFStringRef>::encode):
+        (IPC::ArgumentCoder<RetainPtr<CFStringRef>>::decode):
+        (IPC::ArgumentCoder<CFURLRef>::encode):
+        (IPC::ArgumentCoder<RetainPtr<CFURLRef>>::decode):
+        (IPC::ArgumentCoder<CGColorSpaceRef>::encode):
+        (IPC::ArgumentCoder<RetainPtr<CGColorSpaceRef>>::decode):
+        (IPC::ArgumentCoder<SecCertificateRef>::encode):
+        (IPC::ArgumentCoder<RetainPtr<SecCertificateRef>>::decode):
+        (IPC::ArgumentCoder<SecKeychainItemRef>::encode):
+        (IPC::ArgumentCoder<RetainPtr<SecKeychainItemRef>>::decode):
+        (IPC::ArgumentCoder<SecAccessControlRef>::encode):
+        (IPC::ArgumentCoder<RetainPtr<SecAccessControlRef>>::decode):
+        (IPC::ArgumentCoder<SecTrustRef>::encode):
+        (IPC::ArgumentCoder<RetainPtr<SecTrustRef>>::decode):
+        (IPC::encode): Deleted.
+        (IPC::decode): Deleted.
+        * Shared/cf/ArgumentCodersCF.h:
+        (IPC::CFRetainPtrArgumentCoder::encode):
+        * Shared/mac/ColorSpaceData.mm:
+        (WebKit::ColorSpaceData::encode const):
+        (WebKit::ColorSpaceData::decode):
+        (): Deleted.
+        * Shared/mac/SecItemRequestData.cpp:
+        (WebKit::SecItemRequestData::encode const):
+        (WebKit::SecItemRequestData::decode):
+        * Shared/mac/SecItemResponseData.cpp:
+        (WebKit::SecItemResponseData::encode const):
+        (WebKit::SecItemResponseData::decode):
+        * Shared/mac/WebCoreArgumentCodersMac.mm:
+        (IPC::ArgumentCoder<WebCore::CertificateInfo>::encode):
+        (IPC::ArgumentCoder<WebCore::CertificateInfo>::decode):
+        (IPC::encodeNSError):
+        (IPC::decodeNSError):
+        (IPC::ArgumentCoder<WebCore::ContentFilterUnblockHandler>::encode):
+        (IPC::ArgumentCoder<WebCore::ContentFilterUnblockHandler>::decode):
+
 2021-05-21  Wenson Hsieh  <wenson_hs...@apple.com>
 
         [macOS] Adopt QLItem in WKImageExtractionPreviewController

Modified: trunk/Source/WebKit/NetworkProcess/NetworkProcessCreationParameters.cpp (277905 => 277906)


--- trunk/Source/WebKit/NetworkProcess/NetworkProcessCreationParameters.cpp	2021-05-22 02:07:17 UTC (rev 277905)
+++ trunk/Source/WebKit/NetworkProcess/NetworkProcessCreationParameters.cpp	2021-05-22 02:23:42 UTC (rev 277906)
@@ -57,7 +57,7 @@
     encoder << urlSchemesRegisteredForCustomProtocols;
 #if PLATFORM(COCOA)
     encoder << uiProcessBundleIdentifier;
-    IPC::encode(encoder, networkATSContext.get());
+    encoder << networkATSContext;
 #endif
 #if USE(SOUP)
     encoder << cookieAcceptPolicy;
@@ -115,7 +115,7 @@
 #if PLATFORM(COCOA)
     if (!decoder.decode(result.uiProcessBundleIdentifier))
         return false;
-    if (!IPC::decode(decoder, result.networkATSContext))
+    if (!decoder.decode(result.networkATSContext))
         return false;
 #endif
 

Modified: trunk/Source/WebKit/NetworkProcess/NetworkSessionCreationParameters.cpp (277905 => 277906)


--- trunk/Source/WebKit/NetworkProcess/NetworkSessionCreationParameters.cpp	2021-05-22 02:07:17 UTC (rev 277905)
+++ trunk/Source/WebKit/NetworkProcess/NetworkSessionCreationParameters.cpp	2021-05-22 02:23:42 UTC (rev 277906)
@@ -44,7 +44,7 @@
     encoder << boundInterfaceIdentifier;
     encoder << allowsCellularAccess;
 #if PLATFORM(COCOA)
-    IPC::encode(encoder, proxyConfiguration.get());
+    encoder << proxyConfiguration;
     encoder << sourceApplicationBundleIdentifier;
     encoder << sourceApplicationSecondaryIdentifier;
     encoder << attributedBundleIdentifier;
@@ -108,7 +108,7 @@
     
 #if PLATFORM(COCOA)
     RetainPtr<CFDictionaryRef> proxyConfiguration;
-    if (!IPC::decode(decoder, proxyConfiguration))
+    if (!decoder.decode(proxyConfiguration))
         return WTF::nullopt;
     
     Optional<String> sourceApplicationBundleIdentifier;

Modified: trunk/Source/WebKit/Shared/Cocoa/ArgumentCodersCocoa.mm (277905 => 277906)


--- trunk/Source/WebKit/Shared/Cocoa/ArgumentCodersCocoa.mm	2021-05-22 02:07:17 UTC (rev 277905)
+++ trunk/Source/WebKit/Shared/Cocoa/ArgumentCodersCocoa.mm	2021-05-22 02:23:42 UTC (rev 277906)
@@ -306,13 +306,13 @@
 
 static inline void encodeDataInternal(Encoder& encoder, NSData *data)
 {
-    encode(encoder, (__bridge CFDataRef)data);
+    encoder << (__bridge CFDataRef)data;
 }
 
 static inline Optional<RetainPtr<id>> decodeDataInternal(Decoder& decoder)
 {
     RetainPtr<CFDataRef> data;
-    if (!decode(decoder, data))
+    if (!decoder.decode(data))
         return WTF::nullopt;
     return { adoptNS((NSData *)data.leakRef()) };
 }
@@ -321,13 +321,13 @@
 
 static inline void encodeDateInternal(Encoder& encoder, NSDate *date)
 {
-    encode(encoder, (__bridge CFDateRef)date);
+    encoder << (__bridge CFDateRef)date;
 }
 
 static inline Optional<RetainPtr<id>> decodeDateInternal(Decoder& decoder)
 {
     RetainPtr<CFDateRef> date;
-    if (!decode(decoder, date))
+    if (!decoder.decode(date))
         return WTF::nullopt;
     return { adoptNS((NSDate *)date.leakRef()) };
 }
@@ -414,13 +414,13 @@
 
 static inline void encodeNumberInternal(Encoder& encoder, NSNumber *number)
 {
-    encode(encoder, (__bridge CFNumberRef)number);
+    encoder << (__bridge CFNumberRef)number;
 }
 
 static inline Optional<RetainPtr<id>> decodeNumberInternal(Decoder& decoder)
 {
     RetainPtr<CFNumberRef> number;
-    if (!decode(decoder, number))
+    if (!decoder.decode(number))
         return WTF::nullopt;
     return { adoptNS((NSNumber *)number.leakRef()) };
 }
@@ -438,7 +438,7 @@
     [archiver finishEncoding];
     [archiver setDelegate:nil];
 
-    encode(encoder, (__bridge CFDataRef)[archiver encodedData]);
+    encoder << (__bridge CFDataRef)[archiver encodedData];
 }
 
 static Optional<RetainPtr<id>> decodeSecureCodingInternal(Decoder& decoder, NSArray<Class> *allowedClasses)
@@ -448,7 +448,7 @@
         return WTF::nullopt;
 
     RetainPtr<CFDataRef> data;
-    if (!decode(decoder, data))
+    if (!decoder.decode(data))
         return WTF::nullopt;
 
     auto unarchiver = adoptNS([[NSKeyedUnarchiver alloc] initForReadingFromData:(__bridge NSData *)data.get() error:nullptr]);
@@ -477,13 +477,13 @@
 
 static inline void encodeStringInternal(Encoder& encoder, NSString *string)
 {
-    encode(encoder, (__bridge CFStringRef)string);
+    encoder << (__bridge CFStringRef)string;
 }
 
 static inline Optional<RetainPtr<id>> decodeStringInternal(Decoder& decoder)
 {
     RetainPtr<CFStringRef> string;
-    if (!decode(decoder, string))
+    if (!decoder.decode(string))
         return WTF::nullopt;
     return { adoptNS((NSString *)string.leakRef()) };
 }
@@ -492,13 +492,13 @@
 
 static inline void encodeURLInternal(Encoder& encoder, NSURL *URL)
 {
-    encode(encoder, (__bridge CFURLRef)URL);
+    encoder << (__bridge CFURLRef)URL;
 }
 
 static inline Optional<RetainPtr<id>> decodeURLInternal(Decoder& decoder)
 {
     RetainPtr<CFURLRef> URL;
-    if (!decode(decoder, URL))
+    if (!decoder.decode(URL))
         return WTF::nullopt;
     return { adoptNS((NSURL *)URL.leakRef()) };
 }

Modified: trunk/Source/WebKit/Shared/Cocoa/WebCoreArgumentCodersCocoa.mm (277905 => 277906)


--- trunk/Source/WebKit/Shared/Cocoa/WebCoreArgumentCodersCocoa.mm	2021-05-22 02:07:17 UTC (rev 277905)
+++ trunk/Source/WebKit/Shared/Cocoa/WebCoreArgumentCodersCocoa.mm	2021-05-22 02:23:42 UTC (rev 277906)
@@ -431,7 +431,7 @@
     auto ctFont = platformData.font();
     auto fontDescriptor = adoptCF(CTFontCopyFontDescriptor(ctFont));
     auto attributes = adoptCF(CTFontDescriptorCopyAttributes(fontDescriptor.get()));
-    IPC::encode(encoder, attributes.get());
+    encoder << attributes;
 
     const auto& creationData = platformData.creationData();
     encoder << static_cast<bool>(creationData);
@@ -499,8 +499,9 @@
     if (!syntheticOblique.hasValue())
         return WTF::nullopt;
 
-    RetainPtr<CFDictionaryRef> attributes;
-    if (!IPC::decode(decoder, attributes))
+    Optional<RetainPtr<CFDictionaryRef>> attributes;
+    decoder >> attributes;
+    if (!attributes)
         return WTF::nullopt;
 
     Optional<bool> includesCreationData;
@@ -525,7 +526,7 @@
         auto baseFontDescriptor = fontCustomPlatformData->fontDescriptor.get();
         if (!baseFontDescriptor)
             return WTF::nullopt;
-        auto fontDescriptor = adoptCF(CTFontDescriptorCreateCopyWithAttributes(baseFontDescriptor, attributes.get()));
+        auto fontDescriptor = adoptCF(CTFontDescriptorCreateCopyWithAttributes(baseFontDescriptor, attributes->get()));
         auto ctFont = adoptCF(CTFontCreateWithFontDescriptor(fontDescriptor.get(), size.value(), nullptr));
 
         auto creationData = FontPlatformData::CreationData { fontFaceData.value(), itemInCollection.value() };
@@ -545,7 +546,7 @@
     RetainPtr<CTFontDescriptorRef> fontDescriptor = findFontDescriptor(referenceURL.value(), postScriptName.value());
     if (!fontDescriptor)
         return WTF::nullopt;
-    fontDescriptor = adoptCF(CTFontDescriptorCreateCopyWithAttributes(fontDescriptor.get(), attributes.get()));
+    fontDescriptor = adoptCF(CTFontDescriptorCreateCopyWithAttributes(fontDescriptor.get(), attributes->get()));
     auto ctFont = adoptCF(CTFontCreateWithFontDescriptor(fontDescriptor.get(), size.value(), nullptr));
 
     return FontPlatformData(ctFont.get(), size.value(), syntheticBold.value(), syntheticOblique.value(), orientation.value(), widthVariant.value(), textRenderingMode.value());

Modified: trunk/Source/WebKit/Shared/FontInfo.cpp (277905 => 277906)


--- trunk/Source/WebKit/Shared/FontInfo.cpp	2021-05-22 02:07:17 UTC (rev 277905)
+++ trunk/Source/WebKit/Shared/FontInfo.cpp	2021-05-22 02:23:42 UTC (rev 277906)
@@ -39,7 +39,7 @@
 #if PLATFORM(COCOA)
     encoder << static_cast<bool>(fontAttributeDictionary);
     if (fontAttributeDictionary)
-        IPC::encode(encoder, fontAttributeDictionary.get());
+        encoder << fontAttributeDictionary;
 #else
     UNUSED_PARAM(encoder);
 #endif
@@ -55,7 +55,7 @@
     if (!hasFontAttributeDictionary)
         return true;
 
-    if (!IPC::decode(decoder, fontInfo.fontAttributeDictionary))
+    if (!decoder.decode(fontInfo.fontAttributeDictionary))
         return false;
 #else
     UNUSED_PARAM(decoder);

Modified: trunk/Source/WebKit/Shared/Plugins/PluginProcessCreationParameters.cpp (277905 => 277906)


--- trunk/Source/WebKit/Shared/Plugins/PluginProcessCreationParameters.cpp	2021-05-22 02:07:17 UTC (rev 277905)
+++ trunk/Source/WebKit/Shared/Plugins/PluginProcessCreationParameters.cpp	2021-05-22 02:23:42 UTC (rev 277906)
@@ -46,7 +46,7 @@
     encoder << terminationTimeout;
 #if PLATFORM(COCOA)
     encoder << acceleratedCompositingPort;
-    IPC::encode(encoder, networkATSContext.get());
+    encoder << networkATSContext;
 #endif
 }
 
@@ -61,7 +61,7 @@
 #if PLATFORM(COCOA)
     if (!decoder.decode(result.acceleratedCompositingPort))
         return false;
-    if (!IPC::decode(decoder, result.networkATSContext))
+    if (!decoder.decode(result.networkATSContext))
         return false;
 #endif
 

Modified: trunk/Source/WebKit/Shared/WebProcessCreationParameters.cpp (277905 => 277906)


--- trunk/Source/WebKit/Shared/WebProcessCreationParameters.cpp	2021-05-22 02:07:17 UTC (rev 277905)
+++ trunk/Source/WebKit/Shared/WebProcessCreationParameters.cpp	2021-05-22 02:23:42 UTC (rev 277906)
@@ -129,7 +129,7 @@
 #endif
 
 #if PLATFORM(COCOA)
-    IPC::encode(encoder, networkATSContext.get());
+    encoder << networkATSContext;
 #endif
 
 #if PLATFORM(WAYLAND)
@@ -387,7 +387,7 @@
 #endif
 
 #if PLATFORM(COCOA)
-    if (!IPC::decode(decoder, parameters.networkATSContext))
+    if (!decoder.decode(parameters.networkATSContext))
         return false;
 #endif
 

Modified: trunk/Source/WebKit/Shared/cf/ArgumentCodersCF.cpp (277905 => 277906)


--- trunk/Source/WebKit/Shared/cf/ArgumentCodersCF.cpp	2021-05-22 02:07:17 UTC (rev 277905)
+++ trunk/Source/WebKit/Shared/cf/ArgumentCodersCF.cpp	2021-05-22 02:23:42 UTC (rev 277906)
@@ -32,6 +32,8 @@
 #include "DataReference.h"
 #include "Decoder.h"
 #include "Encoder.h"
+#include "StreamConnectionEncoder.h"
+#include <CoreGraphics/CoreGraphics.h>
 #include <wtf/EnumTraits.h>
 #include <wtf/HashSet.h>
 #include <wtf/ProcessPrivilege.h>
@@ -72,6 +74,7 @@
 #if HAVE(SEC_TRUST_SERIALIZATION)
     SecTrust,
 #endif
+    CGColorSpace,
     Nullptr,
     Unknown,
 };
@@ -102,6 +105,8 @@
         return CFType::CFString;
     if (typeID == CFURLGetTypeID())
         return CFType::CFURL;
+    if (typeID == CGColorSpaceGetTypeID())
+        return CFType::CGColorSpace;
     if (typeID == SecCertificateGetTypeID())
         return CFType::SecCertificate;
 #if HAVE(SEC_KEYCHAIN)
@@ -121,54 +126,59 @@
     return CFType::Unknown;
 }
 
-void encode(Encoder& encoder, CFTypeRef typeRef)
+
+template<typename Encoder>
+void ArgumentCoder<CFTypeRef>::encode(Encoder& encoder, CFTypeRef typeRef)
 {
-    CFType type = typeFromCFTypeRef(typeRef);
+    auto type = typeFromCFTypeRef(typeRef);
     encoder << type;
 
     switch (type) {
     case CFType::CFArray:
-        encode(encoder, static_cast<CFArrayRef>(typeRef));
+        encoder << static_cast<CFArrayRef>(typeRef);
         return;
     case CFType::CFBoolean:
-        encode(encoder, static_cast<CFBooleanRef>(typeRef));
+        encoder << static_cast<CFBooleanRef>(typeRef);
         return;
     case CFType::CFData:
-        encode(encoder, static_cast<CFDataRef>(typeRef));
+        encoder << static_cast<CFDataRef>(typeRef);
         return;
     case CFType::CFDate:
-        encode(encoder, static_cast<CFDateRef>(typeRef));
+        encoder << static_cast<CFDateRef>(typeRef);
         return;
     case CFType::CFDictionary:
-        encode(encoder, static_cast<CFDictionaryRef>(typeRef));
+        encoder << static_cast<CFDictionaryRef>(typeRef);
         return;
     case CFType::CFNull:
         return;
     case CFType::CFNumber:
-        encode(encoder, static_cast<CFNumberRef>(typeRef));
+        encoder << static_cast<CFNumberRef>(typeRef);
         return;
     case CFType::CFString:
-        encode(encoder, static_cast<CFStringRef>(typeRef));
+        encoder << static_cast<CFStringRef>(typeRef);
         return;
     case CFType::CFURL:
-        encode(encoder, static_cast<CFURLRef>(typeRef));
+        encoder << static_cast<CFURLRef>(typeRef);
         return;
+    case CFType::CGColorSpace:
+        encoder << static_cast<CGColorSpaceRef>(const_cast<void*>(typeRef));
+        return;
     case CFType::SecCertificate:
-        encode(encoder, static_cast<SecCertificateRef>(const_cast<void*>(typeRef)));
+        encoder << static_cast<SecCertificateRef>(const_cast<void*>(typeRef));
         return;
 #if HAVE(SEC_KEYCHAIN)
     case CFType::SecKeychainItem:
-        encode(encoder, static_cast<SecKeychainItemRef>(const_cast<void*>(typeRef)));
+        encoder << static_cast<SecKeychainItemRef>(const_cast<void*>(typeRef));
         return;
 #endif
 #if HAVE(SEC_ACCESS_CONTROL)
     case CFType::SecAccessControl:
-        encode(encoder, static_cast<SecAccessControlRef>(const_cast<void*>(typeRef)));
+        encoder << static_cast<SecAccessControlRef>(const_cast<void*>(typeRef));
         return;
 #endif
 #if HAVE(SEC_TRUST_SERIALIZATION)
     case CFType::SecTrust:
-        encode(encoder, static_cast<SecTrustRef>(const_cast<void*>(typeRef)));
+        encoder << static_cast<SecTrustRef>(const_cast<void*>(typeRef));
         return;
 #endif
     case CFType::Nullptr:
@@ -180,46 +190,50 @@
     ASSERT_NOT_REACHED();
 }
 
-bool decode(Decoder& decoder, RetainPtr<CFTypeRef>& result)
+template void ArgumentCoder<CFTypeRef>::encode<Encoder>(Encoder&, CFTypeRef);
+template void ArgumentCoder<CFTypeRef>::encode<StreamConnectionEncoder>(StreamConnectionEncoder&, CFTypeRef);
+
+bool ArgumentCoder<RetainPtr<CFTypeRef>>::decode(Decoder& decoder, RetainPtr<CFTypeRef>& result)
 {
-    CFType type;
-    if (!decoder.decode(type))
+    Optional<CFType> type;
+    decoder >> type;
+    if (!type)
         return false;
 
-    switch (type) {
+    switch (*type) {
     case CFType::CFArray: {
         RetainPtr<CFArrayRef> array;
-        if (!decode(decoder, array))
+        if (!decoder.decode(array))
             return false;
-        result = adoptCF(array.leakRef());
+        result = WTFMove(array);
         return true;
     }
     case CFType::CFBoolean: {
         RetainPtr<CFBooleanRef> boolean;
-        if (!decode(decoder, boolean))
+        if (!decoder.decode(boolean))
             return false;
-        result = adoptCF(boolean.leakRef());
+        result = WTFMove(boolean);
         return true;
     }
     case CFType::CFData: {
         RetainPtr<CFDataRef> data;
-        if (!decode(decoder, data))
+        if (!decoder.decode(data))
             return false;
-        result = adoptCF(data.leakRef());
+        result = WTFMove(data);
         return true;
     }
     case CFType::CFDate: {
         RetainPtr<CFDateRef> date;
-        if (!decode(decoder, date))
+        if (!decoder.decode(date))
             return false;
-        result = adoptCF(date.leakRef());
+        result = WTFMove(date);
         return true;
     }
     case CFType::CFDictionary: {
         RetainPtr<CFDictionaryRef> dictionary;
-        if (!decode(decoder, dictionary))
+        if (!decoder.decode(dictionary))
             return false;
-        result = adoptCF(dictionary.leakRef());
+        result = WTFMove(dictionary);
         return true;
     }
     case CFType::CFNull:
@@ -227,38 +241,45 @@
         return true;
     case CFType::CFNumber: {
         RetainPtr<CFNumberRef> number;
-        if (!decode(decoder, number))
+        if (!decoder.decode(number))
             return false;
-        result = adoptCF(number.leakRef());
+        result = WTFMove(number);
         return true;
     }
     case CFType::CFString: {
         RetainPtr<CFStringRef> string;
-        if (!decode(decoder, string))
+        if (!decoder.decode(string))
             return false;
-        result = adoptCF(string.leakRef());
+        result = WTFMove(string);
         return true;
     }
     case CFType::CFURL: {
         RetainPtr<CFURLRef> url;
-        if (!decode(decoder, url))
+        if (!decoder.decode(url))
             return false;
-        result = adoptCF(url.leakRef());
+        result = WTFMove(url);
         return true;
     }
+    case CFType::CGColorSpace: {
+        RetainPtr<CGColorSpaceRef> colorSpace;
+        if (!decoder.decode(colorSpace))
+            return false;
+        result = WTFMove(colorSpace);
+        return true;
+    }
     case CFType::SecCertificate: {
         RetainPtr<SecCertificateRef> certificate;
-        if (!decode(decoder, certificate))
+        if (!decoder.decode(certificate))
             return false;
-        result = adoptCF(certificate.leakRef());
+        result = WTFMove(certificate);
         return true;
     }
 #if HAVE(SEC_KEYCHAIN)
     case CFType::SecKeychainItem: {
         RetainPtr<SecKeychainItemRef> keychainItem;
-        if (!decode(decoder, keychainItem))
+        if (!decoder.decode(keychainItem))
             return false;
-        result = adoptCF(keychainItem.leakRef());
+        result = WTFMove(keychainItem);
         return true;
     }
 #endif
@@ -265,9 +286,9 @@
 #if HAVE(SEC_ACCESS_CONTROL)
     case CFType::SecAccessControl: {
         RetainPtr<SecAccessControlRef> accessControl;
-        if (!decode(decoder, accessControl))
+        if (!decoder.decode(accessControl))
             return false;
-        result = adoptCF(accessControl.leakRef());
+        result = WTFMove(accessControl);
         return true;
     }
 #endif
@@ -274,9 +295,9 @@
 #if HAVE(SEC_TRUST_SERIALIZATION)
     case CFType::SecTrust: {
         RetainPtr<SecTrustRef> trust;
-        if (!decode(decoder, trust))
+        if (!decoder.decode(trust))
             return false;
-        result = adoptCF(trust.leakRef());
+        result = WTFMove(trust);
         return true;
     }
 #endif
@@ -291,7 +312,8 @@
     return false;
 }
 
-void encode(Encoder& encoder, CFArrayRef array)
+template<typename Encoder>
+void ArgumentCoder<CFArrayRef>::encode(Encoder& encoder, CFArrayRef array)
 {
     if (!array) {
         encoder << true;
@@ -318,11 +340,14 @@
     for (CFIndex i = 0; i < size; ++i) {
         if (invalidIndicies.contains(i))
             continue;
-        encode(encoder, values[i]);
+        encoder << values[i];
     }
 }
 
-bool decode(Decoder& decoder, RetainPtr<CFArrayRef>& result)
+template void ArgumentCoder<CFArrayRef>::encode<Encoder>(Encoder&, CFArrayRef);
+template void ArgumentCoder<CFArrayRef>::encode<StreamConnectionEncoder>(StreamConnectionEncoder&, CFArrayRef);
+
+bool ArgumentCoder<RetainPtr<CFArrayRef>>::decode(Decoder& decoder, RetainPtr<CFArrayRef>& result)
 {
     bool isNull = false;
     if (!decoder.decode(isNull))
@@ -341,7 +366,7 @@
 
     for (size_t i = 0; i < size; ++i) {
         RetainPtr<CFTypeRef> element;
-        if (!decode(decoder, element))
+        if (!decoder.decode(element))
             return false;
 
         if (!element)
@@ -354,12 +379,16 @@
     return true;
 }
 
-void encode(Encoder& encoder, CFBooleanRef boolean)
+template<typename Encoder>
+void ArgumentCoder<CFBooleanRef>::encode(Encoder& encoder, CFBooleanRef boolean)
 {
     encoder << static_cast<bool>(CFBooleanGetValue(boolean));
 }
 
-bool decode(Decoder& decoder, RetainPtr<CFBooleanRef>& result)
+template void ArgumentCoder<CFBooleanRef>::encode<Encoder>(Encoder&, CFBooleanRef);
+template void ArgumentCoder<CFBooleanRef>::encode<StreamConnectionEncoder>(StreamConnectionEncoder&, CFBooleanRef);
+
+bool ArgumentCoder<RetainPtr<CFBooleanRef>>::decode(Decoder& decoder, RetainPtr<CFBooleanRef>& result)
 {
     bool boolean;
     if (!decoder.decode(boolean))
@@ -369,15 +398,16 @@
     return true;
 }
 
-void encode(Encoder& encoder, CFDataRef data)
+template<typename Encoder>
+void ArgumentCoder<CFDataRef>::encode(Encoder& encoder, CFDataRef data)
 {
-    CFIndex length = CFDataGetLength(data);
-    const UInt8* bytePtr = CFDataGetBytePtr(data);
-
-    encoder << IPC::DataReference(bytePtr, length);
+    encoder << IPC::DataReference(CFDataGetBytePtr(data), CFDataGetLength(data));
 }
 
-bool decode(Decoder& decoder, RetainPtr<CFDataRef>& result)
+template void ArgumentCoder<CFDataRef>::encode<Encoder>(Encoder&, CFDataRef);
+template void ArgumentCoder<CFDataRef>::encode<StreamConnectionEncoder>(StreamConnectionEncoder&, CFDataRef);
+
+bool ArgumentCoder<RetainPtr<CFDataRef>>::decode(Decoder& decoder, RetainPtr<CFDataRef>& result)
 {
     IPC::DataReference dataReference;
     if (!decoder.decode(dataReference))
@@ -387,12 +417,16 @@
     return true;
 }
 
-void encode(Encoder& encoder, CFDateRef date)
+template<typename Encoder>
+void ArgumentCoder<CFDateRef>::encode(Encoder& encoder, CFDateRef date)
 {
     encoder << static_cast<double>(CFDateGetAbsoluteTime(date));
 }
 
-bool decode(Decoder& decoder, RetainPtr<CFDateRef>& result)
+template void ArgumentCoder<CFDateRef>::encode<Encoder>(Encoder&, CFDateRef);
+template void ArgumentCoder<CFDateRef>::encode<StreamConnectionEncoder>(StreamConnectionEncoder&, CFDateRef);
+
+bool ArgumentCoder<RetainPtr<CFDateRef>>::decode(Decoder& decoder, RetainPtr<CFDateRef>& result)
 {
     double absoluteTime;
     if (!decoder.decode(absoluteTime))
@@ -402,7 +436,8 @@
     return true;
 }
 
-void encode(Encoder& encoder, CFDictionaryRef dictionary)
+template<typename Encoder>
+void ArgumentCoder<CFDictionaryRef>::encode(Encoder& encoder, CFDictionaryRef dictionary)
 {
     if (!dictionary) {
         encoder << true;
@@ -435,12 +470,14 @@
         if (invalidKeys.contains(keys[i]))
             continue;
 
-        encode(encoder, keys[i]);
-        encode(encoder, values[i]);
+        encoder << keys[i] << values[i];
     }
 }
 
-bool decode(Decoder& decoder, RetainPtr<CFDictionaryRef>& result)
+template void ArgumentCoder<CFDictionaryRef>::encode<Encoder>(Encoder&, CFDictionaryRef);
+template void ArgumentCoder<CFDictionaryRef>::encode<StreamConnectionEncoder>(StreamConnectionEncoder&, CFDictionaryRef);
+
+bool ArgumentCoder<RetainPtr<CFDictionaryRef>>::decode(Decoder& decoder, RetainPtr<CFDictionaryRef>& result)
 {
     bool isNull = false;
     if (!decoder.decode(isNull))
@@ -458,21 +495,22 @@
     RetainPtr<CFMutableDictionaryRef> dictionary = adoptCF(CFDictionaryCreateMutable(0, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks));
     for (uint64_t i = 0; i < size; ++i) {
         RetainPtr<CFTypeRef> key;
-        if (!decode(decoder, key) || !key)
+        if (!decoder.decode(key) || !key)
             return false;
 
         RetainPtr<CFTypeRef> value;
-        if (!decode(decoder, value) || !value)
+        if (!decoder.decode(value) || !value)
             return false;
 
         CFDictionarySetValue(dictionary.get(), key.get(), value.get());
     }
 
-    result = adoptCF(dictionary.leakRef());
+    result = WTFMove(dictionary);
     return true;
 }
 
-void encode(Encoder& encoder, CFNumberRef number)
+template<typename Encoder>
+void ArgumentCoder<CFNumberRef>::encode(Encoder& encoder, CFNumberRef number)
 {
     CFNumberType numberType = CFNumberGetType(number);
 
@@ -480,10 +518,12 @@
     bool result = CFNumberGetValue(number, numberType, buffer.data());
     ASSERT_UNUSED(result, result);
 
-    encoder << static_cast<uint8_t>(numberType);
-    encoder << IPC::DataReference(buffer);
+    encoder << static_cast<uint8_t>(numberType) << IPC::DataReference(buffer);
 }
 
+template void ArgumentCoder<CFNumberRef>::encode<Encoder>(Encoder&, CFNumberRef);
+template void ArgumentCoder<CFNumberRef>::encode<StreamConnectionEncoder>(StreamConnectionEncoder&, CFNumberRef);
+
 static size_t sizeForNumberType(CFNumberType numberType)
 {
     switch (numberType) {
@@ -524,7 +564,7 @@
     return 0;
 }
 
-bool decode(Decoder& decoder, RetainPtr<CFNumberRef>& result)
+bool ArgumentCoder<RetainPtr<CFNumberRef>>::decode(Decoder& decoder, RetainPtr<CFNumberRef>& result)
 {
     Optional<uint8_t> numberTypeFromIPC;
     decoder >> numberTypeFromIPC;
@@ -546,7 +586,8 @@
     return true;
 }
 
-void encode(Encoder& encoder, CFStringRef string)
+template<typename Encoder>
+void ArgumentCoder<CFStringRef>::encode(Encoder& encoder, CFStringRef string)
 {
     CFIndex length = CFStringGetLength(string);
     CFStringEncoding encoding = CFStringGetFastestEncoding(string);
@@ -561,11 +602,13 @@
     numConvertedBytes = CFStringGetBytes(string, range, encoding, 0, false, buffer.data(), buffer.size(), &bufferLength);
     ASSERT(numConvertedBytes == length);
 
-    encoder << static_cast<uint32_t>(encoding);
-    encoder << IPC::DataReference(buffer);
+    encoder << static_cast<uint32_t>(encoding) << IPC::DataReference(buffer);
 }
 
-bool decode(Decoder& decoder, RetainPtr<CFStringRef>& result)
+template void ArgumentCoder<CFStringRef>::encode<Encoder>(Encoder&, CFStringRef);
+template void ArgumentCoder<CFStringRef>::encode<StreamConnectionEncoder>(StreamConnectionEncoder&, CFStringRef);
+
+bool ArgumentCoder<RetainPtr<CFStringRef>>::decode(Decoder& decoder, RetainPtr<CFStringRef>& result)
 {
     Optional<uint32_t> encodingFromIPC;
     decoder >> encodingFromIPC;
@@ -588,20 +631,23 @@
     return true;
 }
 
-void encode(Encoder& encoder, CFURLRef url)
+template<typename Encoder>
+void ArgumentCoder<CFURLRef>::encode(Encoder& encoder, CFURLRef url)
 {
     CFURLRef baseURL = CFURLGetBaseURL(url);
     encoder << static_cast<bool>(baseURL);
     if (baseURL)
-        encode(encoder, baseURL);
+        encoder << baseURL;
 
     WTF::URLCharBuffer urlBytes;
     WTF::getURLBytes(url, urlBytes);
-    IPC::DataReference dataReference(reinterpret_cast<const uint8_t*>(urlBytes.data()), urlBytes.size());
-    encoder << dataReference;
+    encoder << IPC::DataReference(reinterpret_cast<const uint8_t*>(urlBytes.data()), urlBytes.size());
 }
 
-bool decode(Decoder& decoder, RetainPtr<CFURLRef>& result)
+template void ArgumentCoder<CFURLRef>::encode<Encoder>(Encoder&, CFURLRef);
+template void ArgumentCoder<CFURLRef>::encode<StreamConnectionEncoder>(StreamConnectionEncoder&, CFURLRef);
+
+bool ArgumentCoder<RetainPtr<CFURLRef>>::decode(Decoder& decoder, RetainPtr<CFURLRef>& result)
 {
     RetainPtr<CFURLRef> baseURL;
     bool hasBaseURL;
@@ -608,7 +654,7 @@
     if (!decoder.decode(hasBaseURL))
         return false;
     if (hasBaseURL) {
-        if (!decode(decoder, baseURL))
+        if (!decoder.decode(baseURL))
             return false;
     }
 
@@ -631,16 +677,73 @@
     return result;
 }
 
-void encode(Encoder& encoder, SecCertificateRef certificate)
+enum class CGColorSpaceEncodingScheme { Name, PropertyList };
+
+template<typename Encoder>
+void ArgumentCoder<CGColorSpaceRef>::encode(Encoder& encoder, CGColorSpaceRef colorSpace)
 {
-    RetainPtr<CFDataRef> data = ""
-    encode(encoder, data.get());
+    if (auto name = CGColorSpaceGetName(colorSpace)) {
+        encoder << CGColorSpaceEncodingScheme::Name << name;
+        return;
+    }
+
+    encoder << CGColorSpaceEncodingScheme::PropertyList << adoptCF(CGColorSpaceCopyPropertyList(colorSpace));
 }
 
-bool decode(Decoder& decoder, RetainPtr<SecCertificateRef>& result)
+template void ArgumentCoder<CGColorSpaceRef>::encode<Encoder>(Encoder&, CGColorSpaceRef);
+template void ArgumentCoder<CGColorSpaceRef>::encode<StreamConnectionEncoder>(StreamConnectionEncoder&, CGColorSpaceRef);
+
+bool ArgumentCoder<RetainPtr<CGColorSpaceRef>>::decode(Decoder& decoder, RetainPtr<CGColorSpaceRef>& result)
 {
+    CGColorSpaceEncodingScheme encodingScheme;
+    if (!decoder.decode(encodingScheme))
+        return false;
+
+    switch (encodingScheme) {
+    case CGColorSpaceEncodingScheme::Name: {
+        RetainPtr<CFStringRef> name;
+        if (!decoder.decode(name))
+            return false;
+
+        auto colorSpace = adoptCF(CGColorSpaceCreateWithName(name.get()));
+        if (!colorSpace)
+            return false;
+
+        result = WTFMove(colorSpace);
+        return true;
+    }
+    case CGColorSpaceEncodingScheme::PropertyList: {
+        RetainPtr<CFTypeRef> propertyList;
+        if (!decoder.decode(propertyList))
+            return false;
+
+        auto colorSpace = adoptCF(CGColorSpaceCreateWithPropertyList(propertyList.get()));
+        if (!colorSpace)
+            return false;
+
+        result = WTFMove(colorSpace);
+        return true;
+    }
+    }
+
+    ASSERT_NOT_REACHED();
+    return false;
+}
+
+
+template<typename Encoder>
+void ArgumentCoder<SecCertificateRef>::encode(Encoder& encoder, SecCertificateRef certificate)
+{
+    encoder << adoptCF(SecCertificateCopyData(certificate));
+}
+
+template void ArgumentCoder<SecCertificateRef>::encode<Encoder>(Encoder&, SecCertificateRef);
+template void ArgumentCoder<SecCertificateRef>::encode<StreamConnectionEncoder>(StreamConnectionEncoder&, SecCertificateRef);
+
+bool ArgumentCoder<RetainPtr<SecCertificateRef>>::decode(Decoder& decoder, RetainPtr<SecCertificateRef>& result)
+{
     RetainPtr<CFDataRef> data;
-    if (!decode(decoder, data))
+    if (!decoder.decode(data))
         return false;
 
     result = adoptCF(SecCertificateCreateWithData(0, data.get()));
@@ -648,23 +751,27 @@
 }
 
 #if HAVE(SEC_KEYCHAIN)
-void encode(Encoder& encoder, SecKeychainItemRef keychainItem)
+template<typename Encoder>
+void ArgumentCoder<SecKeychainItemRef>::encode(Encoder& encoder, SecKeychainItemRef keychainItem)
 {
     RELEASE_ASSERT(hasProcessPrivilege(ProcessPrivilege::CanAccessCredentials));
 
     CFDataRef data;
     if (SecKeychainItemCreatePersistentReference(keychainItem, &data) == errSecSuccess) {
-        encode(encoder, data);
+        encoder << data;
         CFRelease(data);
     }
 }
 
-bool decode(Decoder& decoder, RetainPtr<SecKeychainItemRef>& result)
+template void ArgumentCoder<SecKeychainItemRef>::encode<Encoder>(Encoder&, SecKeychainItemRef);
+template void ArgumentCoder<SecKeychainItemRef>::encode<StreamConnectionEncoder>(StreamConnectionEncoder&, SecKeychainItemRef);
+
+bool ArgumentCoder<RetainPtr<SecKeychainItemRef>>::decode(Decoder& decoder, RetainPtr<SecKeychainItemRef>& result)
 {
     RELEASE_ASSERT(hasProcessPrivilege(ProcessPrivilege::CanAccessCredentials));
 
     RetainPtr<CFDataRef> data;
-    if (!IPC::decode(decoder, data))
+    if (!decoder.decode(data))
         return false;
 
     CFDataRef dref = data.get();
@@ -682,17 +789,21 @@
 #endif
 
 #if HAVE(SEC_ACCESS_CONTROL)
-void encode(Encoder& encoder, SecAccessControlRef accessControl)
+template<typename Encoder>
+void ArgumentCoder<SecAccessControlRef>::encode(Encoder& encoder, SecAccessControlRef accessControl)
 {
-    RetainPtr<CFDataRef> data = ""
+    auto data = ""
     if (data)
-        encode(encoder, data.get());
+        encoder << data;
 }
 
-bool decode(Decoder& decoder, RetainPtr<SecAccessControlRef>& result)
+template void ArgumentCoder<SecAccessControlRef>::encode<Encoder>(Encoder&, SecAccessControlRef);
+template void ArgumentCoder<SecAccessControlRef>::encode<StreamConnectionEncoder>(StreamConnectionEncoder&, SecAccessControlRef);
+
+bool ArgumentCoder<RetainPtr<SecAccessControlRef>>::decode(Decoder& decoder, RetainPtr<SecAccessControlRef>& result)
 {
     RetainPtr<CFDataRef> data;
-    if (!decode(decoder, data))
+    if (!decoder.decode(data))
         return false;
 
     result = adoptCF(SecAccessControlCreateFromData(kCFAllocatorDefault, data.get(), nullptr));
@@ -704,7 +815,8 @@
 #endif
 
 #if HAVE(SEC_TRUST_SERIALIZATION)
-void encode(Encoder& encoder, SecTrustRef trust)
+template<typename Encoder>
+void ArgumentCoder<SecTrustRef>::encode(Encoder& encoder, SecTrustRef trust)
 {
     auto data = "" nullptr));
     if (!data) {
@@ -712,11 +824,13 @@
         return;
     }
 
-    encoder << true;
-    IPC::encode(encoder, data.get());
+    encoder << true << data;
 }
 
-bool decode(Decoder& decoder, RetainPtr<SecTrustRef>& result)
+template void ArgumentCoder<SecTrustRef>::encode<Encoder>(Encoder&, SecTrustRef);
+template void ArgumentCoder<SecTrustRef>::encode<StreamConnectionEncoder>(StreamConnectionEncoder&, SecTrustRef);
+
+bool ArgumentCoder<RetainPtr<SecTrustRef>>::decode(Decoder& decoder, RetainPtr<SecTrustRef>& result)
 {
     bool hasTrust;
     if (!decoder.decode(hasTrust))
@@ -726,7 +840,7 @@
         return true;
 
     RetainPtr<CFDataRef> trustData;
-    if (!IPC::decode(decoder, trustData))
+    if (!decoder.decode(trustData))
         return false;
 
     auto trust = adoptCF(SecTrustDeserialize(trustData.get(), nullptr));
@@ -744,29 +858,38 @@
 
 template<> struct EnumTraits<IPC::CFType> {
     using values = EnumValues<
-    IPC::CFType,
-    IPC::CFType::CFArray,
-    IPC::CFType::CFBoolean,
-    IPC::CFType::CFData,
-    IPC::CFType::CFDate,
-    IPC::CFType::CFDictionary,
-    IPC::CFType::CFNull,
-    IPC::CFType::CFNumber,
-    IPC::CFType::CFString,
-    IPC::CFType::CFURL,
-    IPC::CFType::SecCertificate,
+        IPC::CFType,
+        IPC::CFType::CFArray,
+        IPC::CFType::CFBoolean,
+        IPC::CFType::CFData,
+        IPC::CFType::CFDate,
+        IPC::CFType::CFDictionary,
+        IPC::CFType::CFNull,
+        IPC::CFType::CFNumber,
+        IPC::CFType::CFString,
+        IPC::CFType::CFURL,
+        IPC::CFType::SecCertificate,
 #if HAVE(SEC_KEYCHAIN)
-    IPC::CFType::SecKeychainItem,
+        IPC::CFType::SecKeychainItem,
 #endif
 #if HAVE(SEC_ACCESS_CONTROL)
-    IPC::CFType::SecAccessControl,
+        IPC::CFType::SecAccessControl,
 #endif
 #if HAVE(SEC_TRUST_SERIALIZATION)
-    IPC::CFType::SecTrust,
+        IPC::CFType::SecTrust,
 #endif
-    IPC::CFType::Nullptr,
-    IPC::CFType::Unknown
+        IPC::CFType::CGColorSpace,
+        IPC::CFType::Nullptr,
+        IPC::CFType::Unknown
     >;
 };
 
+template<> struct EnumTraits<IPC::CGColorSpaceEncodingScheme> {
+    using values = EnumValues<
+        IPC::CGColorSpaceEncodingScheme,
+        IPC::CGColorSpaceEncodingScheme::Name,
+        IPC::CGColorSpaceEncodingScheme::PropertyList
+    >;
+};
+
 } // namespace WTF

Modified: trunk/Source/WebKit/Shared/cf/ArgumentCodersCF.h (277905 => 277906)


--- trunk/Source/WebKit/Shared/cf/ArgumentCodersCF.h	2021-05-22 02:07:17 UTC (rev 277905)
+++ trunk/Source/WebKit/Shared/cf/ArgumentCodersCF.h	2021-05-22 02:23:42 UTC (rev 277906)
@@ -23,9 +23,9 @@
  * THE POSSIBILITY OF SUCH DAMAGE.
  */
 
-#ifndef ArgumentCodersCF_h
-#define ArgumentCodersCF_h
+#pragma once
 
+#include "ArgumentCoder.h"
 #include <Security/SecCertificate.h>
 #include <Security/SecTrust.h>
 #include <wtf/RetainPtr.h>
@@ -34,71 +34,156 @@
 #include <Security/SecKeychainItem.h>
 #endif
 
+typedef struct CGColorSpace* CGColorSpaceRef;
+
 namespace IPC {
 
 class Encoder;
 class Decoder;
 
+// NOTE: These coders are structured such that they expose encoder functions for both CFType and RetainPtr<CFType>
+// but only a decoder only for RetainPtr<CFType>.
+
+template<typename T>
+struct CFRetainPtrArgumentCoder {
+    template<typename Encoder> static void encode(Encoder& encoder, const RetainPtr<T>& retainPtr)
+    {
+        ArgumentCoder<T>::encode(encoder, retainPtr.get());
+    }
+};
+
+// CFTypeRef
+template<> struct ArgumentCoder<CFTypeRef> {
+    template<typename Encoder> static void encode(Encoder&, CFTypeRef);
+};
+
+template<> struct ArgumentCoder<RetainPtr<CFTypeRef>> : CFRetainPtrArgumentCoder<CFTypeRef> {
+    static WARN_UNUSED_RETURN bool decode(Decoder&, RetainPtr<CFTypeRef>&);
+};
+
 // CFArrayRef
-void encode(Encoder&, CFArrayRef);
-WARN_UNUSED_RETURN bool decode(Decoder&, RetainPtr<CFArrayRef>& result);
+template<> struct ArgumentCoder<CFArrayRef> {
+    template<typename Encoder> static void encode(Encoder&, CFArrayRef);
+};
 
+template<> struct ArgumentCoder<RetainPtr<CFArrayRef>> : CFRetainPtrArgumentCoder<CFArrayRef> {
+    static WARN_UNUSED_RETURN bool decode(Decoder&, RetainPtr<CFArrayRef>&);
+};
+
 // CFBooleanRef
-void encode(Encoder&, CFBooleanRef);
-WARN_UNUSED_RETURN bool decode(Decoder&, RetainPtr<CFBooleanRef>& result);
+template<> struct ArgumentCoder<CFBooleanRef> {
+    template<typename Encoder> static void encode(Encoder&, CFBooleanRef);
+};
 
+template<> struct ArgumentCoder<RetainPtr<CFBooleanRef>> : CFRetainPtrArgumentCoder<CFBooleanRef> {
+    static WARN_UNUSED_RETURN bool decode(Decoder&, RetainPtr<CFBooleanRef>&);
+};
+
 // CFDataRef
-void encode(Encoder&, CFDataRef);
-WARN_UNUSED_RETURN bool decode(Decoder&, RetainPtr<CFDataRef>& result);
+template<> struct ArgumentCoder<CFDataRef> {
+    template<typename Encoder> static void encode(Encoder&, CFDataRef);
+};
 
+template<> struct ArgumentCoder<RetainPtr<CFDataRef>> : CFRetainPtrArgumentCoder<CFDataRef> {
+    static WARN_UNUSED_RETURN bool decode(Decoder&, RetainPtr<CFDataRef>&);
+};
+
 // CFDateRef
-void encode(Encoder&, CFDateRef);
-WARN_UNUSED_RETURN bool decode(Decoder&, RetainPtr<CFDateRef>& result);
+template<> struct ArgumentCoder<CFDateRef> {
+    template<typename Encoder> static void encode(Encoder&, CFDateRef);
+};
 
+template<> struct ArgumentCoder<RetainPtr<CFDateRef>> : CFRetainPtrArgumentCoder<CFDateRef> {
+    static WARN_UNUSED_RETURN bool decode(Decoder&, RetainPtr<CFDateRef>&);
+};
+
 // CFDictionaryRef
-void encode(Encoder&, CFDictionaryRef);
-WARN_UNUSED_RETURN bool decode(Decoder&, RetainPtr<CFDictionaryRef>& result);
+template<> struct ArgumentCoder<CFDictionaryRef> {
+    template<typename Encoder> static void encode(Encoder&, CFDictionaryRef);
+};
 
+template<> struct ArgumentCoder<RetainPtr<CFDictionaryRef>> : CFRetainPtrArgumentCoder<CFDictionaryRef> {
+    static WARN_UNUSED_RETURN bool decode(Decoder&, RetainPtr<CFDictionaryRef>&);
+};
+
 // CFNumberRef
-void encode(Encoder&, CFNumberRef);
-WARN_UNUSED_RETURN bool decode(Decoder&, RetainPtr<CFNumberRef>& result);
+template<> struct ArgumentCoder<CFNumberRef> {
+    template<typename Encoder> static void encode(Encoder&, CFNumberRef);
+};
 
+template<> struct ArgumentCoder<RetainPtr<CFNumberRef>> : CFRetainPtrArgumentCoder<CFNumberRef> {
+    static WARN_UNUSED_RETURN bool decode(Decoder&, RetainPtr<CFNumberRef>&);
+};
+
 // CFStringRef
-void encode(Encoder&, CFStringRef);
-WARN_UNUSED_RETURN bool decode(Decoder&, RetainPtr<CFStringRef>& result);
+template<> struct ArgumentCoder<CFStringRef> {
+    template<typename Encoder> static void encode(Encoder&, CFStringRef);
+};
 
-// CFTypeRef
-void encode(Encoder&, CFTypeRef);
-WARN_UNUSED_RETURN bool decode(Decoder&, RetainPtr<CFTypeRef>& result);
+template<> struct ArgumentCoder<RetainPtr<CFStringRef>> : CFRetainPtrArgumentCoder<CFStringRef> {
+    static WARN_UNUSED_RETURN bool decode(Decoder&, RetainPtr<CFStringRef>&);
+};
 
 // CFURLRef
-void encode(Encoder&, CFURLRef);
-WARN_UNUSED_RETURN bool decode(Decoder&, RetainPtr<CFURLRef>& result);
+template<> struct ArgumentCoder<CFURLRef> {
+    template<typename Encoder> static void encode(Encoder&, CFURLRef);
+};
 
+template<> struct ArgumentCoder<RetainPtr<CFURLRef>> : CFRetainPtrArgumentCoder<CFURLRef> {
+    static WARN_UNUSED_RETURN bool decode(Decoder&, RetainPtr<CFURLRef>&);
+};
+
+// CGColorSpaceRef
+template<> struct ArgumentCoder<CGColorSpaceRef> {
+    template<typename Encoder> static void encode(Encoder&, CGColorSpaceRef);
+};
+
+template<> struct ArgumentCoder<RetainPtr<CGColorSpaceRef>> : CFRetainPtrArgumentCoder<CGColorSpaceRef> {
+    static WARN_UNUSED_RETURN bool decode(Decoder&, RetainPtr<CGColorSpaceRef>&);
+};
+
 // SecCertificateRef
-void encode(Encoder&, SecCertificateRef);
-WARN_UNUSED_RETURN bool decode(Decoder&, RetainPtr<SecCertificateRef>& result);
+template<> struct ArgumentCoder<SecCertificateRef> {
+    template<typename Encoder> static void encode(Encoder&, SecCertificateRef);
+};
 
+template<> struct ArgumentCoder<RetainPtr<SecCertificateRef>> : CFRetainPtrArgumentCoder<SecCertificateRef> {
+    static WARN_UNUSED_RETURN bool decode(Decoder&, RetainPtr<SecCertificateRef>&);
+};
+
 #if HAVE(SEC_KEYCHAIN)
 // SecKeychainItemRef
-void encode(Encoder&, SecKeychainItemRef);
-WARN_UNUSED_RETURN bool decode(Decoder&, RetainPtr<SecKeychainItemRef>& result);
+template<> struct ArgumentCoder<SecKeychainItemRef> {
+    template<typename Encoder> static void encode(Encoder&, SecKeychainItemRef);
+};
+
+template<> struct ArgumentCoder<RetainPtr<SecKeychainItemRef>> : CFRetainPtrArgumentCoder<SecKeychainItemRef> {
+    static WARN_UNUSED_RETURN bool decode(Decoder&, RetainPtr<SecKeychainItemRef>&);
+};
 #endif
 
 #if HAVE(SEC_ACCESS_CONTROL)
 // SecAccessControlRef
-void encode(Encoder&, SecAccessControlRef);
-WARN_UNUSED_RETURN bool decode(Decoder&, RetainPtr<SecAccessControlRef>& result);
+template<> struct ArgumentCoder<SecAccessControlRef> {
+    template<typename Encoder> static void encode(Encoder&, SecAccessControlRef);
+};
+
+template<> struct ArgumentCoder<RetainPtr<SecAccessControlRef>> : CFRetainPtrArgumentCoder<SecAccessControlRef> {
+    static WARN_UNUSED_RETURN bool decode(Decoder&, RetainPtr<SecAccessControlRef>&);
+};
 #endif
 
 #if HAVE(SEC_TRUST_SERIALIZATION)
 // SecTrustRef
-void encode(Encoder&, SecTrustRef);
-WARN_UNUSED_RETURN bool decode(Decoder&, RetainPtr<SecTrustRef>&);
+template<> struct ArgumentCoder<SecTrustRef> {
+    template<typename Encoder> static void encode(Encoder&, SecTrustRef);
+};
+
+template<> struct ArgumentCoder<RetainPtr<SecTrustRef>> : CFRetainPtrArgumentCoder<SecTrustRef> {
+    static WARN_UNUSED_RETURN bool decode(Decoder&, RetainPtr<SecTrustRef>&);
+};
 #endif
 
 CFTypeRef tokenNullptrTypeRef();
 
 } // namespace IPC
-
-#endif // ArgumentCodersCF_h

Modified: trunk/Source/WebKit/Shared/mac/ColorSpaceData.mm (277905 => 277906)


--- trunk/Source/WebKit/Shared/mac/ColorSpaceData.mm	2021-05-22 02:07:17 UTC (rev 277905)
+++ trunk/Source/WebKit/Shared/mac/ColorSpaceData.mm	2021-05-22 02:23:42 UTC (rev 277906)
@@ -33,77 +33,28 @@
 
 namespace WebKit {
 
-enum EncodedDataType {
-    Null,
-    Name,
-    Data,
-};
-
 void ColorSpaceData::encode(IPC::Encoder& encoder) const
 {
-    if (cgColorSpace) {
-        // Try to encode the name.
-        if (RetainPtr<CFStringRef> name = adoptCF(CGColorSpaceCopyName(cgColorSpace.get()))) {
-            encoder << Name;
-            IPC::encode(encoder, name.get());
-            return;
-        }
-
-        // Failing that, just encode the ICC data.
-        if (RetainPtr<CFDataRef> profileData = adoptCF(CGColorSpaceCopyICCData(cgColorSpace.get()))) {
-            encoder << Data;
-            IPC::encode(encoder, profileData.get());
-            return;
-        }
-    }
-
-    // The color space was null or failed to be encoded.
-    encoder << Null;
+    encoder << static_cast<bool>(cgColorSpace);
+    if (cgColorSpace)
+        encoder << cgColorSpace;
 }
 
 bool ColorSpaceData::decode(IPC::Decoder& decoder, ColorSpaceData& colorSpaceData)
 {
-    EncodedDataType dataType;
-    if (!decoder.decode(dataType))
+    bool hasCGColorSpace;
+    if (!decoder.decode(hasCGColorSpace))
         return false;
 
-    switch (dataType) {
-    case Null:
-        colorSpaceData.cgColorSpace = nullptr;
+    if (!hasCGColorSpace)
         return true;
-    case Name: {
-        RetainPtr<CFStringRef> name;
-        if (!IPC::decode(decoder, name))
-            return false;
 
-        colorSpaceData.cgColorSpace = adoptCF(CGColorSpaceCreateWithName(name.get()));
-        return true;
-    }
-    case Data: {
-        RetainPtr<CFDataRef> data;
-        if (!IPC::decode(decoder, data))
-            return false;
-
-        colorSpaceData.cgColorSpace = adoptCF(CGColorSpaceCreateWithICCData(data.get()));
-        return true;
-    }
-    }
-
-    ASSERT_NOT_REACHED();
-    return false;
+    RetainPtr<CGColorSpaceRef> colorSpace;
+    if (!decoder.decode(colorSpace))
+        return false;
+    
+    colorSpaceData.cgColorSpace = WTFMove(colorSpace);
+    return true;
 }
 
 } // namespace WebKit
-
-namespace WTF {
-
-template<> struct EnumTraits<WebKit::EncodedDataType> {
-    using values = EnumValues<
-        WebKit::EncodedDataType,
-        WebKit::EncodedDataType::Null,
-        WebKit::EncodedDataType::Name,
-        WebKit::EncodedDataType::Data
-    >;
-};
-
-} // namespace WTF

Modified: trunk/Source/WebKit/Shared/mac/SecItemRequestData.cpp (277905 => 277906)


--- trunk/Source/WebKit/Shared/mac/SecItemRequestData.cpp	2021-05-22 02:07:17 UTC (rev 277905)
+++ trunk/Source/WebKit/Shared/mac/SecItemRequestData.cpp	2021-05-22 02:23:42 UTC (rev 277906)
@@ -50,11 +50,11 @@
 
     encoder << static_cast<bool>(m_queryDictionary);
     if (m_queryDictionary)
-        IPC::encode(encoder, m_queryDictionary.get());
+        encoder << m_queryDictionary;
 
     encoder << static_cast<bool>(m_attributesToMatch);
     if (m_attributesToMatch)
-        IPC::encode(encoder, m_attributesToMatch.get());
+        encoder << m_attributesToMatch;
 }
 
 bool SecItemRequestData::decode(IPC::Decoder& decoder, SecItemRequestData& secItemRequestData)
@@ -66,7 +66,7 @@
     if (!decoder.decode(expectQuery))
         return false;
 
-    if (expectQuery && !IPC::decode(decoder, secItemRequestData.m_queryDictionary))
+    if (expectQuery && !decoder.decode(secItemRequestData.m_queryDictionary))
         return false;
     
     bool expectAttributes;
@@ -73,7 +73,7 @@
     if (!decoder.decode(expectAttributes))
         return false;
     
-    if (expectAttributes && !IPC::decode(decoder, secItemRequestData.m_attributesToMatch))
+    if (expectAttributes && !decoder.decode(secItemRequestData.m_attributesToMatch))
         return false;
     
     return true;

Modified: trunk/Source/WebKit/Shared/mac/SecItemResponseData.cpp (277905 => 277906)


--- trunk/Source/WebKit/Shared/mac/SecItemResponseData.cpp	2021-05-22 02:07:17 UTC (rev 277905)
+++ trunk/Source/WebKit/Shared/mac/SecItemResponseData.cpp	2021-05-22 02:23:42 UTC (rev 277906)
@@ -42,7 +42,7 @@
     encoder << static_cast<int64_t>(m_resultCode);
     encoder << static_cast<bool>(m_resultObject);
     if (m_resultObject)
-        IPC::encode(encoder, m_resultObject.get());
+        encoder << m_resultObject;
 }
 
 Optional<SecItemResponseData> SecItemResponseData::decode(IPC::Decoder& decoder)
@@ -56,7 +56,7 @@
         return WTF::nullopt;
 
     RetainPtr<CFTypeRef> result;
-    if (expectResultObject && !IPC::decode(decoder, result))
+    if (expectResultObject && !decoder.decode(result))
         return WTF::nullopt;
 
     return {{ static_cast<OSStatus>(resultCode), WTFMove(result) }};

Modified: trunk/Source/WebKit/Shared/mac/WebCoreArgumentCodersMac.mm (277905 => 277906)


--- trunk/Source/WebKit/Shared/mac/WebCoreArgumentCodersMac.mm	2021-05-22 02:07:17 UTC (rev 277905)
+++ trunk/Source/WebKit/Shared/mac/WebCoreArgumentCodersMac.mm	2021-05-22 02:23:42 UTC (rev 277906)
@@ -51,11 +51,11 @@
     switch (certificateInfo.type()) {
 #if HAVE(SEC_TRUST_SERIALIZATION)
     case WebCore::CertificateInfo::Type::Trust:
-        IPC::encode(encoder, certificateInfo.trust());
+        encoder << certificateInfo.trust();
         break;
 #endif
     case WebCore::CertificateInfo::Type::CertificateChain:
-        IPC::encode(encoder, certificateInfo.certificateChain());
+        encoder << certificateInfo.certificateChain();
         break;
     case WebCore::CertificateInfo::Type::None:
         // Do nothing.
@@ -73,7 +73,7 @@
 #if HAVE(SEC_TRUST_SERIALIZATION)
     case WebCore::CertificateInfo::Type::Trust: {
         RetainPtr<SecTrustRef> trust;
-        if (!IPC::decode(decoder, trust) || !trust)
+        if (!decoder.decode(trust) || !trust)
             return false;
 
         certificateInfo = WebCore::CertificateInfo(WTFMove(trust));
@@ -82,7 +82,7 @@
 #endif
     case WebCore::CertificateInfo::Type::CertificateChain: {
         RetainPtr<CFArrayRef> certificateChain;
-        if (!IPC::decode(decoder, certificateChain) || !certificateChain)
+        if (!decoder.decode(certificateChain) || !certificateChain)
             return false;
 
         certificateInfo = WebCore::CertificateInfo(WTFMove(certificateChain));
@@ -166,7 +166,7 @@
         CFDictionarySetValue(filteredUserInfo.get(), (__bridge CFStringRef)NSURLErrorFailingURLPeerTrustErrorKey, peerTrust);
 #endif
 
-    IPC::encode(encoder, filteredUserInfo.get());
+    encoder << static_cast<CFDictionaryRef>(filteredUserInfo.get());
 
     if (id underlyingError = [userInfo objectForKey:NSUnderlyingErrorKey]) {
         ASSERT([underlyingError isKindOfClass:[NSError class]]);
@@ -192,7 +192,7 @@
         return nil;
 
     RetainPtr<CFDictionaryRef> userInfo;
-    if (!IPC::decode(decoder, userInfo) || !userInfo)
+    if (!decoder.decode(userInfo) || !userInfo)
         return nil;
 
     bool hasUnderlyingError = false;
@@ -377,13 +377,13 @@
 {
     auto archiver = adoptNS([[NSKeyedArchiver alloc] initRequiringSecureCoding:YES]);
     contentFilterUnblockHandler.encode(archiver.get());
-    IPC::encode(encoder, (__bridge CFDataRef)archiver.get().encodedData);
+    encoder << (__bridge CFDataRef)archiver.get().encodedData;
 }
 
 bool ArgumentCoder<WebCore::ContentFilterUnblockHandler>::decode(Decoder& decoder, WebCore::ContentFilterUnblockHandler& contentFilterUnblockHandler)
 {
     RetainPtr<CFDataRef> data;
-    if (!IPC::decode(decoder, data) || !data)
+    if (!decoder.decode(data) || !data)
         return false;
 
     auto unarchiver = adoptNS([[NSKeyedUnarchiver alloc] initForReadingFromData:(__bridge NSData *)data.get() error:nullptr]);
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to