From 6242e029ede784af7230c17769b03f3d29268ac8 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Tue, 16 Jun 2020 19:09:14 +0200 Subject: [PATCH] LibWeb: Make Element::tag_name() return a const FlyString& The more generic virtual variant is renamed to node_name() and now only Element has tag_name(). This removes a huge amount of String ctor/dtor churn in selector matching. --- Libraries/LibWeb/Bindings/NodeWrapper.cpp | 2 +- Libraries/LibWeb/DOM/Comment.h | 2 +- Libraries/LibWeb/DOM/Document.h | 2 +- Libraries/LibWeb/DOM/DocumentFragment.h | 2 +- Libraries/LibWeb/DOM/DocumentType.h | 2 +- Libraries/LibWeb/DOM/Element.h | 3 ++- Libraries/LibWeb/DOM/Node.h | 2 +- Libraries/LibWeb/DOM/Text.h | 2 +- Libraries/LibWeb/DOMTreeModel.cpp | 2 +- Libraries/LibWeb/Layout/StackingContext.cpp | 2 +- Libraries/LibWeb/LayoutTreeModel.cpp | 2 +- Libraries/LibWeb/Parser/HTMLParser.cpp | 2 +- 12 files changed, 13 insertions(+), 12 deletions(-) diff --git a/Libraries/LibWeb/Bindings/NodeWrapper.cpp b/Libraries/LibWeb/Bindings/NodeWrapper.cpp index b62d7bceb8..8a60fe395d 100644 --- a/Libraries/LibWeb/Bindings/NodeWrapper.cpp +++ b/Libraries/LibWeb/Bindings/NodeWrapper.cpp @@ -55,7 +55,7 @@ NodeWrapper* wrap(JS::Heap& heap, Node& node) NodeWrapper::NodeWrapper(Node& node) : EventTargetWrapper(node) { - put("nodeName", JS::js_string(heap(), node.tag_name())); + put("nodeName", JS::js_string(heap(), node.node_name())); } NodeWrapper::~NodeWrapper() diff --git a/Libraries/LibWeb/DOM/Comment.h b/Libraries/LibWeb/DOM/Comment.h index e8a72cea08..13336833ff 100644 --- a/Libraries/LibWeb/DOM/Comment.h +++ b/Libraries/LibWeb/DOM/Comment.h @@ -36,7 +36,7 @@ public: explicit Comment(Document&, const String&); virtual ~Comment() override; - virtual FlyString tag_name() const override { return "#comment"; } + virtual FlyString node_name() const override { return "#comment"; } }; template<> diff --git a/Libraries/LibWeb/DOM/Document.h b/Libraries/LibWeb/DOM/Document.h index 63779ff429..5073b14ec3 100644 --- a/Libraries/LibWeb/DOM/Document.h +++ b/Libraries/LibWeb/DOM/Document.h @@ -69,7 +69,7 @@ public: CSS::StyleSheetList& style_sheets() { return *m_style_sheets; } const CSS::StyleSheetList& style_sheets() const { return *m_style_sheets; } - virtual FlyString tag_name() const override { return "#document"; } + virtual FlyString node_name() const override { return "#document"; } void set_hovered_node(Node*); Node* hovered_node() { return m_hovered_node; } diff --git a/Libraries/LibWeb/DOM/DocumentFragment.h b/Libraries/LibWeb/DOM/DocumentFragment.h index d7e35b9c53..d01704338c 100644 --- a/Libraries/LibWeb/DOM/DocumentFragment.h +++ b/Libraries/LibWeb/DOM/DocumentFragment.h @@ -41,7 +41,7 @@ public: { } - virtual FlyString tag_name() const override { return "#document-fragment"; } + virtual FlyString node_name() const override { return "#document-fragment"; } }; template<> diff --git a/Libraries/LibWeb/DOM/DocumentType.h b/Libraries/LibWeb/DOM/DocumentType.h index 7a04df4d86..9982e712e2 100644 --- a/Libraries/LibWeb/DOM/DocumentType.h +++ b/Libraries/LibWeb/DOM/DocumentType.h @@ -36,7 +36,7 @@ public: explicit DocumentType(Document&); virtual ~DocumentType() override; - virtual FlyString tag_name() const override { return "#doctype"; } + virtual FlyString node_name() const override { return "#doctype"; } const String& name() const { return m_name; } void set_name(const String& name) { m_name = name; } diff --git a/Libraries/LibWeb/DOM/Element.h b/Libraries/LibWeb/DOM/Element.h index be1f22fbb9..547b6b21e3 100644 --- a/Libraries/LibWeb/DOM/Element.h +++ b/Libraries/LibWeb/DOM/Element.h @@ -45,7 +45,8 @@ public: Element(Document&, const FlyString& tag_name); virtual ~Element() override; - virtual FlyString tag_name() const final { return m_tag_name; } + virtual FlyString node_name() const final { return m_tag_name; } + const FlyString& tag_name() const { return m_tag_name; } bool has_attribute(const FlyString& name) const { return !attribute(name).is_null(); } String attribute(const FlyString& name) const; diff --git a/Libraries/LibWeb/DOM/Node.h b/Libraries/LibWeb/DOM/Node.h index c342d1dc80..cc58ba2533 100644 --- a/Libraries/LibWeb/DOM/Node.h +++ b/Libraries/LibWeb/DOM/Node.h @@ -84,7 +84,7 @@ public: virtual RefPtr create_layout_node(const StyleProperties* parent_style) const; - virtual FlyString tag_name() const = 0; + virtual FlyString node_name() const = 0; virtual String text_content() const; diff --git a/Libraries/LibWeb/DOM/Text.h b/Libraries/LibWeb/DOM/Text.h index f3da78baae..952abc23a5 100644 --- a/Libraries/LibWeb/DOM/Text.h +++ b/Libraries/LibWeb/DOM/Text.h @@ -37,7 +37,7 @@ public: explicit Text(Document&, const String&); virtual ~Text() override; - virtual FlyString tag_name() const override { return "#text"; } + virtual FlyString node_name() const override { return "#text"; } private: virtual RefPtr create_layout_node(const StyleProperties* parent_style) const override; diff --git a/Libraries/LibWeb/DOMTreeModel.cpp b/Libraries/LibWeb/DOMTreeModel.cpp index 8a4902b1e7..1b7030d4fc 100644 --- a/Libraries/LibWeb/DOMTreeModel.cpp +++ b/Libraries/LibWeb/DOMTreeModel.cpp @@ -130,7 +130,7 @@ GUI::Variant DOMTreeModel::data(const GUI::ModelIndex& index, Role role) const if (node.is_text()) return String::format("%s", with_whitespace_collapsed(to(node).data()).characters()); if (!node.is_element()) - return node.tag_name(); + return node.node_name(); auto& element = to(node); StringBuilder builder; builder.append('<'); diff --git a/Libraries/LibWeb/Layout/StackingContext.cpp b/Libraries/LibWeb/Layout/StackingContext.cpp index a95ff04dfa..2ca5cb3b68 100644 --- a/Libraries/LibWeb/Layout/StackingContext.cpp +++ b/Libraries/LibWeb/Layout/StackingContext.cpp @@ -65,7 +65,7 @@ void StackingContext::dump(int indent) const { for (int i = 0; i < indent; ++i) dbgprintf(" "); - dbgprintf("SC for %s{%s} %s [children: %zu]\n", m_box.class_name(), m_box.node() ? m_box.node()->tag_name().characters() : "(anonymous)", m_box.absolute_rect().to_string().characters(), m_children.size()); + dbgprintf("SC for %s{%s} %s [children: %zu]\n", m_box.class_name(), m_box.node() ? m_box.node()->node_name().characters() : "(anonymous)", m_box.absolute_rect().to_string().characters(), m_children.size()); for (auto& child : m_children) child->dump(indent + 1); } diff --git a/Libraries/LibWeb/LayoutTreeModel.cpp b/Libraries/LibWeb/LayoutTreeModel.cpp index 1dc18ba0c5..87dcfb4c30 100644 --- a/Libraries/LibWeb/LayoutTreeModel.cpp +++ b/Libraries/LibWeb/LayoutTreeModel.cpp @@ -134,7 +134,7 @@ GUI::Variant LayoutTreeModel::data(const GUI::ModelIndex& index, Role role) cons if (node.is_anonymous()) { builder.append("[anonymous]"); } else if (!node.node()->is_element()) { - builder.append(node.node()->tag_name()); + builder.append(node.node()->node_name()); } else { auto& element = to(*node.node()); builder.append('<'); diff --git a/Libraries/LibWeb/Parser/HTMLParser.cpp b/Libraries/LibWeb/Parser/HTMLParser.cpp index c22f5b301c..1cc7fdf826 100644 --- a/Libraries/LibWeb/Parser/HTMLParser.cpp +++ b/Libraries/LibWeb/Parser/HTMLParser.cpp @@ -194,7 +194,7 @@ static bool parse_html_document(const StringView& html, Document& document, Pare case State::Free: if (ch == '<') { bool should_treat_as_text = false; - if (node_stack.last().tag_name() == "script") { + if (node_stack.last().node_name() == "script") { bool is_script_close_tag = peek(1) == '/' && tolower(peek(2)) == 's' && tolower(peek(3)) == 'c'