diff options
Diffstat (limited to 'dom/tests/mochitest/bugs/utils_bug260264.js')
-rw-r--r-- | dom/tests/mochitest/bugs/utils_bug260264.js | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/dom/tests/mochitest/bugs/utils_bug260264.js b/dom/tests/mochitest/bugs/utils_bug260264.js new file mode 100644 index 000000000..07b98ea7e --- /dev/null +++ b/dom/tests/mochitest/bugs/utils_bug260264.js @@ -0,0 +1,60 @@ +const ALLOW_ACTION = SpecialPowers.Ci.nsIPermissionManager.ALLOW_ACTION; +const DENY_ACTION = SpecialPowers.Ci.nsIPermissionManager.DENY_ACTION; +const UNKNOWN_ACTION = SpecialPowers.Ci.nsIPermissionManager.UNKNOWN_ACTION; +const PROMPT_ACTION = SpecialPowers.Ci.nsIPermissionManager.PROMPT_ACTION; + +/** + * Dispatches |handler| to |element|, as if fired in response to |event|. + */ +function send(element, event, handler) { + function unique_handler() { return handler.apply(this, arguments) } + element.addEventListener(event, unique_handler, false); + try { sendMouseEvent({ type: event }, element.id) } + finally { element.removeEventListener(event, unique_handler, false) } +} + +/** + * Because it's not nice to leave popup windows open after the tests are + * finished, we need a foolproof way to close some/all window.opened windows. + */ +(function(originalOpen) { + var wins = []; + (window.open = function() { + var win = originalOpen.apply(window, arguments); + if (win) + wins[wins.length] = win; + return win; + }).close = function(n) { + var promises = []; + if (arguments.length < 1) + n = wins.length; + while (n --> 0) { + var win = wins.pop(); + if (win) { + let openedWindowID = + SpecialPowers.getDOMWindowUtils(win).outerWindowID; + promises.push((function(openedWindow) { + return new Promise(function(resolve) { + let observer = { + observe(subject) { + let wrapped = SpecialPowers.wrap(subject); + let winID = wrapped.QueryInterface(SpecialPowers.Ci.nsISupportsPRUint64).data; + if (winID == openedWindowID) { + SpecialPowers.removeObserver(observer, "outer-window-destroyed"); + SimpleTest.executeSoon(resolve); + } + } + }; + + SpecialPowers.addObserver(observer, "outer-window-destroyed", false); + }); + })(win)); + win.close(); + } else { + promises.push(Promise.resolve()); + break; + } + } + return Promise.all(promises); + }; +})(window.open); |