2021-09-02 02:12:49 +01:00
/*
* Copyright ( c ) 2021 , Luke Wilde < lukew @ serenityos . org >
2024-03-10 18:50:30 +00:00
* Copyright ( c ) 2024 , Tim Ledbetter < timledbetter @ gmail . com >
2021-09-02 02:12:49 +01:00
*
* SPDX - License - Identifier : BSD - 2 - Clause
*/
# pragma once
2025-04-10 09:04:01 -04:00
# include <AK/HashMap.h>
2021-09-02 02:12:49 +01:00
# include <AK/RefCounted.h>
# include <AK/Weakable.h>
2024-11-15 04:01:23 +13:00
# include <LibGC/Function.h>
2021-09-02 02:12:49 +01:00
# include <LibWeb/DOM/EventTarget.h>
# include <LibWeb/Forward.h>
2024-02-26 17:52:32 +00:00
# include <LibWeb/WebIDL/Types.h>
2021-09-02 02:12:49 +01:00
namespace Web : : DOM {
// https://dom.spec.whatwg.org/#abortsignal
2022-08-28 13:42:07 +02:00
class AbortSignal final : public EventTarget {
WEB_PLATFORM_OBJECT ( AbortSignal , EventTarget ) ;
2024-11-15 04:01:23 +13:00
GC_DECLARE_ALLOCATOR ( AbortSignal ) ;
2021-09-02 02:12:49 +01:00
2022-08-28 13:42:07 +02:00
public :
2024-11-15 04:01:23 +13:00
static WebIDL : : ExceptionOr < GC : : Ref < AbortSignal > > construct_impl ( JS : : Realm & ) ;
2021-09-02 02:12:49 +01:00
2022-03-14 13:21:51 -06:00
virtual ~ AbortSignal ( ) override = default ;
2021-09-02 02:12:49 +01:00
2025-04-10 09:04:01 -04:00
using AbortAlgorithmID = u64 ;
Optional < AbortAlgorithmID > add_abort_algorithm ( Function < void ( ) > ) ;
void remove_abort_algorithm ( AbortAlgorithmID ) ;
2021-09-02 02:12:49 +01:00
// https://dom.spec.whatwg.org/#dom-abortsignal-aborted
2021-12-10 20:05:12 +00:00
// An AbortSignal object is aborted when its abort reason is not undefined.
bool aborted ( ) const { return ! m_abort_reason . is_undefined ( ) ; }
2021-09-02 02:12:49 +01:00
2021-12-10 20:05:12 +00:00
void signal_abort ( JS : : Value reason ) ;
2021-09-02 02:12:49 +01:00
2022-09-24 16:02:41 +01:00
void set_onabort ( WebIDL : : CallbackType * ) ;
WebIDL : : CallbackType * onabort ( ) ;
2021-10-01 01:09:11 +01:00
2021-12-10 20:05:12 +00:00
// https://dom.spec.whatwg.org/#dom-abortsignal-reason
JS : : Value reason ( ) const { return m_abort_reason ; }
2024-02-20 20:51:29 +00:00
void set_reason ( JS : : Value reason ) { m_abort_reason = reason ; }
2021-12-10 20:05:12 +00:00
2021-12-10 19:48:51 +00:00
JS : : ThrowCompletionOr < void > throw_if_aborted ( ) const ;
2024-11-15 04:01:23 +13:00
static WebIDL : : ExceptionOr < GC : : Ref < AbortSignal > > abort ( JS : : VM & , JS : : Value reason ) ;
static WebIDL : : ExceptionOr < GC : : Ref < AbortSignal > > timeout ( JS : : VM & , Web : : WebIDL : : UnsignedLongLong milliseconds ) ;
static WebIDL : : ExceptionOr < GC : : Ref < AbortSignal > > any ( JS : : VM & , Vector < GC : : Root < AbortSignal > > const & ) ;
2024-02-20 20:51:29 +00:00
2024-11-15 04:01:23 +13:00
static WebIDL : : ExceptionOr < GC : : Ref < AbortSignal > > create_dependent_abort_signal ( JS : : Realm & , Vector < GC : : Root < AbortSignal > > const & ) ;
2024-03-26 07:45:11 +00:00
2021-09-02 02:12:49 +01:00
private :
2022-09-25 16:15:49 -06:00
explicit AbortSignal ( JS : : Realm & ) ;
2022-08-28 13:42:07 +02:00
2023-08-07 08:41:28 +02:00
virtual void initialize ( JS : : Realm & ) override ;
2022-08-28 13:42:07 +02:00
virtual void visit_edges ( JS : : Cell : : Visitor & ) override ;
2021-09-02 02:12:49 +01:00
2024-03-10 18:50:30 +00:00
bool dependent ( ) const { return m_dependent ; }
void set_dependent ( bool dependent ) { m_dependent = dependent ; }
2024-11-15 04:01:23 +13:00
Vector < GC : : Ptr < AbortSignal > > source_signals ( ) const { return m_source_signals ; }
2024-03-10 18:50:30 +00:00
2024-11-15 04:01:23 +13:00
void append_source_signal ( GC : : Ptr < AbortSignal > source_signal ) { m_source_signals . append ( source_signal ) ; }
void append_dependent_signal ( GC : : Ptr < AbortSignal > dependent_signal ) { m_dependent_signals . append ( dependent_signal ) ; }
2024-03-10 18:50:30 +00:00
2021-12-10 20:05:12 +00:00
// 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 ( ) } ;
2021-09-02 02:12:49 +01:00
// https://dom.spec.whatwg.org/#abortsignal-abort-algorithms
2025-04-10 09:04:01 -04:00
OrderedHashMap < AbortAlgorithmID , GC : : Ref < GC : : Function < void ( ) > > > m_abort_algorithms ;
AbortAlgorithmID m_next_abort_algorithm_id { 0 } ;
2024-03-10 18:50:30 +00:00
// https://dom.spec.whatwg.org/#abortsignal-source-signals
// An AbortSignal object has associated source signals (a weak set of AbortSignal objects that the object is dependent on for its aborted state), which is initially empty.
2024-11-15 04:01:23 +13:00
Vector < GC : : Ptr < AbortSignal > > m_source_signals ;
2024-03-10 18:50:30 +00:00
// https://dom.spec.whatwg.org/#abortsignal-dependent-signals
// An AbortSignal object has associated dependent signals (a weak set of AbortSignal objects that are dependent on the object for their aborted state), which is initially empty.
2024-11-15 04:01:23 +13:00
Vector < GC : : Ptr < AbortSignal > > m_dependent_signals ;
2024-03-10 18:50:30 +00:00
// https://dom.spec.whatwg.org/#abortsignal-dependent
// An AbortSignal object has a dependent (a boolean), which is initially false.
bool m_dependent { false } ;
2021-09-02 02:12:49 +01:00
} ;
}