Skip to content

Commit

Permalink
Expose more type metadata to IPC test API
Browse files Browse the repository at this point in the history
https://bugs.webkit.org/show_bug.cgi?id=270985
rdar://124626429

Reviewed by Sihui Liu.

This exposes type metadata for ObjC types wrapped by CoreIPC types,
and fixes up a few other types so their contents are consistently exposed.

* Source/WebKit/NetworkProcess/webrtc/NetworkRTCProvider.messages.in:
* Source/WebKit/Scripts/generate-serializers.py:
(SerializedType.name_declaration_for_serialized_type_info):
(SerializedType.members_for_serialized_type_info):
(ObjCWrappedType):
(ObjCWrappedType.__init__):
(generate_impl):
(generate_serialized_type_info):
(parse_serialized_types):
(main):
* Source/WebKit/Scripts/webkit/messages.py:
(headers_for_type):
* Source/WebKit/Scripts/webkit/tests/GeneratedSerializers.h:
(IPC::ArgumentCoder<RetainPtr<CFStringRef>>::encode):
* Source/WebKit/Scripts/webkit/tests/SerializedTypeInfo.cpp:
(WebKit::allSerializedTypes):
* Source/WebKit/Scripts/webkit/tests/TestSerializedType.serialization.in:
* Source/WebKit/Scripts/webkit/tests/WebKitPlatformGeneratedSerializers.cpp:
(IPC::encodeObjectDirectly<PKPaymentMethod>):
(IPC::decodeObjectDirectlyRequiringAllowedClasses<PKPaymentMethod>):
(IPC::encodeObjectDirectly<NSNull>):
(IPC::decodeObjectDirectlyRequiringAllowedClasses<NSNull>):
(IPC::ArgumentCoder<CFStringRef>::encode):
(IPC::ArgumentCoder<RetainPtr<CFStringRef>>::decode):
* Source/WebKit/Shared/Cocoa/ArgumentCodersCocoa.mm:
* Source/WebKit/Shared/Cocoa/WebCoreArgumentCodersCocoa.serialization.in:
* Source/WebKit/Shared/WebCoreArgumentCoders.serialization.in:
* Source/WebKit/WebProcess/Network/webrtc/LibWebRTCNetwork.messages.in:
* Source/WebKit/WebProcess/Network/webrtc/WebRTCMonitor.messages.in:
* Source/WebKit/WebProcess/Network/webrtc/WebRTCResolver.messages.in:
* Tools/TestWebKitAPI/Tests/WebKitCocoa/IPCTestingAPI.mm:

Canonical link: https://commits.webkit.org/276118@main
  • Loading branch information
achristensen07 committed Mar 14, 2024
1 parent e7bb5f0 commit 129e646
Show file tree
Hide file tree
Showing 14 changed files with 192 additions and 105 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,8 @@
#if USE(LIBWEBRTC)

