diff options
Diffstat (limited to 'remote/marionette/test/xpcshell/test_modal.js')
-rw-r--r-- | remote/marionette/test/xpcshell/test_modal.js | 113 |
1 files changed, 113 insertions, 0 deletions
diff --git a/remote/marionette/test/xpcshell/test_modal.js b/remote/marionette/test/xpcshell/test_modal.js new file mode 100644 index 0000000000..c36811f7ec --- /dev/null +++ b/remote/marionette/test/xpcshell/test_modal.js @@ -0,0 +1,113 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this file, + * You can obtain one at http://mozilla.org/MPL/2.0/. */ + +"use strict"; + +const { modal } = ChromeUtils.importESModule( + "chrome://remote/content/marionette/modal.sys.mjs" +); + +const chromeWindow = {}; + +const mockModalDialog = { + docShell: { + chromeEventHandler: null, + }, + opener: { + ownerGlobal: chromeWindow, + }, + Dialog: { + args: { + modalType: Services.prompt.MODAL_TYPE_WINDOW, + }, + }, +}; + +const mockCurBrowser = { + window: chromeWindow, +}; + +add_task(function test_addCallback() { + let observer = new modal.DialogObserver(() => mockCurBrowser); + let cb1 = () => true; + let cb2 = () => false; + + equal(observer.callbacks.size, 0); + observer.add(cb1); + equal(observer.callbacks.size, 1); + observer.add(cb1); + equal(observer.callbacks.size, 1); + observer.add(cb2); + equal(observer.callbacks.size, 2); +}); + +add_task(function test_removeCallback() { + let observer = new modal.DialogObserver(() => mockCurBrowser); + let cb1 = () => true; + let cb2 = () => false; + + equal(observer.callbacks.size, 0); + observer.add(cb1); + observer.add(cb2); + + equal(observer.callbacks.size, 2); + observer.remove(cb1); + equal(observer.callbacks.size, 1); + observer.remove(cb1); + equal(observer.callbacks.size, 1); + observer.remove(cb2); + equal(observer.callbacks.size, 0); +}); + +add_task(function test_registerDialogClosedEventHandler() { + let observer = new modal.DialogObserver(() => mockCurBrowser); + let mockChromeWindow = { + addEventListener(event, cb) { + equal( + event, + "DOMModalDialogClosed", + "registered event for closing modal" + ); + equal(cb, observer, "set itself as handler"); + }, + }; + + observer.observe(mockChromeWindow, "domwindowopened"); +}); + +add_task(function test_handleCallbackOpenModalDialog() { + let observer = new modal.DialogObserver(() => mockCurBrowser); + + observer.add((action, dialog) => { + equal(action, modal.ACTION_OPENED, "'opened' action has been passed"); + equal(dialog, mockModalDialog, "dialog has been passed"); + }); + observer.observe(mockModalDialog, "common-dialog-loaded"); +}); + +add_task(function test_handleCallbackCloseModalDialog() { + let observer = new modal.DialogObserver(() => mockCurBrowser); + + observer.add((action, dialog) => { + equal(action, modal.ACTION_CLOSED, "'closed' action has been passed"); + equal(dialog, mockModalDialog, "dialog has been passed"); + }); + observer.handleEvent({ + type: "DOMModalDialogClosed", + target: mockModalDialog, + }); +}); + +add_task(async function test_dialogClosed() { + let observer = new modal.DialogObserver(() => mockCurBrowser); + + const dialogClosed = observer.dialogClosed(); + + observer.handleEvent({ + type: "DOMModalDialogClosed", + target: mockModalDialog, + }); + + await dialogClosed; +}); |