diff --git a/Libraries/LibWeb/DOM/Element.cpp b/Libraries/LibWeb/DOM/Element.cpp index 8c14451599..b7a128939d 100644 --- a/Libraries/LibWeb/DOM/Element.cpp +++ b/Libraries/LibWeb/DOM/Element.cpp @@ -44,6 +44,7 @@ #include #include #include +#include namespace Web::DOM { @@ -213,7 +214,7 @@ void Element::recompute_style() } // Don't bother with style on widgets. NATIVE LOOK & FEEL BABY! - if (layout_node()->is_widget()) + if (is(layout_node())) return; auto diff = compute_style_difference(layout_node()->specified_style(), *style, document()); diff --git a/Libraries/LibWeb/Dump.cpp b/Libraries/LibWeb/Dump.cpp index b82ec1243b..8256381b65 100644 --- a/Libraries/LibWeb/Dump.cpp +++ b/Libraries/LibWeb/Dump.cpp @@ -141,7 +141,7 @@ void dump_tree(StringBuilder& builder, const Layout::Node& layout_node, bool sho color_off = "\033[0m"; } - if (!layout_node.is_box()) { + if (!is(layout_node)) { builder.appendff("{}{}{} <{}{}{}>", nonbox_color_on, layout_node.class_name(), @@ -205,7 +205,7 @@ void dump_tree(StringBuilder& builder, const Layout::Node& layout_node, bool sho builder.append("\n"); } - if (layout_node.is_block() && static_cast(layout_node).children_are_inline()) { + if (is(layout_node) && static_cast(layout_node).children_are_inline()) { auto& block = static_cast(layout_node); for (size_t line_box_index = 0; line_box_index < block.line_boxes().size(); ++line_box_index) { auto& line_box = block.line_boxes()[line_box_index]; @@ -231,7 +231,7 @@ void dump_tree(StringBuilder& builder, const Layout::Node& layout_node, bool sho fragment.start(), fragment.length(), enclosing_int_rect(fragment.absolute_rect()).to_string()); - if (fragment.layout_node().is_text()) { + if (is(fragment.layout_node())) { for (size_t i = 0; i < indent; ++i) builder.append(" "); auto& layout_text = static_cast(fragment.layout_node()); diff --git a/Libraries/LibWeb/HTML/HTMLElement.cpp b/Libraries/LibWeb/HTML/HTMLElement.cpp index 317d4bc3ef..eb5356a594 100644 --- a/Libraries/LibWeb/HTML/HTMLElement.cpp +++ b/Libraries/LibWeb/HTML/HTMLElement.cpp @@ -28,6 +28,7 @@ #include #include #include +#include #include namespace Web::HTML { @@ -119,9 +120,9 @@ String HTMLElement::inner_text() Function recurse = [&](auto& node) { for (auto* child = node.first_child(); child; child = child->next_sibling()) { - if (child->is_text()) + if (is(child)) builder.append(downcast(*child).text_for_rendering()); - if (child->is_break()) + if (is(child)) builder.append('\n'); recurse(*child); } diff --git a/Libraries/LibWeb/Layout/BlockBox.cpp b/Libraries/LibWeb/Layout/BlockBox.cpp index b01db3f579..b25a459886 100644 --- a/Libraries/LibWeb/Layout/BlockBox.cpp +++ b/Libraries/LibWeb/Layout/BlockBox.cpp @@ -94,7 +94,7 @@ HitTestResult BlockBox::hit_test(const Gfx::IntPoint& position, HitTestType type if (is(fragment.layout_node()) && downcast(fragment.layout_node()).stacking_context()) continue; if (enclosing_int_rect(fragment.absolute_rect()).contains(position)) { - if (fragment.layout_node().is_block()) + if (is(fragment.layout_node())) return downcast(fragment.layout_node()).hit_test(position, type); return { fragment.layout_node(), fragment.text_index_at(position.x()) }; } diff --git a/Libraries/LibWeb/Layout/BlockBox.h b/Libraries/LibWeb/Layout/BlockBox.h index 14fd57efcb..fb1b3ad4e5 100644 --- a/Libraries/LibWeb/Layout/BlockBox.h +++ b/Libraries/LibWeb/Layout/BlockBox.h @@ -51,9 +51,6 @@ public: void for_each_fragment(Callback) const; virtual void split_into_lines(InlineFormattingContext&, LayoutMode) override; - -private: - virtual bool is_block() const override { return true; } }; template diff --git a/Libraries/LibWeb/Layout/BlockFormattingContext.cpp b/Libraries/LibWeb/Layout/BlockFormattingContext.cpp index 245efc6361..402a86f127 100644 --- a/Libraries/LibWeb/Layout/BlockFormattingContext.cpp +++ b/Libraries/LibWeb/Layout/BlockFormattingContext.cpp @@ -48,7 +48,7 @@ BlockFormattingContext::~BlockFormattingContext() bool BlockFormattingContext::is_initial() const { - return context_box().is_initial_containing_block(); + return is(context_box()); } void BlockFormattingContext::run(Box& box, LayoutMode layout_mode) @@ -85,7 +85,7 @@ void BlockFormattingContext::run(Box& box, LayoutMode layout_mode) void BlockFormattingContext::compute_width(Box& box) { - if (box.is_replaced()) { + if (is(box)) { // FIXME: This should not be done *by* ReplacedBox auto& replaced = downcast(box); replaced.prepare_for_replaced_layout(); @@ -414,7 +414,7 @@ void BlockFormattingContext::compute_width_for_absolutely_positioned_block(Box& void BlockFormattingContext::compute_height(Box& box) { - if (box.is_replaced()) { + if (is(box)) { compute_height_for_block_level_replaced_element_in_normal_flow(downcast(box)); return; } @@ -471,9 +471,9 @@ void BlockFormattingContext::layout_block_level_children(Box& box, LayoutMode la layout_inside(child_box, layout_mode); compute_height(child_box); - if (child_box.is_replaced()) + if (is(child_box)) place_block_level_replaced_element_in_normal_flow(child_box, box); - else if (child_box.is_block()) + else if (is(child_box)) place_block_level_non_replaced_element_in_normal_flow(child_box, box); // FIXME: This should be factored differently. It's uncool that we mutate the tree *during* layout! diff --git a/Libraries/LibWeb/Layout/Box.cpp b/Libraries/LibWeb/Layout/Box.cpp index 5a0c57accc..c7a0a868d0 100644 --- a/Libraries/LibWeb/Layout/Box.cpp +++ b/Libraries/LibWeb/Layout/Box.cpp @@ -165,7 +165,7 @@ void Box::set_containing_line_box_fragment(LineBoxFragment& fragment) StackingContext* Box::enclosing_stacking_context() { for (auto* ancestor = parent(); ancestor; ancestor = ancestor->parent()) { - if (!ancestor->is_box()) + if (!is(ancestor)) continue; auto& ancestor_box = downcast(*ancestor); if (!ancestor_box.establishes_stacking_context()) diff --git a/Libraries/LibWeb/Layout/Box.h b/Libraries/LibWeb/Layout/Box.h index 6c52072f40..a836761087 100644 --- a/Libraries/LibWeb/Layout/Box.h +++ b/Libraries/LibWeb/Layout/Box.h @@ -112,8 +112,6 @@ protected: Vector m_line_boxes; private: - virtual bool is_box() const final { return true; } - Gfx::FloatPoint m_offset; Gfx::FloatSize m_size; diff --git a/Libraries/LibWeb/Layout/BreakNode.h b/Libraries/LibWeb/Layout/BreakNode.h index 7ebe866b7a..58ebbe3322 100644 --- a/Libraries/LibWeb/Layout/BreakNode.h +++ b/Libraries/LibWeb/Layout/BreakNode.h @@ -39,7 +39,6 @@ public: const HTML::HTMLBRElement& dom_node() const { return downcast(*Node::dom_node()); } private: - virtual bool is_break() const override { return true; } virtual void split_into_lines(InlineFormattingContext&, LayoutMode) override; }; diff --git a/Libraries/LibWeb/Layout/ButtonBox.h b/Libraries/LibWeb/Layout/ButtonBox.h index a48342ad2b..f26c7ed8d8 100644 --- a/Libraries/LibWeb/Layout/ButtonBox.h +++ b/Libraries/LibWeb/Layout/ButtonBox.h @@ -43,7 +43,6 @@ public: HTML::HTMLInputElement& dom_node() { return static_cast(ReplacedBox::dom_node()); } private: - virtual bool is_button() const override { return true; } virtual bool wants_mouse_events() const override { return true; } virtual void handle_mousedown(Badge, const Gfx::IntPoint&, unsigned button, unsigned modifiers) override; virtual void handle_mouseup(Badge, const Gfx::IntPoint&, unsigned button, unsigned modifiers) override; diff --git a/Libraries/LibWeb/Layout/CanvasBox.h b/Libraries/LibWeb/Layout/CanvasBox.h index 052f21aeab..150e28ae21 100644 --- a/Libraries/LibWeb/Layout/CanvasBox.h +++ b/Libraries/LibWeb/Layout/CanvasBox.h @@ -40,9 +40,6 @@ public: virtual void paint(PaintContext&, PaintPhase) override; const HTML::HTMLCanvasElement& dom_node() const { return static_cast(ReplacedBox::dom_node()); } - -private: - virtual bool is_canvas() const override { return true; } }; } diff --git a/Libraries/LibWeb/Layout/CheckBox.h b/Libraries/LibWeb/Layout/CheckBox.h index 7a97025383..47809c07f9 100644 --- a/Libraries/LibWeb/Layout/CheckBox.h +++ b/Libraries/LibWeb/Layout/CheckBox.h @@ -42,7 +42,6 @@ public: HTML::HTMLInputElement& dom_node() { return static_cast(ReplacedBox::dom_node()); } private: - virtual bool is_check_box() const override { return true; } virtual bool wants_mouse_events() const override { return true; } virtual void handle_mousedown(Badge, const Gfx::IntPoint&, unsigned button, unsigned modifiers) override; virtual void handle_mouseup(Badge, const Gfx::IntPoint&, unsigned button, unsigned modifiers) override; diff --git a/Libraries/LibWeb/Layout/FormattingContext.cpp b/Libraries/LibWeb/Layout/FormattingContext.cpp index 8256ceccc3..c6f565aa27 100644 --- a/Libraries/LibWeb/Layout/FormattingContext.cpp +++ b/Libraries/LibWeb/Layout/FormattingContext.cpp @@ -31,7 +31,10 @@ #include #include #include +#include +#include #include +#include namespace Web::Layout { @@ -55,7 +58,7 @@ bool FormattingContext::creates_block_formatting_context(const Box& box) return true; if (box.is_inline_block()) return true; - if (box.is_table_cell()) + if (is(box)) return true; // FIXME: table-caption // FIXME: anonymous table cells @@ -76,7 +79,7 @@ void FormattingContext::layout_inside(Box& box, LayoutMode layout_mode) context.run(box, layout_mode); return; } - if (box.is_table()) { + if (is(box)) { TableFormattingContext context(box, this); context.run(box, layout_mode); } else if (box.children_are_inline()) { diff --git a/Libraries/LibWeb/Layout/FrameBox.h b/Libraries/LibWeb/Layout/FrameBox.h index 7c2d9db529..93a5216f3f 100644 --- a/Libraries/LibWeb/Layout/FrameBox.h +++ b/Libraries/LibWeb/Layout/FrameBox.h @@ -43,7 +43,6 @@ public: HTML::HTMLIFrameElement& dom_node() { return downcast(ReplacedBox::dom_node()); } private: - virtual bool is_frame() const final { return true; } virtual void did_set_rect() override; }; diff --git a/Libraries/LibWeb/Layout/ImageBox.h b/Libraries/LibWeb/Layout/ImageBox.h index 46c56bdf4f..a404ca1ca0 100644 --- a/Libraries/LibWeb/Layout/ImageBox.h +++ b/Libraries/LibWeb/Layout/ImageBox.h @@ -46,8 +46,6 @@ public: void set_visible_in_viewport(Badge, bool); private: - virtual bool is_image() const override { return true; } - int preferred_width() const; int preferred_height() const; diff --git a/Libraries/LibWeb/Layout/InitialContainingBlockBox.h b/Libraries/LibWeb/Layout/InitialContainingBlockBox.h index 1e74cefd55..b7b4810364 100644 --- a/Libraries/LibWeb/Layout/InitialContainingBlockBox.h +++ b/Libraries/LibWeb/Layout/InitialContainingBlockBox.h @@ -49,8 +49,6 @@ public: void did_set_viewport_rect(Badge, const Gfx::IntRect&); - virtual bool is_initial_containing_block() const override { return true; } - void build_stacking_context_tree(); void recompute_selection_states(); diff --git a/Libraries/LibWeb/Layout/InlineFormattingContext.cpp b/Libraries/LibWeb/Layout/InlineFormattingContext.cpp index b8d0b6cee0..74b2b6ad06 100644 --- a/Libraries/LibWeb/Layout/InlineFormattingContext.cpp +++ b/Libraries/LibWeb/Layout/InlineFormattingContext.cpp @@ -199,7 +199,7 @@ void InlineFormattingContext::run(Box&, LayoutMode layout_mode) void InlineFormattingContext::dimension_box_on_line(Box& box, LayoutMode layout_mode) { - if (box.is_replaced()) { + if (is(box)) { auto& replaced = downcast(box); replaced.set_width(compute_width_for_replaced_element(replaced)); replaced.set_height(compute_height_for_replaced_element(replaced)); diff --git a/Libraries/LibWeb/Layout/InlineNode.h b/Libraries/LibWeb/Layout/InlineNode.h index f35a50330a..8f47b24f34 100644 --- a/Libraries/LibWeb/Layout/InlineNode.h +++ b/Libraries/LibWeb/Layout/InlineNode.h @@ -38,9 +38,6 @@ public: virtual void paint_fragment(PaintContext&, const LineBoxFragment&, PaintPhase) const override; virtual void split_into_lines(InlineFormattingContext&, LayoutMode) override; - -private: - virtual bool is_inline_node() const final { return true; } }; } diff --git a/Libraries/LibWeb/Layout/LineBoxFragment.cpp b/Libraries/LibWeb/Layout/LineBoxFragment.cpp index e6a6cfeeda..106f9d18d2 100644 --- a/Libraries/LibWeb/Layout/LineBoxFragment.cpp +++ b/Libraries/LibWeb/Layout/LineBoxFragment.cpp @@ -75,7 +75,7 @@ const Gfx::FloatRect LineBoxFragment::absolute_rect() const int LineBoxFragment::text_index_at(float x) const { - if (!layout_node().is_text()) + if (!is(layout_node())) return 0; auto& layout_text = downcast(layout_node()); auto& font = layout_text.specified_style().font(); @@ -108,7 +108,7 @@ Gfx::FloatRect LineBoxFragment::selection_rect(const Gfx::Font& font) const auto selection = layout_node().root().selection().normalized(); if (!selection.is_valid()) return {}; - if (!layout_node().is_text()) + if (!is(layout_node())) return {}; const auto start_index = m_start; diff --git a/Libraries/LibWeb/Layout/ListItemBox.h b/Libraries/LibWeb/Layout/ListItemBox.h index adf5e63b0f..39b5af84e3 100644 --- a/Libraries/LibWeb/Layout/ListItemBox.h +++ b/Libraries/LibWeb/Layout/ListItemBox.h @@ -41,8 +41,6 @@ public: void layout_marker(); private: - virtual bool is_list_item() const override { return true; } - RefPtr m_marker; }; diff --git a/Libraries/LibWeb/Layout/Node.cpp b/Libraries/LibWeb/Layout/Node.cpp index 4376e3bb36..a85ce22f92 100644 --- a/Libraries/LibWeb/Layout/Node.cpp +++ b/Libraries/LibWeb/Layout/Node.cpp @@ -35,6 +35,7 @@ #include #include #include +#include #include #include @@ -56,7 +57,7 @@ Node::~Node() bool Node::can_contain_boxes_with_position_absolute() const { - return style().position() != CSS::Position::Static || is_initial_containing_block(); + return style().position() != CSS::Position::Static || is(*this); } const BlockBox* Node::containing_block() const @@ -68,7 +69,7 @@ const BlockBox* Node::containing_block() const return downcast(ancestor); }; - if (is_text()) + if (is(*this)) return nearest_block_ancestor(); auto position = style().position(); @@ -165,7 +166,7 @@ float Node::font_size() const Gfx::FloatPoint Node::box_type_agnostic_position() const { - if (is_box()) + if (is(*this)) return downcast(*this).absolute_position(); ASSERT(is_inline()); Gfx::FloatPoint position; @@ -303,4 +304,9 @@ String Node::class_name() const return demangle(typeid(*this).name()); } +bool Node::is_inline_block() const +{ + return is_inline() && is(*this); +} + } diff --git a/Libraries/LibWeb/Layout/Node.h b/Libraries/LibWeb/Layout/Node.h index 4ae2da141a..4af3761713 100644 --- a/Libraries/LibWeb/Layout/Node.h +++ b/Libraries/LibWeb/Layout/Node.h @@ -95,24 +95,6 @@ public: String class_name() const; - virtual bool is_initial_containing_block() const { return false; } - virtual bool is_text() const { return false; } - virtual bool is_block() const { return false; } - virtual bool is_replaced() const { return false; } - virtual bool is_widget() const { return false; } - virtual bool is_frame() const { return false; } - virtual bool is_image() const { return false; } - virtual bool is_canvas() const { return false; } - virtual bool is_box() const { return false; } - virtual bool is_table() const { return false; } - virtual bool is_table_row() const { return false; } - virtual bool is_table_cell() const { return false; } - virtual bool is_table_row_group() const { return false; } - virtual bool is_break() const { return false; } - virtual bool is_check_box() const { return false; } - virtual bool is_button() const { return false; } - virtual bool is_list_item() const { return false; } - virtual bool is_inline_node() const { return false; } bool has_style() const { return m_has_style; } virtual bool can_have_children() const { return true; } @@ -120,7 +102,7 @@ public: bool is_inline() const { return m_inline; } void set_inline(bool b) { m_inline = b; } - bool is_inline_block() const { return is_inline() && is_block(); } + bool is_inline_block() const; virtual bool wants_mouse_events() const { return false; } diff --git a/Libraries/LibWeb/Layout/ReplacedBox.h b/Libraries/LibWeb/Layout/ReplacedBox.h index e7f1ece198..f1da91a197 100644 --- a/Libraries/LibWeb/Layout/ReplacedBox.h +++ b/Libraries/LibWeb/Layout/ReplacedBox.h @@ -39,8 +39,6 @@ public: const DOM::Element& dom_node() const { return downcast(*Node::dom_node()); } DOM::Element& dom_node() { return downcast(*Node::dom_node()); } - virtual bool is_replaced() const final { return true; } - bool has_intrinsic_width() const { return m_has_intrinsic_width; } bool has_intrinsic_height() const { return m_has_intrinsic_height; } bool has_intrinsic_ratio() const { return m_has_intrinsic_ratio; } diff --git a/Libraries/LibWeb/Layout/TableBox.h b/Libraries/LibWeb/Layout/TableBox.h index 93bdb18a60..0c34c6a61c 100644 --- a/Libraries/LibWeb/Layout/TableBox.h +++ b/Libraries/LibWeb/Layout/TableBox.h @@ -34,9 +34,6 @@ class TableBox final : public Layout::BlockBox { public: TableBox(DOM::Document&, DOM::Element&, NonnullRefPtr); virtual ~TableBox() override; - -private: - virtual bool is_table() const override { return true; } }; } diff --git a/Libraries/LibWeb/Layout/TableCellBox.h b/Libraries/LibWeb/Layout/TableCellBox.h index ce5d72a2d0..b1a8bb0160 100644 --- a/Libraries/LibWeb/Layout/TableCellBox.h +++ b/Libraries/LibWeb/Layout/TableCellBox.h @@ -41,7 +41,6 @@ public: size_t colspan() const; private: - virtual bool is_table_cell() const override { return true; } virtual float width_of_logical_containing_block() const override; }; diff --git a/Libraries/LibWeb/Layout/TableRowBox.h b/Libraries/LibWeb/Layout/TableRowBox.h index 154947701d..0a63f44efc 100644 --- a/Libraries/LibWeb/Layout/TableRowBox.h +++ b/Libraries/LibWeb/Layout/TableRowBox.h @@ -34,9 +34,6 @@ class TableRowBox final : public Box { public: TableRowBox(DOM::Document&, DOM::Element&, NonnullRefPtr); virtual ~TableRowBox() override; - -private: - virtual bool is_table_row() const override { return true; } }; } diff --git a/Libraries/LibWeb/Layout/TableRowGroupBox.h b/Libraries/LibWeb/Layout/TableRowGroupBox.h index f1781466b8..6a9fd6956c 100644 --- a/Libraries/LibWeb/Layout/TableRowGroupBox.h +++ b/Libraries/LibWeb/Layout/TableRowGroupBox.h @@ -36,9 +36,6 @@ public: virtual ~TableRowGroupBox() override; size_t column_count() const; - -private: - virtual bool is_table_row_group() const override { return true; } }; } diff --git a/Libraries/LibWeb/Layout/TextNode.h b/Libraries/LibWeb/Layout/TextNode.h index 5e0ac342ba..85189a77b4 100644 --- a/Libraries/LibWeb/Layout/TextNode.h +++ b/Libraries/LibWeb/Layout/TextNode.h @@ -43,8 +43,6 @@ public: const String& text_for_style(const CSS::StyleProperties&) const; const String& text_for_rendering() const { return m_text_for_rendering; } - virtual bool is_text() const final { return true; } - virtual void paint_fragment(PaintContext&, const LineBoxFragment&, PaintPhase) const override; virtual void split_into_lines(InlineFormattingContext&, LayoutMode) override; diff --git a/Libraries/LibWeb/Layout/WidgetBox.h b/Libraries/LibWeb/Layout/WidgetBox.h index 24778e0f01..8c7445a1fc 100644 --- a/Libraries/LibWeb/Layout/WidgetBox.h +++ b/Libraries/LibWeb/Layout/WidgetBox.h @@ -38,8 +38,6 @@ public: GUI::Widget& widget() { return m_widget; } const GUI::Widget& widget() const { return m_widget; } - virtual bool is_widget() const final { return true; } - void update_widget(); private: diff --git a/Libraries/LibWeb/LayoutTreeModel.cpp b/Libraries/LibWeb/LayoutTreeModel.cpp index 3bcb6f3552..02d3850509 100644 --- a/Libraries/LibWeb/LayoutTreeModel.cpp +++ b/Libraries/LibWeb/LayoutTreeModel.cpp @@ -29,6 +29,7 @@ #include #include #include +#include #include #include #include @@ -119,14 +120,14 @@ GUI::Variant LayoutTreeModel::data(const GUI::ModelIndex& index, GUI::ModelRole { auto& node = *static_cast(index.internal_data()); if (role == GUI::ModelRole::Icon) { - if (node.is_initial_containing_block()) + if (is(node)) return m_document_icon; - if (node.is_text()) + if (is(node)) return m_text_icon; return m_element_icon; } if (role == GUI::ModelRole::Display) { - if (node.is_text()) + if (is(node)) return String::format("TextNode: %s", with_whitespace_collapsed(downcast(node).text_for_rendering()).characters()); StringBuilder builder; builder.append(node.class_name()); diff --git a/Libraries/LibWeb/Painting/StackingContext.cpp b/Libraries/LibWeb/Painting/StackingContext.cpp index fe24a4c642..e07d640613 100644 --- a/Libraries/LibWeb/Painting/StackingContext.cpp +++ b/Libraries/LibWeb/Painting/StackingContext.cpp @@ -50,7 +50,7 @@ StackingContext::StackingContext(Box& box, StackingContext* parent) void StackingContext::paint(PaintContext& context, PaintPhase phase) { - if (!m_box.is_initial_containing_block()) { + if (!is(m_box)) { m_box.paint(context, phase); } else { // NOTE: InitialContainingBlockBox::paint() merely calls StackingContext::paint() @@ -65,7 +65,7 @@ void StackingContext::paint(PaintContext& context, PaintPhase phase) HitTestResult StackingContext::hit_test(const Gfx::IntPoint& position, HitTestType type) const { HitTestResult result; - if (!m_box.is_initial_containing_block()) { + if (!is(m_box)) { result = m_box.hit_test(position, type); } else { // NOTE: InitialContainingBlockBox::hit_test() merely calls StackingContext::hit_test()