antimony

drive firefox from node.js
git clone https://wehaveforgeathome.hates.computer/antimony.git
Log | Files | Refs | Submodules | LICENSE

commit a7eb583761c9c52b8524fe2625c74c474000450d
parent ecd909c2250d12de785c42cf800fbcadd8744a62
Author: Ryan Wolf <rwolf@borderstylo.com>
Date:   Wed, 15 Dec 2010 16:05:33 -0800

better build, better windex

Diffstat:
MMakefile | 4++--
Daddon/chrome/modules/common.js | 34----------------------------------
Daddon/chrome/modules/windex.js | 868-------------------------------------------------------------------------------
3 files changed, 2 insertions(+), 904 deletions(-)

diff --git a/Makefile b/Makefile @@ -4,8 +4,8 @@ package : clean build : clean cp -R addon/* build/ && \ - cp vendor/windex/windex.js addon/chrome/modules/ && \ - cp vendor/commonjs-ffext/common.js addon/chrome/modules/ + cp vendor/windex/windex.js build/chrome/modules/ && \ + cp vendor/commonjs-ffext/common.js build/chrome/modules/ clean : rm -fr antimony.xpi build/* diff --git a/addon/chrome/modules/common.js b/addon/chrome/modules/common.js @@ -1,34 +0,0 @@ -var EXPORTED_SYMBOLS = ['require']; - -var mods = {}; - -var require = function (mod) { - if (mods[mod]) { - return mods[mod].exports; - } - - var scope = { - require: require - }; - - var found = false; - for (var i = 0 ; i < require.path.length ; i++) { - var path = require.path[i]; - try { - scope.exports = {}; - Components.classes["@mozilla.org/moz/jssubscript-loader;1"]. - getService(Components.interfaces.mozIJSSubScriptLoader). - loadSubScript(path + "/" + mod + ".js", scope); - found = true; - break; - } catch (e if e == "Error opening input stream (invalid filename?)") {} - } - if (!found) { - Components.utils.reportError("CommonJS module not found: " + mod); - } - - mods[mod] = scope; - return mods[mod].exports; -}; - -require.path = []; diff --git a/addon/chrome/modules/windex.js b/addon/chrome/modules/windex.js @@ -1,868 +0,0 @@ -var Cc = Components.classes; -var Ci = Components.interfaces; - -var isNode = function (object) { - if (object instanceof Ci.nsIDOMText) return false; - return (object instanceof Ci.nsIDOMNode) || - (object instanceof Ci.nsIDOMHTMLDocument) || - (object instanceof Ci.nsIDOMWindow); -} - -var Windex = exports = function(selector, context) { - // no sense in wrapping the nodes twice - if (selector instanceof WindexNodes) { return selector; } - - if (isNode(selector)) { return new WindexNodes([selector]); } - - if (typeof selector != "string") { - throw new Error("$(" + selector + ", " + context + "): selector is not a Node or a String"); - } - - // TODO: return documents, windows - if (selector == "body") return Windex(defaultContext()); - if (selector == "!document") { - var document = defaultContext().ownerDocument; - return Windex(document); - } - if (selector == "!window") { - return Windex(defaultContext()); - var document = defaultContext().ownerDocument; - var window = document.defaultView; - return Windex(window); - } - - if (!context) { - return Windex(selector, defaultContext()); - } - - // if passed in a list of nodes, meant the first one - if (context instanceof WindexNodes) { context = context[0]; } - if (!isNode(context)) { - throw new Error("$(" + selector + ", " + context + "): context is not a Node or a String"); - } - context = new XPCNativeWrapper(context); - - return new WindexNodes([context], selector, context).find(selector); -}; - -Windex.prototype.defaultContext = null; - -// See: http://api.jquery.com/jQuery.extend/ -Windex.extend = function () { - if (arguments.length == 1) { return this._extendWindex(arguments[0]); }; - return this._extendDestructiveMerge.apply(this, arguments); -} - -Windex._extendWindex = function (methods) { - for (name in methods) { this[name] = methods[name]; } -}; - -Windex._extendDestructiveMerge = function () { - var target = (arguments[0]) ? arguments[0] : {}; - for (var i = 1; i < arguments.length; i++) { - var object = arguments[i]; - for (key in object) { - target[key] = object[key]; - } - } - return target; -}; - -var is_array = exports.is_array = function (obj) { - return Object.prototype.toString.apply(obj) === "[object Array]"; -}; - -Windex.each = function (a, f) { - if (is_array(a) || a instanceof WindexNodes) { - a.forEach(function (e, i) { f(i, e); }); - return; - } - for (key in a) { f(key, a[key]); } -}; -Windex.map = function (a, f) { return a.map(f); }; - -Windex.inArray = function (e, a) { - return a.some(function (aE) { return e == aE; }); -}; - -// See: http://github.com/jeresig/sizzle/blob/master/sizzle.js -Windex.contains = function (ancestor, descendant) { - return !!(ancestor.compareDocumentPosition(descendant) & 16); -}; - -var WindexNodes = function (nodes, selector, context) { - for (i = 0; i < nodes.length; i++) { - // See: https://developer.mozilla.org/en/XPCNativeWrapper - this.push(new XPCNativeWrapper(nodes[i])); - } - this._selector = selector; - this._context = context; -}; - -WindexNodes.prototype = new Array(); - -// MozRepl freaks out when trying to print WindexNodes -WindexNodes.prototype.toString = function () { return "[object WindexNodes]"; }; - -WindexNodes.prototype.find = function (selector) { - var context = this[0]; - try { - // See: https://developer.mozilla.org/En/DOM/Element.querySelectorAll - var matches = context.querySelectorAll(selector); - } catch (e if (e.name == "NS_ERROR_DOM_SYNTAX_ERR")) { - throw new Error("invalid selector: '" + selector + "'"); - } - - // turn the matches NodeList into an array - var nodes = []; - for (i = 0; i < matches.length; i++) { nodes.push(matches[i]); } - - return new WindexNodes(nodes, selector, context); -}; - -WindexNodes.prototype.toArray = function () { return [].concat(this); } - -WindexNodes.prototype.each = function (f) { return Windex.each(this, f); }; - -WindexNodes.prototype.filter = function (f) { - return Array.prototype.filter.apply(this,[function (n,i) { return f(i,n); }]); -}; - -// See: http://api.jquery.com/children/ -WindexNodes.prototype.children = function (selector) { - var children = []; - if (selector) { return this._childrenMatching(selector); } - this.forEach(function (node) { - var nodeList = node.childNodes; - for (i = 0; i < nodeList.length; i++) { - var node = nodeList[i]; - if (isNode(node)) { - children.push(node); - } - } - }); - return new WindexNodes(children); -}; - -WindexNodes.prototype._childrenMatching = function (selector) { - var children = []; - this.forEach(function (node) { - var matches = new WindexNodes([node], selector, node).find(selector); - matches.forEach(function (windexNode) { children.push(windexNode); }); - }); - return new WindexNodes(children, selector, this[0]); -}; - -// See: http://api.jquery.com/addClass/ -WindexNodes.prototype.addClass = function (className) { - var classesToAdd = className.split(" "); - this.forEach(function (node) { - var classes = (node.className) ? node.className.split(" ") : []; - classesToAdd.forEach(function (classToAdd) { - if (!classes.some(function (class) { return classToAdd == class; })) { - classes.push(classToAdd); - } - }); - node.className = classes.join(" "); - }); - return this; -}; - -// See: http://api.jquery.com/removeClass/ -WindexNodes.prototype.removeClass = function (className) { - if (!className) { return this._removeAllClasses(); } - - var classesToRemove = className.split(" "); - this.forEach(function (node) { - var classes = (node.className) ? node.className.split(" ") : []; - classes = classes.filter(function (class) { - return classesToRemove.every(function (classToRemove) { - return class != classToRemove; - }); - }); - node.className = classes.join(" "); - }); - return this; -}; - -WindexNodes.prototype._removeAllClasses = function () { - this.forEach(function (node) { node.className = ''; }); -}; - -// See: http://api.jquery.com/toggleClass/ -WindexNodes.prototype.toggleClass = function (className, add) { - if (add === true) { return this.addClass(className); } - if (add === false) { return this.removeClass(className); } - var classesToToggle = className.split(" "); - this.forEach(function (node) { - var classes = node.className.split(" "); - classesToToggle.forEach(function (classToToggle) { - // if node has the class, remove it - if (classes.some(function (class) { return class == classToToggle; })) { - classes = classes. - filter(function (class) {return class != classToToggle; }); - } - // otherwise, add it - else { - classes.push(classToToggle); - } - }); - node.className = classes.join(" "); - }); - return this; -}; - -// See: http://api.jquery.com/hasClass/ -WindexNodes.prototype.hasClass = function (className) { - var classesToFind = className.split(" "); - return this.some(function (node) { - var classes = node.className.split(" "); - return classesToFind.every(function (class) { - return Windex.inArray(class, classes); - }); - }); -}; - -// See: http://api.jquery.com/size/ -WindexNodes.prototype.size = function () { return this.length; }; - -// See: http://api.jquery.com/empty/ -WindexNodes.prototype.empty = function () { - this.forEach(function (node) { - if (!node.hasChildNodes()) { return; } - while (node.childNodes.length >= 1){ - node.removeChild(node.firstChild); - } - }); - return this; -}; - -// See: http://api.jquery.com/remove/ -// TODO: optional selector -WindexNodes.prototype.remove = function () { - this.forEach(function (node) { - // in case a node is already removed - if (!node.parentNode) { return; } - node.parentNode.removeChild(node); - }); - return this; -}; - -// See: http://api.jquery.com/append/ -WindexNodes.prototype.append = function (arg) { - if (typeof arg == "string" || typeof arg == "number") { - if (this[0].ownerDocument instanceof Ci.nsIImageDocument) { - return this._appendHTMLtoImageDocument(arg); - } - return this._appendHTML(arg); - } - if (isNode(arg)) { return this._appendNode(arg); } - if (arg instanceof WindexNodes) { return this._appendWindexNodes(arg); } - throw new Error("'" + arg + "' is not a String, Node, or WindexNodes"); -}; - -WindexNodes.prototype._appendHTML = function (html) { - this.forEach(function (node) { - var holder = node.ownerDocument.createElement("div"); - holder.innerHTML = html; - while (holder.firstChild) { - node.appendChild(holder.firstChild); - } - }); - return this; -}; - -// See: https://bugzilla.mozilla.org/show_bug.cgi?id=550612 -// See: http://userscripts.org/guides/9 -WindexNodes.prototype._appendHTMLtoImageDocument = function (html) { - this.forEach(function (node) { - var document = node.ownerDocument; - var docType = document.implementation.createDocumentType( - "html", - "-//W3C//DTD HTML 4.01 Transitional//EN", - "http://www.w3.org/TR/html4/loose.dtd" - ); - var holderDoc = document.implementation.createDocument('', '', docType); - var holder = holderDoc.createElement('html'); - holder.innerHTML = html; - while (holder.firstChild) { - node.appendChild(holder.firstChild); - } - }); - return this; -}; -// See: https://developer.mozilla.org/En/DOM/Node.cloneNode -WindexNodes.prototype._appendNode = function (nodeToAppend) { - this.forEach(function (node) { - node.appendChild(nodeToAppend.cloneNode(true)); - }); - return this; -}; - -// See: https://developer.mozilla.org/En/DOM/Node.cloneNode -WindexNodes.prototype._appendWindexNodes = function (windexNodes) { - this.forEach(function (node) { - windexNodes.forEach(function (nodeToAppend) { - node.appendChild(nodeToAppend.cloneNode(true)); - }); - }); - return this; -}; - -// See: https://developer.mozilla.org/En/DOM/Node.cloneNode -WindexNodes.prototype.clone = function () { - var node = this[0]; - return node.cloneNode(true); -}; - -// See: http://api.jquery.com/before/ -WindexNodes.prototype.before = function (arg) { - if (typeof arg == "string" || typeof arg == "number") { - return this._beforeHTML(arg); - } - if (isNode(arg)) { return this._beforeNode(arg); } - if (arg instanceof WindexNodes) { return this._beforeWindexNodes(arg); } - throw new Error("'" + arg + "' is not a String, Node, or WindexNodes"); -}; - -// See: https://bugzilla.mozilla.org/show_bug.cgi?id=550612 -// See: https://developer.mozilla.org/en/Code_snippets/HTML_to_DOM -WindexNodes.prototype._beforeHTML = function (html) { - this.forEach(function (node) { - if (node.ownerDocument instanceof Components.interfaces.nsIImageDocument) { - var fragment = Components.classes["@mozilla.org/feed-unescapehtml;1"]. - getService(Components.interfaces.nsIScriptableUnescapeHTML). - parseFragment(html, false, null, node); - node.parentNode.insertBefore(fragment, node); - } else { - node.innerHTML = node.innerHTML + html; - } - }); - return this; -}; - -// See: https://developer.mozilla.org/En/DOM/Node.cloneNode -WindexNodes.prototype._beforeNode = function (nodeToAppend) { - this.forEach(function (node) { - node.parentNode.insertBefore(nodeToAppend.cloneNode(true), node); - }); - return this; -}; - -// See: https://developer.mozilla.org/En/DOM/Node.cloneNode -WindexNodes.prototype._beforeWindexNodes = function (windexNodes) { - this.forEach(function (node) { - windexNodes.forEach(function (nodeToAppend) { - node.parentNode.insertBefore(nodeToAppend.cloneNode(true), node); - }); - }); - return this; -}; - -// See: http://api.jquery.com/html/ -WindexNodes.prototype.html = function (replacement) { - if (!replacement) { return this._htmlGet(); }; - return this._htmlSet(replacement); -}; - -// FIXME: innerHTML does work on ImageDocuments in FF < 4 -// See: https://bugzilla.mozilla.org/show_bug.cgi?id=550612 -WindexNodes.prototype._htmlGet = function () { - var html = ""; - this.forEach(function (node) { - if (node.ownerDocument instanceof Components.interfaces.nsIImageDocument) { - throw new Error("html() does not work on ImageDocuments. See: https://bugzilla.mozilla.org/show_bug.cgi?id=550612"); - } - html += node.innerHTML; - }); - return html; -}; - -WindexNodes.prototype._htmlSet = function (replacement) { - this.forEach(function (node) { Windex(node).empty().append(replacement); }); - return this; -}; - -// See: http://api.jquery.com/replaceWith/ -// See: http://james.padolsey.com/javascript/asynchronous-innerhtml/ -// TODO: can also take a function -// TODO: can take an element or a windexNodes -WindexNodes.prototype.replaceWith = function (html) { - this.forEach(function (node) { - if (!node.parentNode) { return; }; - var document = node.ownerDocument; - var div = document.createElement("div"); - Windex(div).html(html); - var fragment = document.createDocumentFragment(); - while (div.firstChild) { fragment.appendChild(div.firstChild); } - node.parentNode.replaceChild(fragment, node); - }); - return this; -}; - -// See: http://api.jquery.com/css/ -WindexNodes.prototype.css = function (name, value) { - if (value === undefined && typeof name == "string") { - return this._cssGet(name); - }; - if (typeof name != "object") { return this._cssSet(name, value); }; - - for (var key in name) { this._cssSet(key, name[key]); }; - return this; -}; - -// See: https://developer.mozilla.org/en/DOM/window.getComputedStyle -WindexNodes.prototype._cssGet = function (name) { - var node = this[0]; - var window = node.ownerDocument.defaultView; - var computedStyle = window.getComputedStyle(node, null); - return computedStyle.getPropertyValue(name); -}; - -WindexNodes.prototype._cssSet = function (name, value) { - var dims = ["height", "width", "top", "left", "right", "bottom"]; - if (typeof(value) == "number" && - dims.some(function (dim) { return name == dim; })) { - value = parseInt(value) + "px"; - } - var translations = { - "z-index": "zIndex", - "overflow-y": "overflowY", - "overflow-x": "overflowX" - }; - if (translations[name]) { name = translations[name]; } - this.forEach(function (node) { node.style[name] = value; }); - return this; -}; - -// See: http://api.jquery.com/height/ -// See: http://api.jquery.com/width/ -// TODO: convert everything to px instead of pretending em == pt == px -["height", "width"].forEach(function (dim) { - var capitalized = dim.replace( - /^(.)(.+)/ , - function(m, p1, p2) { return p1.toUpperCase() + p2; } - ); - - WindexNodes.prototype[dim] = function (replacement) { - if (!replacement) { return this["_" + dim + "Get"](); }; - return this["_" + dim + "Set"](replacement); - }; - - WindexNodes.prototype["_" + dim + "Get"] = function () { - var node = this[0]; - if (node instanceof Components.interfaces.nsIDOMHTMLDocument) { - return this["_" + dim + "GetForDocument"](); - } - if (node instanceof Components.interfaces.nsIDOMWindow) { - return this["_" + dim + "GetForWindow"](); - } - return this["_" + dim + "GetForNode"](); - }; - - WindexNodes.prototype["_" + dim + "GetForNode"] = function () { - var node = this[0]; - var value = parseInt(Windex(node)._cssGet(dim)); - return (value) ? value : 0; - }; - - WindexNodes.prototype["_" + dim + "GetForDocument"] = function () { - var node = this[0]; - return node.documentElement["client" + capitalized]; - }; - - WindexNodes.prototype["_" + dim + "GetForWindow"] = function () { - var node = this[0]; - return node["inner" + capitalized]; - }; - - WindexNodes.prototype["_" + dim + "Set"] = function (replacement) { - this.forEach(function (node) { - if (node instanceof Components.interfaces.nsIDOMHTMLDocument) { - return setters[dim + "ForDocument"](node, replacement); - } - if (node instanceof Components.interfaces.nsIDOMWindow) { - return setters[dim + "ForWindow"](node, replacement); - } - setters[dim + "ForNode"](node, replacement); - }); - return this; - }; - - // work on a node at a time - var setters = {}; - setters[dim + "ForNode"] = function (node, replacement) { - return Windex(node)._cssSet(dim, (replacement) ? replacement + "px" : 0); - }; - - setters[dim + "ForDocument"] = function (node, replacement) { - return node[dim] = replacement; - }; - - setters[dim + "ForWindow"] = function (node, replacement) { - return node["inner" + capitalized] = replacement; - }; -}); - -// See: http://api.jquery.com/outerWidth/ -WindexNodes.prototype.outerWidth = function (includeMargin) { - var dims = { - padding: 0, - margin: 0, - border: 0 - }; - var node = this; - for (key in dims) { - ["left", "right"].forEach(function (side) { - if (includeMargin) { - var attribute = parseInt(node.css(key + "-" + side + "-width")); - dims[key] += (isNaN(attribute)) ? 0 : attribute; - } - }); - } - var val = this[0].offsetWidth; - if (includeMargin) { return val + dims.margin; } - return val - dims.padding - dims.border; -}; - -// See: http://api.jquery.com/outerHeight/ -WindexNodes.prototype.outerHeight = function (includeMargin) { - var node = this; - var dims = { - padding: 0, - margin: 0, - border: 0 - }; - for (key in dims) { - ["top", "bottom"].forEach(function (side) { - if (includeMargin) { - var attribute = parseInt(node.css(key + "-" + side + "-height")); - dims[key] += (isNaN(attribute)) ? 0 : attribute; - } - }); - } - var val = this[0].offsetHeight; - if (includeMargin) { return val + dims.margin; } - return val - dims.padding - dims.border; -}; - -// See: http://api.jquery.com/trigger/ -// See: https://developer.mozilla.org/en/Code_snippets/Interaction_between_privileged_and_non-privileged_pages -WindexNodes.prototype.trigger = function (name) { - this.forEach(function (node) { - if (typeof node[name] == "function") { - node[name](); - } else { - var event = node.ownerDocument.createEvent("Events"); - event.initEvent(name, true, false); - node.dispatchEvent(event); - } - }); - return this; -}; - -WindexNodes.prototype.triggerHandler = function (name) { - this.trigger(name); - return this; -}; - - -var events = []; - -// See: http://api.jquery.com/bind/ -WindexNodes.prototype.bind = function (name, handler) { - this.forEach(function (node) { - var wrapped = function (event) { handler.apply(node, [event]); }; - if (!events[node]) { events[node] = {}; } - if (!events[node][name]) { events[node][name] = []; } - events[node][name].push({ wrapped: wrapped, handler: handler }); - node.addEventListener(name, wrapped, false, false); - }); - return this; -}; - -// See: http://api.jquery.com/unbind -WindexNodes.prototype.unbind = function (name, handler) { - if (!name) { return this._unbindAll(); } - return this._unbindEvent(name, handler); -} - -WindexNodes.prototype._unbindAll = function () { - this.forEach(function (node) { - for (name in events[node]) { - events[node][name].forEach(function (bridge) { - node.removeEventListener(name, bridge.wrapped, false); - }); - } - delete events[node]; - }); - return this; -}; - -WindexNodes.prototype._unbindEvent = function (name, handler) { - this.forEach(function (node) { - if (!events[node][name]) return; - events[node][name] = events[node][name].filter(function (bridge) { - if (bridge.handler !== handler) return true; - node.removeEventListener(name, bridge.wrapped, false); - return false; - }); - }); - return this; -}; - -[ - "click", // See: http://api.jquery.com/click/ - "mousedown", - "mouseup", - "mousemove", - "keypress", // See: http://api.jquery.com/keypress/ - "keydown", - "keyup", - "resize", // See: http://api.jquery.com/resize/ - "submit", // See: http://api.jquery.com/submit/ - "focus", // See: http://api.jquery.com/focus/ - "blur", // See: http://api.jquery.com/blur/ - "command" -].forEach(function (event) { - WindexNodes.prototype[event] = function (handler) { - if (!handler) { return this.trigger(event); } - return this.bind(event, handler); - }; -}); - -// See: http://api.jquery.com/live -WindexNodes.prototype.live = function (name, handler) { - var selector = this._selector; - var context = this._context; - var delegater = function (event) { - Windex(selector, context).forEach(function (node) { - var isTarget = (node == event.originalTarget); - var containsTarget = Windex.contains(node, event.originalTarget); - if (isTarget || containsTarget) { handler.apply(node, [event]); } - }); - }; - context.addEventListener(name, delegater, false); -}; - -// See: http://api.jquery.com/attr/ -WindexNodes.prototype.attr = function (name, value) { - if (typeof name == "object") { return this._attrSetObj(name); } - if (value === undefined) { return this._attrGet(name); } - return this._attrSet(name, value); -}; - -WindexNodes.prototype._attrGet = function (name) { - var node = this[0]; - return node.getAttribute(name); -}; - -WindexNodes.prototype._attrSet = function (name, value) { - if (name == "class") { - this.forEach(function (node) { node.className = value; }); - return this; - } - this.forEach(function (node) { - node.setAttribute(name, value); - if(name === 'checked' && (node.type === 'checkbox' || node.type === 'radio')) { - node.checked = value; - } - }); - return this; -}; - -WindexNodes.prototype._attrSetObj = function (obj) { - for (key in obj) { this._attrSet(key, obj[key]); } - return this; -}; - -// See: http://api.jquery.com/removeAttr/ -WindexNodes.prototype.removeAttr = function (name) { - this.forEach(function (node) { - node.removeAttribute(name); - if(name === 'checked' && node.type === 'checkbox') { - node.checked = false; - } - }); - return this; -}; - -// See: http://api.jquery.com/val/ -WindexNodes.prototype.val = function (replacement) { - if (replacement === undefined) { return this._valGet(); } - return this._valSet(replacement); -}; - -WindexNodes.prototype._valGet = function () { - var node = this[0]; - return node.value; -}; - -WindexNodes.prototype._valSet = function (replacement) { - this.forEach(function (node) { node.value = replacement; }); - return this; -}; - -// See: http://api.jquery.com/hide/ -WindexNodes.prototype.hide = function () { - this.forEach(function (node) { - if (Windex(node).css("display") == "none") return; - Windex(node).attr("olddisplay", Windex(node).css("display")); - Windex(node).css("display", "none"); - }); - return this; -}; - -// See: http://api.jquery.com/show/ -WindexNodes.prototype.show = function () { - this.forEach(function (node) { - node = Windex(node); - if (node.css("display") != "none") return; - var display = (node.attr("olddisplay")) ? node.attr("olddisplay") : "block"; - node.css("display", display).removeAttr("olddisplay"); - }); - return this; -}; - -WindexNodes.prototype.toggle = function () { - this.forEach(function (node) { - node = Windex(node); - if (node.css("display") == "none") { node.show(); } else { node.hide(); } - }); - return this; -}; - -// See: http://api.jquery.com/text/ -WindexNodes.prototype.text = function (replacement) { - if (replacement === undefined) { return this._textGet(); } - return this._textSet(replacement); -}; - -WindexNodes.prototype._textGet = function () { - return this.map(function (node) { return node.textContent; }).join(" "); -}; - -WindexNodes.prototype._textSet = function (replacement) { - this.forEach(function (node) { node.textContent = replacement; }); - return this; -}; - -// See: http://api.jquery.com/position/ -WindexNodes.prototype.position = function () { - var node = this[0]; - return { top: node.offsetTop, left: node.offsetLeft }; -}; - -// See: http://api.jquery.com/scrollTop/ -// See: http://api.jquery.com/scrollLeft/ -[ - "Top", - "Left" -].forEach(function (direction) { - var axis = (direction == "Top") ? "Y" : "X"; - - WindexNodes.prototype["scroll" + direction] = function (replacement) { - if (!replacement) { return this["_scroll" + direction + "Get"](); } - return this["_scroll" + direction + "Set"](replacement); - }; - - WindexNodes.prototype["_scroll" + direction + "Get"] = function () { - var node = this[0]; - if (node instanceof Components.interfaces.nsIDOMHTMLDocument) { - return this["_scroll" + direction + "GetForDocument"](); - } - if (node instanceof Components.interfaces.nsIDOMWindow) { - return this["_scroll" + direction + "GetForWindow"](); - } - return this["_scroll" + direction + "GetForNode"](); - }; - - WindexNodes.prototype["_scroll" + direction + "GetForDocument"] = function() { - var node = this[0]; - return node.defaultView["scroll" + axis]; - }; - - WindexNodes.prototype["_scroll" + direction + "GetForWindow"] = function () { - var node = this[0]; - return node["scroll" + axis]; - }; - - WindexNodes.prototype["_scroll" + direction + "GetForNode"] = function () { - var node = this[0]; - return node["scroll" + direction]; - }; - - var setters = { - document: function (n, r) { n.defaultView["scroll" + axis] = r; }, - window: function (n, r) { n["scroll" + axis] = r; }, - node: function (n, r) { n["scroll" + direction] = r; } - }; - - WindexNodes.prototype["_scroll" + direction + "Set"] = function (replacement){ - this.forEach(function (node) { - if (node instanceof Components.interfaces.nsIDOMHTMLDocument) { - return setters.document(replacement); - } - if (node instanceof Components.interfaces.nsIDOMWindow) { - return setters.window(replacement); - } - setters.node(replacement); - }); - return this; - }; -}); - -WindexNodes.prototype.first = function () { - var node = this[0]; - return new WindexNodes([node], this._selector, this._context); -}; - -WindexNodes.prototype.last = function () { - var node = this[this.length - 1]; - return new WindexNodes([node], this._selector, this._context); -}; - -WindexNodes.prototype.next = function () { - var selector = this._selector; - var context = this._context; - var node = this[0]; - if (!node.nextSibling) { return new WindexNodes([], selector, context); } - node = node.nextSibling; // adjacent text node - if (!node.nextSibling) { return new WindexNodes([], selector, context); } - return new WindexNodes([node.nextSibling], selector, context); -}; - -WindexNodes.prototype.prev = function () { - var selector = this._selector; - var context = this._context; - var node = this[0]; - if (!node.previousSibling) { return new WindexNodes([], selector, context); } - node = node.previousSibling; // adjacent text node - if (!node.previousSibling) { return new WindexNodes([], selector, context); } - return new WindexNodes([node.previousSibling], selector, context); -}; - -Windex.url = { setUrl: function (url) { return new WindexUrl(url); } }; - -var WindexUrl = function (url) { - this._url = { - spec: "", - host: "", - path: "" - }; - try { - var ioService = Components.classes["@mozilla.org/network/io-service;1"]. - getService(Components.interfaces.nsIIOService); - var nsiUri = ioService.newURI(url, null, null); - for (var key in this._url) { - this._url[key] = nsiUri[key]; - } - } catch (e) {} - return this; -}; - -// See: https://developer.mozilla.org/en/nsIURI -// See: https://developer.mozilla.org/en/nsIIOService#newURI.28.29 -WindexUrl.prototype.attr = function (name) { return this._url[name]; }; - -Windex.browser = {};