2023-03-05 23:58:47 +00:00
/*
* Copyright ( c ) 2023 , Linus Groh < linusg @ serenityos . org >
2023-03-22 19:12:57 +00:00
* Copyright ( c ) 2023 , Luke Wilde < lukew @ serenityos . org >
2023-03-05 23:58:47 +00:00
*
* SPDX - License - Identifier : BSD - 2 - Clause
*/
# pragma once
2023-03-22 19:12:57 +00:00
# include <AK/FlyString.h>
2023-03-05 23:58:47 +00:00
# include <AK/Forward.h>
2023-03-14 06:59:23 -04:00
# include <AK/HashMap.h>
# include <AK/IDAllocator.h>
# include <AK/Variant.h>
2023-03-05 23:58:47 +00:00
# include <LibWeb/Bindings/PlatformObject.h>
2023-03-07 18:15:52 +00:00
# include <LibWeb/Fetch/Request.h>
2023-03-05 23:58:47 +00:00
# include <LibWeb/Forward.h>
2023-03-07 18:21:49 +00:00
# include <LibWeb/HTML/MessagePort.h>
2023-03-22 19:12:57 +00:00
# include <LibWeb/PerformanceTimeline/PerformanceEntry.h>
# include <LibWeb/PerformanceTimeline/PerformanceEntryTuple.h>
2023-03-05 23:58:47 +00:00
namespace Web : : HTML {
2023-03-14 06:59:23 -04:00
// https://html.spec.whatwg.org/#timerhandler
2023-03-14 07:06:32 -04:00
using TimerHandler = Variant < JS : : Handle < WebIDL : : CallbackType > , String > ;
2023-03-14 06:59:23 -04:00
2023-03-05 23:58:47 +00:00
// https://html.spec.whatwg.org/multipage/webappapis.html#windoworworkerglobalscope
class WindowOrWorkerGlobalScopeMixin {
public :
virtual ~ WindowOrWorkerGlobalScopeMixin ( ) ;
virtual Bindings : : PlatformObject & this_impl ( ) = 0 ;
virtual Bindings : : PlatformObject const & this_impl ( ) const = 0 ;
// JS API functions
WebIDL : : ExceptionOr < String > origin ( ) const ;
bool is_secure_context ( ) const ;
bool cross_origin_isolated ( ) const ;
WebIDL : : ExceptionOr < String > btoa ( String const & data ) const ;
WebIDL : : ExceptionOr < String > atob ( String const & data ) const ;
2023-03-07 18:25:18 +00:00
void queue_microtask ( WebIDL : : CallbackType & ) ;
2023-03-07 18:21:49 +00:00
WebIDL : : ExceptionOr < JS : : Value > structured_clone ( JS : : Value , StructuredSerializeOptions const & ) const ;
2023-03-07 18:15:52 +00:00
JS : : NonnullGCPtr < JS : : Promise > fetch ( Fetch : : RequestInfo const & , Fetch : : RequestInit const & ) const ;
2023-03-14 06:59:23 -04:00
i32 set_timeout ( TimerHandler , i32 timeout , JS : : MarkedVector < JS : : Value > arguments ) ;
i32 set_interval ( TimerHandler , i32 timeout , JS : : MarkedVector < JS : : Value > arguments ) ;
void clear_timeout ( i32 ) ;
void clear_interval ( i32 ) ;
2023-03-23 17:07:52 +00:00
PerformanceTimeline : : PerformanceEntryTuple & relevant_performance_entry_tuple ( FlyString const & entry_type ) ;
2023-08-25 01:26:47 +01:00
void queue_performance_entry ( JS : : NonnullGCPtr < PerformanceTimeline : : PerformanceEntry > new_entry ) ;
2023-03-23 17:07:52 +00:00
void clear_performance_entry_buffer ( Badge < HighResolutionTime : : Performance > , FlyString const & entry_type ) ;
void remove_entries_from_performance_entry_buffer ( Badge < HighResolutionTime : : Performance > , FlyString const & entry_type , String entry_name ) ;
2023-03-22 19:12:57 +00:00
ErrorOr < Vector < JS : : Handle < PerformanceTimeline : : PerformanceEntry > > > filter_buffer_map_by_name_and_type ( Optional < String > name , Optional < String > type ) const ;
2023-08-25 01:26:47 +01:00
void register_performance_observer ( Badge < PerformanceTimeline : : PerformanceObserver > , JS : : NonnullGCPtr < PerformanceTimeline : : PerformanceObserver > ) ;
void unregister_performance_observer ( Badge < PerformanceTimeline : : PerformanceObserver > , JS : : NonnullGCPtr < PerformanceTimeline : : PerformanceObserver > ) ;
bool has_registered_performance_observer ( JS : : NonnullGCPtr < PerformanceTimeline : : PerformanceObserver > ) ;
void queue_the_performance_observer_task ( ) ;
2023-03-14 06:59:23 -04:00
protected :
2023-08-07 08:41:28 +02:00
void initialize ( JS : : Realm & ) ;
2023-03-14 06:59:23 -04:00
void visit_edges ( JS : : Cell : : Visitor & ) ;
private :
enum class Repeat {
Yes ,
No ,
} ;
i32 run_timer_initialization_steps ( TimerHandler handler , i32 timeout , JS : : MarkedVector < JS : : Value > arguments , Repeat repeat , Optional < i32 > previous_id = { } , Optional < AK : : URL > base_url = { } ) ;
IDAllocator m_timer_id_allocator ;
HashMap < int , JS : : NonnullGCPtr < Timer > > m_timers ;
2023-03-22 19:12:57 +00:00
// https://www.w3.org/TR/performance-timeline/#performance-timeline
// Each global object has:
2023-08-25 01:26:47 +01:00
// - a performance observer task queued flag
bool m_performance_observer_task_queued { false } ;
// - a list of registered performance observer objects that is initially empty
OrderedHashTable < JS : : NonnullGCPtr < PerformanceTimeline : : PerformanceObserver > > m_registered_performance_observer_objects ;
2023-03-22 19:12:57 +00:00
// https://www.w3.org/TR/performance-timeline/#dfn-performance-entry-buffer-map
// a performance entry buffer map map, keyed on a DOMString, representing the entry type to which the buffer belongs. The map's value is the following tuple:
// NOTE: See the PerformanceEntryTuple struct above for the map's value tuple.
OrderedHashMap < FlyString , PerformanceTimeline : : PerformanceEntryTuple > m_performance_entry_buffer_map ;
2023-03-05 23:58:47 +00:00
} ;
}