| 
									
										
										
										
											2023-07-29 11:51:15 -05:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * Copyright (c) 2023, Jonah Shafran <jonahshafran@gmail.com> | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * SPDX-License-Identifier: BSD-2-Clause | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-11-15 04:01:23 +13:00
										 |  |  | #include <LibGC/Heap.h>
 | 
					
						
							| 
									
										
										
										
											2023-07-29 11:51:15 -05:00
										 |  |  | #include <LibJS/Runtime/Realm.h>
 | 
					
						
							|  |  |  | #include <LibWeb/Bindings/CSSNamespaceRulePrototype.h>
 | 
					
						
							|  |  |  | #include <LibWeb/Bindings/Intrinsics.h>
 | 
					
						
							|  |  |  | #include <LibWeb/CSS/CSSNamespaceRule.h>
 | 
					
						
							| 
									
										
										
										
											2023-08-04 14:56:15 +01:00
										 |  |  | #include <LibWeb/CSS/Serialize.h>
 | 
					
						
							| 
									
										
										
										
											2023-07-29 11:51:15 -05:00
										 |  |  | #include <LibWeb/WebIDL/ExceptionOr.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace Web::CSS { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-11-15 04:01:23 +13:00
										 |  |  | GC_DEFINE_ALLOCATOR(CSSNamespaceRule); | 
					
						
							| 
									
										
										
										
											2023-11-19 19:47:52 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-12-01 13:36:40 +01:00
										 |  |  | CSSNamespaceRule::CSSNamespaceRule(JS::Realm& realm, Optional<FlyString> prefix, FlyString namespace_uri) | 
					
						
							| 
									
										
										
										
											2024-10-28 20:16:28 +01:00
										 |  |  |     : CSSRule(realm, Type::Namespace) | 
					
						
							| 
									
										
										
										
											2023-12-01 13:36:40 +01:00
										 |  |  |     , m_namespace_uri(move(namespace_uri)) | 
					
						
							|  |  |  |     , m_prefix(prefix.value_or(""_fly_string)) | 
					
						
							| 
									
										
										
										
											2023-07-29 11:51:15 -05:00
										 |  |  | { | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-11-15 04:01:23 +13:00
										 |  |  | GC::Ref<CSSNamespaceRule> CSSNamespaceRule::create(JS::Realm& realm, Optional<FlyString> prefix, FlyString namespace_uri) | 
					
						
							| 
									
										
										
										
											2023-07-29 11:51:15 -05:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2024-11-14 05:50:17 +13:00
										 |  |  |     return realm.create<CSSNamespaceRule>(realm, move(prefix), move(namespace_uri)); | 
					
						
							| 
									
										
										
										
											2023-07-29 11:51:15 -05:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-08-07 08:41:28 +02:00
										 |  |  | void CSSNamespaceRule::initialize(JS::Realm& realm) | 
					
						
							| 
									
										
										
										
											2023-07-29 11:51:15 -05:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2024-03-16 13:13:08 +01:00
										 |  |  |     WEB_SET_PROTOTYPE_FOR_INTERFACE(CSSNamespaceRule); | 
					
						
							| 
									
										
										
										
											2025-04-20 16:22:57 +02:00
										 |  |  |     Base::initialize(realm); | 
					
						
							| 
									
										
										
										
											2023-07-29 11:51:15 -05:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // https://www.w3.org/TR/cssom/#serialize-a-css-rule
 | 
					
						
							| 
									
										
										
										
											2023-11-20 23:16:39 +13:00
										 |  |  | String CSSNamespaceRule::serialized() const | 
					
						
							| 
									
										
										
										
											2023-07-29 11:51:15 -05:00
										 |  |  | { | 
					
						
							|  |  |  |     StringBuilder builder; | 
					
						
							|  |  |  |     // The literal string "@namespace", followed by a single SPACE (U+0020),
 | 
					
						
							|  |  |  |     builder.append("@namespace "sv); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // followed by the serialization as an identifier of the prefix attribute (if any),
 | 
					
						
							| 
									
										
										
										
											2023-10-10 15:00:58 +03:30
										 |  |  |     if (!m_prefix.is_empty()) { | 
					
						
							| 
									
										
										
										
											2023-08-22 12:05:44 +01:00
										 |  |  |         serialize_an_identifier(builder, m_prefix); | 
					
						
							| 
									
										
										
										
											2023-07-29 11:51:15 -05:00
										 |  |  |         // followed by a single SPACE (U+0020) if there is a prefix,
 | 
					
						
							|  |  |  |         builder.append(" "sv); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     //  followed by the serialization as URL of the namespaceURI attribute,
 | 
					
						
							| 
									
										
										
										
											2023-08-22 12:05:44 +01:00
										 |  |  |     serialize_a_url(builder, m_namespace_uri); | 
					
						
							| 
									
										
										
										
											2023-07-29 11:51:15 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |     // followed the character ";" (U+003B).
 | 
					
						
							|  |  |  |     builder.append(";"sv); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-11-20 23:16:39 +13:00
										 |  |  |     return MUST(builder.to_string()); | 
					
						
							| 
									
										
										
										
											2023-07-29 11:51:15 -05:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } |