Skip to content

Commit

Permalink
Port LoadParameters to the new IPC serialization format
Browse files Browse the repository at this point in the history
https://bugs.webkit.org/show_bug.cgi?id=264841

Reviewed by Alex Christensen.

Port LoadParameters to the new IPC serialization format. Add a
[EncodeRequestBody] member attribute to support serialization /
deserialization of the ResourceRequest body since this is the
second time we do such a thing.

* Source/WebKit/CMakeLists.txt:
* Source/WebKit/DerivedSources-input.xcfilelist:
* Source/WebKit/DerivedSources.make:
* Source/WebKit/Scripts/generate-serializers.py:
(encode_type):
(decode_type):
* Source/WebKit/Shared/Cocoa/LoadParametersCocoa.mm:
(WebKit::LoadParameters::platformEncode const): Deleted.
(WebKit::LoadParameters::platformDecode): Deleted.
* Source/WebKit/Shared/LoadParameters.cpp: Removed.
* Source/WebKit/Shared/LoadParameters.h:
* Source/WebKit/Shared/LoadParameters.serialization.in: Added.
* Source/WebKit/Shared/URLSchemeTaskParameters.cpp: Removed.
* Source/WebKit/Shared/URLSchemeTaskParameters.h:
* Source/WebKit/Shared/URLSchemeTaskParameters.serialization.in:
* Source/WebKit/Sources.txt:
* Source/WebKit/WebKit.xcodeproj/project.pbxproj:

Canonical link: https://commits.webkit.org/270762@main
  • Loading branch information
cdumez committed Nov 15, 2023
1 parent 8f82a0e commit f739f03
Show file tree
Hide file tree
Showing 17 changed files with 178 additions and 282 deletions.
1 change: 1 addition & 0 deletions Source/WebKit/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -397,6 +397,7 @@ set(WebKit_SERIALIZATION_IN_FILES
Shared/GPUProcessPreferencesForWebProcess.serialization.in
Shared/GoToBackForwardItemParameters.serialization.in
Shared/LayerTreeContext.serialization.in
Shared/LoadParameters.serialization.in
Shared/LocalFrameCreationParameters.serialization.in
Shared/Model.serialization.in
Shared/NavigationActionData.serialization.in
Expand Down
1 change: 1 addition & 0 deletions Source/WebKit/DerivedSources-input.xcfilelist
Original file line number Diff line number Diff line change
Expand Up @@ -245,6 +245,7 @@ $(PROJECT_DIR)/Shared/IPCStreamTesterProxy.messages.in
$(PROJECT_DIR)/Shared/IPCTester.messages.in
$(PROJECT_DIR)/Shared/IPCTesterReceiver.messages.in
$(PROJECT_DIR)/Shared/LayerTreeContext.serialization.in
$(PROJECT_DIR)/Shared/LoadParameters.serialization.in
$(PROJECT_DIR)/Shared/LocalFrameCreationParameters.serialization.in
$(PROJECT_DIR)/Shared/Model.serialization.in
$(PROJECT_DIR)/Shared/NavigationActionData.serialization.in
Expand Down
1 change: 1 addition & 0 deletions Source/WebKit/DerivedSources.make
Original file line number Diff line number Diff line change
Expand Up @@ -565,6 +565,7 @@ SERIALIZATION_DESCRIPTION_FILES = \
Shared/ios/WebAutocorrectionContext.serialization.in \
Shared/ios/WebAutocorrectionData.serialization.in \
Shared/LayerTreeContext.serialization.in \
Shared/LoadParameters.serialization.in \
Shared/LocalFrameCreationParameters.serialization.in \
Shared/Model.serialization.in \
Shared/NavigationActionData.serialization.in \
Expand Down
13 changes: 13 additions & 0 deletions Source/WebKit/Scripts/generate-serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@
# Supported member attributes:
#
# BitField - work around the need for http://wg21.link/P0572 and don't check that the serialization order matches the memory layout.
# EncodeRequestBody - Include the body of the WebCore::ResourceRequest when encoding (by default, it is omitted).
# Validator - additional C++ to validate the value when decoding
# NotSerialized - member is present in structure but intentionally not serialized.
# SecureCodingAllowed - ObjC classes to allow when decoding.
Expand Down Expand Up @@ -585,9 +586,15 @@ def encode_type(type):
result.append(' encoder << instance.' + member.name + ';')
else:
if type.rvalue and '()' not in member.name:
if 'EncodeRequestBody' in member.attributes:
result.append(' RefPtr ' + member.name + 'Body = instance.' + member.name + '.httpBody();')
result.append(' encoder << WTFMove(instance.' + member.name + ');')
if 'EncodeRequestBody' in member.attributes:
result.append(' encoder << IPC::FormDataReference { WTFMove(' + member.name + 'Body) };')
else:
result.append(' encoder << instance.' + member.name + ';')
if 'EncodeRequestBody' in member.attributes:
result.append(' encoder << IPC::FormDataReference { instance.' + member.name + '.httpBody() };')
if member.condition is not None:
result.append('#endif')

Expand Down Expand Up @@ -668,6 +675,11 @@ def decode_type(type):
else:
assert len(decodable_classes) == 0
result.append(' auto ' + sanitized_variable_name + ' = decoder.decode<' + member.type + '>();')
if 'EncodeRequestBody' in member.attributes:
result.append(' if (' + sanitized_variable_name + ') {')
result.append(' if (auto ' + sanitized_variable_name + 'Body = decoder.decode<IPC::FormDataReference>())')
result.append(' ' + sanitized_variable_name + '->setHTTPBody(' + sanitized_variable_name + 'Body->takeData());')
result.append(' }')
for attribute in member.attributes:
match = re.search(r'Validator=\'(.*)\'', attribute)
if match:
Expand Down Expand Up @@ -1237,6 +1249,7 @@ def main(argv):
using_statements = []
headers = []
header_set = set()
header_set.add(ConditionalHeader('"FormDataReference.h"', None))
additional_forward_declarations_set = set()
file_extension = argv[1]
skip = False
Expand Down
64 changes: 64 additions & 0 deletions Source/WebKit/Scripts/webkit/tests/GeneratedSerializers.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@
#include "FirstMemberType.h"
#endif
#include "FooWrapper.h"
#include "FormDataReference.h"
#include "HeaderWithoutCondition"
#include "LayerProperties.h"
#include "RValueWithFunctionCalls.h"
Expand Down Expand Up @@ -1089,6 +1090,69 @@ std::optional<Ref<WebCore::ScrollingStateFrameHostingNodeWithStuffAfterTuple>> A
};
}

