1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
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;
|