]> git.donarmstrong.com Git - dactyl.git/blobdiff - common/modules/overlay.jsm
Imported Upstream version 1.1+hg7904
[dactyl.git] / common / modules / overlay.jsm
index f8a4fb5d314bebe9beb2c649bf53a9a63801e454..f52a23ebaaec4f843f9b55321e8c3b9d4acef4a3 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (c) 2009-2012 Kris Maglione <maglione.k@gmail.com>
+// Copyright (c) 2009-2014 Kris Maglione <maglione.k@gmail.com>
 //
 // This work is licensed for reuse under an MIT license. Details are
 // given in the LICENSE.txt file included with this file.
@@ -20,15 +20,15 @@ var setAttr = function setAttr(elem, ns, name, val) {
         elem.removeAttributeNS(ns, name);
     else
         elem.setAttributeNS(ns, name, val);
-}
+};
 
 var Overlay = Class("Overlay", {
     init: function init(window) {
         this.window = window;
     },
 
-    cleanups: Class.Memoize(function () []),
-    objects: Class.Memoize(function () ({})),
+    cleanups: Class.Memoize(() => []),
+    objects: Class.Memoize(() => ({})),
 
     get doc() this.window.document,
 
@@ -42,7 +42,6 @@ var Overlay = Class("Overlay", {
     }
 });
 
-
 var Overlay = Module("Overlay", XPCOM([Ci.nsIObserver, Ci.nsISupportsWeakReference]), {
     init: function init() {
         util.addObserver(this);
@@ -53,7 +52,7 @@ var Overlay = Module("Overlay", XPCOM([Ci.nsIObserver, Ci.nsISupportsWeakReferen
         this.onWindowVisible = [];
     },
 
-    id: Class.Memoize(function () config.addon.id),
+    id: Class.Memoize(() => config.addon.id),
 
     /**
      * Adds an event listener for this session and removes it on
@@ -104,16 +103,20 @@ var Overlay = Module("Overlay", XPCOM([Ci.nsIObserver, Ci.nsISupportsWeakReferen
             target = null;
 
         this.setData(doc, "listeners", listeners.filter(function (args) {
-            if (target == null || args[0].get() == target && args[1] == event && args[2].wrapped == callback && args[3] == capture) {
-                args[0].get().removeEventListener.apply(args[0].get(), args.slice(1));
+            let elem = args[0].get();
+            if (target == null || elem == target && args[1] == event && args[2].wrapped == callback && args[3] == capture) {
+                elem.removeEventListener.apply(elem, args.slice(1));
                 return false;
             }
-            return !args[0].get();
+            return elem;
         }));
     },
 
     cleanup: function cleanup(reason) {
         for (let doc in util.iterDocuments()) {
+            for (let callback in values(this.getData(doc, "cleanup")))
+                util.trapErrors(callback, doc, reason);
+
             for (let elem in values(this.getData(doc, "overlayElements")))
                 if (elem.parentNode)
                     elem.parentNode.removeChild(elem);
@@ -122,9 +125,6 @@ var Overlay = Module("Overlay", XPCOM([Ci.nsIObserver, Ci.nsISupportsWeakReferen
                 if (getAttr(elem, ns, name) === value)
                     setAttr(elem, ns, name, orig);
 
-            for (let callback in values(this.getData(doc, "cleanup")))
-                util.trapErrors(callback, doc, reason);
-
             this.unlisten(doc, true);
 
             delete doc[this.id];
@@ -149,7 +149,7 @@ var Overlay = Module("Overlay", XPCOM([Ci.nsIObserver, Ci.nsISupportsWeakReferen
         "content-document-global-created": function (window, uri) { this.observe(window, "toplevel-window-ready", null); },
         "xul-window-visible": function () {
             if (this.onWindowVisible)
-                this.onWindowVisible.forEach(function (f) f.call(this), this);
+                this.onWindowVisible.forEach(f => { f.call(this); });
             this.onWindowVisible = null;
         }
     },
@@ -186,11 +186,13 @@ var Overlay = Module("Overlay", XPCOM([Ci.nsIObserver, Ci.nsISupportsWeakReferen
 
     setData: function setData(obj, key, val) {
         let data = this.getData(obj);
+        if (val !== undefined)
+            return data[key] = val;
 
-        return data[key] = val;
+        delete data[key];
     },
 
-    overlayWindow: function (url, fn) {
+    overlayWindow: function overlayWindow(url, fn) {
         if (url instanceof Ci.nsIDOMWindow)
             overlay._loadOverlay(url, fn);
         else {
@@ -216,7 +218,7 @@ var Overlay = Module("Overlay", XPCOM([Ci.nsIObserver, Ci.nsISupportsWeakReferen
     _loadOverlays: function _loadOverlays(window) {
         let overlays = this.getData(window, "overlays");
 
-        for each (let obj in overlay.overlays[window.document.documentURI] || []) {
+        for (let obj of overlay.overlays[window.document.documentURI] || []) {
             if (~overlays.indexOf(obj))
                 continue;
             overlays.push(obj);
@@ -234,23 +236,19 @@ var Overlay = Module("Overlay", XPCOM([Ci.nsIObserver, Ci.nsISupportsWeakReferen
                 let iterator = Iterator(obj[key]);
                 if (isArray(obj[key])) {
                     iterator = ([elem[1].id, elem.slice(2), elem[1]]
-                                for each (elem in obj[key]))
+                                for each (elem in obj[key]));
                 }
 
                 for (let [elem, xml, attrs] in iterator) {
                     if (elem = doc.getElementById(String(elem))) {
                         // Urgh. Hack.
                         let namespaces;
-                        if (attrs && !isXML(attrs))
+                        if (attrs)
                             namespaces = iter([k.slice(6), DOM.fromJSON.namespaces[v] || v]
                                               for ([k, v] in Iterator(attrs))
                                               if (/^xmlns(?:$|:)/.test(k))).toObject();
 
-                        let node;
-                        if (isXML(xml))
-                            node = DOM.fromXML(xml, doc, obj.objects);
-                        else
-                            node = DOM.fromJSON(xml, doc, obj.objects, namespaces);
+                        let node = DOM.fromJSON(xml, doc, obj.objects, namespaces);
 
                         if (!(node instanceof Ci.nsIDOMDocumentFragment))
                             savedElems.push(node);
@@ -260,12 +258,6 @@ var Overlay = Module("Overlay", XPCOM([Ci.nsIObserver, Ci.nsISupportsWeakReferen
 
                         fn(elem, node);
 
-                        if (isXML(attrs))
-                            // Evilness and such.
-                            let (oldAttrs = attrs) {
-                                attrs = (attr for each (attr in oldAttrs));
-                            }
-
                         for (let attr in attrs || []) {
                             let [ns, localName] = DOM.parseNamespace(attr);
                             let name = attr;
@@ -282,10 +274,10 @@ var Overlay = Module("Overlay", XPCOM([Ci.nsIObserver, Ci.nsISupportsWeakReferen
             }
         }
 
-        insert("before", function (elem, dom) elem.parentNode.insertBefore(dom, elem));
-        insert("after", function (elem, dom) elem.parentNode.insertBefore(dom, elem.nextSibling));
-        insert("append", function (elem, dom) elem.appendChild(dom));
-        insert("prepend", function (elem, dom) elem.insertBefore(dom, elem.firstChild));
+        insert("before", (elem, dom) => elem.parentNode.insertBefore(dom, elem));
+        insert("after", (elem, dom) => elem.parentNode.insertBefore(dom, elem.nextSibling));
+        insert("append", (elem, dom) => elem.appendChild(dom));
+        insert("prepend", (elem, dom) => elem.insertBefore(dom, elem.firstChild));
         if (obj.ready)
             util.trapErrors("ready", obj, window);
 
@@ -344,18 +336,23 @@ var Overlay = Module("Overlay", XPCOM([Ci.nsIObserver, Ci.nsISupportsWeakReferen
         overrides = update(Object.create(original), overrides);
 
         Object.getOwnPropertyNames(overrides).forEach(function (k) {
-            let orig, desc = Object.getOwnPropertyDescriptor(overrides, k);
+            let desc = Object.getOwnPropertyDescriptor(overrides, k);
+
             if (desc.value instanceof Class.Property)
                 desc = desc.value.init(k) || desc.value;
 
             if (k in object) {
-                for (let obj = object; obj && !orig; obj = Object.getPrototypeOf(obj))
-                    if (orig = Object.getOwnPropertyDescriptor(obj, k))
+                for (let obj = object; obj && !orig; obj = Object.getPrototypeOf(obj)) {
+                    var orig = Object.getOwnPropertyDescriptor(obj, k);
+                    if (orig)
                         Object.defineProperty(original, k, orig);
+                }
 
-                if (!orig)
-                    if (orig = Object.getPropertyDescriptor(object, k))
+                if (!orig) {
+                    orig = Object.getPropertyDescriptor(object, k);
+                    if (orig)
                         Object.defineProperty(original, k, orig);
+                }
             }
 
             // Guard against horrible add-ons that use eval-based monkey
@@ -367,7 +364,7 @@ var Overlay = Module("Overlay", XPCOM([Ci.nsIObserver, Ci.nsISupportsWeakReferen
                 delete desc.writable;
                 desc.get = function get() value;
                 desc.set = function set(val) {
-                    if (!callable(val) || Function.prototype.toString(val).indexOf(sentinel) < 0)
+                    if (!callable(val) || !Function.prototype.toString(val).contains(sentinel))
                         Class.replaceProperty(this, k, val);
                     else {
                         let package_ = util.newURI(Components.stack.caller.filename).host;
@@ -381,7 +378,7 @@ var Overlay = Module("Overlay", XPCOM([Ci.nsIObserver, Ci.nsISupportsWeakReferen
                 Object.defineProperty(object, k, desc);
 
                 if (callable(value)) {
-                    var sentinel = "(function DactylOverlay() {}())"
+                    var sentinel = "(function DactylOverlay() {}())";
                     value.toString = function toString() toString.toString.call(this).replace(/\}?$/, sentinel + "; $&");
                     value.toSource = function toSource() toSource.toSource.call(this).replace(/\}?$/, sentinel + "; $&");
                 }
@@ -399,7 +396,7 @@ var Overlay = Module("Overlay", XPCOM([Ci.nsIObserver, Ci.nsISupportsWeakReferen
         }, this);
 
         return function unwrap() {
-            for each (let k in Object.getOwnPropertyNames(original))
+            for (let k of Object.getOwnPropertyNames(original))
                 if (Object.getOwnPropertyDescriptor(object, k).configurable)
                     Object.defineProperty(object, k, Object.getOwnPropertyDescriptor(original, k));
                 else {
@@ -413,23 +410,26 @@ var Overlay = Module("Overlay", XPCOM([Ci.nsIObserver, Ci.nsISupportsWeakReferen
 
     get activeModules() this.activeWindow && this.activeWindow.dactyl.modules,
 
-    get modules() this.windows.map(function (w) w.dactyl.modules),
+    get modules() [w.dactyl.modules for (w of this.windows)],
 
     /**
      * The most recently active dactyl window.
      */
-    get activeWindow() this.windows[0],
+    get activeWindow() {
+        let win = this._activeWindow && this._activeWindow.get();
+        return this.windows.has(win) && win;
+    },
 
-    set activeWindow(win) this.windows = [win].concat(this.windows.filter(function (w) w != win)),
+    set activeWindow(win) this._activeWindow = util.weakReference(win),
 
     /**
      * A list of extant dactyl windows.
      */
-    windows: Class.Memoize(function () [])
+    windows: Class.Memoize(() => RealSet())
 });
 
 endModule();
 
 } catch(e){ if (!e.stack) e = Error(e); dump(e.fileName+":"+e.lineNumber+": "+e+"\n" + e.stack); }
 
-// vim: set fdm=marker sw=4 ts=4 et ft=javascript:
+// vim: set fdm=marker sw=4 sts=4 ts=8 et ft=javascript: