From 3aea14093f06b7f8623738c7dcd64735ac5fc967 Mon Sep 17 00:00:00 2001 From: Tim Ledbetter Date: Mon, 22 Apr 2024 19:36:39 +0100 Subject: [PATCH] LibWeb: Don't crash if the document element is not visible Previously, setting the `hidden` property on the `` element would cause a crash. --- Tests/LibWeb/Layout/expected/hidden-root-element.txt | 3 +++ Tests/LibWeb/Layout/input/hidden-root-element.html | 5 +++++ Userland/Libraries/LibWeb/DOM/Document.cpp | 6 +++--- 3 files changed, 11 insertions(+), 3 deletions(-) create mode 100644 Tests/LibWeb/Layout/expected/hidden-root-element.txt create mode 100644 Tests/LibWeb/Layout/input/hidden-root-element.html diff --git a/Tests/LibWeb/Layout/expected/hidden-root-element.txt b/Tests/LibWeb/Layout/expected/hidden-root-element.txt new file mode 100644 index 00000000000..fe53551f0bb --- /dev/null +++ b/Tests/LibWeb/Layout/expected/hidden-root-element.txt @@ -0,0 +1,3 @@ +Viewport <#document> at (0,0) content-size 800x600 children: not-inline + +ViewportPaintable (Viewport<#document>) [0,0 800x600] diff --git a/Tests/LibWeb/Layout/input/hidden-root-element.html b/Tests/LibWeb/Layout/input/hidden-root-element.html new file mode 100644 index 00000000000..28f88b1b0bf --- /dev/null +++ b/Tests/LibWeb/Layout/input/hidden-root-element.html @@ -0,0 +1,5 @@ + + +
Test passes if we don't crash
+ + diff --git a/Userland/Libraries/LibWeb/DOM/Document.cpp b/Userland/Libraries/LibWeb/DOM/Document.cpp index 1fafa722a4f..b44de964608 100644 --- a/Userland/Libraries/LibWeb/DOM/Document.cpp +++ b/Userland/Libraries/LibWeb/DOM/Document.cpp @@ -1058,13 +1058,14 @@ void Document::update_layout() if (!navigable) return; + auto* document_element = this->document_element(); auto viewport_rect = this->viewport_rect(); if (!m_layout_root) { Layout::TreeBuilder tree_builder; m_layout_root = verify_cast(*tree_builder.build(*this)); - if (auto* document_element = this->document_element()) { + if (document_element && document_element->layout_node()) { propagate_overflow_to_viewport(*document_element, *m_layout_root); } } @@ -1079,8 +1080,7 @@ void Document::update_layout() viewport_state.set_content_width(viewport_rect.width()); viewport_state.set_content_height(viewport_rect.height()); - if (auto* document_element = this->document_element()) { - VERIFY(document_element->layout_node()); + if (document_element && document_element->layout_node()) { auto& icb_state = layout_state.get_mutable(verify_cast(*document_element->layout_node())); icb_state.set_content_width(viewport_rect.width()); }