AbortSignal.h 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. /*
  2. * Copyright (c) 2021, Luke Wilde <lukew@serenityos.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #pragma once
  7. #include <AK/RefCounted.h>
  8. #include <AK/Weakable.h>
  9. #include <LibWeb/Bindings/Wrappable.h>
  10. #include <LibWeb/DOM/EventTarget.h>
  11. #include <LibWeb/DOM/Window.h>
  12. #include <LibWeb/Forward.h>
  13. namespace Web::DOM {
  14. // https://dom.spec.whatwg.org/#abortsignal
  15. class AbortSignal final
  16. : public RefCounted<AbortSignal>
  17. , public Weakable<AbortSignal>
  18. , public EventTarget
  19. , public Bindings::Wrappable {
  20. public:
  21. using WrapperType = Bindings::AbortSignalWrapper;
  22. using RefCounted::ref;
  23. using RefCounted::unref;
  24. static NonnullRefPtr<AbortSignal> create(Document& document)
  25. {
  26. return adopt_ref(*new AbortSignal(document));
  27. }
  28. static NonnullRefPtr<AbortSignal> create_with_global_object(Bindings::WindowObject& window_object)
  29. {
  30. return AbortSignal::create(window_object.impl().associated_document());
  31. }
  32. virtual ~AbortSignal() override;
  33. void add_abort_algorithm(Function<void()>);
  34. // https://dom.spec.whatwg.org/#dom-abortsignal-aborted
  35. bool aborted() const { return m_aborted; }
  36. void signal_abort();
  37. // ^EventTarget
  38. virtual void ref_event_target() override { ref(); }
  39. virtual void unref_event_target() override { unref(); }
  40. virtual bool dispatch_event(NonnullRefPtr<Event>) override;
  41. virtual JS::Object* create_wrapper(JS::GlobalObject&) override;
  42. private:
  43. AbortSignal(Document& document);
  44. // https://dom.spec.whatwg.org/#abortsignal-aborted-flag
  45. bool m_aborted { false };
  46. // https://dom.spec.whatwg.org/#abortsignal-abort-algorithms
  47. // FIXME: This should be a set.
  48. Vector<Function<void()>> m_abort_algorithms;
  49. };
  50. }