| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286 | /* Copyright 2017 Mozilla Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * *     http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */import {  EventBus,  waitOnEventOrTimeout,  WaitOnType,} from "../../web/event_utils.js";import { isNodeJS } from "../../src/shared/is_node.js";describe("event_utils", function () {  describe("EventBus", function () {    it("dispatch event", function () {      const eventBus = new EventBus();      let count = 0;      eventBus.on("test", function (evt) {        expect(evt).toEqual(undefined);        count++;      });      eventBus.dispatch("test");      expect(count).toEqual(1);    });    it("dispatch event with arguments", function () {      const eventBus = new EventBus();      let count = 0;      eventBus.on("test", function (evt) {        expect(evt).toEqual({ abc: 123 });        count++;      });      eventBus.dispatch("test", {        abc: 123,      });      expect(count).toEqual(1);    });    it("dispatch different event", function () {      const eventBus = new EventBus();      let count = 0;      eventBus.on("test", function () {        count++;      });      eventBus.dispatch("nottest");      expect(count).toEqual(0);    });    it("dispatch event multiple times", function () {      const eventBus = new EventBus();      let count = 0;      eventBus.dispatch("test");      eventBus.on("test", function () {        count++;      });      eventBus.dispatch("test");      eventBus.dispatch("test");      expect(count).toEqual(2);    });    it("dispatch event to multiple handlers", function () {      const eventBus = new EventBus();      let count = 0;      eventBus.on("test", function () {        count++;      });      eventBus.on("test", function () {        count++;      });      eventBus.dispatch("test");      expect(count).toEqual(2);    });    it("dispatch to detached", function () {      const eventBus = new EventBus();      let count = 0;      const listener = function () {        count++;      };      eventBus.on("test", listener);      eventBus.dispatch("test");      eventBus.off("test", listener);      eventBus.dispatch("test");      expect(count).toEqual(1);    });    it("dispatch to wrong detached", function () {      const eventBus = new EventBus();      let count = 0;      eventBus.on("test", function () {        count++;      });      eventBus.dispatch("test");      eventBus.off("test", function () {        count++;      });      eventBus.dispatch("test");      expect(count).toEqual(2);    });    it("dispatch to detached during handling", function () {      const eventBus = new EventBus();      let count = 0;      const listener1 = function () {        eventBus.off("test", listener2);        count++;      };      const listener2 = function () {        eventBus.off("test", listener1);        count++;      };      eventBus.on("test", listener1);      eventBus.on("test", listener2);      eventBus.dispatch("test");      eventBus.dispatch("test");      expect(count).toEqual(2);    });    it("dispatch event to handlers with/without 'once' option", function () {      const eventBus = new EventBus();      let multipleCount = 0,        onceCount = 0;      eventBus.on("test", function () {        multipleCount++;      });      eventBus.on(        "test",        function () {          onceCount++;        },        { once: true }      );      eventBus.dispatch("test");      eventBus.dispatch("test");      eventBus.dispatch("test");      expect(multipleCount).toEqual(3);      expect(onceCount).toEqual(1);    });    it("should not re-dispatch to DOM", async function () {      if (isNodeJS) {        pending("Document is not supported in Node.js.");      }      const eventBus = new EventBus();      let count = 0;      eventBus.on("test", function (evt) {        expect(evt).toEqual(undefined);        count++;      });      function domEventListener() {        // Shouldn't get here.        expect(false).toEqual(true);      }      document.addEventListener("test", domEventListener);      eventBus.dispatch("test");      await Promise.resolve();      expect(count).toEqual(1);      document.removeEventListener("test", domEventListener);    });  });  describe("waitOnEventOrTimeout", function () {    let eventBus;    beforeAll(function () {      eventBus = new EventBus();    });    afterAll(function () {      eventBus = null;    });    it("should reject invalid parameters", async function () {      const invalidTarget = waitOnEventOrTimeout({        target: "window",        name: "DOMContentLoaded",      }).then(        function () {          // Shouldn't get here.          expect(false).toEqual(true);        },        function (reason) {          expect(reason instanceof Error).toEqual(true);        }      );      const invalidName = waitOnEventOrTimeout({        target: eventBus,        name: "",      }).then(        function () {          // Shouldn't get here.          expect(false).toEqual(true);        },        function (reason) {          expect(reason instanceof Error).toEqual(true);        }      );      const invalidDelay = waitOnEventOrTimeout({        target: eventBus,        name: "pagerendered",        delay: -1000,      }).then(        function () {          // Shouldn't get here.          expect(false).toEqual(true);        },        function (reason) {          expect(reason instanceof Error).toEqual(true);        }      );      await Promise.all([invalidTarget, invalidName, invalidDelay]);    });    it("should resolve on event, using the DOM", async function () {      if (isNodeJS) {        pending("Document is not supported in Node.js.");      }      const button = document.createElement("button");      const buttonClicked = waitOnEventOrTimeout({        target: button,        name: "click",        delay: 10000,      });      // Immediately dispatch the expected event.      button.click();      const type = await buttonClicked;      expect(type).toEqual(WaitOnType.EVENT);    });    it("should resolve on timeout, using the DOM", async function () {      if (isNodeJS) {        pending("Document is not supported in Node.js.");      }      const button = document.createElement("button");      const buttonClicked = waitOnEventOrTimeout({        target: button,        name: "click",        delay: 10,      });      // Do *not* dispatch the event, and wait for the timeout.      const type = await buttonClicked;      expect(type).toEqual(WaitOnType.TIMEOUT);    });    it("should resolve on event, using the EventBus", async function () {      const pageRendered = waitOnEventOrTimeout({        target: eventBus,        name: "pagerendered",        delay: 10000,      });      // Immediately dispatch the expected event.      eventBus.dispatch("pagerendered");      const type = await pageRendered;      expect(type).toEqual(WaitOnType.EVENT);    });    it("should resolve on timeout, using the EventBus", async function () {      const pageRendered = waitOnEventOrTimeout({        target: eventBus,        name: "pagerendered",        delay: 10,      });      // Do *not* dispatch the event, and wait for the timeout.      const type = await pageRendered;      expect(type).toEqual(WaitOnType.TIMEOUT);    });  });});
 |