summaryrefslogtreecommitdiffstats
path: root/addon-sdk/source/lib/sdk/window/helpers.js
diff options
context:
space:
mode:
Diffstat (limited to 'addon-sdk/source/lib/sdk/window/helpers.js')
-rw-r--r--addon-sdk/source/lib/sdk/window/helpers.js81
1 files changed, 81 insertions, 0 deletions
diff --git a/addon-sdk/source/lib/sdk/window/helpers.js b/addon-sdk/source/lib/sdk/window/helpers.js
new file mode 100644
index 000000000..56cfcaba7
--- /dev/null
+++ b/addon-sdk/source/lib/sdk/window/helpers.js
@@ -0,0 +1,81 @@
+/* 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 { defer, all } = require('../core/promise');
+const events = require('../system/events');
+const { open: openWindow, onFocus, getToplevelWindow,
+ isInteractive, isStartupFinished, getOuterId } = require('./utils');
+const { Ci } = require("chrome");
+
+function open(uri, options) {
+ return promise(openWindow.apply(null, arguments), 'load').then(focus);
+}
+exports.open = open;
+
+function close(window) {
+ let deferred = defer();
+ let toplevelWindow = getToplevelWindow(window);
+ let outerId = getOuterId(toplevelWindow);
+ events.on("outer-window-destroyed", function onclose({subject}) {
+ let id = subject.QueryInterface(Ci.nsISupportsPRUint64).data;
+ if (id == outerId) {
+ events.off("outer-window-destroyed", onclose);
+ deferred.resolve();
+ }
+ }, true);
+ window.close();
+ return deferred.promise;
+}
+exports.close = close;
+
+function focus(window) {
+ let p = onFocus(window);
+ window.focus();
+ return p;
+}
+exports.focus = focus;
+
+function ready(window) {
+ let { promise: result, resolve } = defer();
+
+ if (isInteractive(window))
+ resolve(window);
+ else
+ resolve(promise(window, 'DOMContentLoaded'));
+
+ return result;
+}
+exports.ready = ready;
+
+function startup(window) {
+ let { promise: result, resolve } = defer();
+
+ if (isStartupFinished(window)) {
+ resolve(window);
+ } else {
+ events.on("browser-delayed-startup-finished", function listener({subject}) {
+ if (subject === window) {
+ events.off("browser-delayed-startup-finished", listener);
+ resolve(window);
+ }
+ });
+ }
+
+ return result;
+}
+exports.startup = startup;
+
+function promise(target, evt, capture) {
+ let deferred = defer();
+ capture = !!capture;
+
+ target.addEventListener(evt, function eventHandler() {
+ target.removeEventListener(evt, eventHandler, capture);
+ deferred.resolve(target);
+ }, capture);
+
+ return deferred.promise;
+}
+exports.promise = promise;