mirror of
https://github.com/RGBCube/serenity
synced 2025-07-24 09:07:41 +00:00
LibWeb: Run queued promise jobs after callbacks
We now run queued promise jobs after calling event handler, timer, and requestAnimationFrame() callbacks - this is a bit ad-hoc, but I don't want to switch LibWeb to use an event loop right now - this works just fine, too. We might want to revisit this at a later point and do tasks and microtasks properly.
This commit is contained in:
parent
f418115f1b
commit
ade3adcc7a
3 changed files with 12 additions and 2 deletions
|
@ -543,8 +543,12 @@ Color Document::visited_link_color() const
|
||||||
|
|
||||||
JS::Interpreter& Document::interpreter()
|
JS::Interpreter& Document::interpreter()
|
||||||
{
|
{
|
||||||
if (!m_interpreter)
|
if (!m_interpreter) {
|
||||||
m_interpreter = JS::Interpreter::create<Bindings::WindowObject>(Bindings::main_thread_vm(), *m_window);
|
auto& vm = Bindings::main_thread_vm();
|
||||||
|
// TODO: Hook up vm.on_promise_unhandled_rejection and vm.on_promise_rejection_handled
|
||||||
|
// See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Using_promises#promise_rejection_events
|
||||||
|
m_interpreter = JS::Interpreter::create<Bindings::WindowObject>(vm, *m_window);
|
||||||
|
}
|
||||||
return *m_interpreter;
|
return *m_interpreter;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -114,6 +114,8 @@ bool EventDispatcher::inner_invoke(Event& event, Vector<EventTarget::EventListen
|
||||||
vm.clear_exception();
|
vm.clear_exception();
|
||||||
// FIXME: Set legacyOutputDidListenersThrowFlag if given. (Only used by IndexedDB currently)
|
// FIXME: Set legacyOutputDidListenersThrowFlag if given. (Only used by IndexedDB currently)
|
||||||
}
|
}
|
||||||
|
vm.run_queued_promise_jobs();
|
||||||
|
VERIFY(!vm.exception());
|
||||||
|
|
||||||
event.set_in_passive_listener(false);
|
event.set_in_passive_listener(false);
|
||||||
if (is<Bindings::WindowObject>(global)) {
|
if (is<Bindings::WindowObject>(global)) {
|
||||||
|
|
|
@ -109,6 +109,8 @@ void Window::timer_did_fire(Badge<Timer>, Timer& timer)
|
||||||
[[maybe_unused]] auto rc = vm.call(timer.callback(), wrapper());
|
[[maybe_unused]] auto rc = vm.call(timer.callback(), wrapper());
|
||||||
if (vm.exception())
|
if (vm.exception())
|
||||||
vm.clear_exception();
|
vm.clear_exception();
|
||||||
|
vm.run_queued_promise_jobs();
|
||||||
|
VERIFY(!vm.exception());
|
||||||
}
|
}
|
||||||
|
|
||||||
i32 Window::allocate_timer_id(Badge<Timer>)
|
i32 Window::allocate_timer_id(Badge<Timer>)
|
||||||
|
@ -143,6 +145,8 @@ i32 Window::request_animation_frame(JS::Function& callback)
|
||||||
[[maybe_unused]] auto rc = vm.call(function, JS::js_undefined(), JS::Value(fake_timestamp));
|
[[maybe_unused]] auto rc = vm.call(function, JS::js_undefined(), JS::Value(fake_timestamp));
|
||||||
if (vm.exception())
|
if (vm.exception())
|
||||||
vm.clear_exception();
|
vm.clear_exception();
|
||||||
|
vm.run_queued_promise_jobs();
|
||||||
|
VERIFY(!vm.exception());
|
||||||
GUI::DisplayLink::unregister_callback(link_id);
|
GUI::DisplayLink::unregister_callback(link_id);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue