mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2024-09-11 05:25:32 +03:00
LibWeb: Check for nullish objects in process_a_keyframe algorithm
This commit is contained in:
parent
37ee45db3d
commit
36ceaf38d5
Notes:
sideshowbarker
2024-07-17 10:10:18 +09:00
Author: https://github.com/mattco98 Commit: https://github.com/SerenityOS/serenity/commit/36ceaf38d5 Pull-request: https://github.com/SerenityOS/serenity/pull/24530
@ -53,7 +53,7 @@ using KeyframeType = Conditional<AL == AllowLists::Yes, BasePropertyIndexedKeyfr
|
|||||||
|
|
||||||
// https://www.w3.org/TR/web-animations-1/#process-a-keyframe-like-object
|
// https://www.w3.org/TR/web-animations-1/#process-a-keyframe-like-object
|
||||||
template<AllowLists AL>
|
template<AllowLists AL>
|
||||||
static WebIDL::ExceptionOr<KeyframeType<AL>> process_a_keyframe_like_object(JS::Realm& realm, JS::GCPtr<JS::Object> keyframe_input)
|
static WebIDL::ExceptionOr<KeyframeType<AL>> process_a_keyframe_like_object(JS::Realm& realm, JS::Value keyframe_input)
|
||||||
{
|
{
|
||||||
auto& vm = realm.vm();
|
auto& vm = realm.vm();
|
||||||
|
|
||||||
@ -96,11 +96,15 @@ static WebIDL::ExceptionOr<KeyframeType<AL>> process_a_keyframe_like_object(JS::
|
|||||||
// Store the result of this procedure as keyframe output.
|
// Store the result of this procedure as keyframe output.
|
||||||
|
|
||||||
KeyframeType<AL> keyframe_output;
|
KeyframeType<AL> keyframe_output;
|
||||||
auto offset = TRY(keyframe_input->get("offset"));
|
if (keyframe_input.is_nullish())
|
||||||
auto easing = TRY(keyframe_input->get("easing"));
|
return keyframe_output;
|
||||||
|
|
||||||
|
auto& keyframe_object = keyframe_input.as_object();
|
||||||
|
auto offset = TRY(keyframe_object.get("offset"));
|
||||||
|
auto easing = TRY(keyframe_object.get("easing"));
|
||||||
if (easing.is_undefined())
|
if (easing.is_undefined())
|
||||||
easing = JS::PrimitiveString::create(vm, "linear"_string);
|
easing = JS::PrimitiveString::create(vm, "linear"_string);
|
||||||
auto composite = TRY(keyframe_input->get("composite"));
|
auto composite = TRY(keyframe_object.get("composite"));
|
||||||
if (composite.is_undefined())
|
if (composite.is_undefined())
|
||||||
composite = JS::PrimitiveString::create(vm, "auto"_string);
|
composite = JS::PrimitiveString::create(vm, "auto"_string);
|
||||||
|
|
||||||
@ -138,7 +142,7 @@ static WebIDL::ExceptionOr<KeyframeType<AL>> process_a_keyframe_like_object(JS::
|
|||||||
// 4. Make up a new list animation properties that consists of all of the properties that are in both input
|
// 4. Make up a new list animation properties that consists of all of the properties that are in both input
|
||||||
// properties and animatable properties, or which are in input properties and conform to the
|
// properties and animatable properties, or which are in input properties and conform to the
|
||||||
// <custom-property-name> production.
|
// <custom-property-name> production.
|
||||||
auto input_properties = TRY(keyframe_input->internal_own_property_keys());
|
auto input_properties = TRY(keyframe_object.internal_own_property_keys());
|
||||||
|
|
||||||
Vector<String> animation_properties;
|
Vector<String> animation_properties;
|
||||||
Optional<JS::Value> all_value;
|
Optional<JS::Value> all_value;
|
||||||
@ -149,7 +153,7 @@ static WebIDL::ExceptionOr<KeyframeType<AL>> process_a_keyframe_like_object(JS::
|
|||||||
|
|
||||||
auto name = input_property.as_string().utf8_string();
|
auto name = input_property.as_string().utf8_string();
|
||||||
if (name == "all"sv) {
|
if (name == "all"sv) {
|
||||||
all_value = TRY(keyframe_input->get(JS::PropertyKey { name }));
|
all_value = TRY(keyframe_object.get(JS::PropertyKey { name }));
|
||||||
for (auto i = to_underlying(CSS::first_longhand_property_id); i <= to_underlying(CSS::last_longhand_property_id); ++i) {
|
for (auto i = to_underlying(CSS::first_longhand_property_id); i <= to_underlying(CSS::last_longhand_property_id); ++i) {
|
||||||
auto property = static_cast<CSS::PropertyID>(i);
|
auto property = static_cast<CSS::PropertyID>(i);
|
||||||
if (CSS::is_animatable_property(property))
|
if (CSS::is_animatable_property(property))
|
||||||
@ -170,7 +174,7 @@ static WebIDL::ExceptionOr<KeyframeType<AL>> process_a_keyframe_like_object(JS::
|
|||||||
// as the property key and keyframe input as the receiver.
|
// as the property key and keyframe input as the receiver.
|
||||||
// 2. Check the completion record of raw value.
|
// 2. Check the completion record of raw value.
|
||||||
JS::PropertyKey key { property_name };
|
JS::PropertyKey key { property_name };
|
||||||
auto raw_value = TRY(keyframe_input->has_property(key)) ? TRY(keyframe_input->get(key)) : *all_value;
|
auto raw_value = TRY(keyframe_object.has_property(key)) ? TRY(keyframe_object.get(key)) : *all_value;
|
||||||
|
|
||||||
using PropertyValuesType = Conditional<AL == AllowLists::Yes, Vector<String>, String>;
|
using PropertyValuesType = Conditional<AL == AllowLists::Yes, Vector<String>, String>;
|
||||||
PropertyValuesType property_values;
|
PropertyValuesType property_values;
|
||||||
@ -343,7 +347,7 @@ static WebIDL::ExceptionOr<Vector<BaseKeyframe>> process_a_keyframes_argument(JS
|
|||||||
|
|
||||||
// 7. Append to processed keyframes the result of running the procedure to process a keyframe-like object
|
// 7. Append to processed keyframes the result of running the procedure to process a keyframe-like object
|
||||||
// passing nextItem as the keyframe input and with the allow lists flag set to false.
|
// passing nextItem as the keyframe input and with the allow lists flag set to false.
|
||||||
processed_keyframes.append(TRY(process_a_keyframe_like_object<AllowLists::No>(realm, next_item.as_object())));
|
processed_keyframes.append(TRY(process_a_keyframe_like_object<AllowLists::No>(realm, next_item)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// -> Otherwise,
|
// -> Otherwise,
|
||||||
|
Loading…
Reference in New Issue
Block a user