1
0
mirror of https://github.com/gryf/pentadactyl-pm.git synced 2025-12-20 08:27:59 +01:00

Add util.makeXPath for constructing XPath expressions.

--HG--
extra : transplant_source : G%A7_%1B%9B%7BN%9C%FF%14%A9g%BA%04%99%B3%8B%23%ED%F2
This commit is contained in:
Doug Kearns
2009-09-25 15:57:20 +10:00
parent 378fe9de1d
commit 4daa9ace53
3 changed files with 24 additions and 20 deletions

View File

@@ -336,24 +336,16 @@ function Buffer() //{{{
buffer.focusElement(buffer.lastInputField);
else
{
let elements = [];
let matches = buffer.evaluateXPath(
"//input[not(@type) or @type='text' or @type='password' or @type='file'] | //textarea[not(@disabled) and not(@readonly)] |" +
"//xhtml:input[not(@type) or @type='text' or @type='password' or @type='file'] | //xhtml:textarea[not(@disabled) and not(@readonly)]"
);
let xpath = util.makeXPath(["input[not(@type) or @type='text' or @type='password' or @type='file']",
"textarea[not(@disabled) and not(@readonly)]"]);
for (let match in matches)
{
let elements = [m for (m in buffer.evaluateXPath(xpath))].filter(function (match) {
let computedStyle = util.computedStyle(match);
if (computedStyle.visibility != "hidden" && computedStyle.display != "none")
elements.push(match);
}
return computedStyle.visibility != "hidden" && computedStyle.display != "none";
});
if (elements.length > 0)
{
count = util.Math.constrain(count, 1, elements.length);
buffer.focusElement(elements[count - 1]);
}
buffer.focusElement(elements[util.Math.constrain(count, 1, elements.length) - 1]);
else
liberator.beep();
}

View File

@@ -63,14 +63,14 @@ function Hints() //{{{
const Mode = new Struct("prompt", "action", "tags");
Mode.defaultValue("tags", function () function () options.hinttags);
function extended() options.extendedhinttags;
function images() "//img | //xhtml:img";
function images() util.makeXPath(["img"]);
const hintModes = {
";": Mode("Focus hint", function (elem) buffer.focusElement(elem), extended),
"?": Mode("Show information for hint", function (elem) buffer.showElementInfo(elem), extended),
s: Mode("Save hint", function (elem) buffer.saveLink(elem, true)),
a: Mode("Save hint with prompt", function (elem) buffer.saveLink(elem, false)),
f: Mode("Focus frame", function (elem) elem.ownerDocument.defaultView.focus(), function () "//body | //xhtml:body"),
f: Mode("Focus frame", function (elem) elem.ownerDocument.defaultView.focus(), function () util.makeXPath(["body"])),
o: Mode("Follow hint", function (elem) buffer.followLink(elem, liberator.CURRENT_TAB)),
t: Mode("Follow hint in a new tab", function (elem) buffer.followLink(elem, liberator.NEW_TAB)),
b: Mode("Follow hint in a background tab", function (elem) buffer.followLink(elem, liberator.NEW_BACKGROUND_TAB)),
@@ -786,10 +786,8 @@ function Hints() //{{{
/////////////////////////////////////////////////////////////////////////////{{{
const DEFAULT_HINTTAGS =
util.Array(["input[not(@type='hidden')]", "a", "area", "iframe", "textarea", "button", "select"])
.map(function (spec) [spec, "xhtml:" + spec]).flatten()
.concat("*[@onclick or @onmouseover or @onmousedown or @onmouseup or @oncommand or @role='link']")
.map(function (node) "//" + node).join(" | ");
util.makeXPath(["input[not(@type='hidden')]", "a", "area", "iframe", "textarea", "button", "select"])
+ " | //*[@onclick or @onmouseover or @onmousedown or @onmouseup or @oncommand or @role='link']";
function checkXPath(val)
{

View File

@@ -178,6 +178,20 @@ const util = { //{{{
return dest;
},
/**
* Returns an XPath union expression constructed from the specified node
* tests. An expression is built with node tests for both the null and
* XHTML namespaces. See {@link Buffer#evaluateXPath}.
*
* @param nodes {Array(string)}
* @returns {string}
*/
makeXPath: function makeXPath(nodes)
{
return util.Array(nodes).map(function (node) [node, "xhtml:" + node]).flatten()
.map(function (node) "//" + node).join(" | ");
},
/**
* Memoize the lookup of a property in an object.
*