summaryrefslogtreecommitdiff
path: root/common/content
diff options
context:
space:
mode:
authorDoug Kearns <dougkearns@gmail.com>2009-09-25 15:57:20 +1000
committerDoug Kearns <dougkearns@gmail.com>2009-09-25 15:57:20 +1000
commit4daa9ace532322a0935732572a840ca034f8506d (patch)
treedbc5ccbc8afb5265fec78cd8f1d286fbf13fbca6 /common/content
parent378fe9de1d9d9bf4414267c7573a6fe7633dfa79 (diff)
downloadpentadactyl-4daa9ace532322a0935732572a840ca034f8506d.tar.gz
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
Diffstat (limited to 'common/content')
-rw-r--r--common/content/buffer.js20
-rw-r--r--common/content/hints.js10
-rw-r--r--common/content/util.js14
3 files changed, 24 insertions, 20 deletions
diff --git a/common/content/buffer.js b/common/content/buffer.js
index cbb08849..f16fcb57 100644
--- a/common/content/buffer.js
+++ b/common/content/buffer.js
@@ -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();
}
diff --git a/common/content/hints.js b/common/content/hints.js
index 9646d3f8..26f51a7d 100644
--- a/common/content/hints.js
+++ b/common/content/hints.js
@@ -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)
{
diff --git a/common/content/util.js b/common/content/util.js
index a8e410bc..c0e9ad47 100644
--- a/common/content/util.js
+++ b/common/content/util.js
@@ -179,6 +179,20 @@ const util = { //{{{
},
/**
+ * 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.
*
* @param {object} obj The object to alter.