"use strict";

const { setupForSimpleEventAccessors } = require("../helpers/create-event-accessor");
const EventTargetImpl = require("../events/EventTarget-impl").implementation;

const Event = require("../generated/Event");

class AbortSignalImpl extends EventTargetImpl {
  constructor(args, privateData) {
    super();

    // make event firing possible
    this._ownerDocument = privateData.window.document;

    this.aborted = false;
    this.abortAlgorithms = new Set();
  }

  _signalAbort() {
    if (this.aborted) {
      return;
    }
    this.aborted = true;

    for (const algorithm of this.abortAlgorithms) {
      algorithm();
    }
    this.abortAlgorithms.clear();
    this._dispatch(Event.createImpl(["abort"]), false);
  }

  _addAlgorithm(algorithm) {
    if (this.aborted) {
      return;
    }
    this.abortAlgorithms.add(algorithm);
  }

  _removeAlgorithm(algorithm) {
    this.abortAlgorithms.delete(algorithm);
  }
}

setupForSimpleEventAccessors(AbortSignalImpl.prototype, ["abort"]);

module.exports = {
  implementation: AbortSignalImpl
};

@@ -671,24 +671,25 @@
 ms.clear();%0A
+%0A
     this._di
@@ -716,25 +716,120 @@
 mpl(
-%5B%22abort%22%5D), false
+%0A      %5B%0A        %22abort%22,%0A        %7B bubbles: false, cancelable: false %7D%0A      %5D,%0A      %7B isTrusted: true %7D%0A    )
 );%0A 

Set abort event isTrusted to true