LibWeb: Don't rely on SHTQ::process() in process_the_iframe_attributes

`HTMLIFrameElement::inserted()` does following:
1. Init a new navigable. This step appends a task on session history
   traversal queue (SHTQ) that creates a new nested history.
2. Process iframe's attributes

Processing of iframe's attributes might result in synchronous
navigation that fails to get active SHE if SHTQ task that creates
new nested history is not yet completed.

Before this change, a workaround involved forcing the processing of
SHTQ, which was terrible hack because it could occur in the middle of
another SHTQ task.

This change removes the need for "force SHTQ processing" by ensuring
that the processing of iframe's attributes is always executed after
the iframe's navigable nested history has been created.
This commit is contained in:
Aliaksandr Kalenik
2024-04-04 18:49:40 +02:00
committed by Alexander Kalenik
parent 8cc2ee34db
commit 11011cf250
Notes: sideshowbarker 2024-07-17 07:35:03 +09:00
4 changed files with 21 additions and 8 deletions

View File

@@ -62,16 +62,19 @@ protected:
// https://html.spec.whatwg.org/multipage/iframe-embed-object.html#navigate-an-iframe-or-frame
void navigate_an_iframe_or_frame(URL::URL url, ReferrerPolicy::ReferrerPolicy referrer_policy, Optional<String> srcdoc_string = {});
WebIDL::ExceptionOr<void> create_new_child_navigable();
WebIDL::ExceptionOr<void> create_new_child_navigable(JS::SafeFunction<void()> afterSessionHistoryUpdate = {});
// 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; }
void set_content_navigable_initialized() { m_content_navigable_initialized = true; }
private:
virtual bool is_navigable_container() const override { return true; }
bool m_potentially_delays_the_load_event { true };
bool m_content_navigable_initialized { false };
};
}