diff --git a/common/content/buffer.js b/common/content/buffer.js
index 739abe88..a0e6e6cc 100644
--- a/common/content/buffer.js
+++ b/common/content/buffer.js
@@ -892,7 +892,7 @@ function Buffer() //{{{
return null;
}
},
- asIterator ? XPathResult.UNORDERED_NODE_ITERATOR_TYPE : XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,
+ asIterator ? XPathResult.ORDERED_NODE_ITERATOR_TYPE : XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,
null
);
@@ -959,100 +959,57 @@ function Buffer() //{{{
elem.dispatchEvent(evt);
},
- followDocumentRelationship: function (relationship)
+ followDocumentRelationship: function (rel)
{
- function followFrameRelationship(relationship, parsedFrame)
- {
- var regexps;
- var relText;
- var patternText;
- var revString;
- switch (relationship)
- {
- case "next":
- regexps = options.get("nextpattern").values;
- revString = "previous";
- break;
- case "previous":
- // TODO: accept prev\%[ious]
- regexps = options.get("previouspattern").values;
- revString = "next";
- break;
- default:
- liberator.echoerr("Bad document relationship: " + relationship);
- }
+ let regexps = options.get(rel + "pattern").values
+ .map(function (re) RegExp(re, "i"));
- relText = new RegExp(relationship, "i");
- revText = new RegExp(revString, "i");
- var elems = parsedFrame.document.getElementsByTagName("link");
- // links have higher priority than normal hrefs
- for (let i = 0; i < elems.length; i++)
+ function followFrame(frame)
+ {
+ function iter(elems) (e for ([i, e] in Iterator(elems)) if (e.rel.toLowerCase() == rel || e.rev.toLowerCase() == rel));
+
+ // s have higher priority than normal hrefs
+ let elems = frame.document.getElementsByTagName("link");
+ for (let elem in iter(elems))
{
- if (relText.test(elems[i].rel) || revText.test(elems[i].rev))
- {
- liberator.open(elems[i].href);
- return true;
- }
+ liberator.open(elem.href);
+ return true;
}
// no links? ok, look for hrefs
- elems = parsedFrame.document.getElementsByTagName("a");
- for (let i = 0; i < elems.length; i++)
+ elems = frame.document.getElementsByTagName("a");
+ for (let elem in iter(elems))
{
- if (relText.test(elems[i].rel) || revText.test(elems[i].rev))
- {
- buffer.followLink(elems[i], liberator.CURRENT_TAB);
- return true;
- }
+ buffer.followLink(elems[i], liberator.CURRENT_TAB);
+ return true;
}
- for (let pattern = 0; pattern < regexps.length; pattern++)
+ let res = buffer.evaluateXPath(options["hinttags"], frame.document);
+ for (let [,regex] in Iterator(regexps))
{
- patternText = new RegExp(regexps[pattern], "i");
- for (let i = 0; i < elems.length; i++)
+ for (let i in util.range(res.snapshotLength, 0, true))
{
- if (patternText.test(elems[i].textContent))
+ let elem = res.snapshotItem(i);
+ if (regex.test(elem.textContent))
{
- buffer.followLink(elems[i], liberator.CURRENT_TAB);
+ buffer.followLink(elem, liberator.CURRENT_TAB);
return true;
}
- else
+ // images with alt text being href
+ if (Array.some(elem.childNodes, function (child) regex.test(child.alt)))
{
- // images with alt text being href
- var children = elems[i].childNodes;
- for (let j = 0; j < children.length; j++)
- {
- if (patternText.test(children[j].alt))
- {
- buffer.followLink(elems[i], liberator.CURRENT_TAB);
- return true;
- }
- }
+ buffer.followLink(elem, liberator.CURRENT_TAB);
+ return true;
}
}
}
return false;
}
- var retVal;
- if (window.content.frames.length != 0)
- {
- retVal = followFrameRelationship(relationship, window.content);
- if (!retVal)
- {
- // only loop through frames if the main content didnt match
- for (let i = 0; i < window.content.frames.length; i++)
- {
- retVal = followFrameRelationship(relationship, window.content.frames[i]);
- if (retVal)
- break;
- }
- }
- }
- else
- {
- retVal = followFrameRelationship(relationship, window.content);
- }
+ let retVal = followFrame(window.content);
+ if (!retVal)
+ // only loop through frames if the main content didnt match
+ retVal = Array.some(window.content.frames, followFrame);
if (!retVal)
liberator.beep();