mirror of
https://github.com/RGBCube/serenity
synced 2025-07-27 11:17:35 +00:00
LibWeb: Implement window.queueMicrotask(callback)
This API allows authors to schedule a serialized JS callback that will get invoked at the next spec-allowed opportunity.
This commit is contained in:
parent
831fdcaabc
commit
a248ec63e3
10 changed files with 144 additions and 19 deletions
|
@ -642,6 +642,10 @@ JS::Interpreter& Document::interpreter()
|
|||
auto& vm = m_interpreter->vm();
|
||||
vm.run_queued_promise_jobs();
|
||||
vm.run_queued_finalization_registry_cleanup_jobs();
|
||||
|
||||
// FIXME: This isn't exactly the right place for this.
|
||||
HTML::main_thread_event_loop().perform_a_microtask_checkpoint();
|
||||
|
||||
// Note: This is not an exception check for the promise jobs, they will just leave any
|
||||
// exception that already exists intact and never throw a new one (without cleaning it
|
||||
// up, that is). Taking care of any previous unhandled exception just happens to be the
|
||||
|
|
|
@ -12,6 +12,7 @@
|
|||
#include <LibWeb/DOM/EventDispatcher.h>
|
||||
#include <LibWeb/DOM/Timer.h>
|
||||
#include <LibWeb/DOM/Window.h>
|
||||
#include <LibWeb/HTML/EventLoop/EventLoop.h>
|
||||
#include <LibWeb/HTML/PageTransitionEvent.h>
|
||||
#include <LibWeb/HighResolutionTime/Performance.h>
|
||||
#include <LibWeb/Layout/InitialContainingBlock.h>
|
||||
|
@ -295,4 +296,17 @@ void Window::fire_a_page_transition_event(FlyString event_name, bool persisted)
|
|||
dispatch_event(move(event));
|
||||
}
|
||||
|
||||
// https://html.spec.whatwg.org/#dom-queuemicrotask
|
||||
void Window::queue_microtask(JS::FunctionObject& callback)
|
||||
{
|
||||
// The queueMicrotask(callback) method must queue a microtask to invoke callback,
|
||||
HTML::queue_a_microtask(associated_document(), [&callback, handle = JS::make_handle(&callback)]() {
|
||||
auto& vm = callback.vm();
|
||||
[[maybe_unused]] auto rc = vm.call(callback, JS::js_null());
|
||||
// FIXME: ...and if callback throws an exception, report the exception.
|
||||
if (vm.exception())
|
||||
vm.clear_exception();
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -55,6 +55,8 @@ public:
|
|||
void clear_timeout(i32);
|
||||
void clear_interval(i32);
|
||||
|
||||
void queue_microtask(JS::FunctionObject&);
|
||||
|
||||
int inner_width() const;
|
||||
int inner_height() const;
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue