ladybird/Userland/Libraries/LibWeb/HTML/NavigableContainer.h
Sam Atkins 7f509317fd LibWeb: Allow NavigableContainers to report whether to delay load event
Four elements match the "potentially delay the load event" check in the
spec: `<embed>`, `<frame>`, `<iframe>`, and `<object>`. These four are
the same set of elements that are NavigableContainers (or will be once
we implement them) so let's put this logic there.

Note that other things can delay the load event, this is just the name
the spec gives to this particular behaviour.
2023-12-01 10:28:02 +01:00

82 lines
2.8 KiB
C++

/*
* Copyright (c) 2020-2021, Andreas Kling <kling@serenityos.org>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#pragma once
#include <LibWeb/HTML/HTMLElement.h>
#include <LibWeb/HTML/Navigable.h>
namespace Web::HTML {
class NavigableContainer : public HTMLElement {
WEB_PLATFORM_OBJECT(NavigableContainer, HTMLElement);
public:
static JS::GCPtr<NavigableContainer> navigable_container_with_content_navigable(JS::NonnullGCPtr<Navigable> navigable);
virtual ~NavigableContainer() override;
static HashTable<NavigableContainer*>& all_instances();
JS::GCPtr<Navigable> content_navigable() { return m_content_navigable; }
JS::GCPtr<Navigable const> content_navigable() const { return m_content_navigable.ptr(); }
BrowsingContext* nested_browsing_context()
{
if (m_content_navigable)
return m_content_navigable->active_browsing_context();
return nullptr;
}
BrowsingContext const* nested_browsing_context() const
{
if (m_content_navigable)
return m_content_navigable->active_browsing_context();
return nullptr;
}
const DOM::Document* content_document() const;
DOM::Document const* content_document_without_origin_check() const;
HTML::WindowProxy* content_window();
DOM::Document const* get_svg_document() const;
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);
virtual void visit_edges(Cell::Visitor&) override;
// https://html.spec.whatwg.org/multipage/iframe-embed-object.html#shared-attribute-processing-steps-for-iframe-and-frame-elements
Optional<AK::URL> shared_attribute_processing_steps_for_iframe_and_frame(bool initial_insertion);
// https://html.spec.whatwg.org/multipage/iframe-embed-object.html#navigate-an-iframe-or-frame
void navigate_an_iframe_or_frame(AK::URL url, ReferrerPolicy::ReferrerPolicy referrer_policy, Optional<String> srcdoc_string = {});
WebIDL::ExceptionOr<void> create_new_child_navigable();
// https://html.spec.whatwg.org/multipage/document-sequences.html#content-navigable
JS::GCPtr<Navigable> 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 };
};
}
namespace Web::DOM {
template<>
inline bool Node::fast_is<HTML::NavigableContainer>() const { return is_navigable_container(); }
}