Browse Source

LibWeb: Implement element slot-related attributes and settings

This implements the element's slot attribute itself, and setting the
slot assignment on the element's shadow root.
Timothy Flynn 1 năm trước cách đây
mục cha
commit
54b5a431a3

+ 2 - 1
Userland/Libraries/LibWeb/DOM/Element.cpp

@@ -599,7 +599,8 @@ WebIDL::ExceptionOr<JS::NonnullGCPtr<ShadowRoot>> Element::attach_shadow(ShadowR
     if (m_custom_element_state == CustomElementState::Precustomized || m_custom_element_state == CustomElementState::Custom)
         shadow->set_available_to_element_internals(true);
 
-    // FIXME: 8. Set shadow’s slot assignment to init["slotAssignment"].
+    // 8. Set shadow’s slot assignment to init["slotAssignment"].
+    shadow->set_slot_assignment(init.slot_assignment);
 
     // 9. Set this’s shadow root to shadow.
     set_shadow_root(shadow);

+ 1 - 0
Userland/Libraries/LibWeb/DOM/Element.h

@@ -30,6 +30,7 @@ namespace Web::DOM {
 struct ShadowRootInit {
     Bindings::ShadowRootMode mode;
     bool delegates_focus = false;
+    Bindings::SlotAssignmentMode slot_assignment { Bindings::SlotAssignmentMode::Named };
 };
 
 // https://w3c.github.io/csswg-drafts/cssom-view-1/#dictdef-scrollintoviewoptions

+ 2 - 1
Userland/Libraries/LibWeb/DOM/Element.idl

@@ -49,6 +49,7 @@ interface Element : Node {
     [Reflect, CEReactions] attribute DOMString id;
     [Reflect=class, CEReactions] attribute DOMString className;
     [SameObject, PutForwards=value] readonly attribute DOMTokenList classList;
+    [Reflect, CEReactions, Unscopable] attribute DOMString slot;
 
     ShadowRoot attachShadow(ShadowRootInit init);
     readonly attribute ShadowRoot? shadowRoot;
@@ -90,7 +91,7 @@ interface Element : Node {
 dictionary ShadowRootInit {
     required ShadowRootMode mode;
     boolean delegatesFocus = false;
-    // FIXME: SlotAssignmentMode slotAssignment = "named";
+    SlotAssignmentMode slotAssignment = "named";
 };
 
 Element includes ParentNode;

+ 5 - 1
Userland/Libraries/LibWeb/DOM/ShadowRoot.h

@@ -17,6 +17,9 @@ class ShadowRoot final : public DocumentFragment {
 public:
     Bindings::ShadowRootMode mode() const { return m_mode; }
 
+    Bindings::SlotAssignmentMode slot_assignment() const { return m_slot_assignment; }
+    void set_slot_assignment(Bindings::SlotAssignmentMode slot_assignment) { m_slot_assignment = slot_assignment; }
+
     bool delegates_focus() const { return m_delegates_focus; }
     void set_delegates_focus(bool delegates_focus) { m_delegates_focus = delegates_focus; }
 
@@ -37,8 +40,9 @@ private:
     virtual DeprecatedFlyString node_name() const override { return "#shadow-root"; }
     virtual bool is_shadow_root() const final { return true; }
 
-    // NOTE: The specification doesn't seem to specify a default value for closed. Assuming closed for now.
+    // NOTE: The specification doesn't seem to specify a default value for mode. Assuming closed for now.
     Bindings::ShadowRootMode m_mode { Bindings::ShadowRootMode::Closed };
+    Bindings::SlotAssignmentMode m_slot_assignment { Bindings::SlotAssignmentMode::Named };
     bool m_delegates_focus { false };
     bool m_available_to_element_internals { false };
 };

+ 1 - 1
Userland/Libraries/LibWeb/DOM/ShadowRoot.idl

@@ -6,7 +6,7 @@
 interface ShadowRoot : DocumentFragment {
     readonly attribute ShadowRootMode mode;
     // FIXME: readonly attribute boolean delegatesFocus;
-    // FIXME: readonly attribute SlotAssignmentMode slotAssignment;
+    readonly attribute SlotAssignmentMode slotAssignment;
     readonly attribute Element host;
     // FIXME: attribute EventHandler onslotchange;
 };

+ 1 - 0
Userland/Libraries/LibWeb/HTML/AttributeNames.h

@@ -214,6 +214,7 @@ namespace AttributeNames {
     __ENUMERATE_HTML_ATTRIBUTE(shape)                      \
     __ENUMERATE_HTML_ATTRIBUTE(size)                       \
     __ENUMERATE_HTML_ATTRIBUTE(sizes)                      \
+    __ENUMERATE_HTML_ATTRIBUTE(slot)                       \
     __ENUMERATE_HTML_ATTRIBUTE(span)                       \
     __ENUMERATE_HTML_ATTRIBUTE(src)                        \
     __ENUMERATE_HTML_ATTRIBUTE(srcdoc)                     \