summaryrefslogtreecommitdiff
path: root/common/content
diff options
context:
space:
mode:
Diffstat (limited to 'common/content')
-rw-r--r--common/content/bookmarks.js80
-rw-r--r--common/content/buffer.js2
-rw-r--r--common/content/dactyl.js3
-rw-r--r--common/content/events.js9
-rw-r--r--common/content/hints.js20
5 files changed, 76 insertions, 38 deletions
diff --git a/common/content/bookmarks.js b/common/content/bookmarks.js
index ac9841c3..1195af43 100644
--- a/common/content/bookmarks.js
+++ b/common/content/bookmarks.js
@@ -32,6 +32,10 @@ const Bookmarks = Module("bookmarks", {
// if starOnly = true it is saved in the unfiledBookmarksFolder, otherwise in the bookmarksMenuFolder
add: function add(starOnly, title, url, keyword, tags, force) {
+ // FIXME
+ if (isObject(starOnly))
+ var { starOnly, title, url, keyword, tags, post, force } = starOnly;
+
try {
let uri = util.createURI(url);
if (!force && bookmarks.isBookmarked(uri.spec))
@@ -54,6 +58,7 @@ const Bookmarks = Module("bookmarks", {
if (!id)
return false;
+ PlacesUtils.setPostDataForBookmark(id, post);
if (keyword)
services.get("bookmarks").setKeywordForBookmark(id, keyword);
}
@@ -65,6 +70,17 @@ const Bookmarks = Module("bookmarks", {
return true;
},
+ addSearchKeyword: function (elem) {
+ let [url, post] = util.parseForm(elem);
+ let options = { "-title": "Search " + elem.ownerDocument.title };
+ if (post != null)
+ options["-post"] = post;
+
+ commandline.open(":",
+ commands.commandToString({ command: "bmark", options: options, arguments: [url] }) + " -keyword ",
+ modes.EX);
+ },
+
toggle: function toggle(url) {
if (!url)
return;
@@ -104,11 +120,16 @@ const Bookmarks = Module("bookmarks", {
.getBookmarkIdsForURI(uri, {})
.filter(bookmarkcache.closure.isRegularBookmark);
}
- bmarks.forEach(services.get("bookmarks").removeItem);
+ bmarks.forEach(function (id) {
+ let bmark = bookmarkcache.bookmarks[id];
+ if (bmark)
+ PlacesUtils.tagging.untagURI(util.newURI(bmark.url), null);
+ services.get("bookmarks").removeItem(id);
+ });
return bmarks.length;
}
catch (e) {
- dactyl.reportError(e);
+ dactyl.reportError(e, true);
return 0;
}
},
@@ -132,7 +153,7 @@ const Bookmarks = Module("bookmarks", {
if (engine.alias != alias)
engine.alias = alias;
- searchEngines.push([engine.alias, engine.description, engine.iconURI && engine.iconURI.spec]);
+ searchEngines.push({ keyword: engine.alias, title: engine.description, icon: engine.iconURI && engine.iconURI.spec });
}
return searchEngines;
@@ -286,10 +307,9 @@ const Bookmarks = Module("bookmarks", {
args.completeFilter = have.pop();
let prefix = filter.substr(0, filter.length - args.completeFilter.length);
- let tags = array.uniq(array.flatten([b.tags for ([k, b] in Iterator(bookmarkcache.bookmarks)) if (b.tags)]));
-
- context.keys = { text: 0, description: 1 };
- return [[prefix + tag, tag] for ([i, tag] in Iterator(tags)) if (have.indexOf(tag) < 0)];
+ context.generate = function () array(b.tags for (b in bookmarkcache) if (b.tags)).flatten().uniq().array;
+ context.keys = { text: function (tag) prefix + tag, description: util.identity };
+ context.filters.push(function (tag) have.indexOf(tag) < 0);
},
type: CommandOption.LIST
};
@@ -310,6 +330,17 @@ const Bookmarks = Module("bookmarks", {
type: CommandOption.STRING
};
+ const post = {
+ names: ["-post", "-p"],
+ description: "Bookmark POST data",
+ completer: function post(context, args) {
+ context.keys.text = "post";
+ context.keys.description = "url";
+ return bookmarks.get(args.join(" "), args["-tags"], null, { keyword: args["-keyword"], post: context.filter });
+ },
+ type: CommandOption.STRING
+ };
+
const keyword = {
names: ["-keyword", "-k"],
description: "Keyword by which this bookmark may be opened (:open {keyword})",
@@ -324,18 +355,23 @@ const Bookmarks = Module("bookmarks", {
commands.add(["bma[rk]"],
"Add a bookmark",
function (args) {
- let url = args.length == 0 ? buffer.URL : args[0];
- let title = args["-title"] || (args.length == 0 ? buffer.title : null);
- let keyword = args["-keyword"] || null;
- let tags = args["-tags"] || [];
-
- if (bookmarks.add(false, title, url, keyword, tags, args.bang)) {
- let extra = (title == url) ? "" : " (" + title + ")";
- dactyl.echomsg({ domains: [util.getHost(url)], message: "Added bookmark: " + url + extra },
+ let opts = {
+ force: args.bang,
+ starOnly: false,
+ keyword: args["-keyword"] || null,
+ post: args["-post"] || null,
+ tags: args["-tags"] || [],
+ title: args["-title"] || (args.length === 0 ? buffer.title : null),
+ url: args.length === 0 ? buffer.URL : args[0]
+ };
+
+ if (bookmarks.add(opts)) {
+ let extra = (opts.title == opts.url) ? "" : " (" + opts.title + ")";
+ dactyl.echomsg({ domains: [util.getHost(opts.url)], message: "Added bookmark: " + opts.url + extra },
1, commandline.FORCE_SINGLELINE);
}
else
- dactyl.echoerr("Exxx: Could not add bookmark " + title.quote(), commandline.FORCE_SINGLELINE);
+ dactyl.echoerr("Exxx: Could not add bookmark " + opts.title.quote(), commandline.FORCE_SINGLELINE);
}, {
argCount: "?",
bang: true,
@@ -350,7 +386,7 @@ const Bookmarks = Module("bookmarks", {
}
completion.bookmark(context, args["-tags"], { keyword: args["-keyword"], title: args["-title"] });
},
- options: [title, tags, keyword]
+ options: [keyword, title, tags, post]
});
commands.add(["bmarks"],
@@ -383,7 +419,7 @@ const Bookmarks = Module("bookmarks", {
commandline.input("This will delete all bookmarks. Would you like to continue? (yes/[no]) ",
function (resp) {
if (resp && resp.match(/^y(es)?$/i)) {
- bookmarkcache.bookmarks.forEach(function (bmark) { services.get("bookmarks").removeItem(bmark.id); });
+ Object.keys(bookmarkcache.bookmarks).forEach(function (id) { services.get("bookmarks").removeItem(id); });
dactyl.echomsg("All bookmarks deleted", 1, commandline.FORCE_SINGLELINE);
}
});
@@ -477,7 +513,7 @@ const Bookmarks = Module("bookmarks", {
if (v != null)
context.filters.push(function (item) item.item[k] != null && this.matchString(v, item.item[k]));
});
- context.completions = bookmarkcache.bookmarks;
+ context.generate = function () values(bookmarkcache.bookmarks);
completion.urls(context, tags);
};
@@ -487,8 +523,8 @@ const Bookmarks = Module("bookmarks", {
let engines = bookmarks.getSearchEngines();
context.title = ["Search Keywords"];
- context.completions = keywords.concat(engines);
- context.keys = { text: 0, description: 1, icon: 2 };
+ context.completions = array(values(keywords)).concat(engines).array;
+ context.keys = { text: "keyword", description: "title", icon: "icon" };
if (!space || noSuggest)
return;
@@ -496,7 +532,7 @@ const Bookmarks = Module("bookmarks", {
context.fork("suggest", keyword.length + space.length, this, "searchEngineSuggest",
keyword, true);
- let item = keywords.filter(function (k) k.keyword == keyword)[0];
+ let item = keywords[keyword];
if (item && item.url.indexOf("%s") > -1)
context.fork("keyword/" + keyword, keyword.length + space.length, null, function (context) {
context.format = history.format;
diff --git a/common/content/buffer.js b/common/content/buffer.js
index 7903bc2c..823d5b97 100644
--- a/common/content/buffer.js
+++ b/common/content/buffer.js
@@ -1651,7 +1651,7 @@ const Buffer = Module("buffer", {
let elements = frames.map(function (win) [m for (m in util.evaluateXPath(xpath, win.document))])
.flatten().filter(function (elem) {
- if (elem.readOnly || elem instanceof HTMLInputElement && !set.has(Events.editableInputs, elem.type))
+ if (elem.readOnly || elem instanceof HTMLInputElement && !set.has(util.editableInputs, elem.type))
return false;
let computedStyle = util.computedStyle(elem);
diff --git a/common/content/dactyl.js b/common/content/dactyl.js
index 8d708b26..65244f87 100644
--- a/common/content/dactyl.js
+++ b/common/content/dactyl.js
@@ -294,7 +294,8 @@ const Dactyl = Module("dactyl", {
if (!context)
context = userContext;
- return Cu.evalInSandbox("with (window) {" + str + "}", context, "1.8", fileName, lineNumber);
+ context[EVAL_STRING] = str;
+ return Cu.evalInSandbox("with (window) { eval(" + EVAL_STRING + ") }", context, "1.8", fileName, lineNumber);
},
/**
diff --git a/common/content/events.js b/common/content/events.js
index a8cc8ac5..0c5c50fb 100644
--- a/common/content/events.js
+++ b/common/content/events.js
@@ -670,7 +670,7 @@ const Events = Module("events", {
// displayed too. --djk
function isInputField() {
let elem = dactyl.focus;
- return elem instanceof HTMLInputElement && set.has(Events.editableInputs, elem.type)
+ return elem instanceof HTMLInputElement && set.has(util.editableInputs, elem.type)
|| elem instanceof HTMLIsIndexElement;
}
@@ -738,7 +738,7 @@ const Events = Module("events", {
if (elem && elem.readOnly)
return;
- if (elem instanceof HTMLInputElement && set.has(Events.editableInputs, elem.type) ||
+ if (elem instanceof HTMLInputElement && set.has(util.editableInputs, elem.type) ||
elem instanceof HTMLSelectElement) {
dactyl.mode = modes.INSERT;
if (hasHTMLDocument(win))
@@ -1075,9 +1075,6 @@ const Events = Module("events", {
// }
}
}, {
- editableInputs: set(["date", "datetime", "datetime-local", "email", "file",
- "month", "number", "password", "range", "search",
- "tel", "text", "time", "url", "week"]),
isContentNode: function (node) {
let win = (node.ownerDocument || node).defaultView;
for (; win; win = win.parent != win && win.parent)
@@ -1087,7 +1084,7 @@ const Events = Module("events", {
},
isInputElemFocused: function () {
let elem = dactyl.focus;
- return elem instanceof HTMLInputElement && set.has(Events.editableInputs, elem.type) ||
+ return elem instanceof HTMLInputElement && set.has(util.editableInputs, elem.type) ||
isinstance(elem, [HTMLIsIndexElement, HTMLEmbedElement,
HTMLObjectElement, HTMLTextAreaElement]);
}
diff --git a/common/content/hints.js b/common/content/hints.js
index b78b1a26..8cbfbc1c 100644
--- a/common/content/hints.js
+++ b/common/content/hints.js
@@ -54,9 +54,10 @@ const Hints = Module("hints", {
this.addMode("t", "Follow hint in a new tab", function (elem) buffer.followLink(elem, dactyl.NEW_TAB));
this.addMode("b", "Follow hint in a background tab", function (elem) buffer.followLink(elem, dactyl.NEW_BACKGROUND_TAB));
this.addMode("w", "Follow hint in a new window", function (elem) buffer.followLink(elem, dactyl.NEW_WINDOW));
- this.addMode("O", "Generate an ':open URL' using hint", function (elem, loc) commandline.open(":", "open " + loc, modes.EX));
- this.addMode("T", "Generate a ':tabopen URL' using hint", function (elem, loc) commandline.open(":", "tabopen " + loc, modes.EX));
- this.addMode("W", "Generate a ':winopen URL' using hint", function (elem, loc) commandline.open(":", "winopen " + loc, modes.EX));
+ this.addMode("O", "Generate an ‘:open URL’ prompt", function (elem, loc) commandline.open(":", "open " + loc, modes.EX));
+ this.addMode("T", "Generate a ‘:tabopen URL’ prompt", function (elem, loc) commandline.open(":", "tabopen " + loc, modes.EX));
+ this.addMode("W", "Generate a ‘:winopen URL’ prompt", function (elem, loc) commandline.open(":", "winopen " + loc, modes.EX));
+ this.addMode("S", "Add a search keyword", function (elem) bookmarks.addSearchKeyword(elem));
this.addMode("v", "View hint source", function (elem, loc) buffer.viewSource(loc, false));
this.addMode("V", "View hint source in external editor", function (elem, loc) buffer.viewSource(loc, true));
this.addMode("y", "Yank hint location", function (elem, loc) dactyl.clipboardWrite(loc, true));
@@ -128,7 +129,7 @@ const Hints = Module("hints", {
let type = elem.type;
- if (elem instanceof HTMLInputElement && set.has(Events.editableInputs, elem.type))
+ if (elem instanceof HTMLInputElement && set.has(util.editableInputs, elem.type))
return [elem.value, false];
else {
for (let [, option] in Iterator(options["hintinputs"])) {
@@ -494,8 +495,9 @@ const Hints = Module("hints", {
if ((modes.extended & modes.HINTS) && !this._continue)
modes.pop();
commandline._lastEcho = null; // Hack.
- this._hintMode.action(elem, elem.href || elem.src || "",
- this._extendedhintCount, top);
+ dactyl.trapErrors(this._hintMode.action, this._hintMode,
+ elem, elem.href || elem.src || "",
+ this._extendedhintCount, top);
}, timeout);
return true;
},
@@ -766,7 +768,7 @@ const Hints = Module("hints", {
this._hintMode = this._hintModes[minor];
dactyl.assert(this._hintMode);
- commandline.input(this._hintMode.prompt + ": ", null, {
+ commandline.input(UTF8(this._hintMode.prompt) + ": ", null, {
extended: modes.HINTS,
leave: function () { hints.hide(); },
onChange: this.closure._onInput
@@ -1072,7 +1074,9 @@ const Hints = Module("hints", {
"XPath string of hintable elements activated by ';'",
"regexmap", "[iI]:" + Option.quote(util.makeXPath(["img"])) +
",[OTivVWy]:" + Option.quote(util.makeXPath(
- ["{a,area}[@href]", "{img,iframe}[@src]"])),
+ ["{a,area}[@href]", "{img,iframe}[@src]"])) +
+ ",[S]:" + Option.quote(util.makeXPath(
+ ["input[not(@type='hidden')]", "textarea", "button", "select"])),
{ validator: Option.validateXPath });
options.add(["hinttags", "ht"],