mirror of
https://github.com/RGBCube/serenity
synced 2025-05-31 17:58:12 +00:00
LibWeb: Handle two kinds of deferred script executions
This patch adds two script lists to Document: - Scripts to execute when parsing has finished - Scripts to execute as soon as possible Since we don't actually load scripts asynchronously yet (we just do a synchronous load when parsing the <script> element for simplicity), these are already loaded by the time we get to "The end" of parsing.
This commit is contained in:
parent
6f85422e8a
commit
e82226f3fb
4 changed files with 41 additions and 6 deletions
|
@ -51,10 +51,10 @@
|
|||
#include <LibWeb/DOM/Window.h>
|
||||
#include <LibWeb/Dump.h>
|
||||
#include <LibWeb/Frame.h>
|
||||
#include <LibWeb/PageView.h>
|
||||
#include <LibWeb/Layout/LayoutDocument.h>
|
||||
#include <LibWeb/Layout/LayoutTreeBuilder.h>
|
||||
#include <LibWeb/Origin.h>
|
||||
#include <LibWeb/PageView.h>
|
||||
#include <LibWeb/Parser/CSSParser.h>
|
||||
#include <stdio.h>
|
||||
|
||||
|
@ -429,4 +429,24 @@ NonnullRefPtr<HTMLScriptElement> Document::take_pending_parsing_blocking_script(
|
|||
return m_pending_parsing_blocking_script.release_nonnull();
|
||||
}
|
||||
|
||||
void Document::add_script_to_execute_when_parsing_has_finished(Badge<HTMLScriptElement>, HTMLScriptElement& script)
|
||||
{
|
||||
m_scripts_to_execute_when_parsing_has_finished.append(script);
|
||||
}
|
||||
|
||||
NonnullRefPtrVector<HTMLScriptElement> Document::take_scripts_to_execute_when_parsing_has_finished(Badge<HTMLDocumentParser>)
|
||||
{
|
||||
return move(m_scripts_to_execute_when_parsing_has_finished);
|
||||
}
|
||||
|
||||
void Document::add_script_to_execute_as_soon_as_possible(Badge<HTMLScriptElement>, HTMLScriptElement& script)
|
||||
{
|
||||
m_scripts_to_execute_as_soon_as_possible.append(script);
|
||||
}
|
||||
|
||||
NonnullRefPtrVector<HTMLScriptElement> Document::take_scripts_to_execute_as_soon_as_possible(Badge<HTMLDocumentParser>)
|
||||
{
|
||||
return move(m_scripts_to_execute_as_soon_as_possible);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -133,6 +133,12 @@ public:
|
|||
HTMLScriptElement* pending_parsing_blocking_script() { return m_pending_parsing_blocking_script; }
|
||||
NonnullRefPtr<HTMLScriptElement> take_pending_parsing_blocking_script(Badge<HTMLDocumentParser>);
|
||||
|
||||
void add_script_to_execute_when_parsing_has_finished(Badge<HTMLScriptElement>, HTMLScriptElement&);
|
||||
NonnullRefPtrVector<HTMLScriptElement> take_scripts_to_execute_when_parsing_has_finished(Badge<HTMLDocumentParser>);
|
||||
|
||||
void add_script_to_execute_as_soon_as_possible(Badge<HTMLScriptElement>, HTMLScriptElement&);
|
||||
NonnullRefPtrVector<HTMLScriptElement> take_scripts_to_execute_as_soon_as_possible(Badge<HTMLDocumentParser>);
|
||||
|
||||
bool in_quirks_mode() const { return m_quirks_mode; }
|
||||
void set_quirks_mode(bool mode) { m_quirks_mode = mode; }
|
||||
|
||||
|
@ -161,6 +167,8 @@ private:
|
|||
OwnPtr<JS::Interpreter> m_interpreter;
|
||||
|
||||
RefPtr<HTMLScriptElement> m_pending_parsing_blocking_script;
|
||||
NonnullRefPtrVector<HTMLScriptElement> m_scripts_to_execute_when_parsing_has_finished;
|
||||
NonnullRefPtrVector<HTMLScriptElement> m_scripts_to_execute_as_soon_as_possible;
|
||||
|
||||
bool m_quirks_mode { false };
|
||||
};
|
||||
|
|
|
@ -206,10 +206,7 @@ void HTMLScriptElement::prepare_script(Badge<HTMLDocumentParser>)
|
|||
|
||||
// FIXME: Check classic vs. module
|
||||
if (has_attribute("src") && has_attribute("defer") && m_parser_inserted && !has_attribute("async")) {
|
||||
// FIXME: Add the element to the end of the list of scripts that will execute
|
||||
// when the document has finished parsing associated with the Document
|
||||
// of the parser that created the element.
|
||||
ASSERT_NOT_REACHED();
|
||||
document().add_script_to_execute_when_parsing_has_finished({}, *this);
|
||||
}
|
||||
|
||||
else if (has_attribute("src") && m_parser_inserted && !has_attribute("async")) {
|
||||
|
@ -225,7 +222,7 @@ void HTMLScriptElement::prepare_script(Badge<HTMLDocumentParser>)
|
|||
}
|
||||
|
||||
else if (has_attribute("src")) {
|
||||
ASSERT_NOT_REACHED();
|
||||
m_preparation_time_document->add_script_to_execute_as_soon_as_possible({}, *this);
|
||||
}
|
||||
|
||||
else {
|
||||
|
|
|
@ -80,7 +80,17 @@ void HTMLDocumentParser::run(const URL& url)
|
|||
|
||||
// "The end"
|
||||
|
||||
auto scripts_to_execute_when_parsing_has_finished = m_document->take_scripts_to_execute_when_parsing_has_finished({});
|
||||
for (auto& script : scripts_to_execute_when_parsing_has_finished) {
|
||||
script.execute_script();
|
||||
}
|
||||
|
||||
m_document->dispatch_event(Event::create("DOMContentLoaded"));
|
||||
|
||||
auto scripts_to_execute_as_soon_as_possible = m_document->take_scripts_to_execute_as_soon_as_possible({});
|
||||
for (auto& script : scripts_to_execute_as_soon_as_possible) {
|
||||
script.execute_script();
|
||||
}
|
||||
}
|
||||
|
||||
void HTMLDocumentParser::process_using_the_rules_for(InsertionMode mode, HTMLToken& token)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue