Преглед на файлове

LibHTML: Add a simple <style> element for inline CSS

Andreas Kling преди 5 години
родител
ревизия
a4fccc02ec

+ 28 - 0
Libraries/LibHTML/DOM/HTMLStyleElement.cpp

@@ -0,0 +1,28 @@
+#include <LibHTML/DOM/Document.h>
+#include <LibHTML/DOM/HTMLStyleElement.h>
+#include <LibHTML/Parser/CSSParser.h>
+
+HTMLStyleElement::HTMLStyleElement(Document& document, const String& tag_name)
+    : HTMLElement(document, tag_name)
+{
+}
+
+HTMLStyleElement::~HTMLStyleElement()
+{
+}
+
+void HTMLStyleElement::inserted_into(Node& new_parent)
+{
+    m_stylesheet = parse_css(text_content());
+    if (m_stylesheet)
+        document().add_sheet(*m_stylesheet);
+    HTMLElement::inserted_into(new_parent);
+}
+
+void HTMLStyleElement::removed_from(Node& old_parent)
+{
+    if (m_stylesheet) {
+        // FIXME: Remove the sheet from the document
+    }
+    return HTMLElement::removed_from(old_parent);
+}

+ 17 - 0
Libraries/LibHTML/DOM/HTMLStyleElement.h

@@ -0,0 +1,17 @@
+#pragma once
+
+#include <LibHTML/DOM/HTMLElement.h>
+
+class StyleSheet;
+
+class HTMLStyleElement : public HTMLElement {
+public:
+    HTMLStyleElement(Document&, const String& tag_name);
+    virtual ~HTMLStyleElement() override;
+
+    virtual void inserted_into(Node&) override;
+    virtual void removed_from(Node&) override;
+
+private:
+    RefPtr<StyleSheet> m_stylesheet;
+};

+ 1 - 0
Libraries/LibHTML/Makefile.shared

@@ -7,6 +7,7 @@ LIBHTML_OBJS = \
     DOM/HTMLHeadingElement.o \
     DOM/HTMLHeadElement.o \
     DOM/HTMLHtmlElement.o \
+    DOM/HTMLStyleElement.o \
     DOM/HTMLTitleElement.o \
     DOM/Document.o \
     DOM/Text.o \

+ 3 - 0
Libraries/LibHTML/Parser/HTMLParser.cpp

@@ -6,6 +6,7 @@
 #include <LibHTML/DOM/HTMLHeadElement.h>
 #include <LibHTML/DOM/HTMLHeadingElement.h>
 #include <LibHTML/DOM/HTMLHtmlElement.h>
+#include <LibHTML/DOM/HTMLStyleElement.h>
 #include <LibHTML/DOM/HTMLTitleElement.h>
 #include <LibHTML/DOM/Text.h>
 #include <LibHTML/Parser/HTMLParser.h>
@@ -21,6 +22,8 @@ static NonnullRefPtr<Element> create_element(Document& document, const String& t
         return adopt(*new HTMLHtmlElement(document, tag_name));
     if (lowercase_tag_name == "head")
         return adopt(*new HTMLHeadElement(document, tag_name));
+    if (lowercase_tag_name == "style")
+        return adopt(*new HTMLStyleElement(document, tag_name));
     if (lowercase_tag_name == "title")
         return adopt(*new HTMLTitleElement(document, tag_name));
     if (lowercase_tag_name == "h1"