From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from out.smtp-auth.no-ip.com (out.smtp-auth.no-ip.com [8.23.224.60]) by hurricane.the-brannons.com (Postfix) with ESMTPS id 4969579DCD for ; Wed, 28 Dec 2016 19:24:29 -0800 (PST) X-No-IP: carhart.net@noip-smtp X-Report-Spam-To: abuse@no-ip.com Received: from carhart.net (unknown [99.52.200.227]) (Authenticated sender: carhart.net@noip-smtp) by smtp-auth.no-ip.com (Postfix) with ESMTPA id E1A65448 for ; Wed, 28 Dec 2016 19:24:28 -0800 (PST) Received: from kevc (carhart.net [192.168.1.179]) by carhart.net (8.13.8/8.13.8) with ESMTP id uBT3ORFm004497; Wed, 28 Dec 2016 19:24:27 -0800 To: Edbrowse-dev@lists.the-brannons.com From: Kevin Carhart Reply-to: Kevin Carhart User-Agent: edbrowse/3.5.4.2 Date: Wed, 28 Dec 2016 19:24:27 -0800 Message-ID: <20161128192427.kevin@carhart.net > Mime-Version: 1.0 Content-Type: text/plain Content-Transfer-Encoding: 7bit Subject: [Edbrowse-dev] [PATCH] nextSibling and previousSibling X-BeenThere: edbrowse-dev@lists.the-brannons.com X-Mailman-Version: 2.1.23 Precedence: list List-Id: Edbrowse Development List List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 29 Dec 2016 03:24:29 -0000 >>From f4bdb9b57e30010859586b056cde7a179cd11ae6 Mon Sep 17 00:00:00 2001 From: Kevin Carhart Date: Wed, 28 Dec 2016 19:03:46 -0800 Subject: [PATCH] Implement nextSibling and previousSibling for several node types --- src/startwindow.js | 251 ++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 250 insertions(+), 1 deletion(-) diff --git a/src/startwindow.js b/src/startwindow.js index 2675875..5079cfe 100644 --- a/src/startwindow.js +++ b/src/startwindow.js @@ -602,6 +602,16 @@ get: function() { return document.childNodes[0]; } Object.defineProperty(document, "lastChild", { get: function() { return document.childNodes[document.childNodes.length-1]; } }); +Object.defineProperty(document, "nextSibling", { +get: function() { return get_sibling(this,"next"); } +}); +Object.defineProperty(document, "previousSibling", { +get: function() { return get_sibling(this,"previous"); } +}); + + + + document.hasChildNodes = function() { return (this.childNodes.length > 0); } document.replaceChild = function(newc, oldc) { var lastentry; @@ -728,6 +738,79 @@ nodeToReturn[url] = new URL(u.href); return nodeToReturn; } + +function get_sibling(node,direction) +{ + // For the calling node, you know it has a parent but you don't know about its sibling neighborhood at all + // So I am going to do the following + // graft in a timestamp on the calling node + // Go to the parent + // Iterate over all the children and test them for the current timestamp + // Lock on the one that has it + // Then either subtract one or add one + moment_of_call = Date.now(); + node.setAttribute('timestamp' + moment_of_call,'timestamp' + moment_of_call); + // Go to the parent + var pn = node.parentNode; + for(var i=0; i pn.childNodes.length) + { + // if the calling node was the last child in the first place, you can't take nextSibling + next_sibling = null; + } else { + // otherwise, you can + next_sibling = pn.childNodes[current_node_index + 1]; + } + if (current_node_index - 1 < 0 ) + { + // and if the calling node was the first child in the first place, you can't take previous + previous_sibling = null; + } else { + previous_sibling = pn.childNodes[current_node_index - 1]; + } + } + // clean up, remove the graft + node.setAttribute('timestamp' + moment_of_call,undefined); + switch (direction) + { + case "next": + return next_sibling; + break; + case "previous": + return previous_sibling; + break; + } +} + + + + + + + + + + + + + + + /* The select element in a form is itself an array, so the above functions have * to be on array prototype, except appendchild is to have no side effects, * because select options are maintained by rebuildSelectors(), so appendChild @@ -764,6 +847,13 @@ get: function() { return this[0]; } Object.defineProperty(Array.prototype, "lastChild", { get: function() { return this[this.length-1]; } }); +Object.defineProperty(Array.prototype, "nextSibling", { +get: function() { return get_sibling(this,"next"); } +}); +Object.defineProperty(Array.prototype, "previousSibling", { +get: function() { return get_sibling(this,"previous"); } +}); + Array.prototype.hasChildNodes = document.hasChildNodes; Array.prototype.replaceChild = document.replaceChild; Array.prototype.getAttribute = document.getAttribute; @@ -779,6 +869,13 @@ get: function() { return this.childNodes[0]; } Object.defineProperty(Head.prototype, "lastChild", { get: function() { return this.childNodes[this.childNodes.length-1]; } }); +Object.defineProperty(Head.prototype, "nextSibling", { +get: function() { return get_sibling(this,"next"); } +}); +Object.defineProperty(Head.prototype, "previousSibling", { +get: function() { return get_sibling(this,"previous"); } +}); + Head.prototype.hasChildNodes = document.hasChildNodes; Head.prototype.removeChild = document.removeChild; Head.prototype.replaceChild = document.replaceChild; @@ -796,6 +893,13 @@ get: function() { return this.childNodes[0]; } Object.defineProperty(Body.prototype, "lastChild", { get: function() { return this.childNodes[this.childNodes.length-1]; } }); +Object.defineProperty(Body.prototype, "nextSibling", { +get: function() { return get_sibling(this,"next"); } +}); +Object.defineProperty(Body.prototype, "previousSibling", { +get: function() { return get_sibling(this,"previous"); } +}); + Body.prototype.hasChildNodes = document.hasChildNodes; Body.prototype.removeChild = document.removeChild; Body.prototype.replaceChild = document.replaceChild; @@ -850,6 +954,13 @@ get: function() { return this.childNodes[0]; } Object.defineProperty(Form.prototype, "lastChild", { get: function() { return this.childNodes[this.childNodes.length-1]; } }); +Object.defineProperty(Form.prototype, "nextSibling", { +get: function() { return get_sibling(this,"next"); } +}); +Object.defineProperty(Form.prototype, "previousSibling", { +get: function() { return get_sibling(this,"previous"); } +}); + Form.prototype.hasChildNodes = document.hasChildNodes; Form.prototype.removeChildNative = document.removeChild; Form.prototype.removeChild = function(item) { @@ -872,6 +983,13 @@ get: function() { return this.childNodes[0]; } Object.defineProperty(Element.prototype, "lastChild", { get: function() { return this.childNodes[this.childNodes.length-1]; } }); +Object.defineProperty(Element.prototype, "nextSibling", { +get: function() { return get_sibling(this,"next"); } +}); +Object.defineProperty(Element.prototype, "previousSibling", { +get: function() { return get_sibling(this,"previous"); } +}); + Element.prototype.hasChildNodes = document.hasChildNodes; Element.prototype.removeChild = document.removeChild; Element.prototype.replaceChild = document.replaceChild; @@ -900,6 +1018,13 @@ get: function() { return this.childNodes[0]; } Object.defineProperty(Div.prototype, "lastChild", { get: function() { return this.childNodes[this.childNodes.length-1]; } }); +Object.defineProperty(Div.prototype, "nextSibling", { +get: function() { return get_sibling(this,"next"); } +}); +Object.defineProperty(Div.prototype, "previousSibling", { +get: function() { return get_sibling(this,"previous"); } +}); + Div.prototype.hasChildNodes = document.hasChildNodes; Div.prototype.removeChild = document.removeChild; Div.prototype.replaceChild = document.replaceChild; @@ -917,6 +1042,14 @@ get: function() { return this.childNodes[0]; } Object.defineProperty(HtmlObj.prototype, "lastChild", { get: function() { return this.childNodes[this.childNodes.length-1]; } }); +Object.defineProperty(HtmlObj.prototype, "nextSibling", { +get: function() { return get_sibling(this,"next"); } +}); +Object.defineProperty(HtmlObj.prototype, "previousSibling", { +get: function() { return get_sibling(this,"previous"); } +}); + + HtmlObj.prototype.hasChildNodes = document.hasChildNodes; HtmlObj.prototype.removeChild = document.removeChild; HtmlObj.prototype.replaceChild = document.replaceChild; @@ -929,11 +1062,56 @@ Script.prototype.getAttribute = document.getAttribute; Script.prototype.setAttribute = document.setAttribute; Script.prototype.cloneNode = document.cloneNode; Script.prototype.hasAttribute = document.hasAttribute; +Script.prototype.appendChild = document.appendChild; +Script.prototype.apch$ = document.apch$; +Script.prototype.insertBefore = document.insertBefore; +Script.prototype.hasChildNodes = document.hasChildNodes; +Script.prototype.removeChild = document.removeChild; +Script.prototype.replaceChild = document.replaceChild; + +Object.defineProperty(Script.prototype, "firstChild", { +get: function() { return this.childNodes[0]; } +}); +Object.defineProperty(Script.prototype, "lastChild", { +get: function() { return this.childNodes[this.childNodes.length-1]; } +}); +Object.defineProperty(Script.prototype, "nextSibling", { +get: function() { return get_sibling(this,"next"); } +}); +Object.defineProperty(Script.prototype, "previousSibling", { +get: function() { return get_sibling(this,"previous"); } +}); + +TextNode.prototype.getAttribute = document.getAttribute; +TextNode.prototype.setAttribute = document.setAttribute; +TextNode.prototype.cloneNode = document.cloneNode; +TextNode.prototype.hasAttribute = document.hasAttribute; +TextNode.prototype.appendChild = document.appendChild; +TextNode.prototype.apch$ = document.apch$; +TextNode.prototype.insertBefore = document.insertBefore; +TextNode.prototype.hasChildNodes = document.hasChildNodes; +TextNode.prototype.removeChild = document.removeChild; +TextNode.prototype.replaceChild = document.replaceChild; + +Object.defineProperty(TextNode.prototype, "firstChild", { +get: function() { return this.childNodes[0]; } +}); +Object.defineProperty(TextNode.prototype, "lastChild", { +get: function() { return this.childNodes[this.childNodes.length-1]; } +}); +Object.defineProperty(TextNode.prototype, "nextSibling", { +get: function() { return get_sibling(this,"next"); } +}); +Object.defineProperty(TextNode.prototype, "previousSibling", { +get: function() { return get_sibling(this,"previous"); } +}); P.prototype.appendChild = document.appendChild; P.prototype.apch$ = document.apch$; P.prototype.getAttribute = document.getAttribute; P.prototype.setAttribute = document.setAttribute; +P.prototype.hasAttribute = document.hasAttribute; + P.prototype.insertBefore = document.insertBefore; Object.defineProperty(P.prototype, "firstChild", { get: function() { return this.childNodes[0]; } @@ -941,11 +1119,17 @@ get: function() { return this.childNodes[0]; } Object.defineProperty(P.prototype, "lastChild", { get: function() { return this.childNodes[this.childNodes.length-1]; } }); +Object.defineProperty(P.prototype, "nextSibling", { +get: function() { return get_sibling(this,"next"); } +}); +Object.defineProperty(P.prototype, "previousSibling", { +get: function() { return get_sibling(this,"previous"); } +}); + P.prototype.hasChildNodes = document.hasChildNodes; P.prototype.removeChild = document.removeChild; P.prototype.replaceChild = document.replaceChild; P.prototype.cloneNode = document.cloneNode; -P.prototype.setAttribute = document.hasAttribute; Lister.prototype.appendChild = document.appendChild; Lister.prototype.apch$ = document.apch$; @@ -958,6 +1142,14 @@ get: function() { return this.childNodes[0]; } Object.defineProperty(Lister.prototype, "lastChild", { get: function() { return this.childNodes[this.childNodes.length-1]; } }); +Object.defineProperty(Lister.prototype, "nextSibling", { +get: function() { return get_sibling(this,"next"); } +}); +Object.defineProperty(Lister.prototype, "previousSibling", { +get: function() { return get_sibling(this,"previous"); } +}); + + Lister.prototype.hasChildNodes = document.hasChildNodes; Lister.prototype.removeChild = document.removeChild; Lister.prototype.replaceChild = document.replaceChild; @@ -975,6 +1167,13 @@ get: function() { return this.childNodes[0]; } Object.defineProperty(Listitem.prototype, "lastChild", { get: function() { return this.childNodes[this.childNodes.length-1]; } }); +Object.defineProperty(Listitem.prototype, "nextSibling", { +get: function() { return get_sibling(this,"next"); } +}); +Object.defineProperty(Listitem.prototype, "previousSibling", { +get: function() { return get_sibling(this,"previous"); } +}); + Listitem.prototype.hasChildNodes = document.hasChildNodes; Listitem.prototype.removeChild = document.removeChild; Listitem.prototype.replaceChild = document.replaceChild; @@ -992,6 +1191,13 @@ get: function() { return this.childNodes[0]; } Object.defineProperty(Table.prototype, "lastChild", { get: function() { return this.childNodes[this.childNodes.length-1]; } }); +Object.defineProperty(Table.prototype, "nextSibling", { +get: function() { return get_sibling(this,"next"); } +}); +Object.defineProperty(Table.prototype, "previousSibling", { +get: function() { return get_sibling(this,"previous"); } +}); + Table.prototype.hasChildNodes = document.hasChildNodes; Table.prototype.removeChild = document.removeChild; Table.prototype.replaceChild = document.replaceChild; @@ -1009,6 +1215,13 @@ get: function() { return this.childNodes[0]; } Object.defineProperty(Tbody.prototype, "lastChild", { get: function() { return this.childNodes[this.childNodes.length-1]; } }); +Object.defineProperty(Tbody.prototype, "nextSibling", { +get: function() { return get_sibling(this,"next"); } +}); +Object.defineProperty(Tbody.prototype, "previousSibling", { +get: function() { return get_sibling(this,"previous"); } +}); + Tbody.prototype.hasChildNodes = document.hasChildNodes; Tbody.prototype.removeChild = document.removeChild; Tbody.prototype.replaceChild = document.replaceChild; @@ -1026,6 +1239,13 @@ get: function() { return this.childNodes[0]; } Object.defineProperty(Trow.prototype, "lastChild", { get: function() { return this.childNodes[this.childNodes.length-1]; } }); +Object.defineProperty(Trow.prototype, "nextSibling", { +get: function() { return get_sibling(this,"next"); } +}); +Object.defineProperty(Trow.prototype, "previousSibling", { +get: function() { return get_sibling(this,"previous"); } +}); + Trow.prototype.hasChildNodes = document.hasChildNodes; Trow.prototype.removeChild = document.removeChild; Trow.prototype.replaceChild = document.replaceChild; @@ -1043,6 +1263,14 @@ get: function() { return this.childNodes[0]; } Object.defineProperty(Cell.prototype, "lastChild", { get: function() { return this.childNodes[this.childNodes.length-1]; } }); +Object.defineProperty(Cell.prototype, "nextSibling", { +get: function() { return get_sibling(this,"next"); } +}); +Object.defineProperty(Cell.prototype, "previousSibling", { +get: function() { return get_sibling(this,"previous"); } +}); + + Cell.prototype.hasChildNodes = document.hasChildNodes; Cell.prototype.removeChild = document.removeChild; Cell.prototype.replaceChild = document.replaceChild; @@ -1060,6 +1288,13 @@ get: function() { return this.childNodes[0]; } Object.defineProperty(Span.prototype, "lastChild", { get: function() { return this.childNodes[this.childNodes.length-1]; } }); +Object.defineProperty(Span.prototype, "nextSibling", { +get: function() { return get_sibling(this,"next"); } +}); +Object.defineProperty(Span.prototype, "previousSibling", { +get: function() { return get_sibling(this,"previous"); } +}); + Span.prototype.hasChildNodes = document.hasChildNodes; Span.prototype.removeChild = document.removeChild; Span.prototype.replaceChild = document.replaceChild; @@ -1077,6 +1312,13 @@ get: function() { return this.childNodes[0]; } Object.defineProperty(Image.prototype, "lastChild", { get: function() { return this.childNodes[this.childNodes.length-1]; } }); +Object.defineProperty(Image.prototype, "nextSibling", { +get: function() { return get_sibling(this,"next"); } +}); +Object.defineProperty(Image.prototype, "previousSibling", { +get: function() { return get_sibling(this,"previous"); } +}); + Image.prototype.hasChildNodes = document.hasChildNodes; Image.prototype.removeChild = document.removeChild; Image.prototype.replaceChild = document.replaceChild; @@ -1094,6 +1336,13 @@ get: function() { return this.childNodes[0]; } Object.defineProperty(Frame.prototype, "lastChild", { get: function() { return this.childNodes[this.childNodes.length-1]; } }); +Object.defineProperty(Frame.prototype, "nextSibling", { +get: function() { return get_sibling(this,"next"); } +}); +Object.defineProperty(Frame.prototype, "previousSibling", { +get: function() { return get_sibling(this,"previous"); } +}); + Frame.prototype.hasChildNodes = document.hasChildNodes; Frame.prototype.removeChild = document.removeChild; Frame.prototype.replaceChild = document.replaceChild; -- 1.8.3.2