diff --git a/Tests/LibWeb/Text/expected/WebAnimations/misc/animating-all.txt b/Tests/LibWeb/Text/expected/WebAnimations/misc/animating-all.txt
new file mode 100644
index 00000000000..6d2f403c52e
--- /dev/null
+++ b/Tests/LibWeb/Text/expected/WebAnimations/misc/animating-all.txt
@@ -0,0 +1 @@
+ opacity value: 0.5
diff --git a/Tests/LibWeb/Text/input/WebAnimations/misc/animating-all.html b/Tests/LibWeb/Text/input/WebAnimations/misc/animating-all.html
new file mode 100644
index 00000000000..7488f8c9302
--- /dev/null
+++ b/Tests/LibWeb/Text/input/WebAnimations/misc/animating-all.html
@@ -0,0 +1,13 @@
+
+
+
+
diff --git a/Userland/Libraries/LibWeb/Animations/KeyframeEffect.cpp b/Userland/Libraries/LibWeb/Animations/KeyframeEffect.cpp
index ac109aa20f1..579cc0e1db5 100644
--- a/Userland/Libraries/LibWeb/Animations/KeyframeEffect.cpp
+++ b/Userland/Libraries/LibWeb/Animations/KeyframeEffect.cpp
@@ -138,12 +138,21 @@ static WebIDL::ExceptionOr> process_a_keyframe_like_object(JS::
auto input_properties = TRY(keyframe_input->internal_own_property_keys());
Vector animation_properties;
+ Optional all_value;
+
for (auto const& input_property : input_properties) {
if (!input_property.is_string())
continue;
auto name = input_property.as_string().utf8_string();
- if (auto property = CSS::property_id_from_camel_case_string(name); property.has_value()) {
+ if (name == "all"sv) {
+ all_value = TRY(keyframe_input->get(JS::PropertyKey { name }));
+ for (auto i = to_underlying(CSS::first_longhand_property_id); i <= to_underlying(CSS::last_longhand_property_id); ++i) {
+ auto property = static_cast(i);
+ if (CSS::is_animatable_property(property))
+ animation_properties.append(String { CSS::string_from_property_id(property) });
+ }
+ } else if (auto property = CSS::property_id_from_camel_case_string(name); property.has_value()) {
if (CSS::is_animatable_property(property.value()))
animation_properties.append(name);
}
@@ -157,7 +166,8 @@ static WebIDL::ExceptionOr> process_a_keyframe_like_object(JS::
// 1. Let raw value be the result of calling the [[Get]] internal method on keyframe input, with property name
// as the property key and keyframe input as the receiver.
// 2. Check the completion record of raw value.
- auto raw_value = TRY(keyframe_input->get(ByteString { property_name }));
+ JS::PropertyKey key { property_name };
+ auto raw_value = TRY(keyframe_input->has_property(key)) ? TRY(keyframe_input->get(key)) : *all_value;
using PropertyValuesType = Conditional, String>;
PropertyValuesType property_values;