|
1 /* This Source Code Form is subject to the terms of the Mozilla Public |
|
2 * License, v. 2.0. If a copy of the MPL was not distributed with this |
|
3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ |
|
4 'use strict'; |
|
5 |
|
6 const { defer } = require('../core/promise'); |
|
7 const events = require('../system/events'); |
|
8 const { open: openWindow, onFocus, getToplevelWindow, |
|
9 isInteractive, getOuterId } = require('./utils'); |
|
10 const { Ci } = require("chrome"); |
|
11 |
|
12 function open(uri, options) { |
|
13 return promise(openWindow.apply(null, arguments), 'load'); |
|
14 } |
|
15 exports.open = open; |
|
16 |
|
17 function close(window) { |
|
18 let deferred = defer(); |
|
19 let toplevelWindow = getToplevelWindow(window); |
|
20 let outerId = getOuterId(toplevelWindow); |
|
21 events.on("outer-window-destroyed", function onclose({subject}) { |
|
22 let id = subject.QueryInterface(Ci.nsISupportsPRUint64).data; |
|
23 if (id == outerId) { |
|
24 events.off("outer-window-destroyed", onclose); |
|
25 deferred.resolve(); |
|
26 } |
|
27 }, true); |
|
28 window.close(); |
|
29 return deferred.promise; |
|
30 } |
|
31 exports.close = close; |
|
32 |
|
33 function focus(window) { |
|
34 let p = onFocus(window); |
|
35 window.focus(); |
|
36 return p; |
|
37 } |
|
38 exports.focus = focus; |
|
39 |
|
40 function ready(window) { |
|
41 let { promise: result, resolve } = defer(); |
|
42 |
|
43 if (isInteractive(window)) |
|
44 resolve(window); |
|
45 else |
|
46 resolve(promise(window, 'DOMContentLoaded')); |
|
47 |
|
48 return result; |
|
49 } |
|
50 exports.ready = ready; |
|
51 |
|
52 function promise(target, evt, capture) { |
|
53 let deferred = defer(); |
|
54 capture = !!capture; |
|
55 |
|
56 target.addEventListener(evt, function eventHandler() { |
|
57 target.removeEventListener(evt, eventHandler, capture); |
|
58 deferred.resolve(target); |
|
59 }, capture); |
|
60 |
|
61 return deferred.promise; |
|
62 } |
|
63 exports.promise = promise; |