michael@0: /* This Source Code Form is subject to the terms of the Mozilla Public michael@0: * License, v. 2.0. If a copy of the MPL was not distributed with this michael@0: * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ michael@0: 'use strict'; michael@0: michael@0: const { defer } = require('../core/promise'); michael@0: const events = require('../system/events'); michael@0: const { open: openWindow, onFocus, getToplevelWindow, michael@0: isInteractive, getOuterId } = require('./utils'); michael@0: const { Ci } = require("chrome"); michael@0: michael@0: function open(uri, options) { michael@0: return promise(openWindow.apply(null, arguments), 'load'); michael@0: } michael@0: exports.open = open; michael@0: michael@0: function close(window) { michael@0: let deferred = defer(); michael@0: let toplevelWindow = getToplevelWindow(window); michael@0: let outerId = getOuterId(toplevelWindow); michael@0: events.on("outer-window-destroyed", function onclose({subject}) { michael@0: let id = subject.QueryInterface(Ci.nsISupportsPRUint64).data; michael@0: if (id == outerId) { michael@0: events.off("outer-window-destroyed", onclose); michael@0: deferred.resolve(); michael@0: } michael@0: }, true); michael@0: window.close(); michael@0: return deferred.promise; michael@0: } michael@0: exports.close = close; michael@0: michael@0: function focus(window) { michael@0: let p = onFocus(window); michael@0: window.focus(); michael@0: return p; michael@0: } michael@0: exports.focus = focus; michael@0: michael@0: function ready(window) { michael@0: let { promise: result, resolve } = defer(); michael@0: michael@0: if (isInteractive(window)) michael@0: resolve(window); michael@0: else michael@0: resolve(promise(window, 'DOMContentLoaded')); michael@0: michael@0: return result; michael@0: } michael@0: exports.ready = ready; michael@0: michael@0: function promise(target, evt, capture) { michael@0: let deferred = defer(); michael@0: capture = !!capture; michael@0: michael@0: target.addEventListener(evt, function eventHandler() { michael@0: target.removeEventListener(evt, eventHandler, capture); michael@0: deferred.resolve(target); michael@0: }, capture); michael@0: michael@0: return deferred.promise; michael@0: } michael@0: exports.promise = promise;