Browse Source

LibWeb: Don't choke when trying to render a document-less <iframe>

Just paint it like an empty box if there's no document in the frame.
Andreas Kling 5 năm trước cách đây
mục cha
commit
a93fb7299f

+ 5 - 0
Libraries/LibWeb/DOM/HTMLIFrameElement.cpp

@@ -82,4 +82,9 @@ void HTMLIFrameElement::load_src(const String& value)
     m_hosted_frame->loader().load(url);
 }
 
+const Document* HTMLIFrameElement::hosted_document() const
+{
+    return m_hosted_frame ? m_hosted_frame->document() : nullptr;
+}
+
 }

+ 2 - 0
Libraries/LibWeb/DOM/HTMLIFrameElement.h

@@ -40,6 +40,8 @@ public:
     Frame* hosted_frame() { return m_hosted_frame; }
     const Frame* hosted_frame() const { return m_hosted_frame; }
 
+    const Document* hosted_document() const;
+
 private:
     virtual void document_did_attach_to_frame(Frame&) override;
     virtual void document_will_detach_from_frame(Frame&) override;

+ 8 - 1
Libraries/LibWeb/Layout/LayoutFrame.cpp

@@ -63,6 +63,13 @@ void LayoutFrame::render(RenderingContext& context)
 {
     LayoutReplaced::render(context);
 
+    auto* hosted_document = node().hosted_document();
+    if (!hosted_document)
+        return;
+    auto* hosted_layout_tree = hosted_document->layout_node();
+    if (!hosted_layout_tree)
+        return;
+
     context.painter().save();
     auto old_viewport_rect = context.viewport_rect();
 
@@ -70,7 +77,7 @@ void LayoutFrame::render(RenderingContext& context)
     context.painter().translate(absolute_x(), absolute_y());
 
     context.set_viewport_rect({ {}, node().hosted_frame()->size() });
-    node().hosted_frame()->document()->layout_node()->render(context);
+    const_cast<LayoutDocument*>(hosted_layout_tree)->render(context);
 
     context.set_viewport_rect(old_viewport_rect);
     context.painter().restore();