11cb0ef41Sopenharmony_ciconst otherWindow = document.body.appendChild(document.createElement("iframe")).contentWindow;
21cb0ef41Sopenharmony_ci
31cb0ef41Sopenharmony_ci["EventTarget", "XMLHttpRequest"].forEach(constructorName => {
41cb0ef41Sopenharmony_ci  async_test(t => {
51cb0ef41Sopenharmony_ci    const eventTarget = new otherWindow[constructorName]();
61cb0ef41Sopenharmony_ci    eventTarget.addEventListener("hi", t.step_func_done(e => {
71cb0ef41Sopenharmony_ci      assert_equals(otherWindow.event, undefined);
81cb0ef41Sopenharmony_ci      assert_equals(e, window.event);
91cb0ef41Sopenharmony_ci    }));
101cb0ef41Sopenharmony_ci    eventTarget.dispatchEvent(new Event("hi"));
111cb0ef41Sopenharmony_ci  }, "window.event for constructors from another global: " + constructorName);
121cb0ef41Sopenharmony_ci});
131cb0ef41Sopenharmony_ci
141cb0ef41Sopenharmony_ci// XXX: It would be good to test a subclass of EventTarget once we sort out
151cb0ef41Sopenharmony_ci// https://github.com/heycam/webidl/issues/540
161cb0ef41Sopenharmony_ci
171cb0ef41Sopenharmony_ciasync_test(t => {
181cb0ef41Sopenharmony_ci  const element = document.body.appendChild(otherWindow.document.createElement("meh"));
191cb0ef41Sopenharmony_ci  element.addEventListener("yo", t.step_func_done(e => {
201cb0ef41Sopenharmony_ci    assert_equals(e, window.event);
211cb0ef41Sopenharmony_ci  }));
221cb0ef41Sopenharmony_ci  element.dispatchEvent(new Event("yo"));
231cb0ef41Sopenharmony_ci}, "window.event and element from another document");
241cb0ef41Sopenharmony_ci
251cb0ef41Sopenharmony_ciasync_test(t => {
261cb0ef41Sopenharmony_ci  const doc = otherWindow.document,
271cb0ef41Sopenharmony_ci        element = doc.body.appendChild(doc.createElement("meh")),
281cb0ef41Sopenharmony_ci        child = element.appendChild(doc.createElement("bleh"));
291cb0ef41Sopenharmony_ci  element.addEventListener("yoyo", t.step_func(e => {
301cb0ef41Sopenharmony_ci    document.body.appendChild(element);
311cb0ef41Sopenharmony_ci    assert_equals(element.ownerDocument, document);
321cb0ef41Sopenharmony_ci    assert_equals(window.event, e);
331cb0ef41Sopenharmony_ci    assert_equals(otherWindow.event, undefined);
341cb0ef41Sopenharmony_ci  }), true);
351cb0ef41Sopenharmony_ci  element.addEventListener("yoyo", t.step_func(e => {
361cb0ef41Sopenharmony_ci    assert_equals(element.ownerDocument, document);
371cb0ef41Sopenharmony_ci    assert_equals(window.event, e);
381cb0ef41Sopenharmony_ci    assert_equals(otherWindow.event, undefined);
391cb0ef41Sopenharmony_ci  }), true);
401cb0ef41Sopenharmony_ci  child.addEventListener("yoyo", t.step_func_done(e => {
411cb0ef41Sopenharmony_ci    assert_equals(child.ownerDocument, document);
421cb0ef41Sopenharmony_ci    assert_equals(window.event, e);
431cb0ef41Sopenharmony_ci    assert_equals(otherWindow.event, undefined);
441cb0ef41Sopenharmony_ci  }));
451cb0ef41Sopenharmony_ci  child.dispatchEvent(new Event("yoyo"));
461cb0ef41Sopenharmony_ci}, "window.event and moving an element post-dispatch");
471cb0ef41Sopenharmony_ci
481cb0ef41Sopenharmony_citest(t => {
491cb0ef41Sopenharmony_ci  const host = document.createElement("div"),
501cb0ef41Sopenharmony_ci        shadow = host.attachShadow({ mode: "open" }),
511cb0ef41Sopenharmony_ci        child = shadow.appendChild(document.createElement("trala")),
521cb0ef41Sopenharmony_ci        furtherChild = child.appendChild(document.createElement("waddup"));
531cb0ef41Sopenharmony_ci  let counter = 0;
541cb0ef41Sopenharmony_ci  host.addEventListener("hi", t.step_func(e => {
551cb0ef41Sopenharmony_ci    assert_equals(window.event, e);
561cb0ef41Sopenharmony_ci    assert_equals(counter++, 3);
571cb0ef41Sopenharmony_ci  }));
581cb0ef41Sopenharmony_ci  child.addEventListener("hi", t.step_func(e => {
591cb0ef41Sopenharmony_ci    assert_equals(window.event, undefined);
601cb0ef41Sopenharmony_ci    assert_equals(counter++, 2);
611cb0ef41Sopenharmony_ci  }));
621cb0ef41Sopenharmony_ci  furtherChild.addEventListener("hi", t.step_func(e => {
631cb0ef41Sopenharmony_ci    host.appendChild(child);
641cb0ef41Sopenharmony_ci    assert_equals(window.event, undefined);
651cb0ef41Sopenharmony_ci    assert_equals(counter++, 0);
661cb0ef41Sopenharmony_ci  }));
671cb0ef41Sopenharmony_ci  furtherChild.addEventListener("hi", t.step_func(e => {
681cb0ef41Sopenharmony_ci    assert_equals(window.event, undefined);
691cb0ef41Sopenharmony_ci    assert_equals(counter++, 1);
701cb0ef41Sopenharmony_ci  }));
711cb0ef41Sopenharmony_ci  furtherChild.dispatchEvent(new Event("hi", { composed: true, bubbles: true }));
721cb0ef41Sopenharmony_ci  assert_equals(counter, 4);
731cb0ef41Sopenharmony_ci}, "window.event should not be affected by nodes moving post-dispatch");
741cb0ef41Sopenharmony_ci
751cb0ef41Sopenharmony_ciasync_test(t => {
761cb0ef41Sopenharmony_ci  const frame = document.body.appendChild(document.createElement("iframe"));
771cb0ef41Sopenharmony_ci  frame.src = "resources/event-global-extra-frame.html";
781cb0ef41Sopenharmony_ci  frame.onload = t.step_func_done((load_event) => {
791cb0ef41Sopenharmony_ci    const event = new Event("hi");
801cb0ef41Sopenharmony_ci    document.addEventListener("hi", frame.contentWindow.listener); // listener intentionally not wrapped in t.step_func
811cb0ef41Sopenharmony_ci    document.addEventListener("hi", t.step_func(e => {
821cb0ef41Sopenharmony_ci      assert_equals(event, e);
831cb0ef41Sopenharmony_ci      assert_equals(window.event, e);
841cb0ef41Sopenharmony_ci    }));
851cb0ef41Sopenharmony_ci    document.dispatchEvent(event);
861cb0ef41Sopenharmony_ci    assert_equals(frameState.event, event);
871cb0ef41Sopenharmony_ci    assert_equals(frameState.windowEvent, event);
881cb0ef41Sopenharmony_ci    assert_equals(frameState.parentEvent, load_event);
891cb0ef41Sopenharmony_ci  });
901cb0ef41Sopenharmony_ci}, "Listener from a different global");
91