mirror of
https://github.com/gryf/pentadactyl-pm.git
synced 2025-12-19 16:27:58 +01:00
Add missing function name. Fix cleanup on window close. Fix minor mode change bug and add guards.
This commit is contained in:
@@ -15,7 +15,7 @@
|
||||
* @instance buffer
|
||||
*/
|
||||
var Buffer = Module("buffer", {
|
||||
init: function () {
|
||||
init: function init() {
|
||||
this.evaluateXPath = util.evaluateXPath;
|
||||
this.pageInfo = {};
|
||||
|
||||
@@ -165,7 +165,7 @@ var Buffer = Module("buffer", {
|
||||
);
|
||||
},
|
||||
|
||||
climbUrlPath: function (count) {
|
||||
climbUrlPath: function climbUrlPath(count) {
|
||||
let url = buffer.documentURI.clone();
|
||||
dactyl.assert(url instanceof Ci.nsIURL);
|
||||
|
||||
@@ -176,7 +176,7 @@ var Buffer = Module("buffer", {
|
||||
dactyl.open(url.spec);
|
||||
},
|
||||
|
||||
incrementURL: function (count) {
|
||||
incrementURL: function incrementURL(count) {
|
||||
let matches = buffer.uri.spec.match(/(.*?)(\d+)(\D*)$/);
|
||||
dactyl.assert(matches);
|
||||
let oldNum = matches[2];
|
||||
@@ -302,7 +302,7 @@ var Buffer = Module("buffer", {
|
||||
/**
|
||||
* Returns a list of all frames in the given window or current buffer.
|
||||
*/
|
||||
allFrames: function (win, focusedFirst) {
|
||||
allFrames: function allFrames(win, focusedFirst) {
|
||||
let frames = [];
|
||||
(function rec(frame) {
|
||||
if (frame.document.body instanceof HTMLBodyElement)
|
||||
@@ -343,7 +343,7 @@ var Buffer = Module("buffer", {
|
||||
* @param {Node|Window}
|
||||
* @returns {boolean}
|
||||
*/
|
||||
focusAllowed: function (elem) {
|
||||
focusAllowed: function focusAllowed(elem) {
|
||||
if (elem instanceof Window && !Editor.getEditor(elem))
|
||||
return true;
|
||||
let doc = elem.ownerDocument || elem.document || elem;
|
||||
@@ -357,7 +357,7 @@ var Buffer = Module("buffer", {
|
||||
*
|
||||
* @param {Node} elem The element to focus.
|
||||
*/
|
||||
focusElement: function (elem) {
|
||||
focusElement: function focusElement(elem) {
|
||||
let win = elem.ownerDocument && elem.ownerDocument.defaultView || elem;
|
||||
win.document.dactylFocusAllowed = true;
|
||||
|
||||
@@ -427,7 +427,7 @@ var Buffer = Module("buffer", {
|
||||
function followDocumentRelationship(rel) {
|
||||
this.findLink(rel, options[rel + "pattern"], 0, true);
|
||||
}),
|
||||
findLink: function (rel, regexps, count, follow, path) {
|
||||
findLink: function findLink(rel, regexps, count, follow, path) {
|
||||
let selector = path || options.get("hinttags").stringDefaultValue;
|
||||
|
||||
function followFrame(frame) {
|
||||
@@ -475,7 +475,7 @@ var Buffer = Module("buffer", {
|
||||
* @param {number} where Where to open the link. See
|
||||
* {@link dactyl.open}.
|
||||
*/
|
||||
followLink: function (elem, where) {
|
||||
followLink: function followLink(elem, where) {
|
||||
let doc = elem.ownerDocument;
|
||||
let view = doc.defaultView;
|
||||
let { left: offsetX, top: offsetY } = elem.getBoundingClientRect();
|
||||
@@ -538,7 +538,7 @@ var Buffer = Module("buffer", {
|
||||
*
|
||||
* @param {Node} elem The context element.
|
||||
*/
|
||||
openContextMenu: function (elem) {
|
||||
openContextMenu: function openContextMenu(elem) {
|
||||
document.popupNode = elem;
|
||||
let menu = document.getElementById("contentAreaContextMenu");
|
||||
menu.showPopup(elem, -1, -1, "context", "bottomleft", "topleft");
|
||||
@@ -549,7 +549,7 @@ var Buffer = Module("buffer", {
|
||||
*
|
||||
* @param {HTMLAnchorElement} elem The page link to save.
|
||||
*/
|
||||
saveLink: function (elem) {
|
||||
saveLink: function saveLink(elem) {
|
||||
let doc = elem.ownerDocument;
|
||||
let uri = util.newURI(elem.href || elem.src, null, util.newURI(elem.baseURI));
|
||||
let referrer = util.newURI(doc.documentURI, doc.characterSet);
|
||||
@@ -588,7 +588,7 @@ var Buffer = Module("buffer", {
|
||||
* @param {nsIURI} uri The URI to save
|
||||
* @param {nsIFile} file The file into which to write the result.
|
||||
*/
|
||||
saveURI: function (uri, file, callback, self) {
|
||||
saveURI: function saveURI(uri, file, callback, self) {
|
||||
var persist = services.Persist();
|
||||
persist.persistFlags = persist.PERSIST_FLAGS_FROM_CACHE
|
||||
| persist.PERSIST_FLAGS_REPLACE_EXISTING_FILES;
|
||||
@@ -645,7 +645,7 @@ var Buffer = Module("buffer", {
|
||||
* @param {number} count The multiple of 'scroll' lines to scroll.
|
||||
* @optional
|
||||
*/
|
||||
scrollByScrollSize: function (direction, count) {
|
||||
scrollByScrollSize: function scrollByScrollSize(direction, count) {
|
||||
direction = direction ? 1 : -1;
|
||||
count = count || 1;
|
||||
|
||||
@@ -732,7 +732,7 @@ var Buffer = Module("buffer", {
|
||||
* @param {number} count The number of frames to skip through. A negative
|
||||
* count skips backwards.
|
||||
*/
|
||||
shiftFrameFocus: function (count) {
|
||||
shiftFrameFocus: function shiftFrameFocus(count) {
|
||||
if (!(content.document instanceof HTMLDocument))
|
||||
return;
|
||||
|
||||
@@ -780,7 +780,7 @@ var Buffer = Module("buffer", {
|
||||
*
|
||||
* @param {Node} elem The element to query.
|
||||
*/
|
||||
showElementInfo: function (elem) {
|
||||
showElementInfo: function showElementInfo(elem) {
|
||||
dactyl.echo(<>Element:<br/>{util.objectToString(elem, true)}</>, commandline.FORCE_MULTILINE);
|
||||
},
|
||||
|
||||
@@ -791,7 +791,7 @@ var Buffer = Module("buffer", {
|
||||
* @param {string} sections A string limiting the displayed sections.
|
||||
* @default The value of 'pageinfo'.
|
||||
*/
|
||||
showPageInfo: function (verbose, sections) {
|
||||
showPageInfo: function showPageInfo(verbose, sections) {
|
||||
// Ctrl-g single line output
|
||||
if (!verbose) {
|
||||
let file = content.location.pathname.split("/").pop() || "[No Name]";
|
||||
@@ -830,7 +830,7 @@ var Buffer = Module("buffer", {
|
||||
* Opens a viewer to inspect the source of the currently selected
|
||||
* range.
|
||||
*/
|
||||
viewSelectionSource: function () {
|
||||
viewSelectionSource: function viewSelectionSource() {
|
||||
// copied (and tuned somewhat) from browser.jar -> nsContextMenu.js
|
||||
let win = document.commandDispatcher.focusedWindow;
|
||||
if (win == window)
|
||||
@@ -852,7 +852,7 @@ var Buffer = Module("buffer", {
|
||||
* @default The current buffer.
|
||||
* @param {boolean} useExternalEditor View the source in the external editor.
|
||||
*/
|
||||
viewSource: function (url, useExternalEditor) {
|
||||
viewSource: function viewSource(url, useExternalEditor) {
|
||||
let doc = this.focusedFrame.document;
|
||||
|
||||
if (isArray(url)) {
|
||||
@@ -893,7 +893,7 @@ var Buffer = Module("buffer", {
|
||||
*/
|
||||
viewSourceExternally: Class("viewSourceExternally",
|
||||
XPCOM([Ci.nsIWebProgressListener, Ci.nsISupportsWeakReference]), {
|
||||
init: function (doc, callback) {
|
||||
init: function init(doc, callback) {
|
||||
this.callback = callable(callback) ? callback :
|
||||
function (file, temp) {
|
||||
editor.editFileExternally({ file: file.path, line: callback },
|
||||
@@ -924,7 +924,7 @@ var Buffer = Module("buffer", {
|
||||
return null;
|
||||
},
|
||||
|
||||
onStateChange: function (progress, request, flag, status) {
|
||||
onStateChange: function onStateChange(progress, request, flag, status) {
|
||||
if ((flag & this.STATE_STOP) && status == 0) {
|
||||
try {
|
||||
var ok = this.callback(this.file, true);
|
||||
@@ -944,7 +944,7 @@ var Buffer = Module("buffer", {
|
||||
* @param {number} steps The number of zoom levels to jump.
|
||||
* @param {boolean} fullZoom Whether to use full zoom or text zoom.
|
||||
*/
|
||||
zoomIn: function (steps, fullZoom) {
|
||||
zoomIn: function zoomIn(steps, fullZoom) {
|
||||
this.bumpZoomLevel(steps, fullZoom);
|
||||
},
|
||||
|
||||
@@ -954,7 +954,7 @@ var Buffer = Module("buffer", {
|
||||
* @param {number} steps The number of zoom levels to jump.
|
||||
* @param {boolean} fullZoom Whether to use full zoom or text zoom.
|
||||
*/
|
||||
zoomOut: function (steps, fullZoom) {
|
||||
zoomOut: function zoomOut(steps, fullZoom) {
|
||||
this.bumpZoomLevel(-steps, fullZoom);
|
||||
},
|
||||
|
||||
@@ -1037,7 +1037,7 @@ var Buffer = Module("buffer", {
|
||||
*
|
||||
* @returns {string}
|
||||
*/
|
||||
currentWord: function (win) {
|
||||
currentWord: function currentWord(win) {
|
||||
let selection = win.getSelection();
|
||||
if (selection.rangeCount == 0)
|
||||
return "";
|
||||
@@ -1206,7 +1206,7 @@ var Buffer = Module("buffer", {
|
||||
|
||||
openUploadPrompt: function openUploadPrompt(elem) {
|
||||
io.CommandFileMode("Upload file: ", {
|
||||
onSubmit: function (path) {
|
||||
onSubmit: function onSubmit(path) {
|
||||
let file = io.File(path);
|
||||
dactyl.assert(file.exists());
|
||||
|
||||
@@ -1216,7 +1216,7 @@ var Buffer = Module("buffer", {
|
||||
}).open(elem.value);
|
||||
}
|
||||
}, {
|
||||
commands: function () {
|
||||
commands: function initCommands(dactyl, modules, window) {
|
||||
commands.add(["frameo[nly]"],
|
||||
"Show only the current frame's page",
|
||||
function (args) {
|
||||
@@ -1417,7 +1417,7 @@ var Buffer = Module("buffer", {
|
||||
bang: true
|
||||
});
|
||||
},
|
||||
completion: function () {
|
||||
completion: function initCompletion(dactyl, modules, window) {
|
||||
completion.alternateStyleSheet = function alternateStylesheet(context) {
|
||||
context.title = ["Stylesheet", "Location"];
|
||||
|
||||
@@ -1496,10 +1496,10 @@ var Buffer = Module("buffer", {
|
||||
});
|
||||
};
|
||||
},
|
||||
events: function () {
|
||||
events: function initEvents(dactyl, modules, window) {
|
||||
events.listen(config.browser, "scroll", buffer.closure._updateBufferPosition, false);
|
||||
},
|
||||
mappings: function () {
|
||||
mappings: function initMappings(dactyl, modules, window) {
|
||||
mappings.add([modes.NORMAL],
|
||||
["y", "<yank-location>"], "Yank current location to the clipboard",
|
||||
function () { dactyl.clipboardWrite(buffer.uri.spec, true); });
|
||||
@@ -1774,7 +1774,7 @@ var Buffer = Module("buffer", {
|
||||
"Print file information",
|
||||
function () { buffer.showPageInfo(true); });
|
||||
},
|
||||
options: function () {
|
||||
options: function initOptions(dactyl, modules, window) {
|
||||
options.add(["encoding", "enc"],
|
||||
"The current buffer's character encoding",
|
||||
"string", "UTF-8",
|
||||
|
||||
@@ -88,9 +88,9 @@ var CommandWidgets = Class("CommandWidgets", {
|
||||
|
||||
this.addElement({
|
||||
name: "command",
|
||||
test: function (stack, prev) stack.pop && !isinstance(prev.main, modes.COMMAND_LINE),
|
||||
test: function test(stack, prev) stack.pop && !isinstance(prev.main, modes.COMMAND_LINE),
|
||||
id: "commandline-command",
|
||||
get: function (elem) {
|
||||
get: function command_get(elem) {
|
||||
// The long path is because of complications with the
|
||||
// completion preview.
|
||||
try {
|
||||
@@ -102,7 +102,7 @@ var CommandWidgets = Class("CommandWidgets", {
|
||||
},
|
||||
getElement: CommandWidgets.getEditor,
|
||||
getGroup: function (value) this.activeGroup.commandline,
|
||||
onChange: function (elem, value) {
|
||||
onChange: function command_onChange(elem, value) {
|
||||
if (elem.inputField != dactyl.focusedElement)
|
||||
try {
|
||||
elem.selectionStart = elem.value.length;
|
||||
@@ -113,7 +113,7 @@ var CommandWidgets = Class("CommandWidgets", {
|
||||
if (!elem.collapsed)
|
||||
dactyl.focus(elem);
|
||||
},
|
||||
onVisibility: function (elem, visible) {
|
||||
onVisibility: function command_onVisibility(elem, visible) {
|
||||
if (visible)
|
||||
dactyl.focus(elem);
|
||||
}
|
||||
@@ -431,8 +431,8 @@ var CommandExMode = Class("CommandExMode", CommandMode, {
|
||||
|
||||
onSubmit: function onSubmit(command) {
|
||||
contexts.withContext({ file: "[Command Line]", line: 1 },
|
||||
function () {
|
||||
io.withSavedValues(["readHeredoc"], function () {
|
||||
function _onSubmit() {
|
||||
io.withSavedValues(["readHeredoc"], function _onSubmit() {
|
||||
this.readHeredoc = commandline.readHeredoc;
|
||||
commands.repeat = command;
|
||||
dactyl.execute(command);
|
||||
|
||||
@@ -66,6 +66,7 @@ var Dactyl = Module("dactyl", XPCOM(Ci.nsISupportsWeakReference, ModuleBase), {
|
||||
|
||||
for (let mod in values(mods))
|
||||
if (mod instanceof ModuleBase || mod && mod.isLocalModule) {
|
||||
mod.stale = true;
|
||||
if ("cleanup" in mod)
|
||||
this.trapErrors(mod.cleanup, mod);
|
||||
if ("destroy" in mod)
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
/** @scope modules */
|
||||
|
||||
var Modes = Module("modes", {
|
||||
init: function () {
|
||||
init: function init() {
|
||||
this.modeChars = {};
|
||||
this._main = 1; // NORMAL
|
||||
this._extended = 0; // NONE
|
||||
@@ -197,11 +197,11 @@ var Modes = Module("modes", {
|
||||
}
|
||||
});
|
||||
},
|
||||
cleanup: function () {
|
||||
cleanup: function cleanup() {
|
||||
modes.reset();
|
||||
},
|
||||
|
||||
_getModeMessage: function () {
|
||||
_getModeMessage: function _getModeMessage() {
|
||||
// when recording a macro
|
||||
let macromode = "";
|
||||
if (this.recording)
|
||||
@@ -217,7 +217,7 @@ var Modes = Module("modes", {
|
||||
|
||||
NONE: 0,
|
||||
|
||||
__iterator__: function () array.iterValues(this.all),
|
||||
__iterator__: function __iterator__() array.iterValues(this.all),
|
||||
|
||||
get all() this._modes.slice(),
|
||||
|
||||
@@ -229,7 +229,7 @@ var Modes = Module("modes", {
|
||||
|
||||
get topOfStack() this._modeStack[this._modeStack.length - 1],
|
||||
|
||||
addMode: function (name, options, params) {
|
||||
addMode: function addMode(name, options, params) {
|
||||
let mode = Modes.Mode(name, options, params);
|
||||
|
||||
this[name] = mode;
|
||||
@@ -245,23 +245,23 @@ var Modes = Module("modes", {
|
||||
dactyl.triggerObserver("mode-add", mode);
|
||||
},
|
||||
|
||||
dumpStack: function () {
|
||||
dumpStack: function dumpStack() {
|
||||
util.dump("Mode stack:");
|
||||
for (let [i, mode] in array.iterItems(this._modeStack))
|
||||
util.dump(" " + i + ": " + mode);
|
||||
},
|
||||
|
||||
getMode: function (name) this._modeMap[name],
|
||||
getMode: function getMode(name) this._modeMap[name],
|
||||
|
||||
getStack: function (idx) this._modeStack[this._modeStack.length - idx - 1] || this._modeStack[0],
|
||||
getStack: function getStack(idx) this._modeStack[this._modeStack.length - idx - 1] || this._modeStack[0],
|
||||
|
||||
get stack() this._modeStack.slice(),
|
||||
|
||||
getCharModes: function (chr) (this.modeChars[chr] || []).slice(),
|
||||
getCharModes: function getCharModes(chr) (this.modeChars[chr] || []).slice(),
|
||||
|
||||
have: function have(mode) this._modeStack.some(function (m) isinstance(m.main, mode)),
|
||||
|
||||
matchModes: function (obj)
|
||||
matchModes: function matchModes(obj)
|
||||
this._modes.filter(function (mode) Object.keys(obj)
|
||||
.every(function (k) obj[k] == (mode[k] || false))),
|
||||
|
||||
@@ -287,7 +287,7 @@ var Modes = Module("modes", {
|
||||
},
|
||||
|
||||
delayed: [],
|
||||
delay: function (callback, self) { this.delayed.push([callback, self]); },
|
||||
delay: function delay(callback, self) { this.delayed.push([callback, self]); },
|
||||
|
||||
save: function save(id, obj, prop, test) {
|
||||
if (!(id in this.boundProperties))
|
||||
@@ -296,14 +296,26 @@ var Modes = Module("modes", {
|
||||
this.boundProperties[id] = { obj: Cu.getWeakReference(obj), prop: prop, test: test };
|
||||
},
|
||||
|
||||
inSet: false,
|
||||
|
||||
// helper function to set both modes in one go
|
||||
set: function set(mainMode, extendedMode, params, stack) {
|
||||
var delayed, oldExtended, oldMain, prev, push;
|
||||
|
||||
if (this.inSet) {
|
||||
dactyl.reportError(Error("Not executing modes.set recursively"), true);
|
||||
return;
|
||||
}
|
||||
|
||||
this.withSavedValues(["inSet"], function set() {
|
||||
this.inSet = true;
|
||||
|
||||
params = params || this.getMode(mainMode || this.main).params;
|
||||
|
||||
if (!stack && mainMode != null && this._modeStack.length > 1)
|
||||
this.reset();
|
||||
|
||||
let oldMain = this._main, oldExtended = this._extended;
|
||||
oldMain = this._main, oldExtended = this._extended;
|
||||
|
||||
if (extendedMode != null)
|
||||
this._extended = extendedMode;
|
||||
@@ -317,7 +329,7 @@ var Modes = Module("modes", {
|
||||
dactyl.trapErrors("leave", stack.pop.params,
|
||||
stack, this.topOfStack);
|
||||
|
||||
let push = mainMode != null && !(stack && stack.pop) &&
|
||||
push = mainMode != null && !(stack && stack.pop) &&
|
||||
Modes.StackElement(this._main, this._extended, params, {});
|
||||
|
||||
if (push && this.topOfStack) {
|
||||
@@ -333,19 +345,20 @@ var Modes = Module("modes", {
|
||||
}
|
||||
}
|
||||
|
||||
let delayed = this.delayed;
|
||||
delayed = this.delayed;
|
||||
this.delayed = [];
|
||||
|
||||
let prev = stack && stack.pop || this.topOfStack;
|
||||
prev = stack && stack.pop || this.topOfStack;
|
||||
if (push)
|
||||
this._modeStack.push(push);
|
||||
|
||||
if (stack && stack.pop)
|
||||
for (let { obj, prop, value, test } in values(this.topOfStack.saved))
|
||||
if (!test || !test(stack, prev))
|
||||
obj[prop] = value;
|
||||
dactyl.trapErrors(function () { obj[prop] = value });
|
||||
|
||||
this.show();
|
||||
});
|
||||
|
||||
delayed.forEach(function ([fn, self]) dactyl.trapErrors(fn, self));
|
||||
|
||||
@@ -417,7 +430,7 @@ var Modes = Module("modes", {
|
||||
}, options);
|
||||
},
|
||||
|
||||
isinstance: function (obj)
|
||||
isinstance: function isinstance(obj)
|
||||
this === obj || this.allBases.indexOf(obj) >= 0 || callable(obj) && this instanceof obj,
|
||||
|
||||
allBases: Class.memoize(function () {
|
||||
@@ -436,17 +449,17 @@ var Modes = Module("modes", {
|
||||
|
||||
get description() this._display,
|
||||
|
||||
_display: Class.memoize(function () this.name.replace("_", " ", "g")),
|
||||
_display: Class.memoize(function _display() this.name.replace("_", " ", "g")),
|
||||
|
||||
display: function () this._display,
|
||||
display: function display() this._display,
|
||||
|
||||
extended: false,
|
||||
|
||||
hidden: false,
|
||||
|
||||
input: Class.memoize(function () this.bases.length && this.bases.some(function (b) b.input)),
|
||||
input: Class.memoize(function input() this.bases.length && this.bases.some(function (b) b.input)),
|
||||
|
||||
ownsFocus: Class.memoize(function () this.bases.length && this.bases.some(function (b) b.ownsFocus)),
|
||||
ownsFocus: Class.memoize(function ownsFocus() this.bases.length && this.bases.some(function (b) b.ownsFocus)),
|
||||
|
||||
get passUnknown() this.input,
|
||||
|
||||
@@ -454,7 +467,7 @@ var Modes = Module("modes", {
|
||||
|
||||
get toStringParams() [this.name],
|
||||
|
||||
valueOf: function () this.id
|
||||
valueOf: function valueOf() this.id
|
||||
}, {
|
||||
_id: 0
|
||||
}),
|
||||
@@ -472,19 +485,21 @@ var Modes = Module("modes", {
|
||||
return StackElement;
|
||||
})(),
|
||||
cacheId: 0,
|
||||
boundProperty: function boundProperty(desc) {
|
||||
boundProperty: function BoundProperty(desc) {
|
||||
let id = this.cacheId++;
|
||||
let value;
|
||||
|
||||
desc = desc || {};
|
||||
let id = this.cacheId++, value;
|
||||
return Class.Property(update({
|
||||
enumerable: true,
|
||||
configurable: true,
|
||||
init: function (prop) update(this, {
|
||||
get: function () {
|
||||
enumerable: true,
|
||||
init: function bound_init(prop) update(this, {
|
||||
get: function bound_get() {
|
||||
if (desc.get)
|
||||
var val = desc.get.call(this, value);
|
||||
return val === undefined ? value : val;
|
||||
},
|
||||
set: function (val) {
|
||||
set: function bound_set(val) {
|
||||
modes.save(id, this, prop, desc.test);
|
||||
if (desc.set)
|
||||
value = desc.set.call(this, val);
|
||||
|
||||
@@ -7,9 +7,9 @@
|
||||
"use strict";
|
||||
|
||||
var MOW = Module("mow", {
|
||||
init: function () {
|
||||
init: function init() {
|
||||
|
||||
this._resize = Timer(20, 400, function () {
|
||||
this._resize = Timer(20, 400, function _resize() {
|
||||
if (this.visible)
|
||||
this.resize(false);
|
||||
|
||||
@@ -17,7 +17,7 @@ var MOW = Module("mow", {
|
||||
this.updateMorePrompt();
|
||||
}, this);
|
||||
|
||||
this._timer = Timer(20, 400, function () {
|
||||
this._timer = Timer(20, 400, function _timer() {
|
||||
if (modes.have(modes.OUTPUT_MULTILINE)) {
|
||||
this.resize(true);
|
||||
|
||||
@@ -80,9 +80,9 @@ var MOW = Module("mow", {
|
||||
__noSuchMethod__: function (meth, args) Buffer[meth].apply(Buffer, [this.body].concat(args)),
|
||||
|
||||
get widget() this.widgets.multilineOutput,
|
||||
widgets: Class.memoize(function () commandline.widgets),
|
||||
widgets: Class.memoize(function widgets() commandline.widgets),
|
||||
|
||||
body: Class.memoize(function () this.widget.contentDocument.documentElement),
|
||||
body: Class.memoize(function body() this.widget.contentDocument.documentElement),
|
||||
get document() this.widget.contentDocument,
|
||||
get window() this.widget.contentWindow,
|
||||
|
||||
@@ -195,7 +195,7 @@ var MOW = Module("mow", {
|
||||
},
|
||||
|
||||
contextEvents: {
|
||||
popupshowing: function (event) {
|
||||
popupshowing: function onPopupShowing(event) {
|
||||
let menu = commandline.widgets.contextMenu;
|
||||
let enabled = {
|
||||
link: window.document.popupNode instanceof HTMLAnchorElement,
|
||||
@@ -229,7 +229,7 @@ var MOW = Module("mow", {
|
||||
* @param {boolean} open If true, the widget will be opened if it's not
|
||||
* already so.
|
||||
*/
|
||||
resize: function updateOutputHeight(open, extra) {
|
||||
resize: function resize(open, extra) {
|
||||
if (!(open || this.visible))
|
||||
return;
|
||||
|
||||
@@ -266,7 +266,6 @@ var MOW = Module("mow", {
|
||||
* and what they do.
|
||||
*/
|
||||
updateMorePrompt: function updateMorePrompt(force, showHelp) {
|
||||
util.dump("\n"); modes.dumpStack(); util.dumpStack(); util.dump("\n");
|
||||
if (!this.visible || !isinstance(modes.main, modes.OUTPUT_MULTILINE))
|
||||
return this.widgets.message = null;
|
||||
|
||||
@@ -286,13 +285,19 @@ var MOW = Module("mow", {
|
||||
this.widgets.mowContainer.collapsed = !value;
|
||||
|
||||
let elem = this.widget;
|
||||
if (!value && elem && elem.contentWindow == document.commandDispatcher.focusedWindow)
|
||||
if (!value && elem && elem.contentWindow == document.commandDispatcher.focusedWindow) {
|
||||
|
||||
let focused = content.document.activeElement;
|
||||
if (Events.isInputElement(focused))
|
||||
focused.blur();
|
||||
|
||||
document.commandDispatcher.focusedWindow = content;
|
||||
}
|
||||
}
|
||||
})
|
||||
}, {
|
||||
}, {
|
||||
mappings: function () {
|
||||
mappings: function initMappings() {
|
||||
const PASS = true;
|
||||
const DROP = false;
|
||||
const BEEP = {};
|
||||
@@ -376,7 +381,7 @@ var MOW = Module("mow", {
|
||||
function () {},
|
||||
function () false, DROP);
|
||||
},
|
||||
options: function () {
|
||||
options: function initOptions() {
|
||||
options.add(["more"],
|
||||
"Pause the message list window when the full output will not fit on one page",
|
||||
"boolean", true);
|
||||
|
||||
@@ -828,9 +828,9 @@ Class.prototype = {
|
||||
* Initializes new instances of this class. Called automatically
|
||||
* when new instances are created.
|
||||
*/
|
||||
init: function () {},
|
||||
init: function c_init() {},
|
||||
|
||||
withSavedValues: function (names, callback, self) {
|
||||
withSavedValues: function withSavedValues(names, callback, self) {
|
||||
let vals = names.map(function (name) this[name], this);
|
||||
try {
|
||||
return callback.call(self || this);
|
||||
@@ -840,7 +840,7 @@ Class.prototype = {
|
||||
}
|
||||
},
|
||||
|
||||
toString: function () {
|
||||
toString: function C_toString() {
|
||||
if (this.toStringParams)
|
||||
var params = "(" + this.toStringParams.map(function (m) isArray(m) ? "[" + m + "]" :
|
||||
isString(m) ? m.quote() : String(m))
|
||||
@@ -857,19 +857,20 @@ Class.prototype = {
|
||||
* before calling *callback*.
|
||||
* @returns {nsITimer} The timer which backs this timeout.
|
||||
*/
|
||||
timeout: function (callback, timeout) {
|
||||
timeout: function timeout(callback, timeout) {
|
||||
const self = this;
|
||||
function notify(timer) {
|
||||
if (util.rehashing && !isinstance(Cu.getGlobalForObject(callback), ["BackstagePass"]))
|
||||
function timeout_notify(timer) {
|
||||
if (self.stale ||
|
||||
util.rehashing && !isinstance(Cu.getGlobalForObject(callback), ["BackstagePass"]))
|
||||
return;
|
||||
util.trapErrors(callback, self);
|
||||
}
|
||||
return services.Timer(notify, timeout || 0, services.Timer.TYPE_ONE_SHOT);
|
||||
return services.Timer(timeout_notify, timeout || 0, services.Timer.TYPE_ONE_SHOT);
|
||||
}
|
||||
};
|
||||
memoize(Class.prototype, "closure", function () {
|
||||
memoize(Class.prototype, "closure", function closure() {
|
||||
const self = this;
|
||||
function closure(fn) function () {
|
||||
function closure(fn) function _closure() {
|
||||
try {
|
||||
return fn.apply(self, arguments);
|
||||
}
|
||||
@@ -919,7 +920,7 @@ function XPCOM(interfaces, superClass) {
|
||||
*/
|
||||
var ErrorBase = Class("ErrorBase", Error, {
|
||||
level: 2,
|
||||
init: function (message, level) {
|
||||
init: function EB_init(message, level) {
|
||||
level = level || 0;
|
||||
update(this, Error(message))
|
||||
this.message = message;
|
||||
@@ -957,7 +958,7 @@ function Module(name, prototype) {
|
||||
return module;
|
||||
}
|
||||
Module.INIT = {
|
||||
init: function (dactyl, modules, window) {
|
||||
init: function Module_INIT_init(dactyl, modules, window) {
|
||||
let args = arguments;
|
||||
|
||||
let locals = [];
|
||||
@@ -1008,28 +1009,28 @@ function Struct() {
|
||||
return Struct;
|
||||
}
|
||||
let StructBase = Class("StructBase", Array, {
|
||||
init: function () {
|
||||
init: function struct_init() {
|
||||
for (let i = 0; i < arguments.length; i++)
|
||||
if (arguments[i] != undefined)
|
||||
this[i] = arguments[i];
|
||||
},
|
||||
|
||||
clone: function clone() this.constructor.apply(null, this.slice()),
|
||||
clone: function struct_clone() this.constructor.apply(null, this.slice()),
|
||||
|
||||
closure: Class.Property(Object.getOwnPropertyDescriptor(Class.prototype, "closure")),
|
||||
|
||||
get: function (key, val) this[this.members[key]],
|
||||
set: function (key, val) this[this.members[key]] = val,
|
||||
get: function struct_get(key, val) this[this.members[key]],
|
||||
set: function struct_set(key, val) this[this.members[key]] = val,
|
||||
|
||||
toString: function () Class.prototype.toString.apply(this, arguments),
|
||||
toString: function struct_toString() Class.prototype.toString.apply(this, arguments),
|
||||
|
||||
// Iterator over our named members
|
||||
__iterator__: function () {
|
||||
__iterator__: function struct__iterator__() {
|
||||
let self = this;
|
||||
return ([k, self[k]] for (k in keys(self.members)))
|
||||
}
|
||||
}, {
|
||||
fromArray: function (ary) {
|
||||
fromArray: function fromArray(ary) {
|
||||
if (!(ary instanceof this))
|
||||
ary.__proto__ = this.prototype;
|
||||
return ary;
|
||||
@@ -1045,7 +1046,7 @@ let StructBase = Class("StructBase", Array, {
|
||||
* @param {function} val The function which is to generate
|
||||
* the default value.
|
||||
*/
|
||||
defaultValue: function (key, val) {
|
||||
defaultValue: function defaultValue(key, val) {
|
||||
let i = this.prototype.members[key];
|
||||
this.prototype.__defineGetter__(i, function () (this[i] = val.call(this)));
|
||||
this.prototype.__defineSetter__(i, function (value)
|
||||
@@ -1054,7 +1055,7 @@ let StructBase = Class("StructBase", Array, {
|
||||
});
|
||||
|
||||
var Timer = Class("Timer", {
|
||||
init: function (minInterval, maxInterval, callback, self) {
|
||||
init: function init(minInterval, maxInterval, callback, self) {
|
||||
this._timer = services.Timer();
|
||||
this.callback = callback;
|
||||
this.self = self || this;
|
||||
@@ -1064,7 +1065,7 @@ var Timer = Class("Timer", {
|
||||
this.latest = 0;
|
||||
},
|
||||
|
||||
notify: function (timer, force) {
|
||||
notify: function notify(timer, force) {
|
||||
try {
|
||||
if (!loaded || loaded.util && util.rehashing || typeof util === "undefined" || !force && this.doneAt == 0)
|
||||
return;
|
||||
@@ -1087,7 +1088,7 @@ var Timer = Class("Timer", {
|
||||
}
|
||||
},
|
||||
|
||||
tell: function (arg) {
|
||||
tell: function tell(arg) {
|
||||
if (arguments.length > 0)
|
||||
this.arg = arg;
|
||||
|
||||
@@ -1107,12 +1108,12 @@ var Timer = Class("Timer", {
|
||||
this.doneAt = -1;
|
||||
},
|
||||
|
||||
reset: function () {
|
||||
reset: function reset() {
|
||||
this._timer.cancel();
|
||||
this.doneAt = 0;
|
||||
},
|
||||
|
||||
flush: function (force) {
|
||||
flush: function flush(force) {
|
||||
if (this.doneAt == -1 || force)
|
||||
this.notify(null, true);
|
||||
}
|
||||
|
||||
@@ -66,7 +66,7 @@ update(CommandOption, {
|
||||
* @property {object} The option accepts a boolean argument.
|
||||
* @final
|
||||
*/
|
||||
BOOL: ArgType("boolean", function (val) Commands.parseBool(val)),
|
||||
BOOL: ArgType("boolean", function parseBool(val) Commands.parseBool(val)),
|
||||
/**
|
||||
* @property {object} The option accepts a string argument.
|
||||
* @final
|
||||
@@ -76,18 +76,18 @@ update(CommandOption, {
|
||||
* @property {object} The option accepts an integer argument.
|
||||
* @final
|
||||
*/
|
||||
INT: ArgType("int", function (val) parseInt(val)),
|
||||
INT: ArgType("int", function parseInt(val) parseInt(val)),
|
||||
/**
|
||||
* @property {object} The option accepts a float argument.
|
||||
* @final
|
||||
*/
|
||||
FLOAT: ArgType("float", function (val) parseFloat(val)),
|
||||
FLOAT: ArgType("float", function parseFloat(val) parseFloat(val)),
|
||||
/**
|
||||
* @property {object} The option accepts a string list argument.
|
||||
* E.g. "foo,bar"
|
||||
* @final
|
||||
*/
|
||||
LIST: ArgType("list", function (arg, quoted) Option.splitList(quoted))
|
||||
LIST: ArgType("list", function parseList(arg, quoted) Option.splitList(quoted))
|
||||
});
|
||||
|
||||
/**
|
||||
@@ -116,7 +116,7 @@ update(CommandOption, {
|
||||
* @private
|
||||
*/
|
||||
var Command = Class("Command", {
|
||||
init: function (specs, description, action, extraInfo) {
|
||||
init: function init(specs, description, action, extraInfo) {
|
||||
specs = Array.concat(specs); // XXX
|
||||
let parsedSpecs = extraInfo.parsedSpecs || Command.parseSpecs(specs);
|
||||
|
||||
@@ -147,7 +147,7 @@ var Command = Class("Command", {
|
||||
* @param {Args} args The Args object passed to {@link #action}.
|
||||
* @param {Object} modifiers Any modifiers to be passed to {@link #action}.
|
||||
*/
|
||||
execute: function (args, modifiers) {
|
||||
execute: function execute(args, modifiers) {
|
||||
const { dactyl } = this.modules;
|
||||
|
||||
let context = args.context;
|
||||
@@ -184,7 +184,7 @@ var Command = Class("Command", {
|
||||
* @param {string} name The candidate name.
|
||||
* @returns {boolean}
|
||||
*/
|
||||
hasName: function (name) this.parsedSpecs.some(
|
||||
hasName: function hasName(name) this.parsedSpecs.some(
|
||||
function ([long, short]) name.indexOf(short) == 0 && long.indexOf(name) == 0),
|
||||
|
||||
/**
|
||||
@@ -276,22 +276,22 @@ var Command = Class("Command", {
|
||||
.map(function (opt) opt.names.map(function (name) [name, opt]))
|
||||
.flatten().toObject()),
|
||||
|
||||
newArgs: function (base) {
|
||||
newArgs: function newArgs(base) {
|
||||
let res = [];
|
||||
update(res, base);
|
||||
res.__proto__ = this.argsPrototype;
|
||||
return res;
|
||||
},
|
||||
|
||||
argsPrototype: Class.memoize(function () {
|
||||
argsPrototype: Class.memoize(function argsPrototype() {
|
||||
let res = update([], {
|
||||
__iterator__: function () array.iterItems(this),
|
||||
__iterator__: function AP__iterator__() array.iterItems(this),
|
||||
|
||||
command: this,
|
||||
|
||||
explicitOpts: Class.memoize(function () ({})),
|
||||
|
||||
has: function (opt) set.has(this.explicitOpts, opt) || typeof opt === "number" && set.has(this, opt),
|
||||
has: function AP_has(opt) set.has(this.explicitOpts, opt) || typeof opt === "number" && set.has(this, opt),
|
||||
|
||||
get literalArg() this.command.literal != null && this[this.command.literal] || "",
|
||||
|
||||
@@ -378,7 +378,7 @@ var Ex = Module("Ex", {
|
||||
get context() modules.contexts.context
|
||||
}),
|
||||
|
||||
_args: function (cmd, args) {
|
||||
_args: function E_args(cmd, args) {
|
||||
args = Array.slice(args);
|
||||
|
||||
let res = cmd.newArgs({ context: this.context });
|
||||
@@ -401,7 +401,7 @@ var Ex = Module("Ex", {
|
||||
return res;
|
||||
},
|
||||
|
||||
_complete: function (cmd) let (self = this)
|
||||
_complete: function E_complete(cmd) let (self = this)
|
||||
function _complete(context, func, obj, args) {
|
||||
args = self._args(cmd, args);
|
||||
args.completeArg = args.length - 1;
|
||||
@@ -409,7 +409,7 @@ var Ex = Module("Ex", {
|
||||
return cmd.completer(context, args);
|
||||
},
|
||||
|
||||
_run: function (name) {
|
||||
_run: function E_run(name) {
|
||||
const self = this;
|
||||
let cmd = this.commands.get(name);
|
||||
util.assert(cmd, "No such command");
|
||||
@@ -423,7 +423,7 @@ var Ex = Module("Ex", {
|
||||
});
|
||||
},
|
||||
|
||||
__noSuchMethod__: function (meth, args) this._run(meth).apply(this, args)
|
||||
__noSuchMethod__: function __noSuchMethod__(meth, args) this._run(meth).apply(this, args)
|
||||
});
|
||||
|
||||
var CommandHive = Class("CommandHive", Contexts.Hive, {
|
||||
@@ -434,7 +434,7 @@ var CommandHive = Class("CommandHive", Contexts.Hive, {
|
||||
},
|
||||
|
||||
/** @property {Iterator(Command)} @private */
|
||||
__iterator__: function () array.iterValues(this._list.sort(function (a, b) a.name > b.name)),
|
||||
__iterator__: function __iterator__() array.iterValues(this._list.sort(function (a, b) a.name > b.name)),
|
||||
|
||||
/** @property {string} The last executed Ex command line. */
|
||||
repeat: null,
|
||||
@@ -450,7 +450,7 @@ var CommandHive = Class("CommandHive", Contexts.Hive, {
|
||||
* @param {Object} extra An optional extra configuration hash.
|
||||
* @optional
|
||||
*/
|
||||
add: function (names, description, action, extra, replace) {
|
||||
add: function add(names, description, action, extra, replace) {
|
||||
const { commands, contexts } = this.modules;
|
||||
|
||||
extra = extra || {};
|
||||
@@ -486,7 +486,7 @@ var CommandHive = Class("CommandHive", Contexts.Hive, {
|
||||
return name;
|
||||
},
|
||||
|
||||
_add: function (names, description, action, extra, replace) {
|
||||
_add: function _add(names, description, action, extra, replace) {
|
||||
const { contexts } = this.modules;
|
||||
|
||||
extra = extra || {};
|
||||
@@ -540,7 +540,7 @@ var Commands = Module("commands", {
|
||||
lazyInit: true,
|
||||
|
||||
Local: function Local(dactyl, modules, window) let ({ Group, contexts } = modules) ({
|
||||
init: function () {
|
||||
init: function init() {
|
||||
this.Command = Class("Command", Command, { modules: modules });
|
||||
update(this, {
|
||||
hives: contexts.Hives("commands", Class("CommandHive", CommandHive, { modules: modules })),
|
||||
@@ -569,11 +569,11 @@ var Commands = Module("commands", {
|
||||
* the file that is being or has been sourced to obtain the
|
||||
* command string.
|
||||
*/
|
||||
execute: function (string, tokens, silent, args, context) {
|
||||
execute: function execute(string, tokens, silent, args, context) {
|
||||
contexts.withContext(context || this.context || { file: "[Command Line]", line: 1 },
|
||||
function (context) {
|
||||
modules.io.withSavedValues(["readHeredoc"], function () {
|
||||
this.readHeredoc = function (end) {
|
||||
this.readHeredoc = function readHeredoc(end) {
|
||||
let res = [];
|
||||
contexts.context.line++;
|
||||
while (++i < lines.length) {
|
||||
@@ -679,14 +679,14 @@ var Commands = Module("commands", {
|
||||
COUNT_ALL: -2, // :%...
|
||||
|
||||
/** @property {Iterator(Command)} @private */
|
||||
iterator: function () iter.apply(null, this.hives)
|
||||
iterator: function iterator() iter.apply(null, this.hives)
|
||||
.sort(function (a, b) a.serialGroup - b.serialGroup || a.name > b.name)
|
||||
.iterValues(),
|
||||
|
||||
/** @property {string} The last executed Ex command line. */
|
||||
repeat: null,
|
||||
|
||||
add: function () this.builtin._add.apply(this.builtin, arguments),
|
||||
add: function add() this.builtin._add.apply(this.builtin, arguments),
|
||||
addUserCommand: deprecated("group.commands.add", { get: function addUserCommand() this.user.closure._add }),
|
||||
getUserCommands: deprecated("iter(group.commands)", function getUserCommands() iter(this.user).toArray()),
|
||||
removeUserCommand: deprecated("group.commands.remove", { get: function removeUserCommand() this.user.closure.remove }),
|
||||
@@ -698,7 +698,7 @@ var Commands = Module("commands", {
|
||||
* @param {Object} args The command invocation object.
|
||||
* @returns {string}
|
||||
*/
|
||||
commandToString: function (args) {
|
||||
commandToString: function commandToString(args) {
|
||||
let res = [args.command + (args.bang ? "!" : "")];
|
||||
|
||||
let defaults = {};
|
||||
@@ -734,7 +734,7 @@ var Commands = Module("commands", {
|
||||
* any of the command's names.
|
||||
* @returns {Command}
|
||||
*/
|
||||
get: function (name, full) iter(this.hives).map(function ([i, hive]) hive.get(name, full))
|
||||
get: function get(name, full) iter(this.hives).map(function ([i, hive]) hive.get(name, full))
|
||||
.nth(util.identity, 0),
|
||||
|
||||
/**
|
||||
@@ -745,7 +745,7 @@ var Commands = Module("commands", {
|
||||
* @param {string} host
|
||||
* @returns {boolean}
|
||||
*/
|
||||
hasDomain: function (command, host) {
|
||||
hasDomain: function hasDomain(command, host) {
|
||||
try {
|
||||
for (let [cmd, args] in this.subCommands(command))
|
||||
if (Array.concat(cmd.domains(args)).some(function (domain) util.isSubdomain(domain, host)))
|
||||
@@ -764,7 +764,7 @@ var Commands = Module("commands", {
|
||||
* @param {string} command
|
||||
* @returns {boolean}
|
||||
*/
|
||||
hasPrivateData: function (command) {
|
||||
hasPrivateData: function hasPrivateData(command) {
|
||||
for (let [cmd, args] in this.subCommands(command))
|
||||
if (cmd.privateData)
|
||||
return !callable(cmd.privateData) || cmd.privateData(args);
|
||||
@@ -1122,9 +1122,9 @@ var Commands = Module("commands", {
|
||||
]]>, /U/g, "\\u"), "x")
|
||||
}),
|
||||
|
||||
validName: Class.memoize(function () util.regexp("^" + this.nameRegexp.source + "$")),
|
||||
validName: Class.memoize(function validName() util.regexp("^" + this.nameRegexp.source + "$")),
|
||||
|
||||
commandRegexp: Class.memoize(function () util.regexp(<![CDATA[
|
||||
commandRegexp: Class.memoize(function commandRegexp() util.regexp(<![CDATA[
|
||||
^
|
||||
(?P<spec>
|
||||
(?P<prespace> [:\s]*)
|
||||
@@ -1158,7 +1158,7 @@ var Commands = Module("commands", {
|
||||
* @returns {Array}
|
||||
*/
|
||||
// FIXME: why does this return an Array rather than Object?
|
||||
parseCommand: function (str) {
|
||||
parseCommand: function parseCommand(str) {
|
||||
// remove comments
|
||||
str.replace(/\s*".*$/, "");
|
||||
|
||||
@@ -1182,7 +1182,7 @@ var Commands = Module("commands", {
|
||||
return [count, cmd, !!bang, args || "", spec.length, group];
|
||||
},
|
||||
|
||||
parseCommands: function (str, complete) {
|
||||
parseCommands: function parseCommands(str, complete) {
|
||||
const { contexts } = this.modules;
|
||||
do {
|
||||
let [count, cmd, bang, args, len, group] = commands.parseCommand(str);
|
||||
@@ -1216,7 +1216,7 @@ var Commands = Module("commands", {
|
||||
while (str);
|
||||
},
|
||||
|
||||
subCommands: function (command) {
|
||||
subCommands: function subCommands(command) {
|
||||
let commands = [command];
|
||||
while (command = commands.shift())
|
||||
try {
|
||||
@@ -1347,7 +1347,7 @@ var Commands = Module("commands", {
|
||||
};
|
||||
},
|
||||
|
||||
commands: function (dactyl, modules, window) {
|
||||
commands: function initCommands(dactyl, modules, window) {
|
||||
const { commands, contexts } = modules;
|
||||
|
||||
// TODO: Vim allows commands to be defined without {rep} if there are {attr}s
|
||||
@@ -1564,7 +1564,7 @@ var Commands = Module("commands", {
|
||||
literal: 0
|
||||
});
|
||||
},
|
||||
javascript: function (dactyl, modules, window) {
|
||||
javascript: function initJavascript(dactyl, modules, window) {
|
||||
const { JavaScript, commands } = modules;
|
||||
|
||||
JavaScript.setCompleter([commands.user.get, commands.user.remove],
|
||||
@@ -1572,7 +1572,7 @@ var Commands = Module("commands", {
|
||||
JavaScript.setCompleter([commands.get],
|
||||
[function () [[c.names, c.description] for (c in this.iterator())]]);
|
||||
},
|
||||
mappings: function (dactyl, modules, window) {
|
||||
mappings: function initMappings(dactyl, modules, window) {
|
||||
const { commands, mappings, modes } = modules;
|
||||
|
||||
mappings.add([modes.COMMAND],
|
||||
|
||||
@@ -317,9 +317,12 @@ var Overlay = Module("Overlay", {
|
||||
modules.events.listen(window, "unload", function onUnload() {
|
||||
window.removeEventListener("unload", onUnload.wrapped, false);
|
||||
for (let prop in properties(modules)) {
|
||||
let desc = Object.getOwnPropertyDescriptor(modules, prop);
|
||||
if (desc.value instanceof ModuleBase && "destroy" in desc.value)
|
||||
util.trapErrors(desc.value.destroy, desc.value);
|
||||
let mod = Object.getOwnPropertyDescriptor(modules, prop).value;
|
||||
if (mod instanceof ModuleBase || mod && mod.isLocalModule) {
|
||||
mod.stale = true;
|
||||
if ("destroy" in mod)
|
||||
util.trapErrors("destroy", mod);
|
||||
}
|
||||
}
|
||||
}, false);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user