diff options
author | Doug Kearns <dougkearns@gmail.com> | 2009-09-25 15:57:20 +1000 |
---|---|---|
committer | Doug Kearns <dougkearns@gmail.com> | 2009-09-25 15:57:20 +1000 |
commit | 4daa9ace532322a0935732572a840ca034f8506d (patch) | |
tree | dbc5ccbc8afb5265fec78cd8f1d286fbf13fbca6 /common | |
parent | 378fe9de1d9d9bf4414267c7573a6fe7633dfa79 (diff) | |
download | pentadactyl-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')
-rw-r--r-- | common/content/buffer.js | 20 | ||||
-rw-r--r-- | common/content/hints.js | 10 | ||||
-rw-r--r-- | common/content/util.js | 14 |
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. |