messages -> NetworkRTCProvider {
CreateUDPSocket(WebCore::LibWebRTCSocketIdentifier identifier, WebKit::RTCNetwork::SocketAddress localAddress, uint16_t minPort, uint16_t maxPort, WebKit::WebPageProxyIdentifier pageIdentifier, bool isFirstParty, bool isRelayDisabled, WebCore::RegistrableDomain domain)
CreateClientTCPSocket(WebCore::LibWebRTCSocketIdentifier identifier, WebKit::RTCNetwork::SocketAddress localAddress, WebKit::RTCNetwork::SocketAddress remoteAddress, String userAgent, int options, WebKit::WebPageProxyIdentifier pageIdentifier, bool isFirstParty, bool isRelayDisabled, WebCore::RegistrableDomain domain)
CreateUDPSocket(WebCore::LibWebRTCSocketIdentifier identifier, WebKit::RTC::Network::SocketAddress localAddress, uint16_t minPort, uint16_t maxPort, WebKit::WebPageProxyIdentifier pageIdentifier, bool isFirstParty, bool isRelayDisabled, WebCore::RegistrableDomain domain)
CreateClientTCPSocket(WebCore::LibWebRTCSocketIdentifier identifier, WebKit::RTC::Network::SocketAddress localAddress, WebKit::RTC::Network::SocketAddress remoteAddress, String userAgent, int options, WebKit::WebPageProxyIdentifier pageIdentifier, bool isFirstParty, bool isRelayDisabled, WebCore::RegistrableDomain domain)
WrapNewTCPConnection(WebCore::LibWebRTCSocketIdentifier identifier, WebCore::LibWebRTCSocketIdentifier newConnectionSocketIdentifier)

void SetPlatformTCPSocketsEnabled(bool enabled)
Expand All @@ -33,7 +33,7 @@ messages -> NetworkRTCProvider {
CreateResolver(WebKit::LibWebRTCResolverIdentifier identifier, String address)
StopResolver(WebKit::LibWebRTCResolverIdentifier identifier)

void SendToSocket(WebCore::LibWebRTCSocketIdentifier identifier, std::span<const uint8_t> data, WebKit::RTCNetwork::SocketAddress address, struct WebKit::RTCPacketOptions options)
void SendToSocket(WebCore::LibWebRTCSocketIdentifier identifier, std::span<const uint8_t> data, WebKit::RTC::Network::SocketAddress address, struct WebKit::RTCPacketOptions options)
void CloseSocket(WebCore::LibWebRTCSocketIdentifier identifier)
void SetSocketOption(WebCore::LibWebRTCSocketIdentifier identifier, int option, int value)
}
Expand Down
97 changes: 53 additions & 44 deletions Source/WebKit/Scripts/generate-serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -173,6 +173,8 @@ def cf_wrapper_type(self):
return self.namespace + '::' + self.name

def name_declaration_for_serialized_type_info(self):
if self.cf_type is not None:
return self.cf_type + 'Ref'
if self.namespace == 'WTF':
if self.name != "UUID":
return self.name
Expand Down Expand Up @@ -200,43 +202,6 @@ def can_assert_member_order_is_correct(self):
def members_for_serialized_type_info(self):
return self.serialized_members()

result = []
for member in self.dictionary_members:
member = copy.copy(member)
outer_type = None
collection_key_type = None
collection_value_type = None
optional = False
if member.name.endswith('?'):
optional = True
match = re.search(r'(.*)<(.*), (.*)>', member.name)
if match:
outer_type, collection_key_type, collection_value_type = match.groups()
else:
match = re.search(r'(.*)<(.*)>', member.name)
if match:
outer_type, collection_value_type = match.groups()
else:
outer_type = member.name

outer_type = 'WebKit::CoreIPC' + outer_type
if outer_type.endswith('?'):
outer_type = outer_type[:-1]

if collection_key_type is not None:
member.name = outer_type + '<WebKit::CoreIPC' + collection_key_type + ', WebKit::CoreIPC' + collection_value_type + '>'
elif collection_value_type is not None:
member.name = outer_type + '<WebKit::CoreIPC' + collection_value_type + '>'
else:
member.name = outer_type

if optional:
member.name = member.name + '?'
result.append(member)

return result


def serialized_members(self):
return list(filter(lambda member: 'NotSerialized' not in member.attributes, self.members))

Expand Down Expand Up @@ -485,6 +450,13 @@ def __init__(self, name, alias, condition):
self.condition = condition


class ObjCWrappedType(object):
def __init__(self, ns_type, wrapper, condition):
self.ns_type = ns_type
self.wrapper = wrapper
self.condition = condition


def sanitize_string_for_variable_name(string):
return string.replace('()', '').replace('.', '')

Expand Down Expand Up @@ -1093,7 +1065,7 @@ def generate_one_impl(type, template_argument):
return result


def generate_impl(serialized_types, serialized_enums, headers, generating_webkit_platform_impl):
def generate_impl(serialized_types, serialized_enums, headers, generating_webkit_platform_impl, objc_wrapped_types):
result = []
result.append(_license_header)
result.append('#include "config.h"')
Expand Down Expand Up @@ -1141,6 +1113,26 @@ def generate_impl(serialized_types, serialized_enums, headers, generating_webkit
result.append('')
result.append('namespace IPC {')
result.append('')

for type in objc_wrapped_types:
if type.condition is not None:
result.append('#if ' + type.condition)
result.append('template<> void encodeObjectDirectly<' + type.ns_type + '>(IPC::Encoder& encoder, ' + type.ns_type + ' *instance)')
result.append('{')
result.append(' encoder << (instance ? std::optional(WebKit::' + type.wrapper + '(instance)) : std::nullopt);')
result.append('}')
result.append('')
result.append('template<> std::optional<RetainPtr<id>> decodeObjectDirectlyRequiringAllowedClasses<' + type.ns_type + '>(IPC::Decoder& decoder)')
result.append('{')
result.append(' auto result = decoder.decode<std::optional<WebKit::' + type.wrapper + '>>();')
result.append(' if (!result)')
result.append(' return std::nullopt;')
result.append(' return *result ? (*result)->toID() : nullptr;')
result.append('}')
if type.condition is not None:
result.append('#endif // ' + type.condition)
result.append('')

if not generating_webkit_platform_impl:
result = result + argument_coder_declarations(serialized_types, False)
result.append('')
Expand Down Expand Up @@ -1336,7 +1328,7 @@ def output_sorted_headers(sorted_headers):
return result


def generate_serialized_type_info(serialized_types, serialized_enums, headers, using_statements):
def generate_serialized_type_info(serialized_types, serialized_enums, headers, using_statements, objc_wrapped_types):
result = []
result.append(_license_header)
result.append('#include "config.h"')
Expand Down Expand Up @@ -1367,6 +1359,14 @@ def generate_serialized_type_info(serialized_types, serialized_enums, headers, u
for type in serialized_types:
result.extend(generate_one_serialized_type_info(type))

for type in objc_wrapped_types:
if type.condition is not None:
result.append('#if ' + type.condition)
result.append(' { "' + type.ns_type + '"_s, {')
result.append(' { "WebKit::' + type.wrapper + '"_s, "wrapper"_s }')
result.append(' } },')
if type.condition is not None:
result.append('#endif // ' + type.condition)
for using_statement in using_statements:
if using_statement.condition is not None:
result.append('#if ' + using_statement.condition)
Expand Down Expand Up @@ -1436,6 +1436,7 @@ def parse_serialized_types(file):
serialized_types = []
serialized_enums = []
using_statements = []
objc_wrapped_types = []
additional_forward_declarations = []
headers = []

Expand Down Expand Up @@ -1588,6 +1589,11 @@ def parse_serialized_types(file):
if match:
cf_type, namespace, name = match.groups()
continue
match = re.search(r'(.*) wrapped by (.*)', line)
if match:
objc_wrapped_type, objc_wrapper = match.groups()
objc_wrapped_types.append(ObjCWrappedType(objc_wrapped_type, objc_wrapper, type_condition))
continue
match = re.search(r'additional_forward_declaration: (.*)', line)
if match:
declaration = match.groups()[0]
Expand Down Expand Up @@ -1641,7 +1647,7 @@ def parse_serialized_types(file):
dictionary_members.append(MemberVariable(member_type, member_name, member_condition, []))
else:
members.append(MemberVariable(member_type, member_name, member_condition, []))
return [serialized_types, serialized_enums, headers, using_statements, additional_forward_declarations]
return [serialized_types, serialized_enums, headers, using_statements, additional_forward_declarations, objc_wrapped_types]


def generate_webkit_secure_coding_impl(serialized_types, headers):
Expand Down Expand Up @@ -1880,6 +1886,7 @@ def main(argv):
serialized_types = []
serialized_enums = []
using_statements = []
objc_wrapped_types = []
headers = []
header_set = set()
header_set.add(ConditionalHeader('"FormDataReference.h"', None))
Expand All @@ -1897,7 +1904,7 @@ def main(argv):
continue
path = os.path.sep.join([directory, argv[i]])
with open(path) as file:
new_types, new_enums, new_headers, new_using_statements, new_additional_forward_declarations = parse_serialized_types(file)
new_types, new_enums, new_headers, new_using_statements, new_additional_forward_declarations, new_objc_wrapped_types = parse_serialized_types(file)
for type in new_types:
serialized_types.append(type)
for enum in new_enums:
Expand All @@ -1908,18 +1915,20 @@ def main(argv):
header_set.add(header)
for declaration in new_additional_forward_declarations:
additional_forward_declarations_list.append(declaration)
for objc_wrapped_type in new_objc_wrapped_types:
objc_wrapped_types.append(objc_wrapped_type)
headers = sorted(header_set)

serialized_types = resolve_inheritance(serialized_types)

with open('GeneratedSerializers.h', "w+") as output:
output.write(generate_header(serialized_types, serialized_enums, additional_forward_declarations_list))
with open('GeneratedSerializers.%s' % file_extension, "w+") as output:
output.write(generate_impl(serialized_types, serialized_enums, headers, False))
output.write(generate_impl(serialized_types, serialized_enums, headers, False, []))
with open('WebKitPlatformGeneratedSerializers.%s' % file_extension, "w+") as output:
output.write(generate_impl(serialized_types, serialized_enums, headers, True))
output.write(generate_impl(serialized_types, serialized_enums, headers, True, objc_wrapped_types))
with open('SerializedTypeInfo.%s' % file_extension, "w+") as output:
output.write(generate_serialized_type_info(serialized_types, serialized_enums, headers, using_statements))
output.write(generate_serialized_type_info(serialized_types, serialized_enums, headers, using_statements, objc_wrapped_types))
with open('GeneratedWebKitSecureCoding.h', "w+") as output:
output.write(generate_webkit_secure_coding_header(serialized_types))
with open('GeneratedWebKitSecureCoding.%s' % file_extension, "w+") as output:
Expand Down
2 changes: 2 additions & 0 deletions Source/WebKit/Scripts/webkit/messages.py
Original file line number Diff line number Diff line change
Expand Up @@ -998,6 +998,8 @@ def headers_for_type(type):
'WebKit::PaymentSetupFeatures': ['"ApplePayPaymentSetupFeaturesWebKit.h"'],
'WebKit::ImageBufferSetPrepareBufferForDisplayInputData': ['"PrepareBackingStoreBuffersData.h"'],
'WebKit::ImageBufferSetPrepareBufferForDisplayOutputData': ['"PrepareBackingStoreBuffersData.h"'],
'WebKit::RTC::Network::IPAddress': ['"RTCNetwork.h"'],
'WebKit::RTC::Network::SocketAddress': ['"RTCNetwork.h"'],
'WebKit::RemoteVideoFrameReadReference': ['"RemoteVideoFrameIdentifier.h"'],
'WebKit::RemoteVideoFrameWriteReference': ['"RemoteVideoFrameIdentifier.h"'],
'WebKit::RespectSelectionAnchor': ['"GestureTypes.h"'],
Expand Down
18 changes: 18 additions & 0 deletions Source/WebKit/Scripts/webkit/tests/GeneratedSerializers.h
Original file line number Diff line number Diff line change
Expand Up @@ -341,6 +341,24 @@ template<> struct ArgumentCoder<RetainPtr<CFBarRef>> {
};
#endif

#if USE(CFSTRING)
template<> struct ArgumentCoder<CFStringRef> {
static void encode(Encoder&, CFStringRef);
static void encode(StreamConnectionEncoder&, CFStringRef);
};
template<> struct ArgumentCoder<RetainPtr<CFStringRef>> {
static void encode(Encoder& encoder, const RetainPtr<CFStringRef>& retainPtr)
{
ArgumentCoder<CFStringRef>::encode(encoder, retainPtr.get());
}
static void encode(StreamConnectionEncoder& encoder, const RetainPtr<CFStringRef>& retainPtr)
{
ArgumentCoder<CFStringRef>::encode(encoder, retainPtr.get());
}
static std::optional<RetainPtr<CFStringRef>> decode(Decoder&);
};
#endif

template<> struct ArgumentCoder<WebKit::RValueWithFunctionCalls> {
static void encode(Encoder&, WebKit::RValueWithFunctionCalls&&);
static std::optional<WebKit::RValueWithFunctionCalls> decode(Decoder&);
Expand Down
13 changes: 13 additions & 0 deletions Source/WebKit/Scripts/webkit/tests/SerializedTypeInfo.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -417,6 +417,11 @@ Vector<SerializedTypeInfo> allSerializedTypes()
{ "WebKit::BarWrapper"_s, "wrapper"_s }
} },
#endif // USE(CFBAR)
#if USE(CFSTRING)
{ "CFStringRef"_s, {
{ "String"_s, "wrapper"_s }
} },
#endif // USE(CFSTRING)
{ "WebKit::RValueWithFunctionCalls"_s, {
{
"SandboxExtensionHandle"_s,
Expand Down Expand Up @@ -471,6 +476,14 @@ Vector<SerializedTypeInfo> allSerializedTypes()
},
} },
#endif // USE(APPKIT)
#if USE(PASSKIT)
{ "PKPaymentMethod"_s, {
{ "WebKit::CoreIPCPKPaymentMethod"_s, "wrapper"_s }
} },
#endif // USE(PASSKIT)
{ "NSNull"_s, {
{ "WebKit::CoreIPCNull"_s, "wrapper"_s }
} },
{ "WebCore::SharedStringHash"_s, {
{ "uint32_t"_s, "alias"_s }
} },
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -273,6 +273,11 @@ additional_forward_declaration: typedef struct __CFBar * CFBarRef
}
#endif

#if USE(CFSTRING)
[WebKitPlatform, CustomHeader, AdditionalEncoder=StreamConnectionEncoder, ToCFMethod=result->createCFString()] CFStringRef wrapped by WTF::String {
}
#endif

[RValue] class WebKit::RValueWithFunctionCalls {
SandboxExtensionHandle callFunction()
}
Expand Down Expand Up @@ -325,3 +330,8 @@ header: <WebCore/ScrollbarTrackCornerSystemImageMac.h>
bool m_useDarkAppearance;
}
#endif // USE(APPKIT)

