فهرست منبع

LibWeb: Implement StyleSheet.ownerNode :^)

Andreas Kling 4 سال پیش
والد
کامیت
d07fcba69b

+ 10 - 1
Userland/Libraries/LibWeb/CSS/StyleSheet.cpp

@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org>
+ * Copyright (c) 2018-2021, Andreas Kling <kling@serenityos.org>
  * Copyright (c) 2021, the SerenityOS developers.
  * All rights reserved.
  *
@@ -26,7 +26,16 @@
  */
 
 #include <LibWeb/CSS/StyleSheet.h>
+#include <LibWeb/DOM/Element.h>
 
 namespace Web::CSS {
 
+void StyleSheet::set_owner_node(DOM::Element* element)
+{
+    if (element)
+        m_owner_node = element->make_weak_ptr<DOM::Element>();
+    else
+        m_owner_node = nullptr;
+}
+
 }

+ 7 - 1
Userland/Libraries/LibWeb/CSS/StyleSheet.h

@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org>
+ * Copyright (c) 2018-2021, Andreas Kling <kling@serenityos.org>
  * Copyright (c) 2021, the SerenityOS developers.
  * All rights reserved.
  *
@@ -41,8 +41,14 @@ public:
 
     virtual ~StyleSheet() = default;
 
+    DOM::Element* owner_node() { return m_owner_node; }
+    void set_owner_node(DOM::Element*);
+
 protected:
     StyleSheet() = default;
+
+private:
+    WeakPtr<DOM::Element> m_owner_node;
 };
 
 }

+ 4 - 1
Userland/Libraries/LibWeb/CSS/StyleSheet.idl

@@ -1,9 +1,12 @@
 interface StyleSheet {
+
+    readonly attribute Element? ownerNode;
+
     // readonly attribute CSSOMString type;
     // readonly attribute USVString? href;
-    // readonly attribute (Element or ProcessingInstruction)? ownerNode;
     // readonly attribute CSSStyleSheet? parentStyleSheet;
     // readonly attribute DOMString? title;
     // [SameObject, PutForwards=mediaText] readonly attribute MediaList media;
     // attribute boolean disabled;
+
 };

+ 5 - 2
Userland/Libraries/LibWeb/HTML/HTMLLinkElement.cpp

@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org>
+ * Copyright (c) 2018-2021, Andreas Kling <kling@serenityos.org>
  * Copyright (c) 2021, the SerenityOS developers.
  * All rights reserved.
  *
@@ -53,7 +53,10 @@ void HTMLLinkElement::inserted_into(Node& node)
 
     if (m_relationship & Relationship::Stylesheet && !(m_relationship & Relationship::Alternate)) {
         m_css_loader.load_from_url(document().complete_url(href()));
-        document().style_sheets().add_sheet(m_css_loader.style_sheet().release_nonnull());
+        if (auto sheet = m_css_loader.style_sheet()) {
+            sheet->set_owner_node(this);
+            document().style_sheets().add_sheet(sheet.release_nonnull());
+        }
     }
 }
 

+ 6 - 2
Userland/Libraries/LibWeb/HTML/HTMLStyleElement.cpp

@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org>
+ * Copyright (c) 2018-2021, Andreas Kling <kling@serenityos.org>
  * Copyright (c) 2021, the SerenityOS developers.
  * All rights reserved.
  *
@@ -53,7 +53,11 @@ void HTMLStyleElement::children_changed()
             builder.append(downcast<DOM::Text>(child).text_content());
     });
     m_css_loader.load_from_text(builder.to_string());
-    document().style_sheets().add_sheet(m_css_loader.style_sheet().release_nonnull());
+
+    if (auto sheet = m_css_loader.style_sheet()) {
+        sheet->set_owner_node(this);
+        document().style_sheets().add_sheet(sheet.release_nonnull());
+    }
 
     HTMLElement::children_changed();
 }