summaryrefslogtreecommitdiffstats
path: root/dom/tests/mochitest/bugs/utils_bug260264.js
diff options
context:
space:
mode:
Diffstat (limited to 'dom/tests/mochitest/bugs/utils_bug260264.js')
-rw-r--r--dom/tests/mochitest/bugs/utils_bug260264.js69
1 files changed, 69 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 0000000000..dfb0eb45a0
--- /dev/null
+++ b/dom/tests/mochitest/bugs/utils_bug260264.js
@@ -0,0 +1,69 @@
+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);
+ try {
+ sendMouseEvent({ type: event }, element.id);
+ } finally {
+ element.removeEventListener(event, unique_handler);
+ }
+}
+
+/**
+ * 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 openedBrowsingContextID = SpecialPowers.getBrowsingContextID(win);
+ promises.push(
+ (function (openedWindow) {
+ return new Promise(function (resolve) {
+ let observer = {
+ observe(subject) {
+ if (subject.id == openedBrowsingContextID) {
+ SpecialPowers.removeObserver(
+ observer,
+ "browsing-context-discarded"
+ );
+ SimpleTest.executeSoon(resolve);
+ }
+ },
+ };
+
+ SpecialPowers.addObserver(observer, "browsing-context-discarded");
+ });
+ })(win)
+ );
+ win.close();
+ } else {
+ promises.push(Promise.resolve());
+ break;
+ }
+ }
+ return Promise.all(promises);
+ };
+})(window.open);