mirror of
https://github.com/gryf/pentadactyl-pm.git
synced 2025-12-21 02:08:00 +01:00
* Standard module format. All modules are explicitly declared as modules, they're created via a constructor and instantiated automatically. They're dependency aware. They stringify properly. * Classes are declared the same way (rather like Structs already were). They also stringify properly. Plus, each instance has a rather nifty closure member that closes all of its methods around 'this', so you can pass them to map, forEach, setTimeout, etc. Modules are themselves classes, with a special metaclass, as it were. * Doug Crockford is dead, metaphorically speaking. Closure-based classes just don't fit into any of the common JavaScript frameworks, and they're inefficient and confusing. Now, all class and module members are accessed explicitly via 'this', which makes it very clear that they're class members and not (e.g.) local variables, without anything nasty like Hungarian notation. * Strictly one module per file. Classes that belong to a module live in the same file. * For the moment, there are quite a few utility functions sitting in base.c, because my class implementation used them, and I haven't had the time or inclination to sort them out. I plan to reconcile them with the current mess that is the util namespace. * Changed bracing style.
316 lines
14 KiB
JavaScript
316 lines
14 KiB
JavaScript
// Copyright (c) 2006-2009 by Martin Stubenschrott <stubenschrott@vimperator.org>
|
|
//
|
|
// This work is licensed for reuse under an MIT license. Details are
|
|
// given in the LICENSE.txt file included with this file.
|
|
|
|
|
|
const config = { //{{{
|
|
/*** required options, no checks done if they really exist, so be careful ***/
|
|
name: "Vimperator",
|
|
hostApplication: "Firefox",
|
|
|
|
/*** optional options, there are checked for existence and a fallback provided ***/
|
|
features: ["bookmarks", "hints", "history", "marks", "quickmarks", "sanitizer", "session", "tabs", "tabs_undo", "windows"],
|
|
defaults: {
|
|
complete: "slf",
|
|
guioptions: "rb",
|
|
showtabline: 2,
|
|
titlestring: "Vimperator"
|
|
},
|
|
|
|
guioptions: {
|
|
m: ["Menubar", ["toolbar-menubar"]],
|
|
T: ["Toolbar", ["nav-bar"]],
|
|
B: ["Bookmark bar", ["PersonalToolbar"]]
|
|
},
|
|
|
|
get visualbellWindow() getBrowser().mPanelContainer,
|
|
styleableChrome: ["chrome://browser/content/browser.xul"],
|
|
|
|
autocommands: [["BookmarkAdd", "Triggered after a page is bookmarked"],
|
|
["ColorScheme", "Triggered after a color scheme has been loaded"],
|
|
["DOMLoad", "Triggered when a page's DOM content has fully loaded"],
|
|
["DownloadPost", "Triggered when a download has completed"],
|
|
["Fullscreen", "Triggered when the browser's fullscreen state changes"],
|
|
["LocationChange", "Triggered when changing tabs or when navigation to a new location"],
|
|
["PageLoadPre", "Triggered after a page load is initiated"],
|
|
["PageLoad", "Triggered when a page gets (re)loaded/opened"],
|
|
["PrivateMode", "Triggered when private mode is activated or deactivated"],
|
|
["Sanitize", "Triggered when a sanitizeable item is cleared"],
|
|
["ShellCmdPost", "Triggered after executing a shell command with :!cmd"],
|
|
["VimperatorEnter", "Triggered after Firefox starts"],
|
|
["VimperatorLeavePre", "Triggered before exiting Firefox, just before destroying each module"],
|
|
["VimperatorLeave", "Triggered before exiting Firefox"]],
|
|
|
|
dialogs: [
|
|
["about", "About Firefox",
|
|
function () { window.openDialog("chrome://browser/content/aboutDialog.xul", "_blank", "chrome,dialog,modal,centerscreen"); }],
|
|
["addbookmark", "Add bookmark for the current page",
|
|
function () { PlacesCommandHook.bookmarkCurrentPage(true, PlacesUtils.bookmarksRootId); }],
|
|
["addons", "Manage Add-ons",
|
|
function () { window.BrowserOpenAddonsMgr(); }],
|
|
["bookmarks", "List your bookmarks",
|
|
function () { window.openDialog("chrome://browser/content/bookmarks/bookmarksPanel.xul", "Bookmarks", "dialog,centerscreen,width=600,height=600"); }],
|
|
["checkupdates", "Check for updates",
|
|
function () { window.checkForUpdates(); }],
|
|
["cleardata", "Clear private data",
|
|
function () { Cc[GLUE_CID].getService(Ci.nsIBrowserGlue).sanitize(window || null); }],
|
|
["cookies", "List your cookies",
|
|
function () { window.toOpenWindowByType("Browser:Cookies", "chrome://browser/content/preferences/cookies.xul", "chrome,dialog=no,resizable"); }],
|
|
["console", "JavaScript console",
|
|
function () { window.toJavaScriptConsole(); }],
|
|
["customizetoolbar", "Customize the Toolbar",
|
|
function () { window.BrowserCustomizeToolbar(); }],
|
|
["dominspector", "DOM Inspector",
|
|
function () { try { window.inspectDOMDocument(content.document); } catch (e) { liberator.echoerr("DOM Inspector extension not installed"); } }],
|
|
["downloads", "Manage Downloads",
|
|
function () { window.toOpenWindowByType("Download:Manager", "chrome://mozapps/content/downloads/downloads.xul", "chrome,dialog=no,resizable"); }],
|
|
["history", "List your history",
|
|
function () { window.openDialog("chrome://browser/content/history/history-panel.xul", "History", "dialog,centerscreen,width=600,height=600"); }],
|
|
["import", "Import Preferences, Bookmarks, History, etc. from other browsers",
|
|
function () { window.BrowserImport(); }],
|
|
["openfile", "Open the file selector dialog",
|
|
function () { window.BrowserOpenFileWindow(); }],
|
|
["pageinfo", "Show information about the current page",
|
|
function () { window.BrowserPageInfo(); }],
|
|
["pagesource", "View page source",
|
|
function () { window.BrowserViewSourceOfDocument(content.document); }],
|
|
["places", "Places Organizer: Manage your bookmarks and history",
|
|
function () { PlacesCommandHook.showPlacesOrganizer(ORGANIZER_ROOT_BOOKMARKS); }],
|
|
["preferences", "Show Firefox preferences dialog",
|
|
function () { window.openPreferences(); }],
|
|
["printpreview", "Preview the page before printing",
|
|
function () { PrintUtils.printPreview(onEnterPrintPreview, onExitPrintPreview); }],
|
|
["printsetup", "Setup the page size and orientation before printing",
|
|
function () { PrintUtils.showPageSetup(); }],
|
|
["print", "Show print dialog",
|
|
function () { PrintUtils.print(); }],
|
|
["saveframe", "Save frame to disk",
|
|
function () { window.saveFrameDocument(); }],
|
|
["savepage", "Save page to disk",
|
|
function () { window.saveDocument(window.content.document); }],
|
|
["searchengines", "Manage installed search engines",
|
|
function () { window.openDialog("chrome://browser/content/search/engineManager.xul", "_blank", "chrome,dialog,modal,centerscreen"); }],
|
|
["selectionsource", "View selection source",
|
|
function () { buffer.viewSelectionSource(); }]
|
|
],
|
|
|
|
hasTabbrowser: true,
|
|
|
|
get ignoreKeys() {
|
|
delete this.ignoreKeys;
|
|
return this.ignoreKeys = {
|
|
"<Return>": modes.NORMAL | modes.INSERT,
|
|
"<Space>": modes.NORMAL | modes.INSERT,
|
|
"<Up>": modes.NORMAL | modes.INSERT,
|
|
"<Down>": modes.NORMAL | modes.INSERT
|
|
};
|
|
},
|
|
|
|
scripts: [
|
|
"browser.js",
|
|
"bookmarks.js",
|
|
"history.js",
|
|
"quickmarks.js",
|
|
"sanitizer.js",
|
|
"tabs.js"
|
|
],
|
|
|
|
get tempFile() {
|
|
let prefix = this.name.toLowerCase();
|
|
|
|
try
|
|
{
|
|
prefix += "-" + window.content.document.location.hostname;
|
|
}
|
|
catch (e) {}
|
|
|
|
return prefix + ".tmp";
|
|
},
|
|
|
|
init: function ()
|
|
{
|
|
commands.add(["winon[ly]"],
|
|
"Close all other windows",
|
|
function ()
|
|
{
|
|
liberator.windows.forEach(function (win) {
|
|
if (win != window)
|
|
win.close();
|
|
});
|
|
},
|
|
{ argCount: "0" });
|
|
|
|
commands.add(["pref[erences]", "prefs"],
|
|
"Show " + config.hostApplication + " preferences",
|
|
function (args)
|
|
{
|
|
if (args.bang) // open Firefox settings GUI dialog
|
|
{
|
|
liberator.open("about:config",
|
|
(options["newtab"] && options.get("newtab").has("all", "prefs"))
|
|
? liberator.NEW_TAB : liberator.CURRENT_TAB);
|
|
}
|
|
else
|
|
window.openPreferences();
|
|
},
|
|
{
|
|
argCount: "0",
|
|
bang: true
|
|
});
|
|
|
|
commands.add(["sbcl[ose]"],
|
|
"Close the sidebar window",
|
|
function ()
|
|
{
|
|
if (!document.getElementById("sidebar-box").hidden)
|
|
window.toggleSidebar();
|
|
},
|
|
{ argCount: "0" });
|
|
|
|
commands.add(["sideb[ar]", "sb[ar]", "sbope[n]"],
|
|
"Open the sidebar window",
|
|
function (args)
|
|
{
|
|
let arg = args.literalArg;
|
|
function compare(a, b) util.compareIgnoreCase(a, b) == 0
|
|
|
|
// focus if the requested sidebar is already open
|
|
if (compare(document.getElementById("sidebar-title").value, arg))
|
|
{
|
|
document.getElementById("sidebar-box").focus();
|
|
return;
|
|
}
|
|
|
|
let menu = document.getElementById("viewSidebarMenu");
|
|
|
|
for (let [, panel] in Iterator(menu.childNodes))
|
|
{
|
|
if (compare(panel.label, arg))
|
|
{
|
|
panel.doCommand();
|
|
return;
|
|
}
|
|
}
|
|
|
|
liberator.echoerr("No sidebar " + arg + " found");
|
|
},
|
|
{
|
|
argCount: "1",
|
|
completer: function (context)
|
|
{
|
|
context.ignoreCase = true;
|
|
return completion.sidebar(context);
|
|
},
|
|
literal: 0
|
|
});
|
|
|
|
commands.add(["wind[ow]"],
|
|
"Execute a command and tell it to output in a new window",
|
|
function (args)
|
|
{
|
|
liberator.forceNewWindow = true;
|
|
liberator.execute(args.string, null, true);
|
|
liberator.forceNewWindow = false;
|
|
},
|
|
{
|
|
argCount: "+",
|
|
completer: function (context) completion.ex(context),
|
|
literal: 0
|
|
});
|
|
|
|
commands.add(["winc[lose]", "wc[lose]"],
|
|
"Close window",
|
|
function () { window.close(); },
|
|
{ argCount: "0" });
|
|
|
|
commands.add(["wino[pen]", "wo[pen]", "wine[dit]"],
|
|
"Open one or more URLs in a new window",
|
|
function (args)
|
|
{
|
|
args = args.string;
|
|
|
|
if (args)
|
|
liberator.open(args, liberator.NEW_WINDOW);
|
|
else
|
|
liberator.open("about:blank", liberator.NEW_WINDOW);
|
|
},
|
|
{
|
|
completer: function (context) completion.url(context),
|
|
literal: 0,
|
|
privateData: true
|
|
});
|
|
|
|
/////////////////////////////////////////////////////////////////////////////}}}
|
|
////////////////////// OPTIONS /////////////////////////////////////////////////
|
|
/////////////////////////////////////////////////////////////////////////////{{{
|
|
|
|
options.add(["online"],
|
|
"Set the 'work offline' option",
|
|
"boolean", true,
|
|
{
|
|
setter: function (value)
|
|
{
|
|
const ioService = services.get("io");
|
|
if (ioService.offline == value)
|
|
BrowserOffline.toggleOfflineStatus();
|
|
return value;
|
|
},
|
|
getter: function () !services.get("io").offline
|
|
});
|
|
|
|
/////////////////////////////////////////////////////////////////////////////}}}
|
|
////////////////////// COMPLETIONS /////////////////////////////////////////////
|
|
/////////////////////////////////////////////////////////////////////////////{{{
|
|
|
|
var searchRunning = false; // only until Firefox fixes https://bugzilla.mozilla.org/show_bug.cgi?id=510589
|
|
completion.location = function location(context) {
|
|
if (!services.get("autoCompleteSearch"))
|
|
return;
|
|
|
|
context.anchored = false;
|
|
context.title = ["Smart Completions"];
|
|
context.keys.icon = 2;
|
|
context.incomplete = true;
|
|
context.hasItems = context.completions.length > 0; // XXX
|
|
context.filterFunc = null;
|
|
context.cancel = function () { if (searchRunning) { services.get("autoCompleteSearch").stopSearch(); searchRunning = false; } };
|
|
context.compare = CompletionContext.Sort.unsorted;
|
|
let timer = new Timer(50, 100, function (result) {
|
|
context.incomplete = result.searchResult >= result.RESULT_NOMATCH_ONGOING;
|
|
context.completions = [
|
|
[result.getValueAt(i), result.getCommentAt(i), result.getImageAt(i)]
|
|
for (i in util.range(0, result.matchCount))
|
|
];
|
|
});
|
|
if (searchRunning)
|
|
services.get("autoCompleteSearch").stopSearch();
|
|
searchRunning = true;
|
|
services.get("autoCompleteSearch").startSearch(context.filter, "", context.result, {
|
|
onSearchResult: function onSearchResult(search, result) {
|
|
timer.tell(result);
|
|
if (result.searchResult <= result.RESULT_SUCCESS)
|
|
{
|
|
searchRunning = false;
|
|
timer.flush();
|
|
}
|
|
}
|
|
});
|
|
};
|
|
|
|
completion.sidebar = function sidebar(context) {
|
|
let menu = document.getElementById("viewSidebarMenu");
|
|
context.title = ["Sidebar Panel"];
|
|
context.completions = Array.map(menu.childNodes, function (n) [n.label, ""]);
|
|
};
|
|
|
|
completion.addUrlCompleter("l",
|
|
"Firefox location bar entries (bookmarks and history sorted in an intelligent way)",
|
|
completion.location);
|
|
|
|
//}}}
|
|
}
|
|
}; //}}}
|
|
|
|
// vim: set fdm=marker sw=4 ts=4 et:
|