X-Git-Url: https://git.donarmstrong.com/dactyl.git?a=blobdiff_plain;f=common%2Fmodules%2Fdom.jsm;h=72d80135751b7b1779436cfdf877c59baf7f985a;hb=247daf849abc85f4cfb10fa358c62c8daf8db95b;hp=6831bd3e83b9a35fc3a56bf0594d9e6b435aea7b;hpb=354a049cce8415487552ce405cce167b7071fe1f;p=dactyl.git diff --git a/common/modules/dom.jsm b/common/modules/dom.jsm index 6831bd3..72d8013 100644 --- a/common/modules/dom.jsm +++ b/common/modules/dom.jsm @@ -1,5 +1,5 @@ // Copyright (c) 2007-2011 by Doug Kearns -// Copyright (c) 2008-2013 Kris Maglione +// Copyright (c) 2008-2014 Kris Maglione // // This work is licensed for reuse under an MIT license. Details are // given in the LICENSE.txt file included with this file. @@ -55,8 +55,6 @@ var DOM = Class("DOM", { if (val == null) ; - else if (typeof val == "xml" && context instanceof Ci.nsIDOMDocument) - this[length++] = DOM.fromXML(val, context, this.nodes); else if (DOM.isJSONXML(val)) { if (context instanceof Ci.nsIDOMDocument) this[length++] = DOM.fromJSON(val, context, this.nodes); @@ -476,7 +474,7 @@ var DOM = Class("DOM", { let charset = doc.characterSet; let converter = services.CharsetConv(charset); - for each (let cs in form.acceptCharset.split(/\s*,\s*|\s+/)) { + for (let cs of form.acceptCharset.split(/\s*,\s*|\s+/)) { let c = services.CharsetConv(cs); if (c) { converter = services.CharsetConv(cs); @@ -627,7 +625,7 @@ var DOM = Class("DOM", { if (callable(v)) v = v.call(this, elem, i); - if (Set.has(hooks, k) && hooks[k].set) + if (hasOwnProperty(hooks, k) && hooks[k].set) hooks[k].set.call(this, elem, v, k); else if (v == null) elem.removeAttributeNS(ns, k); @@ -639,7 +637,7 @@ var DOM = Class("DOM", { if (!this.length) return null; - if (Set.has(hooks, key) && hooks[key].get) + if (hasOwnProperty(hooks, key) && hooks[key].get) return hooks[key].get.call(this, this[0], key); if (!this[0].hasAttributeNS(ns, key)) @@ -1071,7 +1069,7 @@ var DOM = Class("DOM", { keyTable: Class.Memoize(function (prop) this.init()[prop]), key_code: Class.Memoize(function (prop) this.init()[prop]), key_key: Class.Memoize(function (prop) this.init()[prop]), - pseudoKeys: Set(["count", "leader", "nop", "pass"]), + pseudoKeys: RealSet(["count", "leader", "nop", "pass"]), /** * Converts a user-input string of keys into a canonical @@ -1094,7 +1092,7 @@ var DOM = Class("DOM", { * @returns {string} Canonical form. */ canonicalKeys: function canonicalKeys(keys, unknownOk=true) { - return this.parse(keys, unknownOk).map(this.closure.stringify).join(""); + return this.parse(keys, unknownOk).map(this.bound.stringify).join(""); }, iterKeys: function iterKeys(keys) iter(function () { @@ -1141,19 +1139,19 @@ var DOM = Class("DOM", { } else { let [match, modifier, keyname] = evt_str.match(/^<((?:[*12CASM⌘]-)*)(.+?)>$/i) || [false, '', '']; - modifier = Set(modifier.toUpperCase()); + modifier = RealSet(modifier.toUpperCase()); keyname = keyname.toLowerCase(); evt_obj.dactylKeyname = keyname; if (/^u[0-9a-f]+$/.test(keyname)) keyname = String.fromCharCode(parseInt(keyname.substr(1), 16)); if (keyname && (unknownOk || keyname.length == 1 || /mouse$/.test(keyname) || - this.key_code[keyname] || Set.has(this.pseudoKeys, keyname))) { - evt_obj.globKey ="*" in modifier; - evt_obj.ctrlKey ="C" in modifier; - evt_obj.altKey ="A" in modifier; - evt_obj.shiftKey ="S" in modifier; - evt_obj.metaKey ="M" in modifier || "⌘" in modifier; + this.key_code[keyname] || this.pseudoKeys.has(keyname))) { + evt_obj.globKey = modifier.has("*"); + evt_obj.ctrlKey = modifier.has("C"); + evt_obj.altKey = modifier.has("A"); + evt_obj.shiftKey = modifier.has("S"); + evt_obj.metaKey = modifier.has("M") || modifier.has("⌘"); evt_obj.dactylShift = evt_obj.shiftKey; if (keyname.length == 1) { // normal characters @@ -1164,11 +1162,11 @@ var DOM = Class("DOM", { evt_obj.charCode = keyname.charCodeAt(0); evt_obj.keyCode = this.key_code[keyname.toLowerCase()]; } - else if (Set.has(this.pseudoKeys, keyname)) { + else if (this.pseudoKeys.has(keyname)) { evt_obj.dactylString = "<" + this.key_key[keyname] + ">"; } else if (/mouse$/.test(keyname)) { // mouse events - evt_obj.type = (/2-/.test(modifier) ? "dblclick" : "click"); + evt_obj.type = (modifier.has("2") ? "dblclick" : "click"); evt_obj.button = ["leftmouse", "middlemouse", "rightmouse"].indexOf(keyname); delete evt_obj.keyCode; delete evt_obj.charCode; @@ -1354,38 +1352,26 @@ var DOM = Class("DOM", { * @param {Node} target The DOM node to which to dispatch the event. * @param {Event} event The event to dispatch. */ - dispatch: Class.Memoize(function () - config.haveGecko("2b") - ? function dispatch(target, event, extra) { - try { - this.feedingEvent = extra; - - if (target instanceof Ci.nsIDOMElement) - // This causes a crash on Gecko<2.0, it seems. - return (target.ownerDocument || target.document || target).defaultView - .QueryInterface(Ci.nsIInterfaceRequestor).getInterface(Ci.nsIDOMWindowUtils) - .dispatchDOMEventViaPresShell(target, event, true); - else { - target.dispatchEvent(event); - return !event.defaultPrevented; - } - } - catch (e) { - util.reportError(e); - } - finally { - this.feedingEvent = null; - } + dispatch: function dispatch(target, event, extra) { + try { + this.feedingEvent = extra; + + if (target instanceof Ci.nsIDOMElement) + return (target.ownerDocument || target.document || target).defaultView + .QueryInterface(Ci.nsIInterfaceRequestor).getInterface(Ci.nsIDOMWindowUtils) + .dispatchDOMEventViaPresShell(target, event, true); + else { + target.dispatchEvent(event); + return !event.defaultPrevented; } - : function dispatch(target, event, extra) { - try { - this.feedingEvent = extra; - target.dispatchEvent(update(event, extra)); - } - finally { - this.feedingEvent = null; - } - }) + } + catch (e) { + util.reportError(e); + } + finally { + this.feedingEvent = null; + } + } }), createContents: Class.Memoize(() => services.has("dactyl") && services.dactyl.createContents @@ -1410,9 +1396,9 @@ var DOM = Class("DOM", { * The set of input element type attribute values that mark the element as * an editable field. */ - editableInputs: Set(["date", "datetime", "datetime-local", "email", "file", - "month", "number", "password", "range", "search", - "tel", "text", "time", "url", "week"]), + editableInputs: RealSet(["date", "datetime", "datetime-local", "email", "file", + "month", "number", "password", "range", "search", + "tel", "text", "time", "url", "week"]), /** * Converts a given DOM Node, Range, or Selection to a string. If @@ -1494,7 +1480,7 @@ var DOM = Class("DOM", { * @returns {boolean} True when the patterns are all valid. */ validateMatcher: function validateMatcher(list) { - return this.testValues(list, DOM.closure.testMatcher); + return this.testValues(list, DOM.bound.testMatcher); }, testMatcher: function testMatcher(value) { @@ -1522,21 +1508,6 @@ var DOM = Class("DOM", { return str.replace(regexp, m => map[m]); }, - /** - * Converts an E4X XML literal to a DOM node. Any attribute named - * highlight is present, it is transformed into dactyl:highlight, - * and the named highlight groups are guaranteed to be loaded. - * - * @param {Node} node - * @param {Document} doc - * @param {Object} nodes If present, nodes with the "key" attribute are - * stored here, keyed to the value thereof. - * @returns {Node} - */ - fromXML: deprecated("DOM.fromJSON", { get: function fromXML() - prefs.get("javascript.options.xml.chrome") !== false - && require("dom-e4x").fromXML }), - fromJSON: update(function fromJSON(xml, doc, nodes, namespaces) { if (!doc) doc = document; @@ -1552,8 +1523,6 @@ var DOM = Class("DOM", { if (isinstance(args, ["String", "Number", "Boolean", _])) return doc.createTextNode(args); - if (isXML(args)) - return DOM.fromXML(args, doc, nodes); if (isObject(args) && "toDOM" in args) return args.toDOM(doc, namespaces, nodes); if (args instanceof Ci.nsIDOMNode) @@ -1645,7 +1614,7 @@ var DOM = Class("DOM", { toPrettyXML: function toPrettyXML(xml, asXML, indent, namespaces) { const INDENT = indent || " "; - const EMPTY = Set("area base basefont br col frame hr img input isindex link meta param" + const EMPTY = RealSet("area base basefont br col frame hr img input isindex link meta param" .split(" ")); function namespaced(namespaces, namespace, localName) { @@ -1678,11 +1647,6 @@ var DOM = Class("DOM", { return indent + DOM.escapeHTML(String(args), true); - if (isXML(args)) - return indent + - args.toXMLString() - .replace(/^/m, indent); - if (isObject(args) && "toDOM" in args) return indent + services.XMLSerializer() @@ -1754,7 +1718,7 @@ var DOM = Class("DOM", { let res = [indent, "<", name]; for (let [key, val] in Iterator(attr)) { - if (Set.has(skipAttr, key)) + if (hasOwnProperty(skipAttr, key)) continue; let vals = parseNamespace(key); @@ -1770,7 +1734,7 @@ var DOM = Class("DOM", { '="', DOM.escapeHTML(val), '"'); } - if ((vals[0] || namespaces[""]) == String(XHTML) && Set.has(EMPTY, vals[1]) + if ((vals[0] || namespaces[""]) == String(XHTML) && EMPTY.has(vals[1]) || asXML && !args.length) res.push("/>"); else { @@ -1893,7 +1857,7 @@ var DOM = Class("DOM", { Object.keys(DOM.Event.types).forEach(function (event) { let name = event.replace(/-(.)/g, (m, m1) => m1.toUpperCase()); - if (!Set.has(DOM.prototype, name)) + if (!hasOwnProperty(DOM.prototype, name)) DOM.prototype[name] = function _event(arg, extra) { return this[callable(arg) ? "listen" : "dispatch"](event, arg, extra);