Service workers: Allow HTTPS pages arrived at via HTTP redirect to use SW
[chromium-blink-merge.git] / third_party / polymer / v1_0 / components-chromium / more-routing / emitter-extracted.js
blobe7781575d759572566b7fb5add00c27637607a4c
1 (function(scope) {
2 var MoreRouting = scope.MoreRouting = scope.MoreRouting || {};
3 MoreRouting.Emitter = Object.create(null);  // Minimal set of properties.
5 /**
6  * A dumb prototype that provides very simple event subscription.
7  *
8  * You are responsible for initializing `__listeners` as an array on objects
9  * that make use of this.
10  */
11 Object.defineProperties(MoreRouting.Emitter, {
13   /**
14    * Registers a callback that will be called each time any parameter managed by
15    * this object (or its parents) have changed.
16    *
17    * @param {!Function} callback
18    * @return {{close: function()}}
19    */
20   __subscribe: {
21     value: function __subscribe(callback) {
22       this.__listeners.push(callback);
24       return {
25         close: this.__unsubscribe.bind(this, callback),
26       };
27     },
28   },
30   /**
31    * Unsubscribes a previously registered callback.
32    *
33    * @param {!Function} callback
34    */
35   __unsubscribe: {
36     value: function __unsubscribe(callback) {
37       var index = this.__listeners.indexOf(callback);
38       if (index < 0) {
39         console.warn(this, 'attempted unsubscribe of unregistered listener:', callback);
40         return;
41       }
42       this.__listeners.splice(index, 1);
43     },
44   },
46   /**
47    * Notifies subscribed callbacks.
48    */
49   __notify: {
50     value: function __notify(key, value) {
51       if (this.__silent) return;
52       var args = Array.prototype.slice.call(arguments);
53       // Notify listeners on parents first.
54       var parent = Object.getPrototypeOf(this);
55       if (parent && parent.__notify && parent.__listeners) {
56         parent.__notify.apply(parent, args);
57       }
59       this.__listeners.forEach(function(listener) {
60         listener.apply(null, args);
61       }.bind(this));
62     },
63   },
65 });
67 })(window);