diff --git a/web/src/input_pill.ts b/web/src/input_pill.ts index 5184fc2821..754d763ef9 100644 --- a/web/src/input_pill.ts +++ b/web/src/input_pill.ts @@ -1,6 +1,7 @@ // todo: Refactor pills subsystem to use modern javascript classes? import $ from "jquery"; +import assert from "minimalistic-assert"; import render_input_pill from "../templates/input_pill.hbs"; @@ -408,9 +409,8 @@ export function create(opts: InputPillCreateOptions): InputPillContainer(opts: InputPillCreateOptions): InputPillContainer { const element: HTMLElement = e.currentTarget; const {item} = funcs.getByElement(element)!; - (e.originalEvent as ClipboardEvent).clipboardData?.setData( - "text/plain", - store.get_text_from_item(item), - ); + assert(e.originalEvent instanceof ClipboardEvent); + e.originalEvent.clipboardData?.setData("text/plain", store.get_text_from_item(item)); e.preventDefault(); }); } diff --git a/web/src/modals.ts b/web/src/modals.ts index fb0033b75f..ac05e3ada9 100644 --- a/web/src/modals.ts +++ b/web/src/modals.ts @@ -1,5 +1,6 @@ import $ from "jquery"; import Micromodal from "micromodal"; +import assert from "minimalistic-assert"; import * as blueslip from "./blueslip"; import * as overlay_util from "./overlay_util"; @@ -105,7 +106,8 @@ export function open( const $micromodal = $(id_selector); $micromodal.find(".modal__container").on("animationend", (event) => { - const animation_name = (event.originalEvent as AnimationEvent).animationName; + assert(event.originalEvent instanceof AnimationEvent); + const animation_name = event.originalEvent.animationName; if (animation_name === "mmfadeIn") { // Micromodal adds the is-open class before the modal animation // is complete, which isn't really helpful since a modal is open after the @@ -198,7 +200,8 @@ export function close(modal_id: string, conf: Pick = { // mechanism as a convenience for hooks only known when // closing the modal. $micromodal.find(".modal__container").on("animationend", (event) => { - const animation_name = (event.originalEvent as AnimationEvent).animationName; + assert(event.originalEvent instanceof AnimationEvent); + const animation_name = event.originalEvent.animationName; if (animation_name === "mmfadeOut" && conf.on_hidden) { conf.on_hidden(); } diff --git a/web/src/portico/portico_modals.ts b/web/src/portico/portico_modals.ts index 46dec13d85..243247318a 100644 --- a/web/src/portico/portico_modals.ts +++ b/web/src/portico/portico_modals.ts @@ -1,5 +1,6 @@ import $ from "jquery"; import Micromodal from "micromodal"; +import assert from "minimalistic-assert"; import * as blueslip from "../blueslip"; @@ -77,7 +78,8 @@ export function open(modal_id: string, recursive_call_count: number = 0): void { const $micromodal = $(id_selector); $micromodal.find(".modal__container").on("animationend", (event) => { - const animation_name = (event.originalEvent as AnimationEvent).animationName; + assert(event.originalEvent instanceof AnimationEvent); + const animation_name = event.originalEvent.animationName; if (animation_name === "mmfadeIn") { // Micromodal adds the is-open class before the modal animation // is complete, which isn't really helpful since a modal is open after the diff --git a/web/tests/input_pill.test.js b/web/tests/input_pill.test.js index c34e96f794..a6bfd206b4 100644 --- a/web/tests/input_pill.test.js +++ b/web/tests/input_pill.test.js @@ -8,6 +8,8 @@ const blueslip = require("./lib/zblueslip"); const $ = require("./lib/zjquery"); set_global("document", {}); +class ClipboardEvent {} +set_global("ClipboardEvent", ClipboardEvent); const noop = () => {}; const example_img_link = "http://example.com/example.png"; @@ -163,16 +165,16 @@ run_test("copy from pill", ({mock_template}) => { const $pill_stub = ""; + const originalEvent = new ClipboardEvent(); + originalEvent.clipboardData = { + setData(format, text) { + assert.equal(format, "text/plain"); + copied_text = text; + }, + }; const e = { currentTarget: $pill_stub, - originalEvent: { - clipboardData: { - setData(format, text) { - assert.equal(format, "text/plain"); - copied_text = text; - }, - }, - }, + originalEvent, preventDefault: noop, }; @@ -198,15 +200,15 @@ run_test("paste to input", ({mock_template}) => { const paste_text = "blue,yellow"; - const e = { - originalEvent: { - clipboardData: { - getData(format) { - assert.equal(format, "text/plain"); - return paste_text; - }, - }, + const originalEvent = new ClipboardEvent(); + originalEvent.clipboardData = { + getData(format) { + assert.equal(format, "text/plain"); + return paste_text; }, + }; + const e = { + originalEvent, preventDefault: noop, };