1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-26 23:37:36 +00:00

LibWeb: Allow HTML parser to delay delivery of the document "load" event

We will now spin in "the end" until there are no more "things delaying
the load event". Of course, nothing actually uses this yet, and there
are a lot of things that need to.
This commit is contained in:
Andreas Kling 2021-09-26 01:03:42 +02:00
parent b1529e3202
commit dbba0a520f
6 changed files with 67 additions and 1 deletions

View file

@ -285,6 +285,14 @@ public:
Bindings::LocationObject* location();
size_t number_of_things_delaying_the_load_event() { return m_number_of_things_delaying_the_load_event; }
void increment_number_of_things_delaying_the_load_event(Badge<DocumentLoadEventDelayer>) { ++m_number_of_things_delaying_the_load_event; }
void decrement_number_of_things_delaying_the_load_event(Badge<DocumentLoadEventDelayer>)
{
VERIFY(m_number_of_things_delaying_the_load_event);
--m_number_of_things_delaying_the_load_event;
}
private:
explicit Document(const AK::URL&);
@ -367,6 +375,8 @@ private:
u32 m_script_blocking_style_sheet_counter { 0 };
NonnullRefPtr<HTML::History> m_history;
size_t m_number_of_things_delaying_the_load_event { 0 };
};
}

View file

@ -0,0 +1,23 @@
/*
* Copyright (c) 2021, Andreas Kling <kling@serenityos.org>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#include <LibWeb/DOM/Document.h>
#include <LibWeb/DOM/DocumentLoadEventDelayer.h>
namespace Web::DOM {
DocumentLoadEventDelayer::DocumentLoadEventDelayer(Document& document)
: m_document(document)
{
m_document->increment_number_of_things_delaying_the_load_event({});
}
DocumentLoadEventDelayer::~DocumentLoadEventDelayer()
{
m_document->decrement_number_of_things_delaying_the_load_event({});
}
}

View file

@ -0,0 +1,27 @@
/*
* Copyright (c) 2021, Andreas Kling <kling@serenityos.org>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#pragma once
#include <AK/Noncopyable.h>
#include <AK/NonnullRefPtr.h>
#include <LibWeb/Forward.h>
namespace Web::DOM {
class DocumentLoadEventDelayer {
AK_MAKE_NONMOVABLE(DocumentLoadEventDelayer);
AK_MAKE_NONCOPYABLE(DocumentLoadEventDelayer);
public:
explicit DocumentLoadEventDelayer(Document&);
~DocumentLoadEventDelayer();
private:
NonnullRefPtr<Document> m_document;
};
}