| 
									
										
										
										
											2021-02-21 13:45:26 +02:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * Copyright (c) 2021, the SerenityOS developers. | 
					
						
							| 
									
										
										
										
											2024-09-02 16:45:25 +01:00
										 |  |  |  * Copyright (c) 2022-2024, Sam Atkins <sam@ladybird.org> | 
					
						
							| 
									
										
										
										
											2024-10-04 13:19:50 +02:00
										 |  |  |  * Copyright (c) 2022, Andreas Kling <andreas@ladybird.org> | 
					
						
							| 
									
										
										
										
											2021-02-21 13:45:26 +02:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2021-04-22 01:24:48 -07:00
										 |  |  |  * SPDX-License-Identifier: BSD-2-Clause | 
					
						
							| 
									
										
										
										
											2021-02-21 13:45:26 +02:00
										 |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-04-27 12:09:58 +12:00
										 |  |  | #include <LibWeb/Bindings/CSSRulePrototype.h>
 | 
					
						
							| 
									
										
										
										
											2024-09-02 16:45:25 +01:00
										 |  |  | #include <LibWeb/CSS/CSSLayerBlockRule.h>
 | 
					
						
							| 
									
										
										
										
											2021-02-21 13:45:26 +02:00
										 |  |  | #include <LibWeb/CSS/CSSRule.h>
 | 
					
						
							| 
									
										
										
										
											2022-04-22 19:56:22 +01:00
										 |  |  | #include <LibWeb/CSS/CSSStyleSheet.h>
 | 
					
						
							| 
									
										
										
										
											2021-02-21 13:45:26 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | namespace Web::CSS { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-10-28 20:16:28 +01:00
										 |  |  | CSSRule::CSSRule(JS::Realm& realm, Type type) | 
					
						
							| 
									
										
										
										
											2022-09-24 16:34:04 -06:00
										 |  |  |     : PlatformObject(realm) | 
					
						
							| 
									
										
										
										
											2024-10-28 20:16:28 +01:00
										 |  |  |     , m_type(type) | 
					
						
							| 
									
										
										
										
											2022-08-07 15:46:44 +02:00
										 |  |  | { | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void CSSRule::visit_edges(Cell::Visitor& visitor) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     Base::visit_edges(visitor); | 
					
						
							| 
									
										
										
										
											2023-11-19 16:18:00 +13:00
										 |  |  |     visitor.visit(m_parent_style_sheet); | 
					
						
							|  |  |  |     visitor.visit(m_parent_rule); | 
					
						
							| 
									
										
										
										
											2022-08-07 15:46:44 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-10-30 14:33:46 +00:00
										 |  |  | // https://www.w3.org/TR/cssom/#dom-cssrule-type
 | 
					
						
							|  |  |  | WebIDL::UnsignedShort CSSRule::type_for_bindings() const | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     // NOTE: Types that aren't defined in the spec must return 0.
 | 
					
						
							|  |  |  |     // To do this, we arbitrarily make non-spec ones start at 100.
 | 
					
						
							|  |  |  |     auto type = to_underlying(m_type); | 
					
						
							|  |  |  |     if (type >= 100) | 
					
						
							|  |  |  |         return 0; | 
					
						
							|  |  |  |     return type; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-15 19:38:39 +01:00
										 |  |  | // https://www.w3.org/TR/cssom/#dom-cssrule-csstext
 | 
					
						
							| 
									
										
										
										
											2023-11-20 23:16:39 +13:00
										 |  |  | String CSSRule::css_text() const | 
					
						
							| 
									
										
										
										
											2021-10-01 19:57:45 +02:00
										 |  |  | { | 
					
						
							|  |  |  |     // The cssText attribute must return a serialization of the CSS rule.
 | 
					
						
							|  |  |  |     return serialized(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-15 19:38:39 +01:00
										 |  |  | // https://www.w3.org/TR/cssom/#dom-cssrule-csstext
 | 
					
						
							| 
									
										
										
										
											2021-10-01 19:57:45 +02:00
										 |  |  | void CSSRule::set_css_text(StringView) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     // On setting the cssText attribute must do nothing.
 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-04-22 19:56:22 +01:00
										 |  |  | void CSSRule::set_parent_rule(CSSRule* parent_rule) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2022-07-04 00:42:44 +02:00
										 |  |  |     m_parent_rule = parent_rule; | 
					
						
							| 
									
										
										
										
											2025-06-24 00:42:19 +12:00
										 |  |  | 
 | 
					
						
							|  |  |  |     if (parent_rule == nullptr) | 
					
						
							|  |  |  |         set_parent_style_sheet(nullptr); | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |         set_parent_style_sheet(parent_rule->parent_style_sheet()); | 
					
						
							| 
									
										
										
										
											2024-10-16 14:10:59 +01:00
										 |  |  |     clear_caches(); | 
					
						
							| 
									
										
										
										
											2022-04-22 19:56:22 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void CSSRule::set_parent_style_sheet(CSSStyleSheet* parent_style_sheet) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2022-07-04 00:42:44 +02:00
										 |  |  |     m_parent_style_sheet = parent_style_sheet; | 
					
						
							| 
									
										
										
										
											2024-10-16 14:10:59 +01:00
										 |  |  |     clear_caches(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void CSSRule::clear_caches() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     m_cached_layer_name.clear(); | 
					
						
							| 
									
										
										
										
											2022-04-22 19:56:22 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-09-17 15:48:22 +02:00
										 |  |  | FlyString CSSRule::parent_layer_internal_qualified_name_slow_case() const | 
					
						
							| 
									
										
										
										
											2024-09-02 16:45:25 +01:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2024-09-09 17:35:13 +02:00
										 |  |  |     Vector<FlyString> layer_names; | 
					
						
							|  |  |  |     for (auto* rule = parent_rule(); rule; rule = rule->parent_rule()) { | 
					
						
							|  |  |  |         switch (rule->type()) { | 
					
						
							| 
									
										
										
										
											2024-10-15 15:59:31 +01:00
										 |  |  |         case Type::Import: | 
					
						
							| 
									
										
										
										
											2024-09-09 17:35:13 +02:00
										 |  |  |             // TODO: Handle `layer(foo)` in import rules once we implement that.
 | 
					
						
							|  |  |  |             break; | 
					
						
							| 
									
										
										
										
											2024-09-02 16:45:25 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-10-15 15:59:31 +01:00
										 |  |  |         case Type::LayerBlock: { | 
					
						
							| 
									
										
										
										
											2024-09-09 17:35:13 +02:00
										 |  |  |             auto& layer_block = static_cast<CSSLayerBlockRule const&>(*rule); | 
					
						
							|  |  |  |             layer_names.append(layer_block.internal_name()); | 
					
						
							|  |  |  |             break; | 
					
						
							| 
									
										
										
										
											2024-09-02 16:45:25 +01:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-09-09 17:35:13 +02:00
										 |  |  |             // Ignore everything else
 | 
					
						
							|  |  |  |             // Note that LayerStatement cannot have child rules so we still ignore it here.
 | 
					
						
							| 
									
										
										
										
											2024-10-15 15:59:31 +01:00
										 |  |  |         case Type::LayerStatement: | 
					
						
							|  |  |  |         case Type::Style: | 
					
						
							|  |  |  |         case Type::Media: | 
					
						
							|  |  |  |         case Type::FontFace: | 
					
						
							|  |  |  |         case Type::Keyframes: | 
					
						
							|  |  |  |         case Type::Keyframe: | 
					
						
							|  |  |  |         case Type::Namespace: | 
					
						
							|  |  |  |         case Type::Supports: | 
					
						
							|  |  |  |         case Type::NestedDeclarations: | 
					
						
							| 
									
										
										
										
											2024-10-17 23:28:09 +01:00
										 |  |  |         case Type::Property: | 
					
						
							| 
									
										
										
										
											2025-05-13 12:17:41 +01:00
										 |  |  |         case Type::Page: | 
					
						
							| 
									
										
										
										
											2025-05-15 11:48:56 +01:00
										 |  |  |         case Type::Margin: | 
					
						
							| 
									
										
										
										
											2024-09-09 17:35:13 +02:00
										 |  |  |             break; | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2024-09-07 11:45:50 +02:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2024-09-09 17:35:13 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-09-17 15:48:22 +02:00
										 |  |  |     return MUST(String::join('.', layer_names.in_reverse())); | 
					
						
							| 
									
										
										
										
											2024-09-02 16:45:25 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-21 13:45:26 +02:00
										 |  |  | } |