LibWeb: Use FlyString for Element tag names

This makes selector matching a lot more efficient, and also reduces the
number of strings on the heap.
This commit is contained in:
Andreas Kling 2020-03-22 19:10:43 +01:00
parent c4a6d6ae9f
commit 7309642ca8
Notes: sideshowbarker 2024-07-19 08:10:55 +09:00
48 changed files with 67 additions and 63 deletions

View file

@ -26,7 +26,7 @@
#pragma once
#include <AK/String.h>
#include <AK/FlyString.h>
#include <AK/Vector.h>
#include <LibWeb/CSS/Specificity.h>
@ -55,7 +55,7 @@ public:
};
PseudoClass pseudo_class { PseudoClass::None };
String value;
FlyString value;
enum class AttributeMatchType {
None,
@ -64,7 +64,7 @@ public:
};
AttributeMatchType attribute_match_type { AttributeMatchType::None };
String attribute_name;
FlyString attribute_name;
String attribute_value;
};

View file

@ -26,7 +26,7 @@
#pragma once
#include <AK/String.h>
#include <AK/FlyString.h>
#include <LibWeb/DOM/CharacterData.h>
namespace Web {
@ -36,7 +36,7 @@ public:
explicit Comment(Document&, const String&);
virtual ~Comment() override;
virtual String tag_name() const override { return "#comment"; }
virtual FlyString tag_name() const override { return "#comment"; }
};
template<>

View file

@ -26,6 +26,7 @@
#pragma once
#include <AK/FlyString.h>
#include <AK/Function.h>
#include <AK/NonnullRefPtrVector.h>
#include <AK/OwnPtr.h>
@ -69,7 +70,7 @@ public:
void add_sheet(const StyleSheet& sheet) { m_sheets.append(sheet); }
const NonnullRefPtrVector<StyleSheet>& stylesheets() const { return m_sheets; }
virtual String tag_name() const override { return "#document"; }
virtual FlyString tag_name() const override { return "#document"; }
void set_hovered_node(Node*);
Node* hovered_node() { return m_hovered_node; }

View file

@ -26,6 +26,7 @@
#pragma once
#include <AK/FlyString.h>
#include <LibWeb/DOM/ParentNode.h>
namespace Web {
@ -37,7 +38,7 @@ public:
{
}
virtual String tag_name() const override { return "#document-fragment"; }
virtual FlyString tag_name() const override { return "#document-fragment"; }
};
template<>

View file

@ -26,6 +26,7 @@
#pragma once
#include <AK/FlyString.h>
#include <LibWeb/DOM/Node.h>
namespace Web {
@ -35,7 +36,7 @@ public:
explicit DocumentType(Document&);
virtual ~DocumentType() override;
virtual String tag_name() const override { return "#doctype"; }
virtual FlyString tag_name() const override { return "#doctype"; }
};
template<>

View file

