diff options
author | Matt A. Tobin <mattatobin@localhost.localdomain> | 2018-02-02 04:16:08 -0500 |
---|---|---|
committer | Matt A. Tobin <mattatobin@localhost.localdomain> | 2018-02-02 04:16:08 -0500 |
commit | 5f8de423f190bbb79a62f804151bc24824fa32d8 (patch) | |
tree | 10027f336435511475e392454359edea8e25895d /devtools/client/projecteditor/lib/helpers/event.js | |
parent | 49ee0794b5d912db1f95dce6eb52d781dc210db5 (diff) | |
download | UXP-5f8de423f190bbb79a62f804151bc24824fa32d8.tar UXP-5f8de423f190bbb79a62f804151bc24824fa32d8.tar.gz UXP-5f8de423f190bbb79a62f804151bc24824fa32d8.tar.lz UXP-5f8de423f190bbb79a62f804151bc24824fa32d8.tar.xz UXP-5f8de423f190bbb79a62f804151bc24824fa32d8.zip |
Add m-esr52 at 52.6.0
Diffstat (limited to 'devtools/client/projecteditor/lib/helpers/event.js')
-rw-r--r-- | devtools/client/projecteditor/lib/helpers/event.js | 86 |
1 files changed, 86 insertions, 0 deletions
diff --git a/devtools/client/projecteditor/lib/helpers/event.js b/devtools/client/projecteditor/lib/helpers/event.js new file mode 100644 index 000000000..74b4adb04 --- /dev/null +++ b/devtools/client/projecteditor/lib/helpers/event.js @@ -0,0 +1,86 @@ +/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */ +/* vim: set ft=javascript ts=2 et sw=2 tw=80: */ +/* 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/. */ + +/** + * This file wraps EventEmitter objects to provide functions to forget + * all events bound on a certain object. + */ + +const { Class } = require("sdk/core/heritage"); + +/** + * The Scope object is used to keep track of listeners. + * This object is not exported. + */ +var Scope = Class({ + on: function (target, event, handler) { + this.listeners = this.listeners || []; + this.listeners.push({ + target: target, + event: event, + handler: handler + }); + target.on(event, handler); + }, + + off: function (t, e, h) { + if (!this.listeners) return; + this.listeners = this.listeners.filter(({ target, event, handler }) => { + return !(target === t && event === e && handler === h); + }); + target.off(event, handler); + }, + + clear: function (clearTarget) { + if (!this.listeners) return; + this.listeners = this.listeners.filter(({ target, event, handler }) => { + if (target === clearTarget) { + target.off(event, handler); + return false; + } + return true; + }); + }, + + destroy: function () { + if (!this.listeners) return; + this.listeners.forEach(({ target, event, handler }) => { + target.off(event, handler); + }); + this.listeners = undefined; + } +}); + +var scopes = new WeakMap(); +function scope(owner) { + if (!scopes.has(owner)) { + let scope = new Scope(owner); + scopes.set(owner, scope); + return scope; + } + return scopes.get(owner); +} +exports.scope = scope; + +exports.on = function on(owner, target, event, handler) { + if (!target) return; + scope(owner).on(target, event, handler); +}; + +exports.off = function off(owner, target, event, handler) { + if (!target) return; + scope(owner).off(target, event, handler); +}; + +exports.forget = function forget(owner, target) { + scope(owner).clear(target); +}; + +exports.done = function done(owner) { + scope(owner).destroy(); + scopes.delete(owner); +}; + |