Skip to content

Commit 46a9497

Browse files
committed
Add IPC encoding and decoding support for TimingFunction
https://bugs.webkit.org/show_bug.cgi?id=248814 Reviewed by Alex Christensen. Generalize the encoding and decoding static functions found in PlatformCAAnimationRemote.mm. * Source/WebKit/Shared/WebCoreArgumentCoders.cpp: (IPC::ArgumentCoder<Ref<WebCore::TimingFunction>>::encode): (IPC::ArgumentCoder<Ref<WebCore::TimingFunction>>::decode): (IPC::ArgumentCoder<RefPtr<WebCore::TimingFunction>>::encode): (IPC::ArgumentCoder<RefPtr<WebCore::TimingFunction>>::decode): * Source/WebKit/Shared/WebCoreArgumentCoders.h: * Source/WebKit/WebProcess/WebPage/RemoteLayerTree/PlatformCAAnimationRemote.mm: (WebKit::PlatformCAAnimationRemote::Properties::encode const): (WebKit::PlatformCAAnimationRemote::Properties::decode): (WebKit::encodeTimingFunction): Deleted. (WebKit::decodeTimingFunction): Deleted. Canonical link: https://commits.webkit.org/257544@main
1 parent 142ba65 commit 46a9497

File tree

3 files changed

+111
-96
lines changed

3 files changed

+111
-96
lines changed

Source/WebKit/Shared/WebCoreArgumentCoders.cpp

Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,7 @@
101101
#include <WebCore/TestReportBody.h>
102102
#include <WebCore/TextCheckerClient.h>
103103
#include <WebCore/TextIndicator.h>
104+
#include <WebCore/TimingFunction.h>
104105
#include <WebCore/TransformationMatrix.h>
105106
#include <WebCore/UserStyleSheet.h>
106107
#include <WebCore/VelocityData.h>
@@ -1654,4 +1655,98 @@ std::optional<RefPtr<WebCore::ReportBody>> ArgumentCoder<RefPtr<WebCore::ReportB
16541655
return std::nullopt;
16551656
}
16561657

1658+
void ArgumentCoder<Ref<WebCore::TimingFunction>>::encode(Encoder& encoder, const Ref<WebCore::TimingFunction>& timingFunction)
1659+
{
1660+
encoder << timingFunction->type();
1661+
1662+
switch (timingFunction->type()) {
1663+
case TimingFunction::TimingFunctionType::LinearFunction:
1664+
encoder << downcast<LinearTimingFunction>(timingFunction.get());
1665+
break;
1666+
1667+
case TimingFunction::TimingFunctionType::CubicBezierFunction:
1668+
encoder << downcast<CubicBezierTimingFunction>(timingFunction.get());
1669+
break;
1670+
1671+
case TimingFunction::TimingFunctionType::StepsFunction:
1672+
encoder << downcast<StepsTimingFunction>(timingFunction.get());
1673+
break;
1674+
1675+
case TimingFunction::TimingFunctionType::SpringFunction:
1676+
encoder << downcast<SpringTimingFunction>(timingFunction.get());
1677+
break;
1678+
}
1679+
}
1680+
1681+
std::optional<Ref<WebCore::TimingFunction>> ArgumentCoder<Ref<WebCore::TimingFunction>>::decode(Decoder& decoder)
1682+
{
1683+
std::optional<TimingFunction::TimingFunctionType> type;
1684+
decoder >> type;
1685+
if (!type)
1686+
return std::nullopt;
1687+
1688+
switch (*type) {
1689+
case TimingFunction::TimingFunctionType::LinearFunction: {
1690+
std::optional<Ref<LinearTimingFunction>> function;
1691+
decoder >> function;
1692+
if (!function)
1693+
return std::nullopt;
1694+
return WTFMove(*function);
1695+
}
1696+
1697+
case TimingFunction::TimingFunctionType::CubicBezierFunction: {
1698+
std::optional<Ref<CubicBezierTimingFunction>> function;
1699+
decoder >> function;
1700+
if (!function)
1701+
return std::nullopt;
1702+
return WTFMove(*function);
1703+
}
1704+
1705+
case TimingFunction::TimingFunctionType::StepsFunction: {
1706+
std::optional<Ref<StepsTimingFunction>> function;
1707+
decoder >> function;
1708+
if (!function)
1709+
return std::nullopt;
1710+
return WTFMove(*function);
1711+
}
1712+
1713+
case TimingFunction::TimingFunctionType::SpringFunction: {
1714+
std::optional<Ref<SpringTimingFunction>> function;
1715+
decoder >> function;
1716+
if (!function)
1717+
return std::nullopt;
1718+
return WTFMove(*function);
1719+
}
1720+
}
1721+
1722+
ASSERT_NOT_REACHED();
1723+
return std::nullopt;
1724+
}
1725+
1726+
void ArgumentCoder<RefPtr<WebCore::TimingFunction>>::encode(Encoder& encoder, const RefPtr<WebCore::TimingFunction>& timingFunction)
1727+
{
1728+
bool hasTimingFunction = !!timingFunction;
1729+
encoder << hasTimingFunction;
1730+
if (!hasTimingFunction)
1731+
return;
1732+
1733+
encoder << Ref { *timingFunction };
1734+
}
1735+
1736+
std::optional<RefPtr<WebCore::TimingFunction>> ArgumentCoder<RefPtr<WebCore::TimingFunction>>::decode(Decoder& decoder)
1737+
{
1738+
bool hasTimingFunction;
1739+
if (!decoder.decode(hasTimingFunction))
1740+
return std::nullopt;
1741+
1742+
if (!hasTimingFunction)
1743+
return nullptr;
1744+
1745+
std::optional<Ref<TimingFunction>> timingFunction;
1746+
decoder >> timingFunction;
1747+
if (!timingFunction)
1748+
return std::nullopt;
1749+
return WTFMove(*timingFunction);
1750+
}
1751+
16571752
} // namespace IPC

