Update an extension. When ! is given, update all
diff --git a/common/modules/base.jsm b/common/modules/base.jsm
index daee9992..76b99af4 100644
--- a/common/modules/base.jsm
+++ b/common/modules/base.jsm
@@ -163,7 +163,7 @@ defineModule.dump = function dump_() {
msg = util.objectToString(msg);
return msg;
}).join(", ");
- let name = loaded.services ? services["dactyl:"].name : "dactyl";
+ let name = loaded.services && loaded.prefs && services["dactyl:"] ? services["dactyl:"].name : "dactyl";
dump(String.replace(msg, /\n?$/, "\n")
.replace(/^./gm, name + ": $&"));
}
@@ -294,7 +294,10 @@ function deprecated(reason, fn) {
(obj ? obj + "." : "") + (fn.name || name) + " is deprecated: " + reason);
return func.apply(this, arguments);
}
- deprecatedMethod.seen = { "chrome://dactyl/content/javascript.js": true };
+ deprecatedMethod.seen = {
+ "chrome://dactyl/content/javascript.js": true,
+ "resource://dactyl/util.jsm": true
+ };
return callable(fn) ? deprecatedMethod : Class.Property({
get: function () deprecatedMethod,
@@ -859,6 +862,8 @@ Class.prototype = {
timeout: function (callback, timeout) {
const self = this;
function notify(timer) {
+ if (util.rehashing && !isinstance(Cu.getGlobalForObject(callback), ["BackstagePass"]))
+ return;
util.trapErrors(callback, self);
}
return services.Timer(notify, timeout || 0, services.Timer.TYPE_ONE_SHOT);;
@@ -987,6 +992,8 @@ let StructBase = Class("StructBase", Array, {
clone: function clone() this.constructor.apply(null, this.slice()),
+ closure: Class.Property(Object.getOwnPropertyDescriptor(Class.prototype, "closure")),
+
toString: function () Class.prototype.toString.apply(this, arguments),
// Iterator over our named members
@@ -1029,6 +1036,9 @@ var Timer = Class("Timer", {
},
notify: function (timer) {
+ if (util.rehashing)
+ return;
+
this._timer.cancel();
this.latest = 0;
// minInterval is the time between the completion of the command and the next firing
diff --git a/common/modules/overlay.jsm b/common/modules/overlay.jsm
new file mode 100644
index 00000000..cbf9a750
--- /dev/null
+++ b/common/modules/overlay.jsm
@@ -0,0 +1,266 @@
+// Copyright (c) 2009-2010 by Kris Maglione
+//
+// This work is licensed for reuse under an MIT license. Details are
+// given in the LICENSE.txt file included with this file.
+"use strict";
+
+Components.utils.import("resource://dactyl/base.jsm");
+defineModule("overlay", {
+ exports: ["ModuleBase"],
+ require: ["highlight", "sanitizer", "services", "template", "util"],
+});
+
+/**
+ * @class ModuleBase
+ * The base class for all modules.
+ */
+var ModuleBase = Class("ModuleBase", {
+ /**
+ * @property {[string]} A list of module prerequisites which
+ * must be initialized before this module is loaded.
+ */
+ requires: [],
+
+ toString: function () "[module " + this.constructor.className + "]"
+});
+
+var Overlay = Module("Overlay", {
+ init: function () {
+ util.overlayWindow("chrome://browser/content/browser.xul", function (window) ({
+ init: function (document) {
+ /**
+ * @constructor Module
+ *
+ * Constructs a new ModuleBase class and makes arrangements for its
+ * initialization. Arguments marked as optional must be either
+ * entirely elided, or they must have the exact type specified.
+ * Loading semantics are as follows:
+ *
+ * - A module is guaranteed not to be initialized before any of its
+ * prerequisites as listed in its {@see ModuleBase#requires} member.
+ * - A module is considered initialized once it's been instantiated,
+ * its {@see Class#init} method has been called, and its
+ * instance has been installed into the top-level {@see modules}
+ * object.
+ * - Once the module has been initialized, its module-dependent
+ * initialization functions will be called as described hereafter.
+ * @param {string} name The module's name as it will appear in the
+ * top-level {@see modules} object.
+ * @param {ModuleBase} base The base class for this module.
+ * @optional
+ * @param {Object} prototype The prototype for instances of this
+ * object. The object itself is copied and not used as a prototype
+ * directly.
+ * @param {Object} classProperties The class properties for the new
+ * module constructor.
+ * @optional
+ * @param {Object} moduleInit The module initialization functions
+ * for the new module. Each function is called as soon as the named module
+ * has been initialized, but after the module itself. The constructors are
+ * guaranteed to be called in the same order that the dependent modules
+ * were initialized.
+ * @optional
+ *
+ * @returns {function} The constructor for the resulting module.
+ */
+ function Module(name) {
+ let args = Array.slice(arguments);
+
+ var base = ModuleBase;
+ if (callable(args[1]))
+ base = args.splice(1, 1)[0];
+ let [, prototype, classProperties, moduleInit] = args;
+ const module = Class(name, base, prototype, classProperties);
+
+ module.INIT = moduleInit || {};
+ module.prototype.INIT = module.INIT;
+ module.requires = prototype.requires || [];
+ Module.list.push(module);
+ Module.constructors[name] = module;
+ return module;
+ }
+ Module.list = [];
+ Module.constructors = {};
+
+ const BASE = "chrome://dactyl/content/";
+
+ const create = window.Object.create || (function () {
+ window.__dactyl_eval_string = "(function (proto) ({ __proto__: proto }))";
+ services.subscriptLoader.loadSubScript(BASE + "eval.js", window);
+
+ let res = window.__dactyl_eval_result;
+ delete window.__dactyl_eval_string;
+ delete window.__dactyl_eval_result;
+ return res;
+ })();
+
+ const jsmodules = {};
+ const modules = update(create(jsmodules), {
+
+ jsmodules: jsmodules,
+
+ get content() this.config.browser.contentWindow || window.content,
+
+ window: window,
+
+ Module: Module,
+
+ load: function load(script) {
+ for (let [i, base] in Iterator(prefix)) {
+ try {
+ services.subscriptLoader.loadSubScript(base + script + ".js", modules, "UTF-8");
+ return;
+ }
+ catch (e) {
+ if (typeof e !== "string") {
+ util.dump("Trying: " + (base + script + ".js") + ":");
+ util.reportError(e);
+ }
+ }
+ }
+ try {
+ Cu.import("resource://dactyl/" + script + ".jsm", jsmodules);
+ }
+ catch (e) {
+ util.dump("Loading script " + script + ":");
+ util.reportError(e);
+ }
+ },
+
+ newContext: function newContext(proto) {
+ let sandbox = Components.utils.Sandbox(window, { sandboxPrototype: proto || modules, wantXrays: false });
+ // Hack:
+ sandbox.Object = jsmodules.Object;
+ sandbox.Math = jsmodules.Math;
+ sandbox.__proto__ = proto || modules;
+ return sandbox;
+ }
+ });
+ modules.modules = modules;
+ window.dactyl = { modules: modules };
+
+ let prefix = [BASE];
+
+ modules.load("util");
+ modules.load("services");
+ prefix.unshift("chrome://" + modules.services["dactyl:"].name + "/content/");
+
+ ["base",
+ "overlay",
+ "prefs",
+ "storage",
+ "javascript",
+ "dactyl",
+ "modes",
+ "abbreviations",
+ "autocommands",
+ "buffer",
+ "commandline",
+ "commands",
+ "completion",
+ "configbase",
+ "config",
+ "editor",
+ "events",
+ "finder",
+ "highlight",
+ "hints",
+ "io",
+ "mappings",
+ "marks",
+ "options",
+ "statusline",
+ "styles",
+ "template"
+ ].forEach(modules.load);
+
+ modules.Config.prototype.scripts.forEach(modules.load);
+ },
+ load: function (document) {
+ var { modules, Module } = window.dactyl.modules;
+ delete window.dactyl;
+
+ Module.list.forEach(function (module) {
+ modules.__defineGetter__(module.className, function () {
+ delete modules[module.className];
+ return load(module.className, null, Components.stack.caller);
+ });
+ });
+
+ const start = Date.now();
+ const deferredInit = { load: [] };
+ const seen = set();
+ const loaded = set(["init"]);
+ modules.loaded = loaded;
+
+ function init(module) {
+ function init(func, mod)
+ function () defineModule.time(module.className || module.constructor.className, mod,
+ func, module,
+ modules.dactyl, modules, window);
+
+ set.add(loaded, module.constructor.className);
+ for (let [mod, func] in Iterator(module.INIT)) {
+ if (mod in loaded)
+ init(func, mod)();
+ else {
+ deferredInit[mod] = deferredInit[mod] || [];
+ deferredInit[mod].push(init(func, mod));
+ }
+ }
+ }
+ defineModule.modules.map(init);
+
+ function load(module, prereq, frame) {
+ if (isString(module)) {
+ if (!Module.constructors.hasOwnProperty(module))
+ modules.load(module);
+ module = Module.constructors[module];
+ }
+
+ try {
+ if (module.className in loaded)
+ return;
+ if (module.className in seen)
+ throw Error("Module dependency loop.");
+ set.add(seen, module.className);
+
+ for (let dep in values(module.requires))
+ load(Module.constructors[dep], module.className);
+
+ defineModule.loadLog.push("Load" + (isString(prereq) ? " " + prereq + " dependency: " : ": ") + module.className);
+ if (frame && frame.filename)
+ defineModule.loadLog.push(" from: " + frame.filename + ":" + frame.lineNumber);
+
+ delete modules[module.className];
+ modules[module.className] = defineModule.time(module.className, "init", module);
+
+ init(modules[module.className]);
+ for (let [, fn] in iter(deferredInit[module.className] || []))
+ fn();
+ }
+ catch (e) {
+ util.dump("Loading " + (module && module.className) + ":");
+ util.reportError(e);
+ }
+ return modules[module.className];
+ }
+
+ Module.list.forEach(load);
+ deferredInit["load"].forEach(call);
+ modules.times = update({}, defineModule.times);
+
+ util.dump("Loaded in " + (Date.now() - start) + "ms");
+
+ modules.events.addSessionListener(window, "unload", function onUnload() {
+ window.removeEventListener("unload", onUnload.wrapped, false);
+ for (let [, mod] in iter(modules))
+ if (mod instanceof ModuleBase && "destroy" in mod)
+ util.trapErrors(mod.destroy, mod);
+ }, false);
+ }
+ }));
+ }
+});
+
+// vim: set fdm=marker sw=4 ts=4 et:
diff --git a/common/modules/services.jsm b/common/modules/services.jsm
index 77060989..c29ecb95 100644
--- a/common/modules/services.jsm
+++ b/common/modules/services.jsm
@@ -36,7 +36,7 @@ var Services = Module("Services", {
this.add("extensionManager", "@mozilla.org/extensions/manager;1", Ci.nsIExtensionManager);
this.add("favicon", "@mozilla.org/browser/favicon-service;1", Ci.nsIFaviconService);
this.add("focus", "@mozilla.org/focus-manager;1", Ci.nsIFocusManager);
- this.add("fuel", "@mozilla.org/fuel/application;1", Ci.fuelIApplication);
+ this.add("fuel", "@mozilla.org/fuel/application;1", Ci.extIApplication);
this.add("history", "@mozilla.org/browser/global-history;2", [Ci.nsIBrowserHistory, Ci.nsIGlobalHistory3,
Ci.nsINavHistoryService, Ci.nsPIPlacesDatabase]);
this.add("io", "@mozilla.org/network/io-service;1", Ci.nsIIOService);
@@ -66,6 +66,7 @@ var Services = Module("Services", {
this.addClass("Find", "@mozilla.org/embedcomp/rangefind;1", Ci.nsIFind);
this.addClass("HtmlConverter","@mozilla.org/widget/htmlformatconverter;1", Ci.nsIFormatConverter);
this.addClass("HtmlEncoder", "@mozilla.org/layout/htmlCopyEncoder;1", Ci.nsIDocumentEncoder);
+ this.addClass("Persist", "@mozilla.org/embedding/browser/nsWebBrowserPersist;1", Ci.nsIWebBrowserPersist);
this.addClass("Process", "@mozilla.org/process/util;1", Ci.nsIProcess, "init");
this.addClass("String", "@mozilla.org/supports-string;1", Ci.nsISupportsString);
this.addClass("Timer", "@mozilla.org/timer;1", Ci.nsITimer, "initWithCallback");
@@ -76,6 +77,7 @@ var Services = Module("Services", {
if (!this.extensionManager)
Components.utils.import("resource://gre/modules/AddonManager.jsm");
},
+ reinit: function () {},
_create: function (classes, ifaces, meth, init, args) {
try {
diff --git a/common/modules/styles.jsm b/common/modules/styles.jsm
index bb4f0f03..b31df65a 100644
--- a/common/modules/styles.jsm
+++ b/common/modules/styles.jsm
@@ -56,6 +56,12 @@ update(Sheet.prototype, {
}
},
+ match: function (uri) {
+ if (isString(uri))
+ uri = util.newURI(uri);
+ return this.sites.some(function (site) Styles.matchFilter(site, uri));
+ },
+
get fullCSS() {
let filter = this.sites;
let css = this.css;
@@ -357,31 +363,21 @@ var Styles = Module("Styles", {
commands: function (dactyl, modules, window) {
const commands = modules.commands;
- const queue = [];
- const timer = Timer(10, 10, function () {
- let args = queue.shift()
- let [filter, css] = args;
- if ("-append" in args) {
- let sheet = styles.user.get(args["-name"]);
- if (sheet) {
- filter = sheet.sites.concat(filter).join(",");
- css = sheet.css + " " + css;
-
- }
- }
- styles.user.add(args["-name"], filter, css, args["-agent"]);
-
- if (queue.length)
- timer.tell();
- });
commands.add(["sty[le]"],
"Add or list user styles",
function (args) {
let [filter, css] = args;
if (css) {
- queue.push(args);
- timer.tell(args);
+ if ("-append" in args) {
+ let sheet = styles.user.get(args["-name"]);
+ if (sheet) {
+ filter = sheet.sites.concat(filter).join(",");
+ css = sheet.css + " " + css;
+
+ }
+ }
+ styles.user.add(args["-name"], filter, css, args["-agent"]);
}
else {
let list = styles.user.sheets.slice()
@@ -476,7 +472,7 @@ var Styles = Module("Styles", {
let uris = util.visibleURIs(window.content);
context.compare = modules.CompletionContext.Sort.number;
context.generate = function () styles.user.sheets;
- context.keys.active = function (sheet) sheet.sites.some(function (site) uris.some(Styles.matchFilter(site))),
+ context.keys.active = function (sheet) uris.some(sheet.closure.match);
context.keys.description = function (sheet) <>{sheet.formatSites(uris)}: {sheet.css.replace("\n", "\\n")}>
if (cmd.filter)
context.filters.push(function ({ item }) cmd.filter(item));
diff --git a/common/modules/template.jsm b/common/modules/template.jsm
index 0a4652fc..7e4454eb 100644
--- a/common/modules/template.jsm
+++ b/common/modules/template.jsm
@@ -235,7 +235,7 @@ var Template = Module("Template", {
})(), template[help ? "HelpLink" : "helpLink"]);
},
- options: function options(title, opts) {
+ options: function options(title, opts, verbose) {
XML.ignoreWhitespace = false; XML.prettyPrinting = false;
//
return
@@ -249,7 +249,9 @@ var Template = Module("Template", {
{opt.pre}{opt.name}{opt.value}{
opt.isDefault || opt.default == null ? "" :
- }
+ }{
+ verbose && opt.setFrom ? Last set from {template.sourceLink(opt.setFrom)}
: <>>
+ }
)
}
diff --git a/common/modules/util.jsm b/common/modules/util.jsm
index e5dde3f3..156158ee 100644
--- a/common/modules/util.jsm
+++ b/common/modules/util.jsm
@@ -59,6 +59,8 @@ var Util = Module("Util", XPCOM([Ci.nsIObserver, Ci.nsISupportsWeakReference]),
}
},
+ get addon() services.fuel.storage.get("dactyl.bootstrap", null).addon,
+
// FIXME: Only works for Pentadactyl
get activeWindow() services.windowMediator.getMostRecentWindow("navigator:browser"),
dactyl: update(function dactyl(obj) {
@@ -96,7 +98,7 @@ var Util = Module("Util", XPCOM([Ci.nsIObserver, Ci.nsISupportsWeakReference]),
obj._observe = observers;
function register(meth) {
- for (let target in set(["dactyl-cleanup", "quit-application"].concat(Object.keys(observers))))
+ for (let target in set(["dactyl-cleanup-modules", "quit-application"].concat(Object.keys(observers))))
try {
services.observer[meth](obj, target, true);
}
@@ -106,7 +108,7 @@ var Util = Module("Util", XPCOM([Ci.nsIObserver, Ci.nsISupportsWeakReference]),
Class.replaceProperty(obj, "observe",
function (subject, target, data) {
try {
- if (target == "quit-application" || target == "dactyl-cleanup")
+ if (target == "quit-application" || target == "dactyl-cleanup-modules")
register("removeObserver");
if (observers[target])
observers[target].call(obj, subject, data);
@@ -484,7 +486,7 @@ var Util = Module("Util", XPCOM([Ci.nsIObserver, Ci.nsISupportsWeakReference]),
*/
dumpStack: function dumpStack(msg, frames) {
let stack = util.stackLines(Error().stack);
- stack = stack.slice(2, 2 + (frames || stack.length)).join("\n");
+ stack = stack.slice(1, 1 + (frames || stack.length)).join("\n").replace(/^/gm, " ");
util.dump((arguments.length == 0 ? "Stack" : msg) + "\n" + stack + "\n");
},
@@ -922,6 +924,35 @@ var Util = Module("Util", XPCOM([Ci.nsIObserver, Ci.nsISupportsWeakReference]),
},
observe: {
+ "dactyl-cleanup-modules": function () {
+ util.dump("dactyl: util: observe: dactyl-cleanup-modules");
+
+ for (let module in values(defineModule.modules))
+ if (module.cleanup) {
+ util.dump("cleanup: " + module.constructor.className);
+ util.trapErrors(module.cleanup, module);
+ }
+
+ services.observer.addObserver(this, "dactyl-rehash", true);
+ },
+ "dactyl-rehash": function () {
+ services.observer.removeObserver(this, "dactyl-rehash");
+
+ util.dump("dactyl: util: observe: dactyl-rehash");
+ if (this.rehashing)
+ JSMLoader.purge();
+ else
+ for (let module in values(defineModule.modules)) {
+ util.dump("dactyl: util: init(" + module + ")");
+ if (module.reinit)
+ module.reinit();
+ else
+ module.init();
+ }
+ },
+ "dactyl-purge": function () {
+ this.rehashing = true;
+ },
"toplevel-window-ready": function (window, data) {
window.addEventListener("DOMContentLoaded", wrapCallback(function listener(event) {
if (event.originalTarget === window.document) {
@@ -965,7 +996,10 @@ var Util = Module("Util", XPCOM([Ci.nsIObserver, Ci.nsISupportsWeakReference]),
doc.dactylOverlayElements.push(n);
fn(elem, node);
for each (let attr in attr || []) // FIXME: Cleanup...
- elem.setAttributeNS(attr.namespace(), attr.localName(), attr);
+ if (attr.name() != "highlight")
+ elem.setAttributeNS(attr.namespace(), attr.localName(), String(attr));
+ else
+ highlight.highlightNode(elem, String(attr));
}
}
}
@@ -1156,6 +1190,16 @@ var Util = Module("Util", XPCOM([Ci.nsIObserver, Ci.nsISupportsWeakReference]),
getSource: function regexp_getSource(re) re.source.replace(/\\(.)/g, function (m0, m1) m1 === "/" ? "/" : m0)
}),
+ rehash: function (args) {
+ if (services.fuel)
+ services.fuel.storage.set("dactyl.commandlineArgs", args);
+ this.timeout(function () {
+ this.rehashing = true;
+ this.addon.userDisabled = true;
+ this.addon.userDisabled = false;
+ });
+ },
+
maxErrors: 15,
errors: Class.memoize(function () []),
reportError: function (error) {
@@ -1404,6 +1448,8 @@ var Util = Module("Util", XPCOM([Ci.nsIObserver, Ci.nsISupportsWeakReference]),
*/
xmlToDom: function xmlToDom(node, doc, nodes) {
XML.prettyPrinting = false;
+ if (typeof node === "string") // Sandboxes can't currently pass us XML objects.
+ node = XML(node);
if (node.length() != 1) {
let domnode = doc.createDocumentFragment();
for each (let child in node)
@@ -1418,11 +1464,8 @@ var Util = Module("Util", XPCOM([Ci.nsIObserver, Ci.nsISupportsWeakReference]),
for each (let attr in node.@*::*)
if (attr.name() != "highlight")
domnode.setAttributeNS(attr.namespace(), attr.localName(), String(attr));
- else {
- domnode.setAttributeNS(NS.uri, "highlight", String(attr));
- for each (let h in String.split(attr, " "))
- highlight.loaded[h] = true;
- }
+ else
+ highlight.highlightNode(domnode, String(attr));
for each (let child in node.*::*)
domnode.appendChild(xmlToDom(child, doc, nodes));
diff --git a/common/skin/dactyl.css b/common/skin/dactyl.css
index b94987f3..73945471 100644
--- a/common/skin/dactyl.css
+++ b/common/skin/dactyl.css
@@ -1,6 +1,6 @@
@namespace dactyl url("http://vimperator.org/namespaces/liberator");
@namespace html url("http://www.w3.org/1999/xhtml");
-@namespace xul uri("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul");
+@namespace xul url("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul");
/* Applied to all content */
[dactyl|activeframe] {
@@ -89,8 +89,8 @@ window[dactyl|highlight~=Bell] > * {
}
[dactyl|highlight~=CmdLine] {
- background: inherit;
- color: inherit;
+ background: inherit !important;
+ color: inherit !important;
}
[dactyl|highlight~=CmdLine],
[dactyl|highlight~=CmdLine] > [dactyl|highlight~=CmdLine] {
@@ -122,9 +122,9 @@ statusbarpanel {
background: transparent;
}
-#dactyl-statusline-field-url {
- background-color: inherit;
- color: inherit;
+.dactyl-status-field-url {
+ background-color: inherit !important;
+ color: inherit !important;
}
/* no longer at the window's bottom right corner */
@@ -141,8 +141,8 @@ statusbarpanel {
padding: 0px;
}
.dactyl-commandline-command {
- background-color: inherit;
- color: inherit;
+ background-color: inherit !important;
+ color: inherit !important;
margin: 0px;
}
.dactyl-commandline-command html|*:focus {
diff --git a/pentadactyl/NEWS b/pentadactyl/NEWS
index 6d42bd9b..1bc353fa 100644
--- a/pentadactyl/NEWS
+++ b/pentadactyl/NEWS
@@ -64,7 +64,7 @@
* :extadd now supports remote URLs as well as local files on Firefox 4.
* Added :if/:elseif/:else/:endif conditionals.
- Added -keyword, -tags, -title to :delbmarks.
- - Added :extupdate command.
+ - Added :extrehash, :exttoggle, :extupdate, and :rehash commands.
- Added :feedkeys command.
- Added -sort option to :history.
- Added several new options, including -javascript, to :abbrev and :map.
diff --git a/pentadactyl/bootstrap.js b/pentadactyl/bootstrap.js
new file mode 120000
index 00000000..ff1024d5
--- /dev/null
+++ b/pentadactyl/bootstrap.js
@@ -0,0 +1 @@
+../common/bootstrap.js
\ No newline at end of file
diff --git a/pentadactyl/chrome.manifest b/pentadactyl/chrome.manifest
index 5b2b12e9..85a3f764 100644
--- a/pentadactyl/chrome.manifest
+++ b/pentadactyl/chrome.manifest
@@ -10,9 +10,6 @@ skin dactyl classic/1.0 ../common/skin/
override chrome://dactyl/content/dactyl.dtd chrome://pentadactyl/content/dactyl.dtd
-overlay chrome://browser/content/browser.xul chrome://dactyl/content/dactyl.xul
-overlay chrome://browser/content/browser.xul chrome://pentadactyl/content/pentadactyl.xul
-
component {16dc34f7-6d22-4aa4-a67f-2921fb5dcb69} components/commandline-handler.js
contract @mozilla.org/commandlinehandler/general-startup;1?type=pentadactyl {16dc34f7-6d22-4aa4-a67f-2921fb5dcb69}
category command-line-handler m-pentadactyl @mozilla.org/commandlinehandler/general-startup;1?type=pentadactyl
diff --git a/pentadactyl/content/config.js b/pentadactyl/content/config.js
index e298ffb4..2ab87d56 100644
--- a/pentadactyl/content/config.js
+++ b/pentadactyl/content/config.js
@@ -7,6 +7,52 @@
"use strict";
const Config = Module("config", ConfigBase, {
+ init: function init() {
+ init.superapply(this, arguments);
+
+ util.overlayWindow(window, {
+ append:
+
+
+
+
+
+
+
+
+ .elements()
+ });
+ },
+
get visualbellWindow() getBrowser().mPanelContainer,
styleableChrome: ["chrome://browser/content/browser.xul"],
@@ -177,7 +223,7 @@ const Config = Module("config", ConfigBase, {
},
{ argCount: "0" });
- commands.add(["sideb[ar]", "sb[ar]", "sbope[n]"],
+ commands.add(["sideb[ar]", "sb[ar]", "sbop[en]"],
"Open the sidebar window",
function (args) {
function compare(a, b) util.compareIgnoreCase(a, b) == 0
diff --git a/pentadactyl/content/pentadactyl.xul b/pentadactyl/content/pentadactyl.xul
deleted file mode 100644
index 719b0e20..00000000
--- a/pentadactyl/content/pentadactyl.xul
+++ /dev/null
@@ -1,58 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/pentadactyl/install.rdf b/pentadactyl/install.rdf
index ce5e76b4..7e7429b7 100644
--- a/pentadactyl/install.rdf
+++ b/pentadactyl/install.rdf
@@ -8,7 +8,8 @@
em:description="Firefox for Vim and Links addicts"
em:homepageURL="http://dactyl.sourceforge.net/pentadactyl"
em:iconURL="chrome://pentadactyl/skin/icon.png"
- em:optionsURL="chrome://dactyl/content/preferences.xul">
+ em:optionsURL="chrome://dactyl/content/preferences.xul"
+ em:bootstrap="true">
Kris Maglione, Doug Kearns
Štěpán Němec