From 589849c06d4a7b6751f685a38debf3d7f882c619 Mon Sep 17 00:00:00 2001 From: Kris Maglione Date: Thu, 17 Feb 2011 13:58:39 -0500 Subject: [PATCH] Make 'passkeys' a sitemap rather than a regexpmap for parity with autocmds, groups, and styles. --HG-- extra : rebase_source : 5e3e621416934d4c085eef491dd54243308f92c8 --- common/content/events.js | 14 ++++----- common/locale/en-US/options.xml | 2 +- common/modules/base.jsm | 26 ++++++++--------- common/modules/config.jsm | 1 + common/modules/contexts.jsm | 12 +------- common/modules/options.jsm | 52 +++++++++++++++++++++++++++++---- 6 files changed, 70 insertions(+), 37 deletions(-) diff --git a/common/content/events.js b/common/content/events.js index 105c320a..c59a0ab8 100644 --- a/common/content/events.js +++ b/common/content/events.js @@ -1501,18 +1501,18 @@ var Events = Module("events", { options: function () { options.add(["passkeys", "pk"], "Pass certain keys through directly for the given URLs", - "regexpmap", "", { + "sitemap", "", { has: function (key) { - let url = buffer.documentURI.spec; - for (let re in values(this.value)) - if (re.test(url) && re.result.some(function (k) k === key)) + let uri = buffer.documentURI; + for (let filter in values(this.value)) + if (filter(uri) && filter.result.some(function (k) k === key)) return true; return false; }, setter: function (values) { - values.forEach(function (re) { - re.result = events.fromString(re.result).map(events.closure.toString); - re.result.toString = function toString() this.join(""); + values.forEach(function (filter) { + filter.result = events.fromString(filter.result).map(events.closure.toString); + filter.result.toString = function toString() this.join(""); }); return values; } diff --git a/common/locale/en-US/options.xml b/common/locale/en-US/options.xml index 2fd55ebf..5e98816e 100644 --- a/common/locale/en-US/options.xml +++ b/common/locale/en-US/options.xml @@ -1117,7 +1117,7 @@ 'pk' 'passkeys' 'passkeys' 'pk' - regexpmap + sitemap

diff --git a/common/modules/base.jsm b/common/modules/base.jsm index ef4dc379..5508603e 100644 --- a/common/modules/base.jsm +++ b/common/modules/base.jsm @@ -17,7 +17,7 @@ try { catch (e) {} let objproto = Object.prototype; -let hasOwnProperty = objproto.hasOwnProperty; +let { __lookupGetter__, __lookupSetter__, hasOwnProperty, propertyIsEnumerable } = objproto; if (typeof XPCSafeJSObjectWrapper === "undefined") this.XPCSafeJSObjectWrapper = XPCNativeWrapper; @@ -39,8 +39,8 @@ if (!Object.defineProperty) Object.defineProperty = function defineProperty(obj, prop, desc) { let value = desc.value; if ("value" in desc) - if (desc.writable && !objproto.__lookupGetter__.call(obj, prop) - && !objproto.__lookupSetter__.call(obj, prop)) + if (desc.writable && !__lookupGetter__.call(obj, prop) + && !__lookupSetter__.call(obj, prop)) try { obj[prop] = value; } @@ -69,10 +69,10 @@ if (!Object.getOwnPropertyDescriptor) return undefined; let desc = { configurable: true, - enumerable: objproto.propertyIsEnumerable.call(obj, prop) + enumerable: propertyIsEnumerable.call(obj, prop) }; - var get = obj.__lookupGetter__(prop), - set = obj.__lookupSetter__(prop); + var get = __lookupGetter__.call(obj, prop), + set = __lookupSetter__.call(obj, prop); if (!get && !set) { desc.value = obj[prop]; desc.writable = true; @@ -101,7 +101,7 @@ if (!Object.getPrototypeOf) Object.getPrototypeOf = function getPrototypeOf(obj) obj.__proto__; if (!Object.keys) Object.keys = function keys(obj) - Object.getOwnPropertyNames(obj).filter(function (k) objproto.propertyIsEnumerable.call(obj, k)); + Object.getOwnPropertyNames(obj).filter(function (k) propertyIsEnumerable.call(obj, k)); let getGlobalForObject = Cu.getGlobalForObject || function (obj) obj.__parent__; @@ -376,7 +376,7 @@ set.add = function (set, key) { * @returns {boolean} */ set.has = function (set, key) hasOwnProperty.call(set, key) && - objproto.propertyIsEnumerable.call(set, key); + propertyIsEnumerable.call(set, key); /** * Returns a new set containing the members of the first argument which * do not exist in any of the other given arguments. @@ -518,7 +518,7 @@ function memoize(obj, key, getter) { if (arguments.length == 1) { obj = update({}, obj); for (let prop in Object.getOwnPropertyNames(obj)) { - let get = objproto.__lookupGetter__.call(obj, prop); + let get = __lookupGetter__.call(obj, prop); if (get) memoize(obj, prop, get); } @@ -628,7 +628,7 @@ function update(target) { Object.getOwnPropertyNames(src || {}).forEach(function (k) { let desc = Object.getOwnPropertyDescriptor(src, k); if (desc.value instanceof Class.Property) - desc = desc.value.init(k) || desc.value; + desc = desc.value.init(k, target) || desc.value; if (typeof desc.value == "function" && Object.getPrototypeOf(target)) { let func = desc.value.wrapped || desc.value; func.__defineGetter__("super", function () Object.getPrototypeOf(target)[k]); @@ -879,7 +879,7 @@ memoize(Class.prototype, "closure", function () { } } iter(properties(this), properties(this, true)).forEach(function (k) { - if (!this.__lookupGetter__(k) && callable(this[k])) + if (!__lookupGetter__.call(this, k) && callable(this[k])) closure[k] = closure(this[k]); else if (!(k in closure)) Object.defineProperty(closure, k, { @@ -1241,7 +1241,7 @@ update(iter, { let obj = {}; for (let [k, v] in iter) if (v instanceof Class.Property) - Object.defineProperty(obj, k, v.init(k) || v); + Object.defineProperty(obj, k, v.init(k, obj) || v); else obj[k] = v; return obj; @@ -1388,7 +1388,7 @@ var array = Class("array", Array, { let obj = {}; assoc.forEach(function ([k, v]) { if (v instanceof Class.Property) - Object.defineProperty(obj, k, v.init(k) || v); + Object.defineProperty(obj, k, v.init(k, obj) || v); else obj[k] = v; }); diff --git a/common/modules/config.jsm b/common/modules/config.jsm index c59b3d9a..27a4a646 100644 --- a/common/modules/config.jsm +++ b/common/modules/config.jsm @@ -728,6 +728,7 @@ var ConfigBase = Class("ConfigBase", { HelpXMLText color: #E5E5E5; // ]]>) +}, { }); JSMLoader.loadSubScript("resource://dactyl-local-content/config.js", this); diff --git a/common/modules/contexts.jsm b/common/modules/contexts.jsm index 19df0a46..b93078a5 100644 --- a/common/modules/contexts.jsm +++ b/common/modules/contexts.jsm @@ -53,9 +53,6 @@ var Group = Class("Group", { let (match = array.nth(siteFilter.filters, function (f) f(uri), 0)) match && match.result; - if (!isArray(patterns)) - patterns = Option.splitList(patterns, true); - return update(siteFilter, { toString: function () this.filters.join(","), @@ -64,14 +61,7 @@ var Group = Class("Group", { function (f) {f}, <>,), - filters: patterns.map(function (pattern) { - let [, res, filter] = /^(!?)(.*)/.exec(pattern); - - return update(Styles.matchFilter(Option.dequote(filter)), { - result: !res, - toString: function () pattern - }); - }) + filters: Option.parse.sitelist(patterns) }); }, diff --git a/common/modules/options.jsm b/common/modules/options.jsm index 5423e32a..74e1347f 100644 --- a/common/modules/options.jsm +++ b/common/modules/options.jsm @@ -12,7 +12,7 @@ Components.utils.import("resource://dactyl/bootstrap.jsm"); defineModule("options", { exports: ["Option", "Options", "ValueError", "options"], require: ["storage"], - use: ["commands", "completion", "prefs", "services", "template", "util"] + use: ["commands", "completion", "prefs", "services", "styles", "template", "util"] }, this); @@ -428,17 +428,35 @@ var Option = Class("Option", { unparseRegexp: function (re) re.bang + Option.quote(util.regexp.getSource(re), /^!|:/) + (typeof re.result === "boolean" ? "" : ":" + Option.quote(re.result)), + parseSite: function parseSite(pattern, result, rest) { + if (isArray(rest)) // Called by Array.map + result = undefined; + + let [, bang, filter] = /^(!?)(.*)/.exec(pattern); + filter = Option.dequote(filter); + + return update(Styles.matchFilter(filter), { + bang: bang, + filter: filter, + result: result !== undefined ? result : !bang, + toString: function () this.bang + Option.quote(this.filter) + + (typeof this.result === "boolean" ? "" : ":" + Option.quote(this.result)), + }); + }, + getKey: { stringlist: function (k) this.value.indexOf(k) >= 0, get charlist() this.stringlist, regexplist: function (k, default_) { for (let re in values(this.value)) - if (re.test(k)) + if (re(k)) return re.result; return arguments.length > 1 ? default_ : null; }, - get regexpmap() this.regexplist + get regexpmap() this.regexplist, + get sitelist() this.regexplist, + get sitemap() this.regexplist }, stringify: { @@ -449,7 +467,9 @@ var Option = Class("Option", { stringmap: function (vals) [Option.quote(k, /:/) + ":" + Option.quote(v) for ([k, v] in Iterator(vals))].join(","), regexplist: function (vals) vals.join(","), - get regexpmap() this.regexplist + get regexpmap() this.regexplist, + get sitelist() this.regexplist, + get sitemap() this.regexplist }, parse: { @@ -466,6 +486,14 @@ var Option = Class("Option", { Option.splitList(value, true) .map(function (re) Option.parseRegexp(re, undefined, this.regexpFlags), this), + sitelist: function (value) { + if (value === "") + return []; + if (!isArray(value)) + value = Option.splitList(value, true); + return value.map(Option.parseSite); + }, + stringmap: function (value) array.toObject( Option.splitList(value, true).map(function (v) { let [count, key, quote] = Commands.parseArg(v, /:/); @@ -479,11 +507,21 @@ var Option = Class("Option", { if (count === v.length) [val, re] = [re, ".?"]; return Option.parseRegexp(re, val, this.regexpFlags); + }, this), + + sitemap: function (value) + Option.splitList(value, true).map(function (v) { + let [count, re, quote] = Commands.parseArg(v, /:/, true); + let val = Option.dequote(v.substr(count + 1)); + if (count === v.length) + [val, re] = [re, "*"]; + return Option.parseSite(re, val); }, this) }, testValues: { regexpmap: function (vals, validator) vals.every(function (re) validator(re.result)), + get sitemap() this.regexpmap, stringlist: function (vals, validator) vals.every(validator, this), stringmap: function (vals, validator) values(vals).every(validator, this) }, @@ -597,6 +635,8 @@ var Option = Class("Option", { get charlist() this.stringlist, get regexplist() this.stringlist, get regexpmap() this.stringlist, + get sitelist() this.stringlist, + get sitemap() this.stringlist, string: function (operator, values, scope, invert) { if (invert) @@ -637,7 +677,7 @@ var Option = Class("Option", { if (!acceptable) acceptable = context.allItems.items.map(function (item) [item.text]); } - if (this.type == "regexpmap") + if (this.type === "regexpmap" || this.type === "sitemap") return Array.concat(values).every(function (re) acceptable.some(function (item) item[0] == re.result)); return Array.concat(values).every(function (value) acceptable.some(function (item) item[0] == value)); }, @@ -1286,6 +1326,7 @@ var Options = Module("options", { switch (opt.type) { case "boolean": return; + case "sitelist": case "regexplist": newValues = Option.splitList(context.filter); // Fallthrough @@ -1295,6 +1336,7 @@ var Options = Module("options", { Option._splitAt = newValues.length; break; case "stringmap": + case "sitemap": case "regexpmap": let vals = Option.splitList(context.filter); let target = vals.pop() || "";