mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2025-05-12 06:02:51 +00:00
This isn't perfect (especially the global object situation in activate_event_handler), but I believe it's in a much more complete state now :^) This fixes the issue of crashing in prepare_for_ordinary_call with the `i < m_size` crash, as it now uses the IDL callback functions which requires the Environment Settings Object. The environment settings object for the callback is fetched at the time the callback is created, for example, WrapperGenerator gets the incumbent settings object for the callback at the time of wrapping. This allows us to remove passing in ScriptExecutionContext into EventTarget's constructor. With this, we can now drop ScriptExecutionContext.
77 lines
2.1 KiB
C++
77 lines
2.1 KiB
C++
/*
|
|
* Copyright (c) 2021, Luke Wilde <lukew@serenityos.org>
|
|
*
|
|
* SPDX-License-Identifier: BSD-2-Clause
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include <AK/RefCounted.h>
|
|
#include <AK/Weakable.h>
|
|
#include <LibWeb/Bindings/Wrappable.h>
|
|
#include <LibWeb/DOM/EventTarget.h>
|
|
#include <LibWeb/DOM/Window.h>
|
|
#include <LibWeb/Forward.h>
|
|
|
|
namespace Web::DOM {
|
|
|
|
// https://dom.spec.whatwg.org/#abortsignal
|
|
class AbortSignal final
|
|
: public RefCounted<AbortSignal>
|
|
, public Weakable<AbortSignal>
|
|
, public EventTarget
|
|
, public Bindings::Wrappable {
|
|
public:
|
|
using WrapperType = Bindings::AbortSignalWrapper;
|
|
|
|
using RefCounted::ref;
|
|
using RefCounted::unref;
|
|
|
|
static NonnullRefPtr<AbortSignal> create()
|
|
{
|
|
return adopt_ref(*new AbortSignal());
|
|
}
|
|
|
|
static NonnullRefPtr<AbortSignal> create_with_global_object(Bindings::WindowObject&)
|
|
{
|
|
return AbortSignal::create();
|
|
}
|
|
|
|
virtual ~AbortSignal() override;
|
|
|
|
void add_abort_algorithm(Function<void()>);
|
|
|
|
// https://dom.spec.whatwg.org/#dom-abortsignal-aborted
|
|
// An AbortSignal object is aborted when its abort reason is not undefined.
|
|
bool aborted() const { return !m_abort_reason.is_undefined(); }
|
|
|
|
void signal_abort(JS::Value reason);
|
|
|
|
void set_onabort(Optional<Bindings::CallbackType>);
|
|
Bindings::CallbackType* onabort();
|
|
|
|
// https://dom.spec.whatwg.org/#dom-abortsignal-reason
|
|
JS::Value reason() const { return m_abort_reason; }
|
|
|
|
JS::ThrowCompletionOr<void> throw_if_aborted() const;
|
|
|
|
void visit_edges(JS::Cell::Visitor&);
|
|
|
|
// ^EventTarget
|
|
virtual void ref_event_target() override { ref(); }
|
|
virtual void unref_event_target() override { unref(); }
|
|
virtual JS::Object* create_wrapper(JS::GlobalObject&) override;
|
|
|
|
private:
|
|
AbortSignal();
|
|
|
|
// https://dom.spec.whatwg.org/#abortsignal-abort-reason
|
|
// An AbortSignal object has an associated abort reason, which is a JavaScript value. It is undefined unless specified otherwise.
|
|
JS::Value m_abort_reason { JS::js_undefined() };
|
|
|
|
// https://dom.spec.whatwg.org/#abortsignal-abort-algorithms
|
|
// FIXME: This should be a set.
|
|
Vector<Function<void()>> m_abort_algorithms;
|
|
};
|
|
|
|
}
|