/* * Copyright (c) 2020-2022, Andreas Kling * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include #include #include #include #include #include #include #include #include #include namespace Web::DOM { class RequestAnimationFrameCallback; class Window final : public RefCounted , public EventTarget , public HTML::GlobalEventHandlers { public: static NonnullRefPtr create_with_document(Document&); ~Window(); using RefCounted::ref; using RefCounted::unref; virtual void ref_event_target() override { RefCounted::ref(); } virtual void unref_event_target() override { RefCounted::unref(); } virtual bool dispatch_event(NonnullRefPtr) override; virtual JS::Object* create_wrapper(JS::GlobalObject&) override; Page* page(); Page const* page() const; Document const& associated_document() const { return *m_associated_document; } Document& associated_document() { return *m_associated_document; } void alert(String const&); bool confirm(String const&); String prompt(String const&, String const&); i32 request_animation_frame(NonnullOwnPtr js_callback); void cancel_animation_frame(i32); i32 set_timeout(NonnullOwnPtr callback, i32); i32 set_interval(NonnullOwnPtr callback, i32); void clear_timeout(i32); void clear_interval(i32); void queue_microtask(NonnullOwnPtr callback); int inner_width() const; int inner_height() const; void did_set_location_href(Badge, AK::URL const& new_href); void did_call_location_reload(Badge); void did_call_location_replace(Badge, String url); Bindings::WindowObject* wrapper() { return m_wrapper; } Bindings::WindowObject const* wrapper() const { return m_wrapper; } void set_wrapper(Badge, Bindings::WindowObject&); i32 allocate_timer_id(Badge); void deallocate_timer_id(Badge, i32); void timer_did_fire(Badge, Timer&); HighResolutionTime::Performance& performance() { return *m_performance; } Crypto::Crypto& crypto() { return *m_crypto; } CSS::Screen& screen() { return *m_screen; } Event const* current_event() const { return m_current_event; } void set_current_event(Event* event) { m_current_event = event; } NonnullRefPtr get_computed_style(DOM::Element&) const; NonnullRefPtr match_media(String); Optional query_media_feature(FlyString const&) const; float scroll_x() const; float scroll_y() const; void fire_a_page_transition_event(FlyString const& event_name, bool persisted); float device_pixel_ratio() const; int screen_x() const; int screen_y() const; Selection::Selection* get_selection(); RefPtr local_storage(); private: explicit Window(Document&); // ^HTML::GlobalEventHandlers virtual DOM::EventTarget& global_event_handlers_to_event_target() override { return *this; } // https://html.spec.whatwg.org/multipage/window-object.html#concept-document-window WeakPtr m_associated_document; WeakPtr m_wrapper; IDAllocator m_timer_id_allocator; HashMap> m_timers; NonnullOwnPtr m_performance; NonnullRefPtr m_crypto; NonnullOwnPtr m_screen; RefPtr m_current_event; HashMap> m_request_animation_frame_callbacks; }; void run_animation_frame_callbacks(DOM::Document&, double now); }