diff --git a/content/buffers.js b/content/buffers.js
index b8b320b6..0393f6fa 100644
--- a/content/buffers.js
+++ b/content/buffers.js
@@ -38,6 +38,81 @@ vimperator.Buffer = function () //{{{
var zoomLevels = [ 1, 10, 25, 50, 75, 90, 100,
120, 150, 200, 300, 500, 1000, 2000 ];
+ // TODO: rename
+ function followFrameRelationship(relationship, parsedFrame)
+ {
+ var regexps;
+ var relText;
+ var patternText;
+ var revString;
+ switch (relationship)
+ {
+ case "next":
+ regexps = vimperator.options["nextpattern"].split(",");
+ revString = "previous";
+ break;
+ case "previous":
+ // TODO: accept prev\%[ious]
+ regexps = vimperator.options["previouspattern"].split(",");
+ revString = "next";
+ break;
+ default:
+ vimperator.echoerr("Bad document relationship: " + relationship);
+ }
+
+ relText = new RegExp(relationship, "i");
+ revText = new RegExp(revString, "i");
+ var elems = parsedFrame.document.getElementsByTagName("link");
+ // links have higher priority than normal hrefs
+ for (var i = 0; i < elems.length; i++)
+ {
+ if (relText.test(elems[i].rel) || revText.test(elems[i].rev))
+ {
+ vimperator.open(elems[i].href);
+ return true;
+ }
+ }
+
+ // no links? ok, look for hrefs
+ elems = parsedFrame.document.getElementsByTagName("a");
+ for (var i = 0; i < elems.length; i++)
+ {
+ if (relText.test(elems[i].rel) || revText.test(elems[i].rev))
+ {
+ vimperator.buffer.followLink(elems[i], vimperator.CURRENT_TAB);
+ return true;
+ }
+ }
+
+ patternText = new RegExp(regexps[pattern], "i");
+ for (var pattern = 0; pattern < regexps.length; pattern++)
+ {
+ patternText = new RegExp(regexps[pattern], "i");
+ for (var i = 0; i < elems.length; i++)
+ {
+ if (patternText.test(elems[i].textContent))
+ {
+ vimperator.buffer.followLink(elems[i], vimperator.CURRENT_TAB);
+ return true;
+ }
+ else
+ {
+ // images with alt text being href
+ var children = elems[i].childNodes;
+ for (var j = 0; j < children.length; j++)
+ {
+ if (patternText.test(children[j].alt))
+ {
+ vimperator.buffer.followLink(elems[i], vimperator.CURRENT_TAB);
+ return true;
+ }
+ }
+ }
+ }
+ }
+ return false;
+ }
+
function setZoom(value, fullZoom)
{
if (value < 1 || value > 2000)
@@ -785,63 +860,24 @@ vimperator.Buffer = function () //{{{
followDocumentRelationship: function (relationship)
{
- var regexps;
- var relText;
- var patternText;
- switch (relationship)
- {
- case "next":
- regexps = vimperator.options["nextpattern"].split(",");
- break;
- case "previous":
- // TODO: accept prev\%[ious]
- regexps = vimperator.options["previouspattern"].split(",");
- break;
- default:
- vimperator.echoerr("Bad document relationship: " + relationship);
- }
+ var retVal;
- relText = new RegExp(relationship, "i");
- var elems = window.content.document.getElementsByTagName("link");
- // links have higher priority than normal hrefs
- for (var i = 0; i < elems.length; i++)
+ if (window.content.frames.length != 0)
{
- if (relText.test(elems[i].rel))
+ for (var i = 0; i < window.content.frames.length; i++)
{
- vimperator.open(elems[i].href);
- return;
+ retVal = followFrameRelationship(relationship, window.content.frames[i]);
+ if (retVal)
+ break;
}
}
-
- // no links? ok, look for hrefs
- elems = window.content.document.getElementsByTagName("a");
- for (var pattern = 0; pattern < regexps.length; pattern++)
+ else
{
- patternText = new RegExp(regexps[pattern], "i");
- for (var i = 0; i < elems.length; i++)
- {
- if (patternText.test(elems[i].text) || relText.test(elems[i].rel))
- {
- vimperator.buffer.followLink(elems[i], vimperator.CURRENT_TAB);
- return;
- }
- else
- {
- // images with alt text being href
- var children = elems[i].childNodes;
- for (var j = 0; j < children.length; j++)
- {
- if (patternText.test(children[j].alt))
- {
- vimperator.buffer.followLink(elems[i], vimperator.CURRENT_TAB);
- return;
- }
- }
-
- }
- }
+ retVal = followFrameRelationship(relationship, window.content);
}
- vimperator.beep();
+
+ if (!retVal)
+ vimperator.beep();
}
};
//}}}