diff options
Diffstat (limited to 'common/content')
-rw-r--r-- | common/content/bookmarks.js | 80 | ||||
-rw-r--r-- | common/content/buffer.js | 2 | ||||
-rw-r--r-- | common/content/dactyl.js | 3 | ||||
-rw-r--r-- | common/content/events.js | 9 | ||||
-rw-r--r-- | common/content/hints.js | 20 |
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"], |