mirror of
https://github.com/gryf/pentadactyl-pm.git
synced 2025-12-20 18:47:58 +01:00
Minorish changes.
This commit is contained in:
48
common/bootstrap.js
vendored
48
common/bootstrap.js
vendored
@@ -9,10 +9,7 @@
|
|||||||
const NAME = "bootstrap";
|
const NAME = "bootstrap";
|
||||||
const global = this;
|
const global = this;
|
||||||
|
|
||||||
const Cc = Components.classes;
|
var { classes: Cc, interfaces: Ci, results: Cr, utils: Cu } = Components;
|
||||||
const Ci = Components.interfaces;
|
|
||||||
const Cu = Components.utils;
|
|
||||||
const Cr = Components.results;
|
|
||||||
|
|
||||||
function module(uri) {
|
function module(uri) {
|
||||||
let obj = {};
|
let obj = {};
|
||||||
@@ -29,8 +26,8 @@ const resourceProto = Services.io.getProtocolHandler("resource")
|
|||||||
const categoryManager = Cc["@mozilla.org/categorymanager;1"].getService(Ci.nsICategoryManager);
|
const categoryManager = Cc["@mozilla.org/categorymanager;1"].getService(Ci.nsICategoryManager);
|
||||||
const manager = Components.manager.QueryInterface(Ci.nsIComponentRegistrar);
|
const manager = Components.manager.QueryInterface(Ci.nsIComponentRegistrar);
|
||||||
|
|
||||||
const BOOTSTRAP_JSM = "resource://dactyl/bootstrap.jsm";
|
const DISABLE_ACR = "resource://dactyl-content/disable-acr.jsm";
|
||||||
|
const BOOTSTRAP_JSM = "resource://dactyl/bootstrap.jsm";
|
||||||
const BOOTSTRAP_CONTRACT = "@dactyl.googlecode.com/base/bootstrap";
|
const BOOTSTRAP_CONTRACT = "@dactyl.googlecode.com/base/bootstrap";
|
||||||
|
|
||||||
var JSMLoader = BOOTSTRAP_CONTRACT in Cc && Cc[BOOTSTRAP_CONTRACT].getService().wrappedJSObject.loader;
|
var JSMLoader = BOOTSTRAP_CONTRACT in Cc && Cc[BOOTSTRAP_CONTRACT].getService().wrappedJSObject.loader;
|
||||||
@@ -206,7 +203,7 @@ function init() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
module("resource://dactyl-content/disable-acr.jsm").init(addon.id);
|
module(DISABLE_ACR).init(addon.id);
|
||||||
}
|
}
|
||||||
catch (e) {
|
catch (e) {
|
||||||
reportError(e);
|
reportError(e);
|
||||||
@@ -240,20 +237,21 @@ function init() {
|
|||||||
JSMLoader.init(suffix);
|
JSMLoader.init(suffix);
|
||||||
JSMLoader.load("base.jsm", global);
|
JSMLoader.load("base.jsm", global);
|
||||||
|
|
||||||
if (!(BOOTSTRAP_CONTRACT in Cc))
|
if (!(BOOTSTRAP_CONTRACT in Cc)) {
|
||||||
manager.registerFactory(Components.ID("{f541c8b0-fe26-4621-a30b-e77d21721fb5}"),
|
let factory = {
|
||||||
"{f541c8b0-fe26-4621-a30b-e77d21721fb5}",
|
classID: Components.ID("{f541c8b0-fe26-4621-a30b-e77d21721fb5}"),
|
||||||
BOOTSTRAP_CONTRACT, {
|
contractID: BOOTSTRAP_CONTRACT,
|
||||||
QueryInterface: XPCOMUtils.generateQI([Ci.nsIFactory]),
|
QueryInterface: XPCOMUtils.generateQI([Ci.nsIFactory]),
|
||||||
instance: {
|
|
||||||
QueryInterface: XPCOMUtils.generateQI([]),
|
// Use Sandbox to prevent closures over this scope
|
||||||
contractID: BOOTSTRAP_CONTRACT,
|
createInstance: Cu.evalInSandbox("(function () this)",
|
||||||
wrappedJSObject: {}
|
|
||||||
},
|
|
||||||
// Use Sandbox to prevent closure over this scope
|
|
||||||
createInstance: Cu.evalInSandbox("(function () this.instance)",
|
|
||||||
Cu.Sandbox(Cc["@mozilla.org/systemprincipal;1"].getService()))
|
Cu.Sandbox(Cc["@mozilla.org/systemprincipal;1"].getService()))
|
||||||
});
|
};
|
||||||
|
factory.wrappedJSObject = factory;
|
||||||
|
|
||||||
|
manager.registerFactory(factory.classID, String(factory.classID),
|
||||||
|
BOOTSTRAP_CONTRACT, factory);
|
||||||
|
}
|
||||||
|
|
||||||
Cc[BOOTSTRAP_CONTRACT].getService().wrappedJSObject.loader = !Cu.unload && JSMLoader;
|
Cc[BOOTSTRAP_CONTRACT].getService().wrappedJSObject.loader = !Cu.unload && JSMLoader;
|
||||||
|
|
||||||
@@ -271,7 +269,9 @@ function shutdown(data, reason) {
|
|||||||
debug("bootstrap: shutdown " + reasonToString(reason));
|
debug("bootstrap: shutdown " + reasonToString(reason));
|
||||||
if (reason != APP_SHUTDOWN) {
|
if (reason != APP_SHUTDOWN) {
|
||||||
try {
|
try {
|
||||||
module("resource://dactyl-content/disable-acr.jsm").cleanup();
|
module(DISABLE_ACR).cleanup();
|
||||||
|
if (Cu.unload)
|
||||||
|
Cu.unload(DISABLE_ACR);
|
||||||
}
|
}
|
||||||
catch (e) {
|
catch (e) {
|
||||||
reportError(e);
|
reportError(e);
|
||||||
@@ -293,8 +293,14 @@ function shutdown(data, reason) {
|
|||||||
|
|
||||||
function uninstall(data, reason) {
|
function uninstall(data, reason) {
|
||||||
debug("bootstrap: uninstall " + reasonToString(reason));
|
debug("bootstrap: uninstall " + reasonToString(reason));
|
||||||
if (reason == ADDON_UNINSTALL)
|
if (reason == ADDON_UNINSTALL) {
|
||||||
Services.prefs.deleteBranch("extensions.dactyl.");
|
Services.prefs.deleteBranch("extensions.dactyl.");
|
||||||
|
|
||||||
|
if (BOOTSTRAP_CONTRACT in Cc) {
|
||||||
|
let service = Cc[BOOTSTRAP_CONTRACT].getService().wrappedJSObject;
|
||||||
|
manager.unregisterFactory(service.classID, service);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function reasonToString(reason) {
|
function reasonToString(reason) {
|
||||||
|
|||||||
@@ -1351,7 +1351,7 @@ var CommandLine = Module("commandline", {
|
|||||||
if (isObject(arg))
|
if (isObject(arg))
|
||||||
arg = util.objectToString(arg, useColor);
|
arg = util.objectToString(arg, useColor);
|
||||||
else if (callable(arg))
|
else if (callable(arg))
|
||||||
arg = String(arg);
|
arg = String.replace(arg, "/* use strict */ \n", "/* use strict */ ");
|
||||||
else if (!isString(arg) && useColor)
|
else if (!isString(arg) && useColor)
|
||||||
arg = template.highlight(arg);
|
arg = template.highlight(arg);
|
||||||
return arg;
|
return arg;
|
||||||
|
|||||||
@@ -737,120 +737,6 @@ var Dactyl = Module("dactyl", XPCOM(Ci.nsISupportsWeakReference, ModuleBase), {
|
|||||||
return UTF8(xml.toXMLString());
|
return UTF8(xml.toXMLString());
|
||||||
},
|
},
|
||||||
|
|
||||||
exportHelp: JavaScript.setCompleter(function (path) {
|
|
||||||
const FILE = io.File(path);
|
|
||||||
const PATH = FILE.leafName.replace(/\..*/, "") + "/";
|
|
||||||
const TIME = Date.now();
|
|
||||||
|
|
||||||
if (!FILE.exists() && (/\/$/.test(path) && !/\./.test(FILE.leafName)))
|
|
||||||
FILE.create(FILE.DIRECTORY_TYPE, octal(755));
|
|
||||||
|
|
||||||
dactyl.initHelp();
|
|
||||||
if (FILE.isDirectory()) {
|
|
||||||
var addDataEntry = function addDataEntry(file, data) FILE.child(file).write(data);
|
|
||||||
var addURIEntry = function addURIEntry(file, uri) addDataEntry(file, util.httpGet(uri).responseText);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
var zip = services.ZipWriter();
|
|
||||||
zip.open(FILE, File.MODE_CREATE | File.MODE_WRONLY | File.MODE_TRUNCATE);
|
|
||||||
|
|
||||||
addURIEntry = function addURIEntry(file, uri)
|
|
||||||
zip.addEntryChannel(PATH + file, TIME, 9,
|
|
||||||
services.io.newChannel(uri, null, null), false);
|
|
||||||
addDataEntry = function addDataEntry(file, data) // Unideal to an extreme.
|
|
||||||
addURIEntry(file, "data:text/plain;charset=UTF-8," + encodeURI(data));
|
|
||||||
}
|
|
||||||
|
|
||||||
let empty = Set("area base basefont br col frame hr img input isindex link meta param"
|
|
||||||
.split(" "));
|
|
||||||
function fix(node) {
|
|
||||||
switch(node.nodeType) {
|
|
||||||
case Node.ELEMENT_NODE:
|
|
||||||
if (isinstance(node, [HTMLBaseElement]))
|
|
||||||
return;
|
|
||||||
|
|
||||||
data.push("<"); data.push(node.localName);
|
|
||||||
if (node instanceof HTMLHtmlElement)
|
|
||||||
data.push(" xmlns=" + XHTML.uri.quote(),
|
|
||||||
" xmlns:dactyl=" + NS.uri.quote());
|
|
||||||
|
|
||||||
for (let { name, value } in array.iterValues(node.attributes)) {
|
|
||||||
if (name == "dactyl:highlight") {
|
|
||||||
Set.add(styles, value);
|
|
||||||
name = "class";
|
|
||||||
value = "hl-" + value;
|
|
||||||
}
|
|
||||||
if (name == "href") {
|
|
||||||
value = node.href || value;
|
|
||||||
if (value.indexOf("dactyl://help-tag/") == 0) {
|
|
||||||
let uri = services.io.newChannel(value, null, null).originalURI;
|
|
||||||
value = uri.spec == value ? "javascript:;" : uri.path.substr(1);
|
|
||||||
}
|
|
||||||
if (!/^#|[\/](#|$)|^[a-z]+:/.test(value))
|
|
||||||
value = value.replace(/(#|$)/, ".xhtml$1");
|
|
||||||
}
|
|
||||||
if (name == "src" && value.indexOf(":") > 0) {
|
|
||||||
chromeFiles[value] = value.replace(/.*\//, "");
|
|
||||||
value = value.replace(/.*\//, "");
|
|
||||||
}
|
|
||||||
|
|
||||||
data.push(" ", name, '="',
|
|
||||||
<>{value}</>.toXMLString().replace(/"/g, """),
|
|
||||||
'"');
|
|
||||||
}
|
|
||||||
if (node.localName in empty)
|
|
||||||
data.push(" />");
|
|
||||||
else {
|
|
||||||
data.push(">");
|
|
||||||
if (node instanceof HTMLHeadElement)
|
|
||||||
data.push(<link rel="stylesheet" type="text/css" href="help.css"/>.toXMLString());
|
|
||||||
Array.map(node.childNodes, fix);
|
|
||||||
data.push("</", node.localName, ">");
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case Node.TEXT_NODE:
|
|
||||||
data.push(<>{node.textContent}</>.toXMLString());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
let chromeFiles = {};
|
|
||||||
let styles = {};
|
|
||||||
for (let [file, ] in Iterator(help.files)) {
|
|
||||||
let url = "dactyl://help/" + file;
|
|
||||||
dactyl.open(url);
|
|
||||||
util.waitFor(function () content.location.href == url && buffer.loaded
|
|
||||||
&& content.document.documentElement instanceof HTMLHtmlElement,
|
|
||||||
15000);
|
|
||||||
events.waitForPageLoad();
|
|
||||||
var data = [
|
|
||||||
'<?xml version="1.0" encoding="UTF-8"?>\n',
|
|
||||||
'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"\n',
|
|
||||||
' "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">\n'
|
|
||||||
];
|
|
||||||
fix(content.document.documentElement);
|
|
||||||
addDataEntry(file + ".xhtml", data.join(""));
|
|
||||||
}
|
|
||||||
|
|
||||||
let data = [h for (h in highlight) if (Set.has(styles, h.class) || /^Help/.test(h.class))]
|
|
||||||
.map(function (h) h.selector
|
|
||||||
.replace(/^\[.*?=(.*?)\]/, ".hl-$1")
|
|
||||||
.replace(/html\|/g, "") + "\t" + "{" + h.cssText + "}")
|
|
||||||
.join("\n");
|
|
||||||
addDataEntry("help.css", data.replace(/chrome:[^ ")]+\//g, ""));
|
|
||||||
|
|
||||||
addDataEntry("tag-map.json", JSON.stringify(help.tags));
|
|
||||||
|
|
||||||
let m, re = /(chrome:[^ ");]+\/)([^ ");]+)/g;
|
|
||||||
while ((m = re.exec(data)))
|
|
||||||
chromeFiles[m[0]] = m[2];
|
|
||||||
|
|
||||||
for (let [uri, leaf] in Iterator(chromeFiles))
|
|
||||||
addURIEntry(leaf, uri);
|
|
||||||
|
|
||||||
if (zip)
|
|
||||||
zip.close();
|
|
||||||
}, [function (context, args) completion.file(context)]),
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Generates a help entry and returns it as a string.
|
* Generates a help entry and returns it as a string.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -381,7 +381,7 @@ var EventHive = Class("EventHive", Contexts.Hive, {
|
|||||||
*/
|
*/
|
||||||
unlisten: function (target, event, callback, capture) {
|
unlisten: function (target, event, callback, capture) {
|
||||||
this.sessionListeners = this.sessionListeners.filter(function (args) {
|
this.sessionListeners = this.sessionListeners.filter(function (args) {
|
||||||
if (target == null || args[0].get() == target && args[1] == event && args[2] == callback && args[3] == capture) {
|
if (target == null || args[0].get() == target && args[1] == event && args[2].wrapped == callback && args[3] == capture) {
|
||||||
args[0].get().removeEventListener.apply(args[0].get(), args.slice(1));
|
args[0].get().removeEventListener.apply(args[0].get(), args.slice(1));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -1161,7 +1161,7 @@ var Events = Module("events", {
|
|||||||
|
|
||||||
let win = (elem.ownerDocument || elem).defaultView || elem;
|
let win = (elem.ownerDocument || elem).defaultView || elem;
|
||||||
|
|
||||||
if (!(services.focus.getLastFocusMethod(win) & 0x7000)
|
if (!(services.focus.getLastFocusMethod(win) & 0x3000)
|
||||||
&& events.isContentNode(elem)
|
&& events.isContentNode(elem)
|
||||||
&& !buffer.focusAllowed(elem)
|
&& !buffer.focusAllowed(elem)
|
||||||
&& isinstance(elem, [HTMLInputElement, HTMLSelectElement, HTMLTextAreaElement, Window])) {
|
&& isinstance(elem, [HTMLInputElement, HTMLSelectElement, HTMLTextAreaElement, Window])) {
|
||||||
|
|||||||
@@ -110,6 +110,7 @@ var actions = {
|
|||||||
description: "Reload an extension",
|
description: "Reload an extension",
|
||||||
action: function (addon) {
|
action: function (addon) {
|
||||||
util.assert(config.haveGecko("2b"), _("command.notUseful", config.host));
|
util.assert(config.haveGecko("2b"), _("command.notUseful", config.host));
|
||||||
|
util.flushCache();
|
||||||
util.timeout(function () {
|
util.timeout(function () {
|
||||||
addon.userDisabled = true;
|
addon.userDisabled = true;
|
||||||
addon.userDisabled = false;
|
addon.userDisabled = false;
|
||||||
|
|||||||
@@ -216,9 +216,9 @@ function require(obj, name, from, targetName) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
defineModule("base", {
|
defineModule("base", {
|
||||||
// sed -n 's/^(const|function) ([a-zA-Z0-9_]+).*/ "\2",/p' base.jsm | sort | fmt
|
// sed -n 's/^(const|var|function) ([a-zA-Z0-9_]+).*/ "\2",/p' base.jsm | sort | fmt
|
||||||
exports: [
|
exports: [
|
||||||
"ErrorBase", "Cc", "Ci", "Class", "Cr", "Cu", "Module", "JSMLoader", "Object", "Runnable",
|
"ErrorBase", "Cc", "Ci", "Class", "Cr", "Cu", "Module", "JSMLoader", "Object",
|
||||||
"Set", "Struct", "StructBase", "Timer", "UTF8", "XPCOM", "XPCOMShim", "XPCOMUtils",
|
"Set", "Struct", "StructBase", "Timer", "UTF8", "XPCOM", "XPCOMShim", "XPCOMUtils",
|
||||||
"XPCSafeJSObjectWrapper", "array", "bind", "call", "callable", "ctypes", "curry",
|
"XPCSafeJSObjectWrapper", "array", "bind", "call", "callable", "ctypes", "curry",
|
||||||
"debuggerProperties", "defineModule", "deprecated", "endModule", "forEach", "isArray",
|
"debuggerProperties", "defineModule", "deprecated", "endModule", "forEach", "isArray",
|
||||||
@@ -228,14 +228,6 @@ defineModule("base", {
|
|||||||
]
|
]
|
||||||
}, this);
|
}, this);
|
||||||
|
|
||||||
function Runnable(self, func, args) {
|
|
||||||
return {
|
|
||||||
__proto__: Runnable.prototype,
|
|
||||||
run: function () { func.apply(self, args || []); }
|
|
||||||
};
|
|
||||||
}
|
|
||||||
Runnable.prototype.QueryInterface = XPCOMUtils.generateQI([Ci.nsIRunnable]);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns a list of all of the top-level properties of an object, by
|
* Returns a list of all of the top-level properties of an object, by
|
||||||
* way of the debugger.
|
* way of the debugger.
|
||||||
@@ -845,7 +837,7 @@ Class.extend = function extend(subclass, superclass, overrides) {
|
|||||||
* property's value.
|
* property's value.
|
||||||
* @returns {Class.Property}
|
* @returns {Class.Property}
|
||||||
*/
|
*/
|
||||||
Class.Memoize = Class.Memoize = function Memoize(getter, wait)
|
Class.Memoize = function Memoize(getter, wait)
|
||||||
Class.Property({
|
Class.Property({
|
||||||
configurable: true,
|
configurable: true,
|
||||||
enumerable: true,
|
enumerable: true,
|
||||||
@@ -887,6 +879,8 @@ Class.Memoize = Class.Memoize = function Memoize(getter, wait)
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
Class.memoize = deprecated("Class.Memoize", function memoize() Class.Memoize.apply(this, arguments));
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Updates the given object with the object in the target class's
|
* Updates the given object with the object in the target class's
|
||||||
* prototype.
|
* prototype.
|
||||||
@@ -1184,7 +1178,7 @@ function Struct() {
|
|||||||
});
|
});
|
||||||
return Struct;
|
return Struct;
|
||||||
}
|
}
|
||||||
let StructBase = Class("StructBase", Array, {
|
var StructBase = Class("StructBase", Array, {
|
||||||
init: function struct_init() {
|
init: function struct_init() {
|
||||||
for (let i = 0; i < arguments.length; i++)
|
for (let i = 0; i < arguments.length; i++)
|
||||||
if (arguments[i] != undefined)
|
if (arguments[i] != undefined)
|
||||||
|
|||||||
@@ -275,9 +275,9 @@ var ConfigBase = Class("ConfigBase", {
|
|||||||
/** @property {boolean} True if the OS is Mac OS X. */
|
/** @property {boolean} True if the OS is Mac OS X. */
|
||||||
get isMacOSX() this._arch == "Darwin",
|
get isMacOSX() this._arch == "Darwin",
|
||||||
/** @property {boolean} True if the OS is some other *nix variant. */
|
/** @property {boolean} True if the OS is some other *nix variant. */
|
||||||
get isUnix() !this.isWindows && !this.isMacOSX,
|
get isUnix() !this.isWindows,
|
||||||
/** @property {RegExp} A RegExp which matches illegal characters in path components. */
|
/** @property {RegExp} A RegExp which matches illegal characters in path components. */
|
||||||
get illegalCharacters() this.isWindows ? /[<>:"/\\|?*\x00-\x1f]/g : /\//g,
|
get illegalCharacters() this.isWindows ? /[<>:"/\\|?*\x00-\x1f]/g : /[\/\x00]/g,
|
||||||
|
|
||||||
get pathListSep() this.isWindows ? ";" : ":"
|
get pathListSep() this.isWindows ? ";" : ":"
|
||||||
}),
|
}),
|
||||||
|
|||||||
@@ -669,7 +669,7 @@ var DOM = Class("DOM", {
|
|||||||
val: function val(txt) {
|
val: function val(txt) {
|
||||||
return this.getSet(arguments,
|
return this.getSet(arguments,
|
||||||
function (elem) elem.value,
|
function (elem) elem.value,
|
||||||
function (elem, val) { elem.value = val });
|
function (elem, val) { elem.value = val == null ? "" : val });
|
||||||
},
|
},
|
||||||
|
|
||||||
listen: function listen(event, listener, capture) {
|
listen: function listen(event, listener, capture) {
|
||||||
@@ -1094,3 +1094,6 @@ var $ = DOM;
|
|||||||
|
|
||||||
endModule();
|
endModule();
|
||||||
|
|
||||||
|
// catch(e){ if (!e.stack) e = Error(e); dump(e.fileName+":"+e.lineNumber+": "+e+"\n" + e.stack); }
|
||||||
|
|
||||||
|
// vim: set sw=4 ts=4 et ft=javascript:
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
Components.utils.import("resource://dactyl/bootstrap.jsm");
|
Components.utils.import("resource://dactyl/bootstrap.jsm");
|
||||||
defineModule("help", {
|
defineModule("help", {
|
||||||
exports: ["help"],
|
exports: ["help"],
|
||||||
require: ["dom", "protocol", "services", "util"]
|
require: ["dom", "javascript", "protocol", "services", "util"]
|
||||||
}, this);
|
}, this);
|
||||||
|
|
||||||
var Help = Module("Help", {
|
var Help = Module("Help", {
|
||||||
@@ -95,7 +95,120 @@ var Help = Module("Help", {
|
|||||||
dactyl.assert(page != null, _("help.noTopic", topic));
|
dactyl.assert(page != null, _("help.noTopic", topic));
|
||||||
|
|
||||||
dactyl.open("dactyl://help/" + page, { from: "help" });
|
dactyl.open("dactyl://help/" + page, { from: "help" });
|
||||||
}
|
},
|
||||||
|
|
||||||
|
exportHelp: JavaScript.setCompleter(function (path) {
|
||||||
|
const FILE = io.File(path);
|
||||||
|
const PATH = FILE.leafName.replace(/\..*/, "") + "/";
|
||||||
|
const TIME = Date.now();
|
||||||
|
|
||||||
|
if (!FILE.exists() && (/\/$/.test(path) && !/\./.test(FILE.leafName)))
|
||||||
|
FILE.create(FILE.DIRECTORY_TYPE, octal(755));
|
||||||
|
|
||||||
|
dactyl.initHelp();
|
||||||
|
if (FILE.isDirectory()) {
|
||||||
|
var addDataEntry = function addDataEntry(file, data) FILE.child(file).write(data);
|
||||||
|
var addURIEntry = function addURIEntry(file, uri) addDataEntry(file, util.httpGet(uri).responseText);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
var zip = services.ZipWriter(FILE, File.MODE_CREATE | File.MODE_WRONLY | File.MODE_TRUNCATE);
|
||||||
|
|
||||||
|
addURIEntry = function addURIEntry(file, uri)
|
||||||
|
zip.addEntryChannel(PATH + file, TIME, 9,
|
||||||
|
services.io.newChannel(uri, null, null), false);
|
||||||
|
addDataEntry = function addDataEntry(file, data) // Unideal to an extreme.
|
||||||
|
addURIEntry(file, "data:text/plain;charset=UTF-8," + encodeURI(data));
|
||||||
|
}
|
||||||
|
|
||||||
|
let empty = Set("area base basefont br col frame hr img input isindex link meta param"
|
||||||
|
.split(" "));
|
||||||
|
function fix(node) {
|
||||||
|
switch(node.nodeType) {
|
||||||
|
case Node.ELEMENT_NODE:
|
||||||
|
if (isinstance(node, [HTMLBaseElement]))
|
||||||
|
return;
|
||||||
|
|
||||||
|
data.push("<"); data.push(node.localName);
|
||||||
|
if (node instanceof HTMLHtmlElement)
|
||||||
|
data.push(" xmlns=" + XHTML.uri.quote(),
|
||||||
|
" xmlns:dactyl=" + NS.uri.quote());
|
||||||
|
|
||||||
|
for (let { name, value } in array.iterValues(node.attributes)) {
|
||||||
|
if (name == "dactyl:highlight") {
|
||||||
|
Set.add(styles, value);
|
||||||
|
name = "class";
|
||||||
|
value = "hl-" + value;
|
||||||
|
}
|
||||||
|
if (name == "href") {
|
||||||
|
value = node.href || value;
|
||||||
|
if (value.indexOf("dactyl://help-tag/") == 0) {
|
||||||
|
let uri = services.io.newChannel(value, null, null).originalURI;
|
||||||
|
value = uri.spec == value ? "javascript:;" : uri.path.substr(1);
|
||||||
|
}
|
||||||
|
if (!/^#|[\/](#|$)|^[a-z]+:/.test(value))
|
||||||
|
value = value.replace(/(#|$)/, ".xhtml$1");
|
||||||
|
}
|
||||||
|
if (name == "src" && value.indexOf(":") > 0) {
|
||||||
|
chromeFiles[value] = value.replace(/.*\//, "");
|
||||||
|
value = value.replace(/.*\//, "");
|
||||||
|
}
|
||||||
|
|
||||||
|
data.push(" ", name, '="',
|
||||||
|
<>{value}</>.toXMLString().replace(/"/g, """),
|
||||||
|
'"');
|
||||||
|
}
|
||||||
|
if (node.localName in empty)
|
||||||
|
data.push(" />");
|
||||||
|
else {
|
||||||
|
data.push(">");
|
||||||
|
if (node instanceof HTMLHeadElement)
|
||||||
|
data.push(<link rel="stylesheet" type="text/css" href="help.css"/>.toXMLString());
|
||||||
|
Array.map(node.childNodes, fix);
|
||||||
|
data.push("</", node.localName, ">");
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case Node.TEXT_NODE:
|
||||||
|
data.push(<>{node.textContent}</>.toXMLString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let chromeFiles = {};
|
||||||
|
let styles = {};
|
||||||
|
for (let [file, ] in Iterator(help.files)) {
|
||||||
|
let url = "dactyl://help/" + file;
|
||||||
|
dactyl.open(url);
|
||||||
|
util.waitFor(function () content.location.href == url && buffer.loaded
|
||||||
|
&& content.document.documentElement instanceof HTMLHtmlElement,
|
||||||
|
15000);
|
||||||
|
events.waitForPageLoad();
|
||||||
|
var data = [
|
||||||
|
'<?xml version="1.0" encoding="UTF-8"?>\n',
|
||||||
|
'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"\n',
|
||||||
|
' "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">\n'
|
||||||
|
];
|
||||||
|
fix(content.document.documentElement);
|
||||||
|
addDataEntry(file + ".xhtml", data.join(""));
|
||||||
|
}
|
||||||
|
|
||||||
|
let data = [h for (h in highlight) if (Set.has(styles, h.class) || /^Help/.test(h.class))]
|
||||||
|
.map(function (h) h.selector
|
||||||
|
.replace(/^\[.*?=(.*?)\]/, ".hl-$1")
|
||||||
|
.replace(/html\|/g, "") + "\t" + "{" + h.cssText + "}")
|
||||||
|
.join("\n");
|
||||||
|
addDataEntry("help.css", data.replace(/chrome:[^ ")]+\//g, ""));
|
||||||
|
|
||||||
|
addDataEntry("tag-map.json", JSON.stringify(help.tags));
|
||||||
|
|
||||||
|
let m, re = /(chrome:[^ ");]+\/)([^ ");]+)/g;
|
||||||
|
while ((m = re.exec(data)))
|
||||||
|
chromeFiles[m[0]] = m[2];
|
||||||
|
|
||||||
|
for (let [uri, leaf] in Iterator(chromeFiles))
|
||||||
|
addURIEntry(leaf, uri);
|
||||||
|
|
||||||
|
if (zip)
|
||||||
|
zip.close();
|
||||||
|
}, [function (context, args) completion.file(context)]),
|
||||||
|
|
||||||
}),
|
}),
|
||||||
|
|
||||||
|
|||||||
@@ -37,6 +37,10 @@ var Messages = Module("messages", {
|
|||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
|
cleanup: function cleanup() {
|
||||||
|
services.stringBundle.flushBundles();
|
||||||
|
},
|
||||||
|
|
||||||
bundles: Class.Memoize(function ()
|
bundles: Class.Memoize(function ()
|
||||||
array.uniq([JSMLoader.getTarget("dactyl://locale/" + this.name + ".properties"),
|
array.uniq([JSMLoader.getTarget("dactyl://locale/" + this.name + ".properties"),
|
||||||
JSMLoader.getTarget("dactyl://locale-local/" + this.name + ".properties"),
|
JSMLoader.getTarget("dactyl://locale-local/" + this.name + ".properties"),
|
||||||
@@ -53,10 +57,6 @@ var Messages = Module("messages", {
|
|||||||
yield [key, value];
|
yield [key, value];
|
||||||
},
|
},
|
||||||
|
|
||||||
cleanup: function cleanup() {
|
|
||||||
services.stringBundle.flushBundles();
|
|
||||||
},
|
|
||||||
|
|
||||||
get: function get(value, default_) {
|
get: function get(value, default_) {
|
||||||
for (let bundle in values(this.bundles))
|
for (let bundle in values(this.bundles))
|
||||||
try {
|
try {
|
||||||
@@ -136,10 +136,7 @@ var Messages = Module("messages", {
|
|||||||
}, {
|
}, {
|
||||||
javascript: function initJavascript(dactyl, modules, window) {
|
javascript: function initJavascript(dactyl, modules, window) {
|
||||||
modules.JavaScript.setCompleter([this._, this.get, this.format], [
|
modules.JavaScript.setCompleter([this._, this.get, this.format], [
|
||||||
function (context) {
|
function (context) messages.iterate()
|
||||||
context.keys = { text: "key", description: "value" };
|
|
||||||
return messages.iterate();
|
|
||||||
}
|
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -189,7 +189,7 @@ var Overlay = Module("Overlay", XPCOM([Ci.nsIObserver, Ci.nsISupportsWeakReferen
|
|||||||
var { modules, Module } = window.dactyl.modules;
|
var { modules, Module } = window.dactyl.modules;
|
||||||
delete window.dactyl;
|
delete window.dactyl;
|
||||||
|
|
||||||
const start = Date.now();
|
this.startTime = Date.now();
|
||||||
const deferredInit = { load: {} };
|
const deferredInit = { load: {} };
|
||||||
const seen = Set();
|
const seen = Set();
|
||||||
const loaded = Set();
|
const loaded = Set();
|
||||||
@@ -268,6 +268,8 @@ var Overlay = Module("Overlay", XPCOM([Ci.nsIObserver, Ci.nsISupportsWeakReferen
|
|||||||
});
|
});
|
||||||
|
|
||||||
function frob(name) { values(deferredInit[name] || {}).forEach(call); }
|
function frob(name) { values(deferredInit[name] || {}).forEach(call); }
|
||||||
|
this.frob = frob;
|
||||||
|
this.modules = modules;
|
||||||
|
|
||||||
frobModules();
|
frobModules();
|
||||||
frob("init");
|
frob("init");
|
||||||
@@ -289,21 +291,6 @@ var Overlay = Module("Overlay", XPCOM([Ci.nsIObserver, Ci.nsISupportsWeakReferen
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
function finish() {
|
|
||||||
// Module.list.forEach(load);
|
|
||||||
frob("load");
|
|
||||||
modules.times = update({}, defineModule.times);
|
|
||||||
|
|
||||||
defineModule.loadLog.push("Loaded in " + (Date.now() - start) + "ms");
|
|
||||||
|
|
||||||
overlay.windows = array.uniq(overlay.windows.concat(window), true);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (overlay.onWindowVisible)
|
|
||||||
overlay.onWindowVisible.push(finish);
|
|
||||||
else
|
|
||||||
finish();
|
|
||||||
|
|
||||||
modules.events.listen(window, "unload", function onUnload() {
|
modules.events.listen(window, "unload", function onUnload() {
|
||||||
window.removeEventListener("unload", onUnload.wrapped, false);
|
window.removeEventListener("unload", onUnload.wrapped, false);
|
||||||
|
|
||||||
@@ -316,12 +303,21 @@ var Overlay = Module("Overlay", XPCOM([Ci.nsIObserver, Ci.nsISupportsWeakReferen
|
|||||||
util.trapErrors("destroy", mod);
|
util.trapErrors("destroy", mod);
|
||||||
}
|
}
|
||||||
}, false);
|
}, false);
|
||||||
|
},
|
||||||
|
visible: function visible(window) {
|
||||||
|
// Module.list.forEach(load);
|
||||||
|
this.frob("load");
|
||||||
|
this.modules.times = update({}, defineModule.times);
|
||||||
|
|
||||||
|
defineModule.loadLog.push("Loaded in " + (Date.now() - this.startTime) + "ms");
|
||||||
|
|
||||||
|
overlay.windows = array.uniq(overlay.windows.concat(window), true);
|
||||||
}
|
}
|
||||||
}));
|
}));
|
||||||
},
|
},
|
||||||
|
|
||||||
cleanup: function cleanup() {
|
cleanup: function cleanup() {
|
||||||
for (let { document: doc } in iter(services.windowMediator.getEnumerator(null))) {
|
for (let doc in util.iterDocuments()) {
|
||||||
for (let elem in values(doc.dactylOverlayElements || []))
|
for (let elem in values(doc.dactylOverlayElements || []))
|
||||||
if (elem.parentNode)
|
if (elem.parentNode)
|
||||||
elem.parentNode.removeChild(elem);
|
elem.parentNode.removeChild(elem);
|
||||||
@@ -348,10 +344,9 @@ var Overlay = Module("Overlay", XPCOM([Ci.nsIObserver, Ci.nsISupportsWeakReferen
|
|||||||
"chrome-document-global-created": function (window, uri) { this.observe(window, "toplevel-window-ready", null); },
|
"chrome-document-global-created": function (window, uri) { this.observe(window, "toplevel-window-ready", null); },
|
||||||
"content-document-global-created": function (window, uri) { this.observe(window, "toplevel-window-ready", null); },
|
"content-document-global-created": function (window, uri) { this.observe(window, "toplevel-window-ready", null); },
|
||||||
"xul-window-visible": function () {
|
"xul-window-visible": function () {
|
||||||
if (this.onWindowVisible) {
|
if (this.onWindowVisible)
|
||||||
this.onWindowVisible.forEach(function (f) f.call(this), this);
|
this.onWindowVisible.forEach(function (f) f.call(this), this);
|
||||||
this.onWindowVisible = null;
|
this.onWindowVisible = null;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
@@ -367,11 +362,14 @@ var Overlay = Module("Overlay", XPCOM([Ci.nsIObserver, Ci.nsISupportsWeakReferen
|
|||||||
|
|
||||||
for (let doc in util.iterDocuments())
|
for (let doc in util.iterDocuments())
|
||||||
if (~["interactive", "complete"].indexOf(doc.readyState)) {
|
if (~["interactive", "complete"].indexOf(doc.readyState)) {
|
||||||
this.onWindowVisible = null;
|
this.observe(doc.defaultView, "xul-window-visible");
|
||||||
this._loadOverlays(doc.defaultView);
|
this._loadOverlays(doc.defaultView);
|
||||||
}
|
}
|
||||||
else
|
else {
|
||||||
|
if (!this.onWindowVisible)
|
||||||
|
this.onWindowVisible = [];
|
||||||
this.observe(doc.defaultView, "toplevel-window-ready");
|
this.observe(doc.defaultView, "toplevel-window-ready");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
@@ -394,7 +392,7 @@ var Overlay = Module("Overlay", XPCOM([Ci.nsIObserver, Ci.nsISupportsWeakReferen
|
|||||||
doc.dactylOverlayAttributes = [];
|
doc.dactylOverlayAttributes = [];
|
||||||
}
|
}
|
||||||
|
|
||||||
function overlay(key, fn) {
|
function insert(key, fn) {
|
||||||
if (obj[key]) {
|
if (obj[key]) {
|
||||||
let iterator = Iterator(obj[key]);
|
let iterator = Iterator(obj[key]);
|
||||||
if (!isObject(obj[key]))
|
if (!isObject(obj[key]))
|
||||||
@@ -423,21 +421,30 @@ var Overlay = Module("Overlay", XPCOM([Ci.nsIObserver, Ci.nsISupportsWeakReferen
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
overlay("before", function (elem, dom) elem.parentNode.insertBefore(dom, elem));
|
insert("before", function (elem, dom) elem.parentNode.insertBefore(dom, elem));
|
||||||
overlay("after", function (elem, dom) elem.parentNode.insertBefore(dom, elem.nextSibling));
|
insert("after", function (elem, dom) elem.parentNode.insertBefore(dom, elem.nextSibling));
|
||||||
overlay("append", function (elem, dom) elem.appendChild(dom));
|
insert("append", function (elem, dom) elem.appendChild(dom));
|
||||||
overlay("prepend", function (elem, dom) elem.insertBefore(dom, elem.firstChild));
|
insert("prepend", function (elem, dom) elem.insertBefore(dom, elem.firstChild));
|
||||||
if (obj.init)
|
if (obj.init)
|
||||||
obj.init(window);
|
obj.init(window);
|
||||||
|
|
||||||
|
function load(event) {
|
||||||
|
obj.load(window, event);
|
||||||
|
if (obj.visible)
|
||||||
|
if (!event || !overlay.onWindowVisible || window != util.topWindow(window))
|
||||||
|
obj.visible(window);
|
||||||
|
else
|
||||||
|
overlay.onWindowVisible.push(function () { obj.visible(window) });
|
||||||
|
}
|
||||||
|
|
||||||
if (obj.load)
|
if (obj.load)
|
||||||
if (doc.readyState === "complete")
|
if (doc.readyState === "complete")
|
||||||
obj.load(window);
|
load();
|
||||||
else
|
else
|
||||||
doc.addEventListener("load", util.wrapCallback(function load(event) {
|
doc.addEventListener("load", util.wrapCallback(function onLoad(event) {
|
||||||
if (event.originalTarget === event.target) {
|
if (event.originalTarget === event.target) {
|
||||||
doc.removeEventListener("load", load.wrapper, true);
|
doc.removeEventListener("load", onLoad.wrapper, true);
|
||||||
obj.load(window, event);
|
load(event);
|
||||||
}
|
}
|
||||||
}), true);
|
}), true);
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -70,7 +70,10 @@ var Services = Module("Services", {
|
|||||||
this.add("zipReader", "@mozilla.org/libjar/zip-reader-cache;1", "nsIZipReaderCache");
|
this.add("zipReader", "@mozilla.org/libjar/zip-reader-cache;1", "nsIZipReaderCache");
|
||||||
|
|
||||||
this.addClass("CharsetConv", "@mozilla.org/intl/scriptableunicodeconverter", "nsIScriptableUnicodeConverter", "charset");
|
this.addClass("CharsetConv", "@mozilla.org/intl/scriptableunicodeconverter", "nsIScriptableUnicodeConverter", "charset");
|
||||||
|
this.addClass("CharsetStream","@mozilla.org/intl/converter-input-stream;1", ["nsIConverterInputStream",
|
||||||
|
"nsIUnicharLineInputStream"], "init");
|
||||||
this.addClass("File", "@mozilla.org/file/local;1", "nsILocalFile");
|
this.addClass("File", "@mozilla.org/file/local;1", "nsILocalFile");
|
||||||
|
this.addClass("FileInStream", "@mozilla.org/network/file-input-stream;1", "nsIFileInputStream", "init", false);
|
||||||
this.addClass("Find", "@mozilla.org/embedcomp/rangefind;1", "nsIFind");
|
this.addClass("Find", "@mozilla.org/embedcomp/rangefind;1", "nsIFind");
|
||||||
this.addClass("HtmlConverter","@mozilla.org/widget/htmlformatconverter;1", "nsIFormatConverter");
|
this.addClass("HtmlConverter","@mozilla.org/widget/htmlformatconverter;1", "nsIFormatConverter");
|
||||||
this.addClass("HtmlEncoder", "@mozilla.org/layout/htmlCopyEncoder;1", "nsIDocumentEncoder");
|
this.addClass("HtmlEncoder", "@mozilla.org/layout/htmlCopyEncoder;1", "nsIDocumentEncoder");
|
||||||
@@ -79,6 +82,7 @@ var Services = Module("Services", {
|
|||||||
this.addClass("Persist", "@mozilla.org/embedding/browser/nsWebBrowserPersist;1", "nsIWebBrowserPersist");
|
this.addClass("Persist", "@mozilla.org/embedding/browser/nsWebBrowserPersist;1", "nsIWebBrowserPersist");
|
||||||
this.addClass("Pipe", "@mozilla.org/pipe;1", "nsIPipe", "init");
|
this.addClass("Pipe", "@mozilla.org/pipe;1", "nsIPipe", "init");
|
||||||
this.addClass("Process", "@mozilla.org/process/util;1", "nsIProcess", "init");
|
this.addClass("Process", "@mozilla.org/process/util;1", "nsIProcess", "init");
|
||||||
|
this.addClass("Pump", "@mozilla.org/network/input-stream-pump;1", "nsIInputStreamPump", "init")
|
||||||
this.addClass("StreamChannel","@mozilla.org/network/input-stream-channel;1",
|
this.addClass("StreamChannel","@mozilla.org/network/input-stream-channel;1",
|
||||||
["nsIInputStreamChannel", "nsIChannel"], "setURI");
|
["nsIInputStreamChannel", "nsIChannel"], "setURI");
|
||||||
this.addClass("StreamCopier", "@mozilla.org/network/async-stream-copier;1","nsIAsyncStreamCopier", "init");
|
this.addClass("StreamCopier", "@mozilla.org/network/async-stream-copier;1","nsIAsyncStreamCopier", "init");
|
||||||
@@ -91,7 +95,7 @@ var Services = Module("Services", {
|
|||||||
this.addClass("XPathEvaluator", "@mozilla.org/dom/xpath-evaluator;1", "nsIDOMXPathEvaluator");
|
this.addClass("XPathEvaluator", "@mozilla.org/dom/xpath-evaluator;1", "nsIDOMXPathEvaluator");
|
||||||
this.addClass("XMLDocument", "@mozilla.org/xml/xml-document;1", ["nsIDOMXMLDocument", "nsIDOMNodeSelector"]);
|
this.addClass("XMLDocument", "@mozilla.org/xml/xml-document;1", ["nsIDOMXMLDocument", "nsIDOMNodeSelector"]);
|
||||||
this.addClass("ZipReader", "@mozilla.org/libjar/zip-reader;1", "nsIZipReader", "open");
|
this.addClass("ZipReader", "@mozilla.org/libjar/zip-reader;1", "nsIZipReader", "open");
|
||||||
this.addClass("ZipWriter", "@mozilla.org/zipwriter;1", "nsIZipWriter");
|
this.addClass("ZipWriter", "@mozilla.org/zipwriter;1", "nsIZipWriter", "open");
|
||||||
},
|
},
|
||||||
reinit: function () {},
|
reinit: function () {},
|
||||||
|
|
||||||
@@ -112,7 +116,7 @@ var Services = Module("Services", {
|
|||||||
}
|
}
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
catch (e) {
|
catch (e if service.quiet !== false) {
|
||||||
if (typeof util !== "undefined")
|
if (typeof util !== "undefined")
|
||||||
util.reportError(e);
|
util.reportError(e);
|
||||||
else
|
else
|
||||||
@@ -149,9 +153,9 @@ var Services = Module("Services", {
|
|||||||
* @param {string} init Name of a property or method used to initialize the
|
* @param {string} init Name of a property or method used to initialize the
|
||||||
* class.
|
* class.
|
||||||
*/
|
*/
|
||||||
addClass: function (name, class_, ifaces, init) {
|
addClass: function (name, class_, ifaces, init, quiet) {
|
||||||
const self = this;
|
const self = this;
|
||||||
this.services[name] = { class: class_, interfaces: Array.concat(ifaces || []), method: "createInstance", init: init };
|
this.services[name] = { class: class_, interfaces: Array.concat(ifaces || []), method: "createInstance", init: init, quiet: quiet };
|
||||||
if (init)
|
if (init)
|
||||||
memoize(this.services[name], "callable",
|
memoize(this.services[name], "callable",
|
||||||
function () callable(XPCOMShim(this.interfaces)[this.init]));
|
function () callable(XPCOMShim(this.interfaces)[this.init]));
|
||||||
|
|||||||
@@ -292,11 +292,18 @@ var Storage = Module("Storage", {
|
|||||||
* @param {nsIFile|string} path Expanded according to {@link IO#expandPath}
|
* @param {nsIFile|string} path Expanded according to {@link IO#expandPath}
|
||||||
* @param {boolean} checkPWD Whether to allow expansion relative to the
|
* @param {boolean} checkPWD Whether to allow expansion relative to the
|
||||||
* current directory. @default true
|
* current directory. @default true
|
||||||
|
* @param {string} charset The charset of the file. @default File.defaultEncoding
|
||||||
*/
|
*/
|
||||||
this.File = Class("File", {
|
this.File = Class("File", {
|
||||||
init: function (path, checkPWD) {
|
init: function (path, checkPWD, charset) {
|
||||||
let file = services.File();
|
let file = services.File();
|
||||||
|
|
||||||
|
if (charset)
|
||||||
|
this.charset = charset;
|
||||||
|
|
||||||
|
if (path instanceof Ci.nsIFileURL)
|
||||||
|
path = path.file;
|
||||||
|
|
||||||
if (path instanceof Ci.nsIFile)
|
if (path instanceof Ci.nsIFile)
|
||||||
file = path.clone();
|
file = path.clone();
|
||||||
else if (/file:\/\//.test(path))
|
else if (/file:\/\//.test(path))
|
||||||
@@ -320,10 +327,12 @@ this.File = Class("File", {
|
|||||||
return self;
|
return self;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
charset: Class.Memoize(function () File.defaultEncoding),
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @property {nsIFileURL} Returns the nsIFileURL object for this file.
|
* @property {nsIFileURL} Returns the nsIFileURL object for this file.
|
||||||
*/
|
*/
|
||||||
get URI() services.io.newFileURI(this),
|
get URI() services.io.newFileURI(this).QueryInterface(Ci.nsIFileURL),
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Iterates over the objects in this directory.
|
* Iterates over the objects in this directory.
|
||||||
@@ -347,19 +356,24 @@ this.File = Class("File", {
|
|||||||
return f;
|
return f;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns an iterator for all lines in a file.
|
||||||
|
*/
|
||||||
|
get lines() File.readLines(services.FileInStream(this, -1, 0, 0),
|
||||||
|
this.charset),
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Reads this file's entire contents in "text" mode and returns the
|
* Reads this file's entire contents in "text" mode and returns the
|
||||||
* content as a string.
|
* content as a string.
|
||||||
*
|
*
|
||||||
* @param {string} encoding The encoding from which to decode the file.
|
* @param {string} encoding The encoding from which to decode the file.
|
||||||
* @default options["fileencoding"]
|
* @default #charset
|
||||||
* @returns {string}
|
* @returns {string}
|
||||||
*/
|
*/
|
||||||
read: function (encoding) {
|
read: function (encoding) {
|
||||||
let ifstream = Cc["@mozilla.org/network/file-input-stream;1"].createInstance(Ci.nsIFileInputStream);
|
let ifstream = services.FileInStream(this, -1, 0, 0);
|
||||||
ifstream.init(this, -1, 0, 0);
|
|
||||||
|
|
||||||
return File.readStream(ifstream, encoding);
|
return File.readStream(ifstream, encoding || this.charset);
|
||||||
},
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -408,7 +422,7 @@ this.File = Class("File", {
|
|||||||
* permissions if the file exists.
|
* permissions if the file exists.
|
||||||
* @default 0644
|
* @default 0644
|
||||||
* @param {string} encoding The encoding to used to write the file.
|
* @param {string} encoding The encoding to used to write the file.
|
||||||
* @default options["fileencoding"]
|
* @default #charset
|
||||||
*/
|
*/
|
||||||
write: function (buf, mode, perms, encoding) {
|
write: function (buf, mode, perms, encoding) {
|
||||||
let ofstream = Cc["@mozilla.org/network/file-output-stream;1"].createInstance(Ci.nsIFileOutputStream);
|
let ofstream = Cc["@mozilla.org/network/file-output-stream;1"].createInstance(Ci.nsIFileOutputStream);
|
||||||
@@ -421,7 +435,7 @@ this.File = Class("File", {
|
|||||||
buf = buf.read();
|
buf = buf.read();
|
||||||
|
|
||||||
if (!encoding)
|
if (!encoding)
|
||||||
encoding = File.defaultEncoding;
|
encoding = this.charset;
|
||||||
|
|
||||||
if (mode == ">>")
|
if (mode == ">>")
|
||||||
mode = File.MODE_WRONLY | File.MODE_CREATE | File.MODE_APPEND;
|
mode = File.MODE_WRONLY | File.MODE_CREATE | File.MODE_APPEND;
|
||||||
@@ -579,9 +593,10 @@ this.File = Class("File", {
|
|||||||
|
|
||||||
readStream: function (ifstream, encoding) {
|
readStream: function (ifstream, encoding) {
|
||||||
try {
|
try {
|
||||||
var icstream = Cc["@mozilla.org/intl/converter-input-stream;1"].createInstance(Ci.nsIConverterInputStream);
|
var icstream = services.CharsetStream(
|
||||||
icstream.init(ifstream, encoding || File.defaultEncoding, 4096, // 4096 bytes buffering
|
ifstream, encoding || File.defaultEncoding, 4096, // buffer size
|
||||||
Ci.nsIConverterInputStream.DEFAULT_REPLACEMENT_CHARACTER);
|
services.CharsetStream.DEFAULT_REPLACEMENT_CHARACTER);
|
||||||
|
|
||||||
let buffer = [];
|
let buffer = [];
|
||||||
let str = {};
|
let str = {};
|
||||||
while (icstream.readString(4096, str) != 0)
|
while (icstream.readString(4096, str) != 0)
|
||||||
@@ -594,6 +609,23 @@ this.File = Class("File", {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
readLines: function (ifstream, encoding) {
|
||||||
|
try {
|
||||||
|
var icstream = services.CharsetStream(
|
||||||
|
ifstream, encoding || File.defaultEncoding, 4096, // buffer size
|
||||||
|
services.CharsetStream.DEFAULT_REPLACEMENT_CHARACTER);
|
||||||
|
|
||||||
|
var value = {};
|
||||||
|
while (icstream.readLine(value))
|
||||||
|
yield value.value;
|
||||||
|
}
|
||||||
|
finally {
|
||||||
|
icstream.close();
|
||||||
|
ifstream.close();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
|
||||||
isAbsolutePath: function (path) {
|
isAbsolutePath: function (path) {
|
||||||
try {
|
try {
|
||||||
services.File().initWithPath(path);
|
services.File().initWithPath(path);
|
||||||
|
|||||||
@@ -8,7 +8,6 @@
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
|
|
||||||
let global=this;
|
|
||||||
Components.utils.import("resource://dactyl/bootstrap.jsm");
|
Components.utils.import("resource://dactyl/bootstrap.jsm");
|
||||||
defineModule("util", {
|
defineModule("util", {
|
||||||
exports: ["DOM", "$", "FailedAssertion", "Math", "NS", "Point", "Util", "XBL", "XHTML", "XUL", "util"],
|
exports: ["DOM", "$", "FailedAssertion", "Math", "NS", "Point", "Util", "XBL", "XHTML", "XUL", "util"],
|
||||||
@@ -399,7 +398,9 @@ var Util = Module("Util", XPCOM([Ci.nsIObserver, Ci.nsISupportsWeakReference]),
|
|||||||
*/
|
*/
|
||||||
createURI: function createURI(str) {
|
createURI: function createURI(str) {
|
||||||
try {
|
try {
|
||||||
return services.urifixup.createFixupURI(str, services.urifixup.FIXUP_FLAG_ALLOW_KEYWORD_LOOKUP);
|
let uri = services.urifixup.createFixupURI(str, services.urifixup.FIXUP_FLAG_ALLOW_KEYWORD_LOOKUP);
|
||||||
|
uri instanceof Ci.nsIURL;
|
||||||
|
return uri;
|
||||||
}
|
}
|
||||||
catch (e) {
|
catch (e) {
|
||||||
return null;
|
return null;
|
||||||
@@ -673,6 +674,9 @@ var Util = Module("Util", XPCOM([Ci.nsIObserver, Ci.nsISupportsWeakReference]),
|
|||||||
if (params.mimeType)
|
if (params.mimeType)
|
||||||
xmlhttp.overrideMimeType(params.mimeType);
|
xmlhttp.overrideMimeType(params.mimeType);
|
||||||
|
|
||||||
|
if (params.responseType)
|
||||||
|
xmlhttp.responseType = params.responseType;
|
||||||
|
|
||||||
xmlhttp.open(params.method || "GET", url, async,
|
xmlhttp.open(params.method || "GET", url, async,
|
||||||
params.user, params.pass);
|
params.user, params.pass);
|
||||||
|
|
||||||
@@ -748,11 +752,14 @@ var Util = Module("Util", XPCOM([Ci.nsIObserver, Ci.nsISupportsWeakReference]),
|
|||||||
* Iterates over all currently open documents, including all
|
* Iterates over all currently open documents, including all
|
||||||
* top-level window and sub-frames thereof.
|
* top-level window and sub-frames thereof.
|
||||||
*/
|
*/
|
||||||
iterDocuments: function iterDocuments() {
|
iterDocuments: function iterDocuments(types) {
|
||||||
|
types = types ? types.map(function (s) "type" + util.capitalize(s))
|
||||||
|
: ["typeChrome", "typeContent"];
|
||||||
|
|
||||||
let windows = services.windowMediator.getXULWindowEnumerator(null);
|
let windows = services.windowMediator.getXULWindowEnumerator(null);
|
||||||
while (windows.hasMoreElements()) {
|
while (windows.hasMoreElements()) {
|
||||||
let window = windows.getNext().QueryInterface(Ci.nsIXULWindow);
|
let window = windows.getNext().QueryInterface(Ci.nsIXULWindow);
|
||||||
for each (let type in ["typeChrome", "typeContent"]) {
|
for each (let type in types) {
|
||||||
let docShells = window.docShell.getDocShellEnumerator(Ci.nsIDocShellTreeItem[type],
|
let docShells = window.docShell.getDocShellEnumerator(Ci.nsIDocShellTreeItem[type],
|
||||||
Ci.nsIDocShell.ENUMERATE_FORWARDS);
|
Ci.nsIDocShell.ENUMERATE_FORWARDS);
|
||||||
while (docShells.hasMoreElements())
|
while (docShells.hasMoreElements())
|
||||||
@@ -820,7 +827,11 @@ var Util = Module("Util", XPCOM([Ci.nsIObserver, Ci.nsISupportsWeakReference]),
|
|||||||
* @param {string} uri
|
* @param {string} uri
|
||||||
* @returns {nsIURI}
|
* @returns {nsIURI}
|
||||||
*/
|
*/
|
||||||
newURI: function newURI(uri, charset, base) this.withProperErrors("newURI", services.io, uri, charset, base),
|
newURI: function newURI(uri, charset, base) {
|
||||||
|
let res = this.withProperErrors("newURI", services.io, uri, charset, base);
|
||||||
|
res instanceof Ci.nsIURL;
|
||||||
|
return res;
|
||||||
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Removes leading garbage prepended to URIs by the subscript
|
* Removes leading garbage prepended to URIs by the subscript
|
||||||
@@ -1133,8 +1144,11 @@ var Util = Module("Util", XPCOM([Ci.nsIObserver, Ci.nsISupportsWeakReference]),
|
|||||||
if (isString(error))
|
if (isString(error))
|
||||||
error = Error(error);
|
error = Error(error);
|
||||||
|
|
||||||
if (Cu.reportError)
|
Cu.reportError(error);
|
||||||
Cu.reportError(error);
|
try {
|
||||||
|
services.console.logStringMessage(error.stack || Error().stack);
|
||||||
|
}
|
||||||
|
catch (e) {}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
this.errorCount++;
|
this.errorCount++;
|
||||||
|
|||||||
Reference in New Issue
Block a user