void ArgumentCoder<RequestEncodedWithBody>::encode(Encoder& encoder, const RequestEncodedWithBody& instance)
{
static_assert(std::is_same_v<std::remove_cvref_t<decltype(instance.request)>, WebCore::ResourceRequest>);
struct ShouldBeSameSizeAsRequestEncodedWithBody : public VirtualTableAndRefCountOverhead<std::is_polymorphic_v<RequestEncodedWithBody>, false> {
WebCore::ResourceRequest request;
};
static_assert(sizeof(ShouldBeSameSizeAsRequestEncodedWithBody) == sizeof(RequestEncodedWithBody));
static_assert(MembersInCorrectOrder < 0
, offsetof(RequestEncodedWithBody, request)
>::value);

encoder << instance.request;
encoder << IPC::FormDataReference { instance.request.httpBody() };
}

std::optional<RequestEncodedWithBody> ArgumentCoder<RequestEncodedWithBody>::decode(Decoder& decoder)
{
auto request = decoder.decode<WebCore::ResourceRequest>();
if (request) {
if (auto requestBody = decoder.decode<IPC::FormDataReference>())
request->setHTTPBody(requestBody->takeData());
}
if (UNLIKELY(!decoder.isValid()))
return std::nullopt;
return {
RequestEncodedWithBody {
WTFMove(*request)
}
};
}

void ArgumentCoder<RequestEncodedWithBodyRValue>::encode(Encoder& encoder, RequestEncodedWithBodyRValue&& instance)
{
static_assert(std::is_same_v<std::remove_cvref_t<decltype(instance.request)>, WebCore::ResourceRequest>);
struct ShouldBeSameSizeAsRequestEncodedWithBodyRValue : public VirtualTableAndRefCountOverhead<std::is_polymorphic_v<RequestEncodedWithBodyRValue>, false> {
WebCore::ResourceRequest request;
};
static_assert(sizeof(ShouldBeSameSizeAsRequestEncodedWithBodyRValue) == sizeof(RequestEncodedWithBodyRValue));
static_assert(MembersInCorrectOrder < 0
, offsetof(RequestEncodedWithBodyRValue, request)
>::value);

RefPtr requestBody = instance.request.httpBody();
encoder << WTFMove(instance.request);
encoder << IPC::FormDataReference { WTFMove(requestBody) };
}

