| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354 | /* 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";module.metadata = {  "stability": "unstable"};const { Cc, Ci, Cr } = require("chrome");const { emit, on, off } = require("./core");const { addObserver } = Cc['@mozilla.org/observer-service;1'].                        getService(Ci.nsIObserverService);// Simple class that can be used to instantiate event channel that// implements `nsIObserver` interface. It's will is used by `observe`// function as observer + event target. It basically proxies observer// notifications as to it's registered listeners.function ObserverChannel() {}Object.freeze(Object.defineProperties(ObserverChannel.prototype, {  QueryInterface: {    value: function(iid) {      if (!iid.equals(Ci.nsIObserver) &&          !iid.equals(Ci.nsISupportsWeakReference) &&          !iid.equals(Ci.nsISupports))        throw Cr.NS_ERROR_NO_INTERFACE;      return this;    }  },  observe: {    value: function(subject, topic, data) {      emit(this, "data", {        type: topic,        target: subject,        data: data      });    }  }}));function observe(topic) {  let observerChannel = new ObserverChannel();  // Note: `nsIObserverService` will not hold a weak reference to a  // observerChannel (since third argument is `true`). There for if it  // will be GC-ed with all it's event listeners once no other references  // will be held.  addObserver(observerChannel, topic, true);  return observerChannel;}exports.observe = observe;
 |