1
0
mirror of https://github.com/gryf/pentadactyl-pm.git synced 2026-03-27 00:43:32 +01:00

Make 'passkeys' a sitemap rather than a regexpmap for parity with autocmds, groups, and styles.

--HG--
extra : rebase_source : 5e3e621416934d4c085eef491dd54243308f92c8
This commit is contained in:
Kris Maglione
2011-02-17 13:58:39 -05:00
parent ec2630461c
commit 589849c06d
6 changed files with 70 additions and 37 deletions

View File

@@ -1501,18 +1501,18 @@ var Events = Module("events", {
options: function () { options: function () {
options.add(["passkeys", "pk"], options.add(["passkeys", "pk"],
"Pass certain keys through directly for the given URLs", "Pass certain keys through directly for the given URLs",
"regexpmap", "", { "sitemap", "", {
has: function (key) { has: function (key) {
let url = buffer.documentURI.spec; let uri = buffer.documentURI;
for (let re in values(this.value)) for (let filter in values(this.value))
if (re.test(url) && re.result.some(function (k) k === key)) if (filter(uri) && filter.result.some(function (k) k === key))
return true; return true;
return false; return false;
}, },
setter: function (values) { setter: function (values) {
values.forEach(function (re) { values.forEach(function (filter) {
re.result = events.fromString(re.result).map(events.closure.toString); filter.result = events.fromString(filter.result).map(events.closure.toString);
re.result.toString = function toString() this.join(""); filter.result.toString = function toString() this.join("");
}); });
return values; return values;
} }

View File

@@ -1117,7 +1117,7 @@
<item> <item>
<tags>'pk' 'passkeys'</tags> <tags>'pk' 'passkeys'</tags>
<spec>'passkeys' 'pk'</spec> <spec>'passkeys' 'pk'</spec>
<type>regexpmap</type> <type>sitemap</type>
<default/> <default/>
<description> <description>
<p> <p>

View File

@@ -17,7 +17,7 @@ try {
catch (e) {} catch (e) {}
let objproto = Object.prototype; let objproto = Object.prototype;
let hasOwnProperty = objproto.hasOwnProperty; let { __lookupGetter__, __lookupSetter__, hasOwnProperty, propertyIsEnumerable } = objproto;
if (typeof XPCSafeJSObjectWrapper === "undefined") if (typeof XPCSafeJSObjectWrapper === "undefined")
this.XPCSafeJSObjectWrapper = XPCNativeWrapper; this.XPCSafeJSObjectWrapper = XPCNativeWrapper;
@@ -39,8 +39,8 @@ if (!Object.defineProperty)
Object.defineProperty = function defineProperty(obj, prop, desc) { Object.defineProperty = function defineProperty(obj, prop, desc) {
let value = desc.value; let value = desc.value;
if ("value" in desc) if ("value" in desc)
if (desc.writable && !objproto.__lookupGetter__.call(obj, prop) if (desc.writable && !__lookupGetter__.call(obj, prop)
&& !objproto.__lookupSetter__.call(obj, prop)) && !__lookupSetter__.call(obj, prop))
try { try {
obj[prop] = value; obj[prop] = value;
} }
@@ -69,10 +69,10 @@ if (!Object.getOwnPropertyDescriptor)
return undefined; return undefined;
let desc = { let desc = {
configurable: true, configurable: true,
enumerable: objproto.propertyIsEnumerable.call(obj, prop) enumerable: propertyIsEnumerable.call(obj, prop)
}; };
var get = obj.__lookupGetter__(prop), var get = __lookupGetter__.call(obj, prop),
set = obj.__lookupSetter__(prop); set = __lookupSetter__.call(obj, prop);
if (!get && !set) { if (!get && !set) {
desc.value = obj[prop]; desc.value = obj[prop];
desc.writable = true; desc.writable = true;
@@ -101,7 +101,7 @@ if (!Object.getPrototypeOf)
Object.getPrototypeOf = function getPrototypeOf(obj) obj.__proto__; Object.getPrototypeOf = function getPrototypeOf(obj) obj.__proto__;
if (!Object.keys) if (!Object.keys)
Object.keys = function keys(obj) 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__; let getGlobalForObject = Cu.getGlobalForObject || function (obj) obj.__parent__;
@@ -376,7 +376,7 @@ set.add = function (set, key) {
* @returns {boolean} * @returns {boolean}
*/ */
set.has = function (set, key) hasOwnProperty.call(set, key) && 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 * Returns a new set containing the members of the first argument which
* do not exist in any of the other given arguments. * do not exist in any of the other given arguments.
@@ -518,7 +518,7 @@ function memoize(obj, key, getter) {
if (arguments.length == 1) { if (arguments.length == 1) {
obj = update({}, obj); obj = update({}, obj);
for (let prop in Object.getOwnPropertyNames(obj)) { for (let prop in Object.getOwnPropertyNames(obj)) {
let get = objproto.__lookupGetter__.call(obj, prop); let get = __lookupGetter__.call(obj, prop);
if (get) if (get)
memoize(obj, prop, get); memoize(obj, prop, get);
} }
@@ -628,7 +628,7 @@ function update(target) {
Object.getOwnPropertyNames(src || {}).forEach(function (k) { Object.getOwnPropertyNames(src || {}).forEach(function (k) {
let desc = Object.getOwnPropertyDescriptor(src, k); let desc = Object.getOwnPropertyDescriptor(src, k);
if (desc.value instanceof Class.Property) 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)) { if (typeof desc.value == "function" && Object.getPrototypeOf(target)) {
let func = desc.value.wrapped || desc.value; let func = desc.value.wrapped || desc.value;
func.__defineGetter__("super", function () Object.getPrototypeOf(target)[k]); 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) { 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]); closure[k] = closure(this[k]);
else if (!(k in closure)) else if (!(k in closure))
Object.defineProperty(closure, k, { Object.defineProperty(closure, k, {
@@ -1241,7 +1241,7 @@ update(iter, {
let obj = {}; let obj = {};
for (let [k, v] in iter) for (let [k, v] in iter)
if (v instanceof Class.Property) if (v instanceof Class.Property)
Object.defineProperty(obj, k, v.init(k) || v); Object.defineProperty(obj, k, v.init(k, obj) || v);
else else
obj[k] = v; obj[k] = v;
return obj; return obj;
@@ -1388,7 +1388,7 @@ var array = Class("array", Array, {
let obj = {}; let obj = {};
assoc.forEach(function ([k, v]) { assoc.forEach(function ([k, v]) {
if (v instanceof Class.Property) if (v instanceof Class.Property)
Object.defineProperty(obj, k, v.init(k) || v); Object.defineProperty(obj, k, v.init(k, obj) || v);
else else
obj[k] = v; obj[k] = v;
}); });

View File

@@ -728,6 +728,7 @@ var ConfigBase = Class("ConfigBase", {
HelpXMLText color: #E5E5E5; HelpXMLText color: #E5E5E5;
// </css> // </css>
]]></>) ]]></>)
}, {
}); });
JSMLoader.loadSubScript("resource://dactyl-local-content/config.js", this); JSMLoader.loadSubScript("resource://dactyl-local-content/config.js", this);

View File

@@ -53,9 +53,6 @@ var Group = Class("Group", {
let (match = array.nth(siteFilter.filters, function (f) f(uri), 0)) let (match = array.nth(siteFilter.filters, function (f) f(uri), 0))
match && match.result; match && match.result;
if (!isArray(patterns))
patterns = Option.splitList(patterns, true);
return update(siteFilter, { return update(siteFilter, {
toString: function () this.filters.join(","), toString: function () this.filters.join(","),
@@ -64,14 +61,7 @@ var Group = Class("Group", {
function (f) <span highlight={uri && f(uri) ? "Filter" : ""}>{f}</span>, function (f) <span highlight={uri && f(uri) ? "Filter" : ""}>{f}</span>,
<>,</>), <>,</>),
filters: patterns.map(function (pattern) { filters: Option.parse.sitelist(patterns)
let [, res, filter] = /^(!?)(.*)/.exec(pattern);
return update(Styles.matchFilter(Option.dequote(filter)), {
result: !res,
toString: function () pattern
});
})
}); });
}, },

View File

@@ -12,7 +12,7 @@ Components.utils.import("resource://dactyl/bootstrap.jsm");
defineModule("options", { defineModule("options", {
exports: ["Option", "Options", "ValueError", "options"], exports: ["Option", "Options", "ValueError", "options"],
require: ["storage"], require: ["storage"],
use: ["commands", "completion", "prefs", "services", "template", "util"] use: ["commands", "completion", "prefs", "services", "styles", "template", "util"]
}, this); }, this);
@@ -428,17 +428,35 @@ var Option = Class("Option", {
unparseRegexp: function (re) re.bang + Option.quote(util.regexp.getSource(re), /^!|:/) + unparseRegexp: function (re) re.bang + Option.quote(util.regexp.getSource(re), /^!|:/) +
(typeof re.result === "boolean" ? "" : ":" + Option.quote(re.result)), (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: { getKey: {
stringlist: function (k) this.value.indexOf(k) >= 0, stringlist: function (k) this.value.indexOf(k) >= 0,
get charlist() this.stringlist, get charlist() this.stringlist,
regexplist: function (k, default_) { regexplist: function (k, default_) {
for (let re in values(this.value)) for (let re in values(this.value))
if (re.test(k)) if (re(k))
return re.result; return re.result;
return arguments.length > 1 ? default_ : null; return arguments.length > 1 ? default_ : null;
}, },
get regexpmap() this.regexplist get regexpmap() this.regexplist,
get sitelist() this.regexplist,
get sitemap() this.regexplist
}, },
stringify: { 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(","), stringmap: function (vals) [Option.quote(k, /:/) + ":" + Option.quote(v) for ([k, v] in Iterator(vals))].join(","),
regexplist: function (vals) vals.join(","), regexplist: function (vals) vals.join(","),
get regexpmap() this.regexplist get regexpmap() this.regexplist,
get sitelist() this.regexplist,
get sitemap() this.regexplist
}, },
parse: { parse: {
@@ -466,6 +486,14 @@ var Option = Class("Option", {
Option.splitList(value, true) Option.splitList(value, true)
.map(function (re) Option.parseRegexp(re, undefined, this.regexpFlags), this), .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( stringmap: function (value) array.toObject(
Option.splitList(value, true).map(function (v) { Option.splitList(value, true).map(function (v) {
let [count, key, quote] = Commands.parseArg(v, /:/); let [count, key, quote] = Commands.parseArg(v, /:/);
@@ -479,11 +507,21 @@ var Option = Class("Option", {
if (count === v.length) if (count === v.length)
[val, re] = [re, ".?"]; [val, re] = [re, ".?"];
return Option.parseRegexp(re, val, this.regexpFlags); 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) }, this)
}, },
testValues: { testValues: {
regexpmap: function (vals, validator) vals.every(function (re) validator(re.result)), regexpmap: function (vals, validator) vals.every(function (re) validator(re.result)),
get sitemap() this.regexpmap,
stringlist: function (vals, validator) vals.every(validator, this), stringlist: function (vals, validator) vals.every(validator, this),
stringmap: function (vals, validator) values(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 charlist() this.stringlist,
get regexplist() this.stringlist, get regexplist() this.stringlist,
get regexpmap() this.stringlist, get regexpmap() this.stringlist,
get sitelist() this.stringlist,
get sitemap() this.stringlist,
string: function (operator, values, scope, invert) { string: function (operator, values, scope, invert) {
if (invert) if (invert)
@@ -637,7 +677,7 @@ var Option = Class("Option", {
if (!acceptable) if (!acceptable)
acceptable = context.allItems.items.map(function (item) [item.text]); 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 (re) acceptable.some(function (item) item[0] == re.result));
return Array.concat(values).every(function (value) acceptable.some(function (item) item[0] == value)); 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) { switch (opt.type) {
case "boolean": case "boolean":
return; return;
case "sitelist":
case "regexplist": case "regexplist":
newValues = Option.splitList(context.filter); newValues = Option.splitList(context.filter);
// Fallthrough // Fallthrough
@@ -1295,6 +1336,7 @@ var Options = Module("options", {
Option._splitAt = newValues.length; Option._splitAt = newValues.length;
break; break;
case "stringmap": case "stringmap":
case "sitemap":
case "regexpmap": case "regexpmap":
let vals = Option.splitList(context.filter); let vals = Option.splitList(context.filter);
let target = vals.pop() || ""; let target = vals.pop() || "";