diff --git a/Userland/Libraries/LibWeb/HTML/FrameHostElement.cpp b/Userland/Libraries/LibWeb/HTML/FrameHostElement.cpp index b4d8a55c17..8215fbd61b 100644 --- a/Userland/Libraries/LibWeb/HTML/FrameHostElement.cpp +++ b/Userland/Libraries/LibWeb/HTML/FrameHostElement.cpp @@ -41,6 +41,15 @@ FrameHostElement::~FrameHostElement() { } +void FrameHostElement::inserted_into(Node& parent) +{ + HTMLElement::inserted_into(parent); + if (!is_connected()) + return; + if (auto* frame = document().frame()) + m_content_frame = Frame::create_subframe(*this, frame->main_frame()); +} + Origin FrameHostElement::content_origin() const { if (!m_content_frame || !m_content_frame->document()) diff --git a/Userland/Libraries/LibWeb/HTML/FrameHostElement.h b/Userland/Libraries/LibWeb/HTML/FrameHostElement.h index 24b6675563..f23868fb5d 100644 --- a/Userland/Libraries/LibWeb/HTML/FrameHostElement.h +++ b/Userland/Libraries/LibWeb/HTML/FrameHostElement.h @@ -45,6 +45,8 @@ public: void content_frame_did_load(Badge); + virtual void inserted_into(Node&) override; + protected: RefPtr m_content_frame; }; diff --git a/Userland/Libraries/LibWeb/HTML/HTMLIFrameElement.cpp b/Userland/Libraries/LibWeb/HTML/HTMLIFrameElement.cpp index c183fa6074..7d8cce2ef6 100644 --- a/Userland/Libraries/LibWeb/HTML/HTMLIFrameElement.cpp +++ b/Userland/Libraries/LibWeb/HTML/HTMLIFrameElement.cpp @@ -35,8 +35,6 @@ namespace Web::HTML { HTMLIFrameElement::HTMLIFrameElement(DOM::Document& document, QualifiedName qualified_name) : FrameHostElement(document, move(qualified_name)) { - VERIFY(document.frame()); - m_content_frame = Frame::create_subframe(*this, document.frame()->main_frame()); } HTMLIFrameElement::~HTMLIFrameElement() @@ -56,8 +54,18 @@ void HTMLIFrameElement::parse_attribute(const FlyString& name, const String& val load_src(value); } +void HTMLIFrameElement::inserted_into(Node& parent) +{ + FrameHostElement::inserted_into(parent); + if (is_connected()) + load_src(attribute(HTML::AttributeNames::src)); +} + void HTMLIFrameElement::load_src(const String& value) { + if (!m_content_frame) + return; + auto url = document().complete_url(value); if (!url.is_valid()) { dbgln("iframe failed to load URL: Invalid URL: {}", value); diff --git a/Userland/Libraries/LibWeb/HTML/HTMLIFrameElement.h b/Userland/Libraries/LibWeb/HTML/HTMLIFrameElement.h index 1039c7d0ed..75e6b424bc 100644 --- a/Userland/Libraries/LibWeb/HTML/HTMLIFrameElement.h +++ b/Userland/Libraries/LibWeb/HTML/HTMLIFrameElement.h @@ -40,6 +40,7 @@ public: virtual RefPtr create_layout_node() override; private: + virtual void inserted_into(Node&) override; virtual void parse_attribute(const FlyString& name, const String& value) override; void load_src(const String&);