diff --git a/Userland/Libraries/LibWeb/HTML/NavigableContainer.cpp b/Userland/Libraries/LibWeb/HTML/NavigableContainer.cpp index 75acd9e8bd..db67476a54 100644 --- a/Userland/Libraries/LibWeb/HTML/NavigableContainer.cpp +++ b/Userland/Libraries/LibWeb/HTML/NavigableContainer.cpp @@ -1,6 +1,7 @@ /* * Copyright (c) 2020-2022, Andreas Kling * Copyright (c) 2022, Linus Groh + * Copyright (c) 2023, Sam Atkins * * SPDX-License-Identifier: BSD-2-Clause */ @@ -287,4 +288,31 @@ void NavigableContainer::destroy_the_child_navigable() }); } +// https://html.spec.whatwg.org/multipage/iframe-embed-object.html#potentially-delays-the-load-event +bool NavigableContainer::currently_delays_the_load_event() const +{ + if (!m_potentially_delays_the_load_event) + return false; + + // If an element type potentially delays the load event, then for each element element of that type, + // the user agent must delay the load event of element's node document if element's content navigable is non-null + // and any of the following are true: + if (!m_content_navigable) + return false; + + // - element's content navigable's active document is not ready for post-load tasks; + if (!m_content_navigable->active_document()->ready_for_post_load_tasks()) + return true; + + // - element's content navigable's is delaying load events is true; or + if (m_content_navigable->is_delaying_load_events()) + return true; + + // - anything is delaying the load event of element's content navigable's active document. + if (m_content_navigable->active_document()->anything_is_delaying_the_load_event()) + return true; + + return false; +} + } diff --git a/Userland/Libraries/LibWeb/HTML/NavigableContainer.h b/Userland/Libraries/LibWeb/HTML/NavigableContainer.h index fce8b34941..e16e60808a 100644 --- a/Userland/Libraries/LibWeb/HTML/NavigableContainer.h +++ b/Userland/Libraries/LibWeb/HTML/NavigableContainer.h @@ -46,6 +46,11 @@ public: void destroy_the_child_navigable(); + // All elements that extend NavigableContainer "potentially delay the load event". + // (embed, frame, iframe, and object) + // https://html.spec.whatwg.org/multipage/iframe-embed-object.html#potentially-delays-the-load-event + bool currently_delays_the_load_event() const; + protected: NavigableContainer(DOM::Document&, DOM::QualifiedName); @@ -62,8 +67,11 @@ protected: // https://html.spec.whatwg.org/multipage/document-sequences.html#content-navigable JS::GCPtr m_content_navigable { nullptr }; + void set_potentially_delays_the_load_event(bool value) { m_potentially_delays_the_load_event = value; } + private: virtual bool is_navigable_container() const override { return true; } + bool m_potentially_delays_the_load_event { true }; }; }