ladybird/Libraries/LibWeb/HTML/CloseWatcher.h
Sam Atkins a1fbcfb4c6 LibWeb/HTML: Implement CloseWatcher::getEnabledState closer to spec
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.
2025-12-04 14:47:16 +00:00

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;
};
}