1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-31 15:48:12 +00:00

LibWeb: Start implementing "create and initialize a Document" from HTML

The way we've been creating DOM::Document has been pretty far from what
the spec tells us to do, and this is a first big step towards getting us
closer to spec.

The new Document::create_and_initialize() is called by FrameLoader after
loading a "text/html" resource.

We create the JS Realm and the Window object when creating the Document
(previously, we'd do it on first access to Document::interpreter().)

The realm execution context is owned by the Environment Settings Object.
This commit is contained in:
Andreas Kling 2022-08-04 21:30:33 +02:00
parent 0781bdb23e
commit 602f927982
13 changed files with 315 additions and 78 deletions

View file

@ -24,7 +24,6 @@ Worker::Worker(FlyString const& script_url, WorkerOptions const options, DOM::Do
, m_worker_vm(JS::VM::create(adopt_own(m_custom_data)))
, m_interpreter(JS::Interpreter::create<JS::GlobalObject>(m_worker_vm))
, m_interpreter_scope(*m_interpreter)
, m_execution_context(m_worker_vm->heap())
, m_implicit_port(MessagePort::create())
{
}
@ -153,22 +152,23 @@ void Worker::run_a_worker(AK::URL& url, EnvironmentSettingsObject& outside_setti
// FIXME: This is because I don't know all the libraries well enough to properly setup the environment to spec
// let alone making it a parallel implementation.
m_execution_context.current_node = nullptr;
m_execution_context.this_value = m_worker_scope;
m_execution_context.function_name = "(global execution context)"sv;
m_execution_context.lexical_environment = &m_worker_realm->global_environment();
m_execution_context.variable_environment = &m_worker_realm->global_environment();
m_execution_context.realm = m_worker_realm;
auto execution_context = make<JS::ExecutionContext>(m_worker_vm->heap());
execution_context->current_node = nullptr;
execution_context->this_value = m_worker_scope;
execution_context->function_name = "(global execution context)"sv;
execution_context->lexical_environment = &m_worker_realm->global_environment();
execution_context->variable_environment = &m_worker_realm->global_environment();
execution_context->realm = m_worker_realm;
m_worker_vm->push_execution_context(m_execution_context);
m_worker_realm->set_global_object(*m_worker_scope, m_worker_scope);
m_worker_vm->push_execution_context(*execution_context);
m_worker_realm->set_global_object(m_worker_scope, m_worker_scope);
// 8. Let worker global scope be the global object of realm execution context's Realm component.
// NOTE: This is the DedicatedWorkerGlobalScope or SharedWorkerGlobalScope object created in the previous step.
// 9. Set up a worker environment settings object with realm execution context,
// outside settings, and unsafeWorkerCreationTime, and let inside settings be the result.
m_inner_settings = WorkerEnvironmentSettingsObject::setup(*m_document, m_execution_context);
m_inner_settings = WorkerEnvironmentSettingsObject::setup(*m_document, move(execution_context));
// 10. Set worker global scope's name to the value of options's name member.
// FIXME: name property requires the SharedWorkerGlobalScope or DedicatedWorkerGlobalScope child class to be used