|
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 |
|
5 "use strict"; |
|
6 |
|
7 module.metadata = { |
|
8 "stability": "unstable" |
|
9 }; |
|
10 |
|
11 const { Trait } = require("../deprecated/light-traits"); |
|
12 const { EventEmitterTrait: EventEmitter } = require("../deprecated/events"); |
|
13 const { DOMEventAssembler } = require("../deprecated/events/assembler"); |
|
14 const { browserWindowIterator } = require('../deprecated/window-utils'); |
|
15 const { isBrowser } = require('../window/utils'); |
|
16 const { observer: windowObserver } = require("../windows/observer"); |
|
17 |
|
18 // Event emitter objects used to register listeners and emit events on them |
|
19 // when they occur. |
|
20 const observer = Trait.compose(DOMEventAssembler, EventEmitter).create({ |
|
21 /** |
|
22 * Method is implemented by `EventEmitter` and is used just for emitting |
|
23 * events on registered listeners. |
|
24 */ |
|
25 _emit: Trait.required, |
|
26 /** |
|
27 * Events that are supported and emitted by the module. |
|
28 */ |
|
29 supportedEventsTypes: [ "keydown", "keyup", "keypress" ], |
|
30 /** |
|
31 * Function handles all the supported events on all the windows that are |
|
32 * observed. Method is used to proxy events to the listeners registered on |
|
33 * this event emitter. |
|
34 * @param {Event} event |
|
35 * Keyboard event being emitted. |
|
36 */ |
|
37 handleEvent: function handleEvent(event) { |
|
38 this._emit(event.type, event, event.target.ownerDocument.defaultView); |
|
39 } |
|
40 }); |
|
41 |
|
42 // Adding each opened window to a list of observed windows. |
|
43 windowObserver.on("open", function onOpen(window) { |
|
44 if (isBrowser(window)) |
|
45 observer.observe(window); |
|
46 }); |
|
47 // Removing each closed window form the list of observed windows. |
|
48 windowObserver.on("close", function onClose(window) { |
|
49 if (isBrowser(window)) |
|
50 observer.ignore(window); |
|
51 }); |
|
52 |
|
53 // Making observer aware of already opened windows. |
|
54 for each (let window in browserWindowIterator()) |
|
55 observer.observe(window); |
|
56 |
|
57 exports.observer = observer; |