Source/WebKit/Shared/WebCoreArgumentCoders.h

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,7 @@ class FragmentedSharedBuffer;
144144
class StickyPositionViewportConstraints;
145145
class SystemImage;
146146
class TextCheckingRequestData;
147+
class TimingFunction;
147148
class UserStyleSheet;
148149

149150
struct AttributedString;
@@ -351,7 +352,7 @@ template<> struct ArgumentCoder<WebCore::FilterOperations> {
351352
static void encode(Encoder&, const WebCore::FilterOperations&);
352353
static WARN_UNUSED_RETURN bool decode(Decoder&, WebCore::FilterOperations&);
353354
};
354-
355+
355356
template<> struct ArgumentCoder<WebCore::FilterOperation> {
356357
static void encode(Encoder&, const WebCore::FilterOperation&);
357358
};
@@ -562,6 +563,16 @@ template<> struct ArgumentCoder<RefPtr<WebCore::ReportBody>> {
562563
static std::optional<RefPtr<WebCore::ReportBody>> decode(Decoder&);
563564
};
564565

566+
template<> struct ArgumentCoder<Ref<WebCore::TimingFunction>> {
567+
static void encode(Encoder&, const Ref<WebCore::TimingFunction>&);
568+
static std::optional<Ref<WebCore::TimingFunction>> decode(Decoder&);
569+
};
570+
571+
template<> struct ArgumentCoder<RefPtr<WebCore::TimingFunction>> {
572+
static void encode(Encoder&, const RefPtr<WebCore::TimingFunction>&);
573+
static std::optional<RefPtr<WebCore::TimingFunction>> decode(Decoder&);
574+
};
575+
565576
} // namespace IPC
566577

567578
namespace WTF {

Source/WebKit/WebProcess/WebPage/RemoteLayerTree/PlatformCAAnimationRemote.mm

Lines changed: 4 additions & 95 deletions
Original file line numberDiff line numberDiff line change
@@ -105,71 +105,6 @@ - (void)animationDidStop:(CAAnimation *)animation finished:(BOOL)finished
105105
});
106106
}
107107

