mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2025-12-08 06:09:58 +00:00
We previously had this implemented in an ad-hoc way, where we used a boolean on the CloseWatcher instead of a proper function with steps. This worked at the time, but causes problems with the current version of the spec, so let's just implement it properly. This commit consciously does not update the spec text, because it's diverted quite a lot. That will happen in a subsequent commit.
57 lines
1.5 KiB
C++
57 lines
1.5 KiB
C++
/*
|
|
* Copyright (c) 2024, the Ladybird developers.
|
|
*
|
|
* SPDX-License-Identifier: BSD-2-Clause
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include <AK/Forward.h>
|
|
#include <LibWeb/DOM/EventTarget.h>
|
|
|
|
namespace Web::HTML {
|
|
|
|
// https://html.spec.whatwg.org/multipage/interaction.html#closewatcheroptions
|
|
struct CloseWatcherOptions {
|
|
GC::Ptr<DOM::AbortSignal> signal;
|
|
};
|
|
|
|
// https://html.spec.whatwg.org/multipage/interaction.html#the-closewatcher-interface
|
|
class CloseWatcher final : public DOM::EventTarget {
|
|
WEB_PLATFORM_OBJECT(CloseWatcher, DOM::EventTarget);
|
|
GC_DECLARE_ALLOCATOR(CloseWatcher);
|
|
|
|
public:
|
|
using GetEnabledState = GC::Ref<GC::Function<bool()>>;
|
|
|
|
static WebIDL::ExceptionOr<GC::Ref<CloseWatcher>> construct_impl(JS::Realm&, CloseWatcherOptions const& = {});
|
|
[[nodiscard]] static GC::Ref<CloseWatcher> establish(HTML::Window&, GetEnabledState);
|
|
|
|
void request_close_for_bindings();
|
|
void close();
|
|
void destroy();
|
|
|
|
bool request_close(bool require_history_action_activation);
|
|
|
|
bool get_enabled_state() const;
|
|
|
|
virtual ~CloseWatcher() override = default;
|
|
|
|
void set_oncancel(WebIDL::CallbackType*);
|
|
WebIDL::CallbackType* oncancel();
|
|
|
|
void set_onclose(WebIDL::CallbackType*);
|
|
WebIDL::CallbackType* onclose();
|
|
|
|
private:
|
|
CloseWatcher(JS::Realm&, GetEnabledState);
|
|
|
|
virtual void initialize(JS::Realm&) override;
|
|
virtual void visit_edges(Visitor&) override;
|
|
|
|
bool m_is_running_cancel_action { false };
|
|
bool m_is_active { true };
|
|
GetEnabledState m_get_enabled_state;
|
|
};
|
|
|
|
}
|