#if USE(PASSKIT)
PKPaymentMethod wrapped by CoreIPCPKPaymentMethod
#endif
NSNull wrapped by CoreIPCNull
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,34 @@ IGNORE_WARNINGS_BEGIN("invalid-offsetof")

namespace IPC {

#if USE(PASSKIT)
template<> void encodeObjectDirectly<PKPaymentMethod>(IPC::Encoder& encoder, PKPaymentMethod *instance)
{
encoder << (instance ? std::optional(WebKit::CoreIPCPKPaymentMethod(instance)) : std::nullopt);
}

template<> std::optional<RetainPtr<id>> decodeObjectDirectlyRequiringAllowedClasses<PKPaymentMethod>(IPC::Decoder& decoder)
{
auto result = decoder.decode<std::optional<WebKit::CoreIPCPKPaymentMethod>>();
if (!result)
return std::nullopt;
return *result ? (*result)->toID() : nullptr;
}
#endif // USE(PASSKIT)

template<> void encodeObjectDirectly<NSNull>(IPC::Encoder& encoder, NSNull *instance)
{
encoder << (instance ? std::optional(WebKit::CoreIPCNull(instance)) : std::nullopt);
}

template<> std::optional<RetainPtr<id>> decodeObjectDirectlyRequiringAllowedClasses<NSNull>(IPC::Decoder& decoder)
{
auto result = decoder.decode<std::optional<WebKit::CoreIPCNull>>();
if (!result)
return std::nullopt;
return *result ? (*result)->toID() : nullptr;
}

void ArgumentCoder<WebKit::PlatformClass>::encode(Encoder& encoder, const WebKit::PlatformClass& instance)
{
static_assert(std::is_same_v<std::remove_cvref_t<decltype(instance.value)>, int>);
Expand Down Expand Up @@ -312,6 +340,27 @@ std::optional<WebKit::CoreIPCDDScannerResult> ArgumentCoder<WebKit::CoreIPCDDSca

#endif

#if USE(CFSTRING)
void ArgumentCoder<CFStringRef>::encode(Encoder& encoder, CFStringRef instance)
{
encoder << WTF::String { instance };
}

void ArgumentCoder<CFStringRef>::encode(StreamConnectionEncoder& encoder, CFStringRef instance)
{
encoder << WTF::String { instance };
}

std::optional<RetainPtr<CFStringRef>> ArgumentCoder<RetainPtr<CFStringRef>>::decode(Decoder& decoder)
{
auto result = decoder.decode<WTF::String>();
if (UNLIKELY(!decoder.isValid()))
return std::nullopt;
return result->createCFString();
}

#endif

} // namespace IPC

namespace WTF {
Expand Down
Loading

0 comments on commit 129e646

Please sign in to comment.