@ -39,7 +39,7 @@
namespace Web {
Element::Element(Document& document, const String& tag_name)
Element::Element(Document& document, const FlyString& tag_name)
: ParentNode(document, NodeType::ELEMENT_NODE)
, m_tag_name(tag_name)
{

View file

@ -55,10 +55,10 @@ private:
class Element : public ParentNode {
public:
Element(Document&, const String& tag_name);
Element(Document&, const FlyString& tag_name);
virtual ~Element() override;
virtual String tag_name() const final { return m_tag_name; }
virtual FlyString tag_name() const final { return m_tag_name; }
bool has_attribute(const FlyString& name) const { return !attribute(name).is_null(); }
String attribute(const FlyString& name) const;
@ -94,7 +94,7 @@ private:
Attribute* find_attribute(const FlyString& name);
const Attribute* find_attribute(const FlyString& name) const;
String m_tag_name;
FlyString m_tag_name;
Vector<Attribute> m_attributes;
RefPtr<StyleProperties> m_resolved_style;

View file

@ -45,7 +45,7 @@
namespace Web {
NonnullRefPtr<Element> create_element(Document& document, const String& tag_name)
NonnullRefPtr<Element> create_element(Document& document, const FlyString& tag_name)
{
auto lowercase_tag_name = tag_name.to_lowercase();
if (lowercase_tag_name == "a")

View file

@ -30,6 +30,6 @@
namespace Web {
NonnullRefPtr<Element> create_element(Document&, const String& tag_name);
NonnullRefPtr<Element> create_element(Document&, const FlyString& tag_name);
}

View file

@ -28,7 +28,7 @@
namespace Web {
HTMLAnchorElement::HTMLAnchorElement(Document& document, const String& tag_name)
HTMLAnchorElement::HTMLAnchorElement(Document& document, const FlyString& tag_name)
: HTMLElement(document, tag_name)
{
}

View file

@ -32,7 +32,7 @@ namespace Web {
class HTMLAnchorElement : public HTMLElement {
public:
HTMLAnchorElement(Document&, const String& tag_name);
HTMLAnchorElement(Document&, const FlyString& tag_name);
virtual ~HTMLAnchorElement() override;
String href() const { return attribute("href"); }
@ -41,7 +41,7 @@ public:
template<>
inline bool is<HTMLAnchorElement>(const Node& node)
{
return is<Element>(node) && to<Element>(node).tag_name().to_lowercase() == "a";
return is<Element>(node) && to<Element>(node).tag_name().equals_ignoring_case("a");
}
}

View file

@ -29,7 +29,7 @@
namespace Web {
HTMLBRElement::HTMLBRElement(Document& document, const String& tag_name)
HTMLBRElement::HTMLBRElement(Document& document, const FlyString& tag_name)
: HTMLElement(document, tag_name)
{
}

View file

@ -32,7 +32,7 @@ namespace Web {
class HTMLBRElement final : public HTMLElement {
public:
HTMLBRElement(Document&, const String& tag_name);
HTMLBRElement(Document&, const FlyString& tag_name);
virtual ~HTMLBRElement() override;
virtual RefPtr<LayoutNode> create_layout_node(const StyleProperties* parent_style) const override;
@ -41,7 +41,7 @@ public:
template<>
inline bool is<HTMLBRElement>(const Node& node)
{
return is<Element>(node) && to<Element>(node).tag_name().to_lowercase() == "br";
return is<Element>(node) && to<Element>(node).tag_name().equals_ignoring_case("br");
}
}

View file

@ -32,7 +32,7 @@
namespace Web {
HTMLBlinkElement::HTMLBlinkElement(Document& document, const String& tag_name)
HTMLBlinkElement::HTMLBlinkElement(Document& document, const FlyString& tag_name)
: HTMLElement(document, tag_name)
, m_timer(Core::Timer::construct())
{

View file

@ -33,7 +33,7 @@ namespace Web {
class HTMLBlinkElement : public HTMLElement {
public:
HTMLBlinkElement(Document&, const String& tag_name);
HTMLBlinkElement(Document&, const FlyString& tag_name);
virtual ~HTMLBlinkElement() override;
private:

View file

@ -31,7 +31,7 @@
namespace Web {
HTMLBodyElement::HTMLBodyElement(Document& document, const String& tag_name)
HTMLBodyElement::HTMLBodyElement(Document& document, const FlyString& tag_name)
: HTMLElement(document, tag_name)
{
}

View file

@ -32,7 +32,7 @@ namespace Web {
class HTMLBodyElement : public HTMLElement {
public:
HTMLBodyElement(Document&, const String& tag_name);
HTMLBodyElement(Document&, const FlyString& tag_name);
virtual ~HTMLBodyElement() override;
virtual void parse_attribute(const FlyString&, const String&) override;
@ -45,7 +45,7 @@ private:
template<>
inline bool is<HTMLBodyElement>(const Node& node)
{
return is<Element>(node) && to<Element>(node).tag_name().to_lowercase() == "body";
return is<Element>(node) && to<Element>(node).tag_name().equals_ignoring_case("body");
}
}

View file

@ -33,7 +33,7 @@
namespace Web {
HTMLCanvasElement::HTMLCanvasElement(Document& document, const String& tag_name)
HTMLCanvasElement::HTMLCanvasElement(Document& document, const FlyString& tag_name)
: HTMLElement(document, tag_name)
{
}

View file

@ -38,7 +38,7 @@ class HTMLCanvasElement : public HTMLElement {
public:
using WrapperType = Bindings::HTMLCanvasElementWrapper;
HTMLCanvasElement(Document&, const String& tag_name);
HTMLCanvasElement(Document&, const FlyString& tag_name);
virtual ~HTMLCanvasElement() override;
int preferred_width() const;
@ -59,7 +59,7 @@ private:
template<>
inline bool is<HTMLCanvasElement>(const Node& node)
{
return is<Element>(node) && to<Element>(node).tag_name().to_lowercase() == "canvas";
return is<Element>(node) && to<Element>(node).tag_name().equals_ignoring_case("canvas");
}

View file

@ -28,7 +28,7 @@
namespace Web {
HTMLElement::HTMLElement(Document& document, const String& tag_name)
HTMLElement::HTMLElement(Document& document, const FlyString& tag_name)
: Element(document, tag_name)
{
}

View file

@ -32,7 +32,7 @@ namespace Web {
class HTMLElement : public Element {
public:
HTMLElement(Document&, const String& tag_name);
HTMLElement(Document&, const FlyString& tag_name);
virtual ~HTMLElement() override;
String title() const { return attribute("title"); }

View file

@ -30,7 +30,7 @@
namespace Web {
HTMLFontElement::HTMLFontElement(Document& document, const String& tag_name)
HTMLFontElement::HTMLFontElement(Document& document, const FlyString& tag_name)
: HTMLElement(document, tag_name)
{
}

View file

@ -32,7 +32,7 @@ namespace Web {
class HTMLFontElement : public HTMLElement {
public:
HTMLFontElement(Document&, const String& tag_name);
HTMLFontElement(Document&, const FlyString& tag_name);
virtual ~HTMLFontElement() override;
virtual void apply_presentational_hints(StyleProperties&) const override;

View file

@ -32,7 +32,7 @@
namespace Web {
HTMLFormElement::HTMLFormElement(Document& document, const String& tag_name)
HTMLFormElement::HTMLFormElement(Document& document, const FlyString& tag_name)
: HTMLElement(document, tag_name)
{
}

View file

@ -32,7 +32,7 @@ namespace Web {
class HTMLFormElement : public HTMLElement {
public:
HTMLFormElement(Document&, const String& tag_name);
HTMLFormElement(Document&, const FlyString& tag_name);
virtual ~HTMLFormElement() override;
String action() const { return attribute("action"); }
@ -44,7 +44,7 @@ public:
template<>
inline bool is<HTMLFormElement>(const Node& node)
{
return is<Element>(node) && to<Element>(node).tag_name().to_lowercase() == "form";
return is<Element>(node) && to<Element>(node).tag_name().equals_ignoring_case("form");
}
}

View file

@ -28,7 +28,7 @@
namespace Web {
HTMLHRElement::HTMLHRElement(Document& document, const String& tag_name)
HTMLHRElement::HTMLHRElement(Document& document, const FlyString& tag_name)
: HTMLElement(document, tag_name)
{
}

View file

@ -32,7 +32,7 @@ namespace Web {
class HTMLHRElement : public HTMLElement {
public:
HTMLHRElement(Document&, const String& tag_name);
HTMLHRElement(Document&, const FlyString& tag_name);
virtual ~HTMLHRElement() override;
};

View file

@ -28,7 +28,7 @@
namespace Web {
HTMLHeadElement::HTMLHeadElement(Document& document, const String& tag_name)
HTMLHeadElement::HTMLHeadElement(Document& document, const FlyString& tag_name)
: HTMLElement(document, tag_name)
{
}

View file

@ -32,14 +32,14 @@ namespace Web {
class HTMLHeadElement : public HTMLElement {
public:
HTMLHeadElement(Document&, const String& tag_name);
HTMLHeadElement(Document&, const FlyString& tag_name);
virtual ~HTMLHeadElement() override;
};
template<>
inline bool is<HTMLHeadElement>(const Node& node)
{
return is<Element>(node) && to<Element>(node).tag_name().to_lowercase() == "head";
return is<Element>(node) && to<Element>(node).tag_name().equals_ignoring_case("head");
}
}

View file

@ -28,7 +28,7 @@
namespace Web {
HTMLHeadingElement::HTMLHeadingElement(Document& document, const String& tag_name)
HTMLHeadingElement::HTMLHeadingElement(Document& document, const FlyString& tag_name)
: HTMLElement(document, tag_name)
{
}

View file

@ -32,7 +32,7 @@ namespace Web {
class HTMLHeadingElement : public HTMLElement {
public:
HTMLHeadingElement(Document&, const String& tag_name);
HTMLHeadingElement(Document&, const FlyString& tag_name);
virtual ~HTMLHeadingElement() override;
};

View file

@ -28,7 +28,7 @@
namespace Web {
HTMLHtmlElement::HTMLHtmlElement(Document& document, const String& tag_name)
HTMLHtmlElement::HTMLHtmlElement(Document& document, const FlyString& tag_name)
: HTMLElement(document, tag_name)
{
}

View file

@ -32,14 +32,14 @@ namespace Web {
class HTMLHtmlElement : public HTMLElement {
public:
HTMLHtmlElement(Document&, const String& tag_name);
HTMLHtmlElement(Document&, const FlyString& tag_name);
virtual ~HTMLHtmlElement() override;
};
template<>
inline bool is<HTMLHtmlElement>(const Node& node)
{
return is<Element>(node) && to<Element>(node).tag_name().to_lowercase() == "html";
return is<Element>(node) && to<Element>(node).tag_name().equals_ignoring_case("html");
}
}

View file

@ -34,7 +34,7 @@
namespace Web {
HTMLImageElement::HTMLImageElement(Document& document, const String& tag_name)
HTMLImageElement::HTMLImageElement(Document& document, const FlyString& tag_name)
: HTMLElement(document, tag_name)
{
}

View file

@ -36,7 +36,7 @@ class LayoutDocument;
class HTMLImageElement : public HTMLElement {
public:
HTMLImageElement(Document&, const String& tag_name);
HTMLImageElement(Document&, const FlyString& tag_name);
virtual ~HTMLImageElement() override;
virtual void parse_attribute(const FlyString& name, const String& value) override;

View file

@ -36,7 +36,7 @@
namespace Web {
HTMLInputElement::HTMLInputElement(Document& document, const String& tag_name)
HTMLInputElement::HTMLInputElement(Document& document, const FlyString& tag_name)
: HTMLElement(document, tag_name)
{
}

View file

@ -32,7 +32,7 @@ namespace Web {
class HTMLInputElement : public HTMLElement {
public:
HTMLInputElement(Document&, const String& tag_name);
HTMLInputElement(Document&, const FlyString& tag_name);
virtual ~HTMLInputElement() override;
virtual RefPtr<LayoutNode> create_layout_node(const StyleProperties* parent_style) const override;
@ -45,7 +45,7 @@ public:
template<>
inline bool is<HTMLInputElement>(const Node& node)
{
return is<Element>(node) && to<Element>(node).tag_name().to_lowercase() == "input";
return is<Element>(node) && to<Element>(node).tag_name().equals_ignoring_case("input");
}
}

View file

@ -34,7 +34,7 @@
namespace Web {
HTMLLinkElement::HTMLLinkElement(Document& document, const String& tag_name)
HTMLLinkElement::HTMLLinkElement(Document& document, const FlyString& tag_name)
: HTMLElement(document, tag_name)
{
}

View file

@ -32,7 +32,7 @@ namespace Web {
class HTMLLinkElement final : public HTMLElement {
public:
HTMLLinkElement(Document&, const String& tag_name);
HTMLLinkElement(Document&, const FlyString& tag_name);
virtual ~HTMLLinkElement() override;
virtual void inserted_into(Node&) override;
@ -45,7 +45,7 @@ public:
template<>
inline bool is<HTMLLinkElement>(const Node& node)
{
return is<Element>(node) && to<Element>(node).tag_name().to_lowercase() == "link";
return is<Element>(node) && to<Element>(node).tag_name().equals_ignoring_case("link");
}
}

View file

@ -33,7 +33,7 @@
namespace Web {
HTMLScriptElement::HTMLScriptElement(Document& document, const String& tag_name)
HTMLScriptElement::HTMLScriptElement(Document& document, const FlyString& tag_name)
: HTMLElement(document, tag_name)
{
}

View file

@ -32,7 +32,7 @@ namespace Web {
class HTMLScriptElement : public HTMLElement {
public:
HTMLScriptElement(Document&, const String& tag_name);
HTMLScriptElement(Document&, const FlyString& tag_name);
virtual ~HTMLScriptElement() override;
virtual void inserted_into(Node&) override;

View file

@ -32,7 +32,7 @@
namespace Web {
HTMLStyleElement::HTMLStyleElement(Document& document, const String& tag_name)
HTMLStyleElement::HTMLStyleElement(Document& document, const FlyString& tag_name)
: HTMLElement(document, tag_name)
{
}

View file

@ -34,7 +34,7 @@ class StyleSheet;
class HTMLStyleElement : public HTMLElement {
public:
HTMLStyleElement(Document&, const String& tag_name);
HTMLStyleElement(Document&, const FlyString& tag_name);
virtual ~HTMLStyleElement() override;
virtual void inserted_into(Node&) override;

View file

@ -28,7 +28,7 @@
namespace Web {
HTMLTitleElement::HTMLTitleElement(Document& document, const String& tag_name)
HTMLTitleElement::HTMLTitleElement(Document& document, const FlyString& tag_name)
: HTMLElement(document, tag_name)
{
}

View file

@ -32,14 +32,14 @@ namespace Web {
class HTMLTitleElement : public HTMLElement {
public:
HTMLTitleElement(Document&, const String& tag_name);
HTMLTitleElement(Document&, const FlyString& tag_name);
virtual ~HTMLTitleElement() override;
};
template<>
inline bool is<HTMLTitleElement>(const Node& node)
{
return is<Element>(node) && to<Element>(node).tag_name().to_lowercase() == "title";
return is<Element>(node) && to<Element>(node).tag_name().equals_ignoring_case("title");
}
}

View file

@ -84,7 +84,7 @@ public:
virtual RefPtr<LayoutNode> create_layout_node(const StyleProperties* parent_style) const;
virtual String tag_name() const = 0;
virtual FlyString tag_name() const = 0;
virtual String text_content() const;

View file

@ -26,6 +26,7 @@
#pragma once
#include <AK/FlyString.h>
#include <AK/String.h>
#include <LibWeb/DOM/CharacterData.h>
@ -36,7 +37,7 @@ public:
explicit Text(Document&, const String&);
virtual ~Text() override;
virtual String tag_name() const override { return "#text"; }
virtual FlyString tag_name() const override { return "#text"; }
private:
virtual RefPtr<LayoutNode> create_layout_node(const StyleProperties* parent_style) const override;

View file

@ -75,7 +75,7 @@ void dump_tree(const LayoutNode& layout_node)
for (size_t i = 0; i < indent; ++i)
dbgprintf(" ");
String tag_name;
FlyString tag_name;
if (layout_node.is_anonymous())
tag_name = "(anonymous)";
else if (is<Text>(layout_node.node()))