1
0
mirror of https://github.com/gryf/pentadactyl-pm.git synced 2025-12-20 10:57:58 +01:00

Add $VIMPERATOR_RUNTIME, $VIMPERATOR_INIT, ~/.vimperator/info/{profile}.

This commit is contained in:
Kris Maglione
2008-12-20 18:34:14 -05:00
19 changed files with 280 additions and 266 deletions

View File

@@ -745,15 +745,14 @@ function Buffer() //{{{
// get file size // get file size
const ACCESS_READ = Ci.nsICache.ACCESS_READ; const ACCESS_READ = Ci.nsICache.ACCESS_READ;
const cacheService = Cc["@mozilla.org/network/cache-service;1"].getService(Ci.nsICacheService);
let cacheKey = doc.location.toString().replace(/#.*$/, ""); let cacheKey = doc.location.toString().replace(/#.*$/, "");
for (let proto in util.Array.iterator(["HTTP", "FTP"])) for (let proto in util.Array.iterator(["HTTP", "FTP"]))
{ {
try try
{ {
var cacheEntryDescriptor = cacheService.createSession(proto, 0, true) var cacheEntryDescriptor = service["cache"].createSession(proto, 0, true)
.openCacheEntry(cacheKey, ACCESS_READ, false); .openCacheEntry(cacheKey, ACCESS_READ, false);
break; break;
} }
catch (e) {} catch (e) {}

View File

@@ -675,17 +675,10 @@ function Completion() //{{{
////////////////////// PRIVATE SECTION ///////////////////////////////////////// ////////////////////// PRIVATE SECTION /////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////{{{ /////////////////////////////////////////////////////////////////////////////{{{
try
{
var completionService = Cc["@mozilla.org/browser/global-history;2"].getService(Ci.nsIAutoCompleteSearch);
}
catch (e) {}
const EVAL_TMP = "__liberator_eval_tmp"; const EVAL_TMP = "__liberator_eval_tmp";
function Javascript() function Javascript()
{ {
let json = Cc["@mozilla.org/dom/json;1"].createInstance(Ci.nsIJSON);
const OFFSET = 0, CHAR = 1, STATEMENTS = 2, DOTS = 3, FULL_STATEMENTS = 4, COMMA = 5, FUNCTIONS = 6; const OFFSET = 0, CHAR = 1, STATEMENTS = 2, DOTS = 3, FULL_STATEMENTS = 4, COMMA = 5, FUNCTIONS = 6;
let stack = []; let stack = [];
let functions = []; let functions = [];
@@ -1558,7 +1551,7 @@ function Completion() //{{{
location: function location(context) location: function location(context)
{ {
if (!completionService) if (!service["autoCompleteSearch"])
return return
context.anchored = false; context.anchored = false;
context.title = ["Smart Completions"]; context.title = ["Smart Completions"];
@@ -1574,8 +1567,8 @@ function Completion() //{{{
for (i in util.range(0, result.matchCount)) for (i in util.range(0, result.matchCount))
]; ];
}); });
completionService.stopSearch(); service["autoCompleteSearch"].stopSearch();
completionService.startSearch(context.filter, "", context.result, { service["autoCompleteSearch"].startSearch(context.filter, "", context.result, {
onSearchResult: function onSearchResult(search, result) onSearchResult: function onSearchResult(search, result)
{ {
context.result = result; context.result = result;
@@ -1655,11 +1648,10 @@ function Completion() //{{{
preference: function preference(context) preference: function preference(context)
{ {
let prefs = Cc["@mozilla.org/preferences-service;1"].getService(Ci.nsIPrefBranch);
context.anchored = false; context.anchored = false;
context.title = ["Firefox Preference", "Value"]; context.title = ["Firefox Preference", "Value"];
context.keys = { text: function (item) item, description: function (item) options.getPref(item) }; context.keys = { text: function (item) item, description: function (item) options.getPref(item) };
context.completions = prefs.getChildList("", { value: 0 }); context.completions = service["prefs"].getChildList("", { value: 0 });
}, },
search: function search(context, noSuggest) search: function search(context, noSuggest)
@@ -1706,12 +1698,11 @@ function Completion() //{{{
if (!context.filter) if (!context.filter)
return; return;
let ss = Cc["@mozilla.org/browser/search-service;1"].getService(Ci.nsIBrowserSearchService);
let engineList = (engineAliases || options["suggestengines"] || "google").split(","); let engineList = (engineAliases || options["suggestengines"] || "google").split(",");
let completions = []; let completions = [];
engineList.forEach(function (name) { engineList.forEach(function (name) {
let engine = ss.getEngineByAlias(name); let engine = service["browserSearch"].getEngineByAlias(name);
if (!engine) if (!engine)
return; return;
let [,word] = /^\s*(\S+)/.exec(context.filter) || []; let [,word] = /^\s*(\S+)/.exec(context.filter) || [];
@@ -1734,9 +1725,7 @@ function Completion() //{{{
context.title = ["Shell Command", "Path"]; context.title = ["Shell Command", "Path"];
context.generate = function () context.generate = function ()
{ {
const environmentService = Cc["@mozilla.org/process/environment;1"].getService(Ci.nsIEnvironment); let dirNames = service["environment"].get("PATH").split(RegExp(liberator.has("Win32") ? ";" : ":"));
let dirNames = environmentService.get("PATH").split(RegExp(liberator.has("Win32") ? ";" : ":"));
let commands = []; let commands = [];
for (let [,dirName] in Iterator(dirNames)) for (let [,dirName] in Iterator(dirNames))

View File

@@ -1549,10 +1549,9 @@ function Events() //{{{
// XXX: function may later be needed to detect a canceled synchronous openURL() // XXX: function may later be needed to detect a canceled synchronous openURL()
onStateChange: function (webProgress, request, flags, status) onStateChange: function (webProgress, request, flags, status)
{ {
const nsIWebProgressListener = Ci.nsIWebProgressListener;
// STATE_IS_DOCUMENT | STATE_IS_WINDOW is important, because we also // STATE_IS_DOCUMENT | STATE_IS_WINDOW is important, because we also
// receive statechange events for loading images and other parts of the web page // receive statechange events for loading images and other parts of the web page
if (flags & (nsIWebProgressListener.STATE_IS_DOCUMENT | nsIWebProgressListener.STATE_IS_WINDOW)) if (flags & (Ci.nsIWebProgressListener.STATE_IS_DOCUMENT | Ci.nsIWebProgressListener.STATE_IS_WINDOW))
{ {
// This fires when the load event is initiated // This fires when the load event is initiated
// only thrown for the current tab, not when another tab changes // only thrown for the current tab, not when another tab changes
@@ -1581,12 +1580,11 @@ function Events() //{{{
// for notifying the user about secure web pages // for notifying the user about secure web pages
onSecurityChange: function (webProgress, aRequest, aState) onSecurityChange: function (webProgress, aRequest, aState)
{ {
const nsIWebProgressListener = Ci.nsIWebProgressListener; if (aState & Ci.nsIWebProgressListener.STATE_IS_INSECURE)
if (aState & nsIWebProgressListener.STATE_IS_INSECURE)
statusline.setClass("insecure"); statusline.setClass("insecure");
else if (aState & nsIWebProgressListener.STATE_IS_BROKEN) else if (aState & Ci.nsIWebProgressListener.STATE_IS_BROKEN)
statusline.setClass("broken"); statusline.setClass("broken");
else if (aState & nsIWebProgressListener.STATE_IS_SECURE) else if (aState & Ci.nsIWebProgressListener.STATE_IS_SECURE)
statusline.setClass("secure"); statusline.setClass("secure");
}, },
onStatusChange: function (webProgress, request, status, message) onStatusChange: function (webProgress, request, status, message)
@@ -1646,9 +1644,8 @@ function Events() //{{{
prefObserver: { prefObserver: {
register: function () register: function ()
{ {
const prefService = Cc["@mozilla.org/preferences-service;1"].getService(Ci.nsIPrefService); this._branch = service["pref"].getBranch("") // better way to monitor all changes?
this._branch = prefService.getBranch(""); // better way to monitor all changes? .QueryInterface(Ci.nsIPrefBranch2);
this._branch.QueryInterface(Ci.nsIPrefBranch2);
this._branch.addObserver("", this, false); this._branch.addObserver("", this, false);
}, },

View File

@@ -138,9 +138,7 @@ function Search() //{{{
var highlightObj = { var highlightObj = {
search: function (aWord, matchCase) search: function (aWord, matchCase)
{ {
var finder = Cc["@mozilla.org/embedcomp/rangefind;1"] var finder = service.getFind();
.createInstance()
.QueryInterface(Ci.nsIFind);
if (matchCase !== undefined) if (matchCase !== undefined)
finder.caseSensitive = matchCase; finder.caseSensitive = matchCase;

View File

@@ -66,12 +66,9 @@ function IO() //{{{
const WINDOWS = liberator.has("Win32"); const WINDOWS = liberator.has("Win32");
const EXTENSION_NAME = config.name.toLowerCase(); // "vimperator" or "muttator" const EXTENSION_NAME = config.name.toLowerCase(); // "vimperator" or "muttator"
const ioService = Cc['@mozilla.org/network/io-service;1'].getService(Ci.nsIIOService);
const environmentService = Cc["@mozilla.org/process/environment;1"].getService(Ci.nsIEnvironment);
const directoryService = Cc["@mozilla.org/file/directory_service;1"].getService(Ci.nsIProperties);
const downloadManager = Cc["@mozilla.org/download-manager;1"].createInstance(Ci.nsIDownloadManager); const downloadManager = Cc["@mozilla.org/download-manager;1"].createInstance(Ci.nsIDownloadManager);
var processDir = directoryService.get("CurWorkD", Ci.nsIFile); var processDir = service["directory"].get("CurWorkD", Ci.nsIFile);
var cwd = processDir; var cwd = processDir;
var oldcwd = null; var oldcwd = null;
@@ -79,8 +76,7 @@ function IO() //{{{
var scriptNames = []; var scriptNames = [];
// default option values // default option values
var cdpath = "," + (environmentService.get("CDPATH").replace(/[:;]/g, ",") || ","); var cdpath = "," + (service["environment"].get("CDPATH").replace(/[:;]/g, ",") || ",");
var runtimepath = "~/" + (WINDOWS ? "" : ".") + EXTENSION_NAME;
var shell, shellcmdflag; var shell, shellcmdflag;
if (WINDOWS) if (WINDOWS)
@@ -92,7 +88,7 @@ function IO() //{{{
} }
else else
{ {
shell = environmentService.get("SHELL") || "sh"; shell = service["environment"].get("SHELL") || "sh";
shellcmdflag = "-c"; shellcmdflag = "-c";
} }
@@ -120,7 +116,7 @@ function IO() //{{{
let path = ioManager.getFile(head); let path = ioManager.getFile(head);
try try
{ {
path.appendRelativePath(ioManager.expandPath(tail)); // FIXME: should only expand env vars and normalise path separators path.appendRelativePath(ioManager.expandPath(tail, true)); // FIXME: should only expand env vars and normalise path separators
if (path.exists() && path.normalize) if (path.exists() && path.normalize)
path.normalize(); path.normalize();
} }
@@ -135,7 +131,7 @@ function IO() //{{{
{ {
try try
{ {
Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsILocalFile).initWithPath(path); service.getFile().initWithPath(path);
return true; return true;
} }
catch (e) catch (e)
@@ -179,7 +175,7 @@ function IO() //{{{
options.add(["runtimepath", "rtp"], options.add(["runtimepath", "rtp"],
"List of directories searched for runtime files", "List of directories searched for runtime files",
"stringlist", runtimepath, "stringlist", IO.runtimePath,
{ setter: function (value) expandPathList(value) }); { setter: function (value) expandPathList(value) });
options.add(["shell", "sh"], options.add(["shell", "sh"],
@@ -410,46 +406,7 @@ function IO() //{{{
pathSeparator: WINDOWS ? "\\" : "/", pathSeparator: WINDOWS ? "\\" : "/",
expandPath: function (path) expandPath: IO.expandPath,
{
// TODO: proper pathname separator translation like Vim - this should be done elsewhere
if (WINDOWS)
path = path.replace("/", "\\", "g");
// expand any $ENV vars - this is naive but so is Vim and we like to be compatible
// TODO: Vim does not expand variables set to an empty string (and documents it).
// Kris reckons we shouldn't replicate this 'bug'. --djk
// TODO: should we be doing this for all paths?
function expand(path) path.replace(
!WINDOWS ? /\$(\w+)\b|\${(\w+)}/g
: /\$(\w+)\b|\${(\w+)}|%(\w+)%/g,
function (m, n1, n2, n3) environmentService.get(n1 || n2 || n3) || m
);
path = expand(path);
// expand ~
if ((WINDOWS ? /^~(?:$|\\)/ : /^~(?:$|\/)/).test(path))
{
// Try $(VIMPERATOR|MUTTATOR)_HOME || $HOME first, on all systems
let home = environmentService.get(config.name.toUpperCase() + "_HOME") ||
environmentService.get("HOME");
// Windows has its own ideosynchratic $HOME variables.
if (!home && WINDOWS)
home = environmentService.get("USERPROFILE") ||
environmentService.get("HOMEDRIVE") + environmentService.get("HOMEPATH");
path = home + path.substr(1);
}
// TODO: Vim expands paths twice, once before checking for ~, once
// after, but doesn't document it. Is this just a bug? --Kris
path = expand(path);
// FIXME: Should we be doing this here? I think it should be done
// by the arg parser or nowhere. --Kris
return path.replace("\\ ", " ", "g");
},
// TODO: there seems to be no way, short of a new component, to change // TODO: there seems to be no way, short of a new component, to change
// Firefox's CWD - see // https://bugzilla.mozilla.org/show_bug.cgi?id=280953 // Firefox's CWD - see // https://bugzilla.mozilla.org/show_bug.cgi?id=280953
@@ -522,7 +479,7 @@ function IO() //{{{
// also expands relative paths // also expands relative paths
getFile: function (path, noCheckPWD) getFile: function (path, noCheckPWD)
{ {
let file = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsILocalFile); let file = service.getFile();
if (/file:\/\//.test(path)) if (/file:\/\//.test(path))
{ {
@@ -563,7 +520,7 @@ function IO() //{{{
break; break;
} }
let file = directoryService.get("TmpD", Ci.nsIFile); let file = service["directory"].get("TmpD", Ci.nsIFile);
file.append(tmpName); file.append(tmpName);
file.createUnique(Ci.nsIFile.NORMAL_FILE_TYPE, 0600); file.createUnique(Ci.nsIFile.NORMAL_FILE_TYPE, 0600);
@@ -669,7 +626,7 @@ function IO() //{{{
} }
else else
{ {
let dirs = environmentService.get("PATH").split(WINDOWS ? ";" : ":"); let dirs = service["environment"].get("PATH").split(WINDOWS ? ";" : ":");
// Windows tries the cwd first TODO: desirable? // Windows tries the cwd first TODO: desirable?
if (WINDOWS) if (WINDOWS)
dirs = [io.getCurrentDirectory().path].concat(dirs); dirs = [io.getCurrentDirectory().path].concat(dirs);
@@ -687,7 +644,7 @@ lookup:
// automatically try to add the executable path extensions on windows // automatically try to add the executable path extensions on windows
if (WINDOWS) if (WINDOWS)
{ {
let extensions = environmentService.get("PATHEXT").split(";"); let extensions = service["environment"].get("PATHEXT").split(";");
for (let [,extension] in Iterator(extensions)) for (let [,extension] in Iterator(extensions))
{ {
file = joinPaths(dir, program + extension); file = joinPaths(dir, program + extension);
@@ -706,7 +663,7 @@ lookup:
return -1; return -1;
} }
let process = Cc["@mozilla.org/process/util;1"].createInstance(Ci.nsIProcess); let process = service.getProcess();
process.init(file); process.init(file);
process.run(blocking, args, args.length); process.run(blocking, args, args.length);
@@ -820,7 +777,7 @@ lookup:
liberator.echomsg("sourcing " + filename.quote(), 2); liberator.echomsg("sourcing " + filename.quote(), 2);
let str = ioManager.readFile(file); let str = ioManager.readFile(file);
let uri = ioService.newFileURI(file); let uri = service["io"].newFileURI(file);
// handle pure javascript files specially // handle pure javascript files specially
if (/\.js$/.test(filename)) if (/\.js$/.test(filename))
@@ -964,4 +921,48 @@ lookup:
}; //}}} }; //}}}
IO.__defineGetter__("runtimePath", function () service["environment"].get(config.name.toUpperCase() + "_RUNTIME") ||
"~/" + (liberator.has("Win32") ? "" : ".") + config.name.toLowerCase());
IO.expandPath = function (path, relative)
{
// TODO: proper pathname separator translation like Vim - this should be done elsewhere
const WINDOWS = liberator.has("Win32");
if (WINDOWS)
path = path.replace("/", "\\", "g");
// expand any $ENV vars - this is naive but so is Vim and we like to be compatible
// TODO: Vim does not expand variables set to an empty string (and documents it).
// Kris reckons we shouldn't replicate this 'bug'. --djk
// TODO: should we be doing this for all paths?
function expand(path) path.replace(
!WINDOWS ? /\$(\w+)\b|\${(\w+)}/g
: /\$(\w+)\b|\${(\w+)}|%(\w+)%/g,
function (m, n1, n2, n3) service["environment"].get(n1 || n2 || n3) || m
);
path = expand(path);
// expand ~
if (!relative && (WINDOWS ? /^~(?:$|\\)/ : /^~(?:$|\/)/).test(path))
{
// Try $HOME first, on all systems
let home = service["environment"].get("HOME");
// Windows has its own ideosyncratic $HOME variables.
if (!home && WINDOWS)
home = service["environment"].get("USERPROFILE") ||
service["environment"].get("HOMEDRIVE") + service["environment"].get("HOMEPATH");
path = home + path.substr(1);
}
// TODO: Vim expands paths twice, once before checking for ~, once
// after, but doesn't document it. Is this just a bug? --Kris
path = expand(path);
// FIXME: Should we be doing this here? I think it should be done
// by the arg parser or nowhere. --Kris
return path.replace("\\ ", " ", "g");
};
// vim: set fdm=marker sw=4 ts=4 et: // vim: set fdm=marker sw=4 ts=4 et:

View File

@@ -31,7 +31,8 @@
let prefix = [BASE]; let prefix = [BASE];
["liberator.js", ["service.js",
"liberator.js",
"config.js", "config.js",
"util.js", "util.js",
"style.js", "style.js",

View File

@@ -51,7 +51,6 @@ const liberator = (function () //{{{
////////////////////// PRIVATE SECTION ///////////////////////////////////////// ////////////////////// PRIVATE SECTION /////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////{{{ /////////////////////////////////////////////////////////////////////////////{{{
const threadManager = Cc["@mozilla.org/thread-manager;1"].getService(Ci.nsIThreadManager);
function Runnable(self, func, args) function Runnable(self, func, args)
{ {
this.self = self; this.self = self;
@@ -685,18 +684,18 @@ const liberator = (function () //{{{
return false; // so you can do: if (...) return liberator.beep(); return false; // so you can do: if (...) return liberator.beep();
}, },
newThread: function () threadManager.newThread(0), newThread: function () service["threadManager"].newThread(0),
callAsync: function (thread, self, func) callAsync: function (thread, self, func)
{ {
hread = thread || threadManager.newThread(0); hread = thread || service["threadManager"].newThread(0);
thread.dispatch(new Runnable(self, func, Array.slice(arguments, 2)), thread.DISPATCH_NORMAL); thread.dispatch(new Runnable(self, func, Array.slice(arguments, 2)), thread.DISPATCH_NORMAL);
}, },
// be sure to call GUI related methods like alert() or dump() ONLY in the main thread // be sure to call GUI related methods like alert() or dump() ONLY in the main thread
callFunctionInThread: function (thread, func) callFunctionInThread: function (thread, func)
{ {
thread = thread || threadManager.newThread(0); thread = thread || service["threadManager"].newThread(0);
// DISPATCH_SYNC is necessary, otherwise strange things will happen // DISPATCH_SYNC is necessary, otherwise strange things will happen
thread.dispatch(new Runnable(null, func, Array.slice(arguments, 2)), thread.DISPATCH_SYNC); thread.dispatch(new Runnable(null, func, Array.slice(arguments, 2)), thread.DISPATCH_SYNC);
@@ -768,8 +767,7 @@ const liberator = (function () //{{{
loadScript: function (uri, context) loadScript: function (uri, context)
{ {
let loader = Cc["@mozilla.org/moz/jssubscript-loader;1"].getService(Ci.mozIJSSubScriptLoader); service["subscriptLoader"].loadSubScript(uri, context);
loader.loadSubScript(uri, context);
}, },
eval: function (str, context) eval: function (str, context)
@@ -903,8 +901,7 @@ const liberator = (function () //{{{
// if clearFocusedElement, also blur a focused link // if clearFocusedElement, also blur a focused link
focusContent: function (clearFocusedElement) focusContent: function (clearFocusedElement)
{ {
let ww = Cc["@mozilla.org/embedcomp/window-watcher;1"].getService(Ci.nsIWindowWatcher); if (window != service["windowWatcher"].activeWindow)
if (window != ww.activeWindow)
return; return;
let elem = config.mainWidget || window.content; let elem = config.mainWidget || window.content;
@@ -937,8 +934,7 @@ const liberator = (function () //{{{
hasExtension: function (name) hasExtension: function (name)
{ {
let manager = Cc["@mozilla.org/extensions/manager;1"].getService(Ci.nsIExtensionManager); let extensions = service["extensionManager"].getItemList(Ci.nsIUpdateItem.TYPE_EXTENSION, {});
let extensions = manager.getItemList(Ci.nsIUpdateItem.TYPE_EXTENSION, {});
return extensions.some(function (e) e.name == name); return extensions.some(function (e) e.name == name);
}, },
@@ -1062,8 +1058,7 @@ const liberator = (function () //{{{
if (typeof msg == "object") if (typeof msg == "object")
msg = util.objectToString(msg, false); msg = util.objectToString(msg, false);
const consoleService = Cc["@mozilla.org/consoleservice;1"].getService(Ci.nsIConsoleService); service["console"].logStringMessage(config.name.toLowerCase() + ": " + msg);
consoleService.logStringMessage(config.name.toLowerCase() + ": " + msg);
}, },
// open one or more URLs // open one or more URLs
@@ -1100,7 +1095,6 @@ const liberator = (function () //{{{
{ {
let url = Array.concat(urls)[0]; let url = Array.concat(urls)[0];
let postdata = Array.concat(urls)[1]; let postdata = Array.concat(urls)[1];
let whichwindow = window;
// decide where to load the first url // decide where to load the first url
switch (where) switch (where)
@@ -1121,10 +1115,9 @@ const liberator = (function () //{{{
break; break;
case liberator.NEW_WINDOW: case liberator.NEW_WINDOW:
const wm = Cc["@mozilla.org/appshell/window-mediator;1"].getService(Ci.nsIWindowMediator);
window.open(); window.open();
whichwindow = wm.getMostRecentWindow("navigator:browser"); service["windowMediator"].getMostRecentWindow("navigator:browser")
whichwindow.loadURI(url, null, postdata); .loadURI(url, null, postdata);
break; break;
default: default:
@@ -1164,11 +1157,8 @@ const liberator = (function () //{{{
else else
options.setPref("browser.startup.page", 1); // start with default homepage session options.setPref("browser.startup.page", 1); // start with default homepage session
const nsIAppStartup = Ci.nsIAppStartup;
if (force) if (force)
Cc["@mozilla.org/toolkit/app-startup;1"] service["appStartup"].quit(Ci.nsIAppStartup.eForceQuit);
.getService(nsIAppStartup)
.quit(nsIAppStartup.eForceQuit);
else else
window.goQuitApplication(); window.goQuitApplication();
}, },
@@ -1196,31 +1186,26 @@ const liberator = (function () //{{{
restart: function () restart: function ()
{ {
const nsIAppStartup = Ci.nsIAppStartup;
// notify all windows that an application quit has been requested. // notify all windows that an application quit has been requested.
const os = Cc["@mozilla.org/observer-service;1"].getService(Ci.nsIObserverService); var cancelQuit = Cc["@mozilla.org/supports-PRBool;1"].createInstance(Ci.nsISupportsPRBool);
const cancelQuit = Cc["@mozilla.org/supports-PRBool;1"].createInstance(Ci.nsISupportsPRBool); service["observer"].notifyObservers(cancelQuit, "quit-application-requested", null);
os.notifyObservers(cancelQuit, "quit-application-requested", null);
// something aborted the quit process. // something aborted the quit process.
if (cancelQuit.data) if (cancelQuit.data)
return; return;
// notify all windows that an application quit has been granted. // notify all windows that an application quit has been granted.
os.notifyObservers(null, "quit-application-granted", null); service["observer"].notifyObservers(null, "quit-application-granted", null);
// enumerate all windows and call shutdown handlers // enumerate all windows and call shutdown handlers
const wm = Cc["@mozilla.org/appshell/window-mediator;1"].getService(Ci.nsIWindowMediator); let windows = service["windowMediator"].getEnumerator(null);
let windows = wm.getEnumerator(null);
while (windows.hasMoreElements()) while (windows.hasMoreElements())
{ {
let win = windows.getNext(); let win = windows.getNext();
if (("tryToClose" in win) && !win.tryToClose()) if (("tryToClose" in win) && !win.tryToClose())
return; return;
} }
Cc["@mozilla.org/toolkit/app-startup;1"].getService(nsIAppStartup) service["appStartup"].quit(Ci.nsIAppStartup.eRestart | Ci.nsIAppStartup.eAttemptQuit);
.quit(nsIAppStartup.eRestart | nsIAppStartup.eAttemptQuit);
}, },
// TODO: move to {muttator,vimperator,...}.js // TODO: move to {muttator,vimperator,...}.js
@@ -1245,6 +1230,19 @@ const liberator = (function () //{{{
config.dialogs = config.dialogs || []; config.dialogs = config.dialogs || [];
config.helpFiles = config.helpFiles || []; config.helpFiles = config.helpFiles || [];
try
{
let infoPath = service.getFile();
infoPath.initWithPath(IO.expandPath(IO.runtimePath.replace(/,.*/, "")));
infoPath.append("info");
infoPath.append(service["profile"].selectedProfile.name);
storage.infoPath = infoPath;
}
catch (e)
{
liberator.reportError(e);
}
liberator.triggerObserver("load"); liberator.triggerObserver("load");
// commands must always be the first module to be initialized // commands must always be the first module to be initialized
@@ -1286,18 +1284,24 @@ const liberator = (function () //{{{
// make sourcing asynchronous, otherwise commands that open new tabs won't work // make sourcing asynchronous, otherwise commands that open new tabs won't work
setTimeout(function () { setTimeout(function () {
let rcFile = io.getRCFile("~"); let init = service["environment"].get(config.name.toUpperCase() + "_INIT");
if (init)
if (rcFile) liberator.execute(init);
io.source(rcFile.path, true);
else else
liberator.log("No user RC file found", 3); {
let rcFile = io.getRCFile("~");
if (rcFile)
io.source(rcFile.path, true);
else
liberator.log("No user RC file found", 3);
}
if (options["exrc"]) if (options["exrc"])
{ {
let localRcFile = io.getRCFile(io.getCurrentDirectory().path); let localRCFile = io.getRCFile(io.getCurrentDirectory().path);
if (localRcFile) if (localRCFile)
io.source(localRcFile.path, true); io.source(localRCFile.path, true);
} }
if (options["loadplugins"]) if (options["loadplugins"])
@@ -1337,7 +1341,7 @@ const liberator = (function () //{{{
sleep: function (delay) sleep: function (delay)
{ {
let mainThread = threadManager.mainThread; let mainThread = service["threadManager"].mainThread;
let end = Date.now() + delay; let end = Date.now() + delay;
while (Date.now() < end) while (Date.now() < end)
@@ -1347,8 +1351,8 @@ const liberator = (function () //{{{
callInMainThread: function (callback, self) callInMainThread: function (callback, self)
{ {
let mainThread = threadManager.mainThread; let mainThread = service["threadManager"].mainThread;
if (!threadManager.isMainThread) if (!service["threadManager"].isMainThread)
mainThread.dispatch({ run: callback.call(self) }, mainThread.DISPATCH_NORMAL); mainThread.dispatch({ run: callback.call(self) }, mainThread.DISPATCH_NORMAL);
else else
callback.call(self); callback.call(self);
@@ -1356,7 +1360,7 @@ const liberator = (function () //{{{
threadYield: function (flush, interruptable) threadYield: function (flush, interruptable)
{ {
let mainThread = threadManager.mainThread; let mainThread = service["threadManager"].mainThread;
liberator.interrupted = false; liberator.interrupted = false;
do do
{ {
@@ -1395,10 +1399,8 @@ const liberator = (function () //{{{
get windows() get windows()
{ {
const wm = Cc["@mozilla.org/appshell/window-mediator;1"].getService(Ci.nsIWindowMediator);
let windows = []; let windows = [];
let enumerator = wm.getEnumerator("navigator:browser"); let enumerator = service["windowMediator"].getEnumerator("navigator:browser");
while (enumerator.hasMoreElements()) while (enumerator.hasMoreElements())
windows.push(enumerator.getNext()); windows.push(enumerator.getNext());

View File

@@ -306,7 +306,6 @@ function Options() //{{{
const SAVED = "liberator.saved."; const SAVED = "liberator.saved.";
const prefService = Cc["@mozilla.org/preferences-service;1"].getService(Ci.nsIPrefBranch);
const optionHash = {}; const optionHash = {};
const prefContexts = []; const prefContexts = [];
@@ -331,27 +330,27 @@ function Options() //{{{
prefContexts[prefContexts.length - 1][name] = val; prefContexts[prefContexts.length - 1][name] = val;
} }
let type = prefService.getPrefType(name); let type = service["pref"].getPrefType(name);
switch (typeof value) switch (typeof value)
{ {
case "string": case "string":
if (type == prefService.PREF_INVALID || type == prefService.PREF_STRING) if (type == service["pref"].PREF_INVALID || type == service["prefBranch"].PREF_STRING)
prefService.setCharPref(name, value); service["pref"].setCharPref(name, value);
else if (type == prefService.PREF_INT) else if (type == service["pref"].PREF_INT)
liberator.echoerr("E521: Number required after =: " + name + "=" + value); liberator.echoerr("E521: Number required after =: " + name + "=" + value);
else else
liberator.echoerr("E474: Invalid argument: " + name + "=" + value); liberator.echoerr("E474: Invalid argument: " + name + "=" + value);
break; break;
case "number": case "number":
if (type == prefService.PREF_INVALID || type == prefService.PREF_INT) if (type == service["pref"].PREF_INVALID || type == service["pref"].PREF_INT)
prefService.setIntPref(name, value); service["pref"].setIntPref(name, value);
else else
liberator.echoerr("E474: Invalid argument: " + name + "=" + value); liberator.echoerr("E474: Invalid argument: " + name + "=" + value);
break; break;
case "boolean": case "boolean":
if (type == prefService.PREF_INVALID || type == prefService.PREF_BOOL) if (type == service["pref"].PREF_INVALID || type == service["pref"].PREF_BOOL)
prefService.setBoolPref(name, value); service["pref"].setBoolPref(name, value);
else if (type == prefService.PREF_INT) else if (type == service["pref"].PREF_INT)
liberator.echoerr("E521: Number required after =: " + name + "=" + value); liberator.echoerr("E521: Number required after =: " + name + "=" + value);
else else
liberator.echoerr("E474: Invalid argument: " + name + "=" + value); liberator.echoerr("E474: Invalid argument: " + name + "=" + value);
@@ -367,22 +366,22 @@ function Options() //{{{
if (forcedDefault != null) // this argument sets defaults for non-user settable options (like extensions.history.comp_history) if (forcedDefault != null) // this argument sets defaults for non-user settable options (like extensions.history.comp_history)
defaultValue = forcedDefault; defaultValue = forcedDefault;
let branch = defaultBranch ? prefService.getDefaultBranch("") : prefService; let branch = defaultBranch ? service["pref"].getDefaultBranch("") : service["pref"];
let type = prefService.getPrefType(name); let type = service["pref"].getPrefType(name);
try try
{ {
switch (type) switch (type)
{ {
case prefService.PREF_STRING: case service["pref"].PREF_STRING:
let value = branch.getComplexValue(name, Ci.nsISupportsString).data; let value = branch.getComplexValue(name, Ci.nsISupportsString).data;
// try in case it's a localized string (will throw an exception if not) // try in case it's a localized string (will throw an exception if not)
if (!prefService.prefIsLocked(name) && !prefService.prefHasUserValue(name) && if (!service["pref"].prefIsLocked(name) && !service["pref"].prefHasUserValue(name) &&
/^chrome:\/\/.+\/locale\/.+\.properties/.test(value)) /^chrome:\/\/.+\/locale\/.+\.properties/.test(value))
value = branch.getComplexValue(name, Ci.nsIPrefLocalizedString).data; value = branch.getComplexValue(name, Ci.nsIPrefLocalizedString).data;
return value; return value;
case prefService.PREF_INT: case service["pref"].PREF_INT:
return branch.getIntPref(name); return branch.getIntPref(name);
case prefService.PREF_BOOL: case service["pref"].PREF_BOOL:
return branch.getBoolPref(name); return branch.getBoolPref(name);
default: default:
return defaultValue; return defaultValue;
@@ -787,9 +786,8 @@ function Options() //{{{
{ {
completion.setFunctionCompleter(options.get, [function () ([o.name, o.description] for (o in options))]); completion.setFunctionCompleter(options.get, [function () ([o.name, o.description] for (o in options))]);
completion.setFunctionCompleter([options.getPref, options.safeSetPref, options.setPref, options.resetPref, options.invertPref], completion.setFunctionCompleter([options.getPref, options.safeSetPref, options.setPref, options.resetPref, options.invertPref],
[function () Cc["@mozilla.org/preferences-service;1"].getService(Ci.nsIPrefBranch) [function () service["pref"].getChildList("", { value: 0 })
.getChildList("", { value: 0 }) .map(function (pref) [pref, ""])]);
.map(function (pref) [pref, ""])]);
}); });
return { return {
@@ -890,12 +888,12 @@ function Options() //{{{
if (!filter) if (!filter)
filter = ""; filter = "";
let prefArray = prefService.getChildList("", { value: 0 }); let prefArray = service["pref"].getChildList("", { value: 0 });
prefArray.sort(); prefArray.sort();
let prefs = function () { let prefs = function () {
for each (let pref in prefArray) for each (let pref in prefArray)
{ {
let userValue = prefService.prefHasUserValue(pref); let userValue = service["pref"].prefHasUserValue(pref);
if (onlyNonDefault && !userValue || pref.indexOf(filter) == -1) if (onlyNonDefault && !userValue || pref.indexOf(filter) == -1)
continue; continue;
@@ -988,13 +986,13 @@ function Options() //{{{
resetPref: function (name) resetPref: function (name)
{ {
return prefService.clearUserPref(name); return service["pref"].clearUserPref(name);
}, },
// this works only for booleans // this works only for booleans
invertPref: function (name) invertPref: function (name)
{ {
if (prefService.getPrefType(name) == prefService.PREF_BOOL) if (service["pref"].getPrefType(name) == service["pref"].PREF_BOOL)
this.setPref(name, !this.getPref(name)); this.setPref(name, !this.getPref(name));
else else
liberator.echoerr("E488: Trailing characters: " + name + "!"); liberator.echoerr("E488: Trailing characters: " + name + "!");

35
common/content/service.js Normal file
View File

@@ -0,0 +1,35 @@
/** @scope modules */
let (cc = function (class, iface, meth) { try { return Cc[class][meth || "getService"](iface) } catch (e) {} })
{
/**
* Cached XPCOM services and instances.
*
* @singleton
*/
const service = {
appStartup: cc("@mozilla.org/toolkit/app-startup;1", Ci.nsIAppStartup),
autoCompleteSearch: cc("@mozilla.org/browser/global-history;2", Ci.nsIAutoCompleteSearch),
browserSearch: cc("@mozilla.org/browser/search-service;1", Ci.nsIBrowserSearchService),
cache: cc("@mozilla.org/network/cache-service;1", Ci.nsICacheService),
console: cc("@mozilla.org/consoleservice;1", Ci.nsIConsoleService),
directory: cc("@mozilla.org/file/directory_service;1", Ci.nsIProperties),
environment: cc("@mozilla.org/process/environment;1", Ci.nsIEnvironment),
extensionManager: cc("@mozilla.org/extensions/manager;1", Ci.nsIExtensionManager),
io: cc("@mozilla.org/network/io-service;1", Ci.nsIIOService).QueryInterface(Ci.nsIIOService2),
json: cc("@mozilla.org/dom/json;1", Ci.nsIJSON, "createInstance"),
observer: cc("@mozilla.org/observer-service;1", Ci.nsIObserverService),
profile: cc("@mozilla.org/toolkit/profile-service;1", Ci.nsIToolkitProfileService),
pref: cc("@mozilla.org/preferences-service;1", Ci.nsIPrefService)
.QueryInterface(Ci.nsIPrefBranch).QueryInterface(Ci.nsIPrefBranch2),
sessionStore: cc("@mozilla.org/browser/sessionstore;1", Ci.nsISessionStore),
subscriptLoader: cc("@mozilla.org/moz/jssubscript-loader;1", Ci.mozIJSSubScriptLoader),
threadManager: cc("@mozilla.org/thread-manager;1", Ci.nsIThreadManager),
windowMediator: cc("@mozilla.org/appshell/window-mediator;1", Ci.nsIWindowMediator),
windowWatcher: cc("@mozilla.org/embedcomp/window-watcher;1", Ci.nsIWindowWatcher),
getFile: function () Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsILocalFile),
getFind: function () Cc["@mozilla.org/embedcomp/rangefind;1"].createInstance(Ci.nsIFind),
getProcess: function () Cc["@mozilla.org/process/util;1"].createInstance(Ci.nsIProcess)
};
};

View File

@@ -248,8 +248,8 @@ function Styles(name, store, serial)
const util = modules.util; const util = modules.util;
const sleep = liberator.sleep; const sleep = liberator.sleep;
const storage = modules.storage; const storage = modules.storage;
const consoleService = Cc["@mozilla.org/consoleservice;1"].getService(Ci.nsIConsoleService); const consoleService = service["console"];
const ios = Cc["@mozilla.org/network/io-service;1"].getService(Ci.nsIIOService); const ios = service["io"];
const sss = Cc["@mozilla.org/content/style-sheet-service;1"].getService(Ci.nsIStyleSheetService); const sss = Cc["@mozilla.org/content/style-sheet-service;1"].getService(Ci.nsIStyleSheetService);
const namespace = '@namespace html "' + XHTML + '";\n' + const namespace = '@namespace html "' + XHTML + '";\n' +
'@namespace xul "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";\n' + '@namespace xul "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";\n' +

View File

@@ -99,13 +99,11 @@ function Tabs() //{{{
function copyTab(to, from) function copyTab(to, from)
{ {
const ss = Cc["@mozilla.org/browser/sessionstore;1"].getService(Ci.nsISessionStore);
if (!from) if (!from)
from = getBrowser().mTabContainer.selectedItem; from = getBrowser().mTabContainer.selectedItem;
let tabState = ss.getTabState(from); let tabState = service["sessionStore"].getTabState(from);
ss.setTabState(to, tabState); service["sessionStore"].setTabState(to, tabState);
} }
// hide tabs initially // hide tabs initially
@@ -741,9 +739,7 @@ function Tabs() //{{{
get closedTabs() get closedTabs()
{ {
const json = Cc["@mozilla.org/dom/json;1"].createInstance(Ci.nsIJSON); return service["json"].decode(service["sessionStore"].getClosedTabData(window));
const ss = Cc["@mozilla.org/browser/sessionstore;1"].getService(Ci.nsISessionStore);
return json.decode(ss.getClosedTabData(window));
}, },
list: function (filter) list: function (filter)
@@ -846,8 +842,7 @@ function Tabs() //{{{
{ {
if (bypassCache) if (bypassCache)
{ {
const nsIWebNavigation = Ci.nsIWebNavigation; const flags = Ci.nsIWebNavigation.LOAD_FLAGS_BYPASS_PROXY | Ci.nsIWebNavigation.LOAD_FLAGS_BYPASS_CACHE;
const flags = nsIWebNavigation.LOAD_FLAGS_BYPASS_PROXY | nsIWebNavigation.LOAD_FLAGS_BYPASS_CACHE;
getBrowser().getBrowserForTab(tab).reloadWithFlags(flags); getBrowser().getBrowserForTab(tab).reloadWithFlags(flags);
} }
else else
@@ -971,8 +966,7 @@ function Tabs() //{{{
tab = getBrowser().mTabContainer.selectedItem; tab = getBrowser().mTabContainer.selectedItem;
window.open(); window.open();
const wm = Cc["@mozilla.org/appshell/window-mediator;1"].getService(Ci.nsIWindowMediator); let win = service["windowMediator"].getMostRecentWindow("navigator:browser");
let win = wm.getMostRecentWindow("navigator:browser");
copyTab(win.getBrowser().mCurrentTab, tab); copyTab(win.getBrowser().mCurrentTab, tab);
this.remove(tab, 1, false, 1); this.remove(tab, 1, false, 1);

View File

@@ -660,9 +660,8 @@ function CommandLine() //{{{
{ {
completer: function completer(value) completer: function completer(value)
{ {
let ss = Cc["@mozilla.org/browser/search-service;1"].getService(Ci.nsIBrowserSearchService); let engines = service["browserSearch"].getEngines({})
let engines = ss.getEngines({}) .filter(function (engine) engine.supportsResponseType("application/x-suggestions+json"));
.filter(function (engine) engine.supportsResponseType("application/x-suggestions+json"));
return engines.map(function (engine) [engine.alias, engine.description]); return engines.map(function (engine) [engine.alias, engine.description]);
}, },

View File

@@ -83,60 +83,6 @@ const util = { //{{{
} }
}, },
// TODO: class could have better variable names/documentation
Timer: function Timer(minInterval, maxInterval, callback)
{
let timer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer);
this.doneAt = 0;
this.latest = 0;
this.notify = function (aTimer)
{
timer.cancel();
this.latest = 0;
/* minInterval is the time between the completion of the command and the next firing. */
this.doneAt = Date.now() + minInterval;
try
{
callback(this.arg);
}
finally
{
this.doneAt = Date.now() + minInterval;
}
};
this.tell = function (arg)
{
if (arg !== undefined)
this.arg = arg;
let now = Date.now();
if (this.doneAt == -1)
timer.cancel();
let timeout = minInterval;
if (now > this.doneAt && this.doneAt > -1)
timeout = 0;
else if (this.latest)
timeout = Math.min(timeout, this.latest - now);
else
this.latest = now + maxInterval;
timer.initWithCallback(this, Math.max(timeout, 0), timer.TYPE_ONE_SHOT);
this.doneAt = -1;
};
this.reset = function ()
{
timer.cancel();
this.doneAt = 0;
};
this.flush = function ()
{
if (this.latest)
this.notify();
};
},
cloneObject: function cloneObject(obj) cloneObject: function cloneObject(obj)
{ {
if (obj instanceof Array) if (obj instanceof Array)

View File

@@ -29,10 +29,14 @@ the terms of any one of the MPL, the GPL or the LGPL.
var EXPORTED_SYMBOLS = ["storage", "Timer"]; var EXPORTED_SYMBOLS = ["storage", "Timer"];
const Cc = Components.classes;
const Ci = Components.interfaces;
const Cr = Components.results;
const Cu = Components.utils;
function Timer(minInterval, maxInterval, callback) function Timer(minInterval, maxInterval, callback)
{ {
let timer = Components.classes["@mozilla.org/timer;1"] let timer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer);
.createInstance(Components.interfaces.nsITimer);
this.doneAt = 0; this.doneAt = 0;
this.latest = 0; this.latest = 0;
this.notify = function (aTimer) this.notify = function (aTimer)
@@ -75,7 +79,7 @@ function Timer(minInterval, maxInterval, callback)
{ {
timer.cancel(); timer.cancel();
this.doneAt = 0; this.doneAt = 0;
}; }
this.flush = function () this.flush = function ()
{ {
if (this.latest) if (this.latest)
@@ -83,43 +87,95 @@ function Timer(minInterval, maxInterval, callback)
}; };
} }
var prefService = Components.classes["@mozilla.org/preferences-service;1"] function getFile(name)
.getService(Components.interfaces.nsIPrefService) {
let file = storage.infoPath.clone();
file.append(name);
return file;
}
function readFile(file)
{
let fileStream = Cc["@mozilla.org/network/file-input-stream;1"].createInstance(Ci.nsIFileInputStream);
let stream = Cc["@mozilla.org/intl/converter-input-stream;1"].createInstance(Ci.nsIConverterInputStream);
try
{
fileStream.init(file, -1, 0, 0);
stream.init(fileStream, "UTF-8", 4096, Ci.nsIConverterInputStream.DEFAULT_REPLACEMENT_CHARACTER); // 4096 bytes buffering
let hunks = [];
let res = {};
while (stream.readString(4096, res) != 0)
hunks.push(res.value);
stream.close();
fileStream.close();
return hunks.join("");
}
catch (e) {}
}
function writeFile(file, data)
{
if (!file.exists())
file.create(file.NORMAL_FILE_TYPE, 0600);
let fileStream = Cc["@mozilla.org/network/file-output-stream;1"].createInstance(Ci.nsIFileOutputStream);
let stream = Cc["@mozilla.org/intl/converter-output-stream;1"].createInstance(Ci.nsIConverterOutputStream);
fileStream.init(file, 0x20 | 0x08 | 0x02, 0600, 0); // PR_TRUNCATE | PR_CREATE | PR_WRITE
stream.init(fileStream, "UTF-8", 0, 0);
stream.writeString(data);
stream.close();
fileStream.close();
}
var ioService = Cc["@mozilla.org/network/io-service;1"].getService(Ci.nsIIOService);
var prefService = Cc["@mozilla.org/preferences-service;1"].getService(Ci.nsIPrefService)
.getBranch("extensions.liberator.datastore."); .getBranch("extensions.liberator.datastore.");
var json = Components.classes["@mozilla.org/dom/json;1"] var json = Cc["@mozilla.org/dom/json;1"].createInstance(Ci.nsIJSON);
.createInstance(Components.interfaces.nsIJSON);
function getCharPref(name) function getCharPref(name)
{ {
try try
{ {
return prefService.getComplexValue(name, Components.interfaces.nsISupportsString).data; return prefService.getComplexValue(name, Ci.nsISupportsString).data;
} }
catch (e) {} catch (e) {}
} }
function setCharPref(name, value) function setCharPref(name, value)
{ {
var str = Components.classes['@mozilla.org/supports-string;1'] var str = Cc['@mozilla.org/supports-string;1'].createInstance(Ci.nsISupportsString);
.createInstance(Components.interfaces.nsISupportsString);
str.data = value; str.data = value;
return prefService.setComplexValue(name, Components.interfaces.nsISupportsString, str); return prefService.setComplexValue(name, Ci.nsISupportsString, str);
} }
function loadPref(name, store, type) function loadPref(name, store, type)
{ {
if (store) if (store)
var pref = getCharPref(name); var pref = getCharPref(name);
if (!pref && storage.infoPath)
var file = readFile(getFile(name));
if (pref || file)
var result = json.decode(pref || file);
if (pref) if (pref)
var result = json.decode(pref); {
prefService.clearUserPref(name);
savePref({ name: name, store: true, serial: pref })
}
if (result instanceof type) if (result instanceof type)
return result; return result;
} }
function savePref(obj) function savePref(obj)
{ {
if (obj.store) if (obj.store && storage.infoPath)
setCharPref(obj.name, obj.serial) writeFile(getFile(obj.name), obj.serial);
} }
var prototype = { var prototype = {
@@ -259,7 +315,7 @@ var storage = {
if (!(key in observers)) if (!(key in observers))
observers[key] = []; observers[key] = [];
if (observers[key].indexOf(callback) == -1) if (observers[key].indexOf(callback) == -1)
observers[key].push({ ref: ref && Components.utils.getWeakReference(ref), callback: callback }); observers[key].push({ ref: ref && Cu.getWeakReference(ref), callback: callback });
}, },
removeObserver: function (key, callback) removeObserver: function (key, callback)

View File

@@ -20,7 +20,10 @@
* IMPORTANT: renamed Startup and Quit autocmd events to VimperatorEnter and * IMPORTANT: renamed Startup and Quit autocmd events to VimperatorEnter and
VimperatorLeave respectively VimperatorLeave respectively
* IMPORTANT: 'verbose' is now by default at 1, set to 0 to not show any status messages * IMPORTANT: 'verbose' is now by default at 1, set to 0 to not show any status messages
* IMPORTANT: $VIMPERATOR_HOME is no longer used.
* Added ~/.vimperator/info/{profile}/, similar to viminfo
* added $VIMPERATOR_RUNTIME, $VIMPERATOR_INIT
* :hardcopy now supports output redirection to a file on Unix and MacUnix * :hardcopy now supports output redirection to a file on Unix and MacUnix
* add ";f" extended hint mode to focus a frame * add ";f" extended hint mode to focus a frame
* add "r", "l", and "b" to 'guioptions' to toggle the scrollbars. * add "r", "l", and "b" to 'guioptions' to toggle the scrollbars.

View File

@@ -59,8 +59,8 @@ function Bookmarks() //{{{
const historyService = PlacesUtils.history; const historyService = PlacesUtils.history;
const bookmarksService = PlacesUtils.bookmarks; const bookmarksService = PlacesUtils.bookmarks;
const taggingService = PlacesUtils.tagging; const taggingService = PlacesUtils.tagging;
const searchService = Cc["@mozilla.org/browser/search-service;1"].getService(Ci.nsIBrowserSearchService); const searchService = service.browserSearch;
const ioService = Cc["@mozilla.org/network/io-service;1"].getService(Ci.nsIIOService); const ioService = service.io;
const faviconService = Cc["@mozilla.org/browser/favicon-service;1"].getService(Ci.nsIFaviconService); const faviconService = Cc["@mozilla.org/browser/favicon-service;1"].getService(Ci.nsIFaviconService);
const Bookmark = new Struct("url", "title", "icon", "keyword", "tags", "id"); const Bookmark = new Struct("url", "title", "icon", "keyword", "tags", "id");
@@ -561,7 +561,7 @@ function Bookmarks() //{{{
getSuggestions: function getSuggestions(engine, query, callback) getSuggestions: function getSuggestions(engine, query, callback)
{ {
let ss = Cc["@mozilla.org/browser/search-service;1"].getService(Ci.nsIBrowserSearchService); let ss = service.browserSearch;
const responseType = "application/x-suggestions+json"; const responseType = "application/x-suggestions+json";
let engine = ss.getEngineByAlias(engine); let engine = ss.getEngineByAlias(engine);
@@ -572,7 +572,7 @@ function Bookmarks() //{{{
function process(resp) function process(resp)
{ {
const json = Cc["@mozilla.org/dom/json;1"].createInstance(Ci.nsIJSON); const json = service.json;
let results = []; let results = [];
try try
{ {
@@ -876,7 +876,7 @@ function History() //{{{
let items = completion.runCompleter("history", filter, maxItems); let items = completion.runCompleter("history", filter, maxItems);
if (items.length) if (items.length)
return liberator.open([i[0] for each (i in items)], liberator.NEW_TAB); return liberator.open(items.map(function (i) i.url), liberator.NEW_TAB);
if (filter.length > 0) if (filter.length > 0)
liberator.echoerr("E283: No history matching \"" + filter + "\""); liberator.echoerr("E283: No history matching \"" + filter + "\"");

View File

@@ -418,16 +418,13 @@ const config = { //{{{
{ {
setter: function (value) setter: function (value)
{ {
const ioService = Cc['@mozilla.org/network/io-service;1'].getService(Ci.nsIIOService2); service.io.offline = !value;
gPrefService.setBoolPref("browser.offline", service.io.offline);
ioService.offline = !value;
gPrefService.setBoolPref("browser.offline", ioService.offline);
return value; return value;
}, },
getter: function () getter: function ()
{ {
return Cc['@mozilla.org/network/io-service;1'].getService(Ci.nsIIOService2).offline; return service.io.offline;
} }
}); });

View File

@@ -590,10 +590,11 @@ match being used. The patterns are case insensitive regular expressions.
____ ____
|$VIMPERATOR_RUNTIME|
|\'rtp'| |\'runtimepath'| |\'rtp'| |\'runtimepath'|
||'runtimepath' 'rtp'|| stringlist ||'runtimepath' 'rtp'|| stringlist
____ ____
(default: Unix, Mac: "\~/.vimperator", Windows: "\~/vimperator") (default: \'$VIMPERATOR_RUNTIME' or Unix, Mac: "\~/.vimperator", Windows: "\~/vimperator")
List of directories searched for runtime files: + List of directories searched for runtime files: +
macros/ + macros/ +

View File

@@ -5,20 +5,20 @@ be documented here.
section:Initialization[initialization,startup] section:Initialization[initialization,startup]
At startup Vimperator sources a user RC file, containing Ex commands, and any At startup Vimperator can perform user initialization commands. When one of
JavaScript files found in the plugin directory. The RC file may be named the following is successfully located, it is executed, and no further
[a].vimperatorrc[a] or [a]\_vimperatorrc[a]. The search order is: locations are tried.
* Unix and Mac: [a]\~/.vimperatorrc[a] then [a]\~/_vimperatorrc[a] |$VIMPERATOR_INIT|
* Windows - [a]\~/_vimperatorrc[a] then [a]\~/.vimperatorrc[a] 1. _$VIMPERATOR_INIT_ - May contain a single ex command, usually
[c]:source {file}[c].
2. [a]\~/_vimperatorrc[a] - Windows only. If this file exists, its contents
are executed.
3. [a]\~/.vimperatorrc[a] - If this file exists, its contents are executed.
If 'exrc' is set then any RC file in the current directory is also sourced. If 'exrc' is set then any RC file in the current directory is also sourced.
The plugin directory can be in any of the directories in 'runtimepath'. Using The plugin directory can be in any of the directories in 'runtimepath'.
the default value of 'runtimepath' this would be:
* Unix and Mac - [a]\~/.vimperator/plugin[a]
* Windows - [a]\~/vimperator/plugin[a]
All directories in 'runtimepath' are searched for plugins and they are are all All directories in 'runtimepath' are searched for plugins and they are are all
loaded. loaded.
@@ -31,8 +31,6 @@ The user's \'$HOME'(~) directory is determined as follows:
* Windows - if _%HOME%_ is set then this is used, otherwise _%USERPROFILE%_ or finally * Windows - if _%HOME%_ is set then this is used, otherwise _%USERPROFILE%_ or finally
_%HOMEDRIVE%%HOMEPATH%_. _%HOMEDRIVE%%HOMEPATH%_.
_$VIMPERATOR_HOME_ can be used to override the calculated _$HOME_ directory.
section:Saving{nbsp}settings[save-settings] section:Saving{nbsp}settings[save-settings]
|:mkv| |:mkvimperatorrc| |:mkv| |:mkvimperatorrc|