#pragma once
#include "ContextDestructionObserver.h"
#include "EventTarget.h"
#include "JSDOMPromiseDeferred.h"
#include <wtf/Function.h>
#include <wtf/Ref.h>
#include <wtf/RefCounted.h>
#include <wtf/WeakPtr.h>
namespace WebCore {
class AbortAlgorithm;
class ScriptExecutionContext;
class AbortSignal final : public RefCounted<AbortSignal>, public EventTargetWithInlineData, public CanMakeWeakPtr<AbortSignal>, private ContextDestructionObserver {
WTF_MAKE_ISO_ALLOCATED(AbortSignal);
public:
static Ref<AbortSignal> create(ScriptExecutionContext&);
static bool whenSignalAborted(AbortSignal&, Ref<AbortAlgorithm>&&);
void abort();
bool aborted() const { return m_aborted; }
using RefCounted::ref;
using RefCounted::deref;
using Algorithm = Function<void()>;
void addAlgorithm(Algorithm&& algorithm) { m_algorithms.append(WTFMove(algorithm)); }
void follow(AbortSignal&);
bool isFollowingSignal() const { return !!m_followingSignal; }
private:
explicit AbortSignal(ScriptExecutionContext&);
EventTargetInterface eventTargetInterface() const final { return AbortSignalEventTargetInterfaceType; }
ScriptExecutionContext* scriptExecutionContext() const final { return ContextDestructionObserver::scriptExecutionContext(); }
void refEventTarget() final { ref(); }
void derefEventTarget() final { deref(); }
bool m_aborted { false };
Vector<Algorithm> m_algorithms;
WeakPtr<AbortSignal> m_followingSignal;
};
}