108-
static void encodeTimingFunction(IPC::Encoder& encoder, const TimingFunction& timingFunction)
109-
{
110-
encoder << timingFunction.type();
111-
112-
switch (timingFunction.type()) {
113-
case TimingFunction::TimingFunctionType::LinearFunction:
114-
encoder << static_cast<const LinearTimingFunction&>(timingFunction);
115-
break;
116-
117-
case TimingFunction::TimingFunctionType::CubicBezierFunction:
118-
encoder << static_cast<const CubicBezierTimingFunction&>(timingFunction);
119-
break;
120-
121-
case TimingFunction::TimingFunctionType::StepsFunction:
122-
encoder << static_cast<const StepsTimingFunction&>(timingFunction);
123-
break;
124-
125-
case TimingFunction::TimingFunctionType::SpringFunction:
126-
encoder << static_cast<const SpringTimingFunction&>(timingFunction);
127-
break;
128-
}
129-
}
130-
131-
static std::optional<Ref<TimingFunction>> decodeTimingFunction(IPC::Decoder& decoder)
132-
{
133-
std::optional<TimingFunction::TimingFunctionType> type;
134-
decoder >> type;
135-
if (!type)
136-
return std::nullopt;
137-
138-
switch (*type) {
139-
case TimingFunction::TimingFunctionType::LinearFunction: {
140-
std::optional<Ref<LinearTimingFunction>> function;
141-
decoder >> function;
142-
if (!function)
143-
return std::nullopt;
144-
return WTFMove(*function);
145-
}
146-
147-
case TimingFunction::TimingFunctionType::CubicBezierFunction: {
148-
std::optional<Ref<CubicBezierTimingFunction>> function;
149-
decoder >> function;
150-
if (!function)
151-
return std::nullopt;
152-
return WTFMove(*function);
153-
}
154-
155-
case TimingFunction::TimingFunctionType::StepsFunction: {
156-
std::optional<Ref<StepsTimingFunction>> function;
157-
decoder >> function;
158-
if (!function)
159-
return std::nullopt;
160-
return WTFMove(*function);
161-
}
162-
163-
case TimingFunction::TimingFunctionType::SpringFunction: {
164-
std::optional<Ref<SpringTimingFunction>> function;
165-
decoder >> function;
166-
if (!function)
167-
return std::nullopt;
168-
return WTFMove(*function);
169-
}
170-
}
171-
}
172-
173108
void PlatformCAAnimationRemote::Properties::encode(IPC::Encoder& encoder) const
174109
{
175110
encoder << keyPath;
@@ -183,11 +118,7 @@ static void encodeTimingFunction(IPC::Encoder& encoder, const TimingFunction& ti
183118

184119
encoder << fillMode;
185120
encoder << valueFunction;
186-
187-
bool hasTimingFunction = !!timingFunction;
188-
encoder << hasTimingFunction;
189-
if (hasTimingFunction)
190-
encodeTimingFunction(encoder, *timingFunction);
121+
encoder << timingFunction;
191122

192123
encoder << autoReverses;
193124
encoder << removedOnCompletion;
@@ -198,9 +129,7 @@ static void encodeTimingFunction(IPC::Encoder& encoder, const TimingFunction& ti
198129
encoder << keyValues;
199130
encoder << keyTimes;
200131

201-
encoder << static_cast<uint64_t>(timingFunctions.size());
202-
for (const auto& timingFunction : timingFunctions)
203-
encodeTimingFunction(encoder, timingFunction);
132+
encoder << timingFunctions;
204133

205134
encoder << animations;
206135
}
@@ -235,17 +164,9 @@ static void encodeTimingFunction(IPC::Encoder& encoder, const TimingFunction& ti
235164
if (!decoder.decode(properties.valueFunction))
236165
return std::nullopt;
237166

238-
bool hasTimingFunction;
239-
if (!decoder.decode(hasTimingFunction))
167+
if (!decoder.decode(properties.timingFunction))
240168
return std::nullopt;
241169

242-
if (hasTimingFunction) {
243-
if (auto timingFunction = decodeTimingFunction(decoder))
244-
properties.timingFunction = WTFMove(*timingFunction);
245-
else
246-
return std::nullopt;
247-
}
248-
249170
if (!decoder.decode(properties.autoReverses))
250171
return std::nullopt;
251172

@@ -267,20 +188,8 @@ static void encodeTimingFunction(IPC::Encoder& encoder, const TimingFunction& ti
267188
if (!decoder.decode(properties.keyTimes))
268189
return std::nullopt;
269190

270-
uint64_t numTimingFunctions;
271-
if (!decoder.decode(numTimingFunctions))
191+
if (!decoder.decode(properties.timingFunctions))
272192
return std::nullopt;
273-
274-
if (numTimingFunctions) {
275-
properties.timingFunctions.reserveInitialCapacity(numTimingFunctions);
276-
277-
for (size_t i = 0; i < numTimingFunctions; ++i) {
278-
if (auto timingFunction = decodeTimingFunction(decoder))
279-
properties.timingFunctions.uncheckedAppend(WTFMove(*timingFunction));
280-
else
281-
return std::nullopt;
282-
}
283-
}
284193

285194
if (!decoder.decode(properties.animations))
286195
return std::nullopt;

0 commit comments

Comments
 (0)