mirror of
				https://github.com/RGBCube/serenity
				synced 2025-10-31 17:52:45 +00:00 
			
		
		
		
	LibWeb: Add a way to test if a CSS::PropertyID is animatable
This commit is contained in:
		
							parent
							
								
									edab67d5e8
								
							
						
					
					
						commit
						212a139292
					
				
					 2 changed files with 261 additions and 4 deletions
				
			
		|  | @ -17,6 +17,7 @@ void replace_logical_aliases(JsonObject& properties); | ||||||
| ErrorOr<void> generate_header_file(JsonObject& properties, Core::File& file); | ErrorOr<void> generate_header_file(JsonObject& properties, Core::File& file); | ||||||
| ErrorOr<void> generate_implementation_file(JsonObject& properties, Core::File& file); | ErrorOr<void> generate_implementation_file(JsonObject& properties, Core::File& file); | ||||||
| void generate_bounds_checking_function(JsonObject& properties, SourceGenerator& parent_generator, StringView css_type_name, StringView type_name, Optional<StringView> default_unit_name = {}, Optional<StringView> value_getter = {}); | void generate_bounds_checking_function(JsonObject& properties, SourceGenerator& parent_generator, StringView css_type_name, StringView type_name, Optional<StringView> default_unit_name = {}, Optional<StringView> value_getter = {}); | ||||||
|  | bool is_animatable_property(JsonObject& properties, StringView property_name); | ||||||
| 
 | 
 | ||||||
| static bool type_name_is_enum(StringView type_name) | static bool type_name_is_enum(StringView type_name) | ||||||
| { | { | ||||||
|  | @ -160,6 +161,16 @@ enum class PropertyID { | ||||||
|     generator.append(R"~~~( |     generator.append(R"~~~( | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
|  | enum class AnimationType { | ||||||
|  |     Discrete, | ||||||
|  |     ByComputedValue, | ||||||
|  |     RepeatableList, | ||||||
|  |     Custom, | ||||||
|  |     None, | ||||||
|  | }; | ||||||
|  | AnimationType animation_type_from_longhand_property(PropertyID); | ||||||
|  | bool is_animatable_property(PropertyID); | ||||||
|  | 
 | ||||||
| Optional<PropertyID> property_id_from_camel_case_string(StringView); | Optional<PropertyID> property_id_from_camel_case_string(StringView); | ||||||
| Optional<PropertyID> property_id_from_string(StringView); | Optional<PropertyID> property_id_from_string(StringView); | ||||||
| StringView string_from_property_id(PropertyID); | StringView string_from_property_id(PropertyID); | ||||||
|  | @ -412,6 +423,71 @@ StringView string_from_property_id(PropertyID property_id) { | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | AnimationType animation_type_from_longhand_property(PropertyID property_id) | ||||||
|  | { | ||||||
|  |     switch (property_id) { | ||||||
|  | )~~~"); | ||||||
|  | 
 | ||||||
|  |     properties.for_each_member([&](auto& name, auto& value) { | ||||||
|  |         VERIFY(value.is_object()); | ||||||
|  |         auto member_generator = generator.fork(); | ||||||
|  |         member_generator.set("name:titlecase", title_casify(name)); | ||||||
|  | 
 | ||||||
|  |         // Shorthand properties should have already been expanded before calling into this function
 | ||||||
|  |         if (value.as_object().has("longhands"sv)) { | ||||||
|  |             if (value.as_object().has("animation-type"sv)) { | ||||||
|  |                 dbgln("Property '{}' with longhands cannot specify 'animation-type'", name); | ||||||
|  |                 VERIFY_NOT_REACHED(); | ||||||
|  |             } | ||||||
|  |             member_generator.append(R"~~~( | ||||||
|  |     case PropertyID::@name:titlecase@: | ||||||
|  |         VERIFY_NOT_REACHED(); | ||||||
|  | )~~~"); | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         if (!value.as_object().has("animation-type"sv)) { | ||||||
|  |             dbgln("No animation-type specified for property '{}'", name); | ||||||
|  |             VERIFY_NOT_REACHED(); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         auto animation_type = value.as_object().get_byte_string("animation-type"sv).value(); | ||||||
|  |         member_generator.set("value", title_casify(animation_type)); | ||||||
|  |         member_generator.append(R"~~~( | ||||||
|  |     case PropertyID::@name:titlecase@: | ||||||
|  |         return AnimationType::@value@; | ||||||
|  | )~~~"); | ||||||
|  |     }); | ||||||
|  | 
 | ||||||
|  |     generator.append(R"~~~( | ||||||
|  |     default: | ||||||
|  |         return AnimationType::None; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | bool is_animatable_property(PropertyID property_id) | ||||||
|  | { | ||||||
|  |     switch (property_id) { | ||||||
|  | )~~~"); | ||||||
|  | 
 | ||||||
|  |     properties.for_each_member([&](auto& name, auto& value) { | ||||||
|  |         VERIFY(value.is_object()); | ||||||
|  |         if (is_animatable_property(properties, name)) { | ||||||
|  |             auto member_generator = generator.fork(); | ||||||
|  |             member_generator.set("name:titlecase", title_casify(name)); | ||||||
|  |             member_generator.append(R"~~~( | ||||||
|  |     case PropertyID::@name:titlecase@: | ||||||
|  | )~~~"); | ||||||
|  |         } | ||||||
|  |     }); | ||||||
|  | 
 | ||||||
|  |     generator.append(R"~~~( | ||||||
|  |         return true; | ||||||
|  |     default: | ||||||
|  |         return false; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
| bool is_inherited_property(PropertyID property_id) | bool is_inherited_property(PropertyID property_id) | ||||||
| { | { | ||||||
|     switch (property_id) { |     switch (property_id) { | ||||||
|  | @ -860,3 +936,28 @@ Vector<PropertyID> longhands_for_shorthand(PropertyID property_id) | ||||||
|     TRY(file.write_until_depleted(generator.as_string_view().bytes())); |     TRY(file.write_until_depleted(generator.as_string_view().bytes())); | ||||||
|     return {}; |     return {}; | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | bool is_animatable_property(JsonObject& properties, StringView property_name) | ||||||
|  | { | ||||||
|  |     auto property = properties.get_object(property_name); | ||||||
|  |     VERIFY(property.has_value()); | ||||||
|  | 
 | ||||||
|  |     if (auto animation_type = property.value().get_byte_string("animation-type"sv); animation_type.has_value()) { | ||||||
|  |         return animation_type != "none"; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     if (!property.value().has("longhands"sv)) { | ||||||
|  |         dbgln("Property '{}' must specify either 'animation-type' or 'longhands'"sv, property_name); | ||||||
|  |         VERIFY_NOT_REACHED(); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     auto longhands = property.value().get_array("longhands"sv); | ||||||
|  |     VERIFY(longhands.has_value()); | ||||||
|  |     for (auto const& subproperty_name : longhands->values()) { | ||||||
|  |         VERIFY(subproperty_name.is_string()); | ||||||
|  |         if (is_animatable_property(properties, subproperty_name.as_string())) | ||||||
|  |             return true; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     return false; | ||||||
|  | } | ||||||
|  |  | ||||||
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Matthew Olsson
						Matthew Olsson