std::optional<RequestEncodedWithBodyRValue> ArgumentCoder<RequestEncodedWithBodyRValue>::decode(Decoder& decoder)
{
auto request = decoder.decode<WebCore::ResourceRequest>();
if (request) {
if (auto requestBody = decoder.decode<IPC::FormDataReference>())
request->setHTTPBody(requestBody->takeData());
}
if (UNLIKELY(!decoder.isValid()))
return std::nullopt;
return {
RequestEncodedWithBodyRValue {
WTFMove(*request)
}
};
}

void ArgumentCoder<CFFooRef>::encode(Encoder& encoder, CFFooRef instance)
{
encoder << WebKit::FooWrapper { instance };
Expand Down
12 changes: 12 additions & 0 deletions Source/WebKit/Scripts/webkit/tests/GeneratedSerializers.h
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,8 @@ namespace JSC { enum class Incredible; }
namespace Testing { enum class StorageSize : uint8_t; }
namespace WebCore { class ScrollingStateFrameHostingNode; }
namespace WebCore { class ScrollingStateFrameHostingNodeWithStuffAfterTuple; }
struct RequestEncodedWithBody;
struct RequestEncodedWithBodyRValue;
#if USE(CFBAR)
#endif
namespace WebKit { class RValueWithFunctionCalls; }
Expand Down Expand Up @@ -227,6 +229,16 @@ template<> struct ArgumentCoder<WebCore::ScrollingStateFrameHostingNodeWithStuff
static std::optional<Ref<WebCore::ScrollingStateFrameHostingNodeWithStuffAfterTuple>> decode(Decoder&);
};

template<> struct ArgumentCoder<RequestEncodedWithBody> {
static void encode(Encoder&, const RequestEncodedWithBody&);
static std::optional<RequestEncodedWithBody> decode(Decoder&);
};

template<> struct ArgumentCoder<RequestEncodedWithBodyRValue> {
static void encode(Encoder&, RequestEncodedWithBodyRValue&&);
static std::optional<RequestEncodedWithBodyRValue> decode(Decoder&);
};

template<> struct ArgumentCoder<CFFooRef> {
static void encode(Encoder&, CFFooRef);
};
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 @@ -34,6 +34,7 @@
#include "FirstMemberType.h"
#endif
#include "FooWrapper.h"
#include "FormDataReference.h"
#include "HeaderWithoutCondition"
#include "LayerProperties.h"
#include "PlatformClass.h"
Expand Down Expand Up @@ -299,6 +300,18 @@ Vector<SerializedTypeInfo> allSerializedTypes()
"memberAfterTuple"_s
},
} },
{ "RequestEncodedWithBody"_s, {
{
"WebCore::ResourceRequest"_s,
"request"_s
},
} },
{ "RequestEncodedWithBodyRValue"_s, {
{
"WebCore::ResourceRequest"_s,
"request"_s
},
} },
{ "WebKit::RValueWithFunctionCalls"_s, {
{
"SandboxExtensionHandle"_s,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -216,6 +216,14 @@ class WebKit::TemplateTest {
int memberAfterTuple
}

struct RequestEncodedWithBody {
[EncodeRequestBody] WebCore::ResourceRequest request;
};

[RValue] struct RequestEncodedWithBodyRValue {
[EncodeRequestBody] WebCore::ResourceRequest request;
};

CFFooRef wrapped by WebKit::FooWrapper {
}

Expand Down
14 changes: 0 additions & 14 deletions Source/WebKit/Shared/Cocoa/LoadParametersCocoa.mm
Original file line number Diff line number Diff line change
Expand Up @@ -33,20 +33,6 @@

namespace WebKit {

void LoadParameters::platformEncode(IPC::Encoder& encoder) const
{
encoder << dataDetectionReferenceDate;
}

bool LoadParameters::platformDecode(IPC::Decoder& decoder, LoadParameters& parameters)
{
auto dataDetectionReferenceDate = decoder.decode<std::optional<double>>();
if (!dataDetectionReferenceDate)
return false;
parameters.dataDetectionReferenceDate = WTFMove(*dataDetectionReferenceDate);
return true;
}

} // namespace WebKit

#endif
Loading

0 comments on commit f739f03

Please sign in to comment.