14 Commits
0.3.5 ... 0.3.7

20 changed files with 776 additions and 186 deletions

View File

@ -61,6 +61,32 @@ function i2pbutton_i2p_console_check_ok() {
return false
}
var i2pbutton_window_pref_observer =
{
register: function()
{
m_ib_prefs.addObserver("extensions.i2pbutton", this, false);
},
unregister: function()
{
m_ib_prefs.removeObserver("extensions.i2pbutton", this);
},
// topic: what event occurred
// subject: what nsIPrefBranch we're observing
// data: which pref has been changed (relative to subject)
observe: function(subject, topic, data)
{
if (topic != "nsPref:changed") return;
switch (data) {
case k_ib_browser_update_needed_pref:
torbutton_notify_if_update_needed();
break;
}
}
}
var i2pbutton_unique_pref_observer =
{
register: function()
@ -200,14 +226,82 @@ function i2pbutton_is_mobile() {
return false;
}
function i2pbutton_update_is_needed() {
var updateNeeded = false
try {
updateNeeded = m_ib_prefs.getBoolPref(k_ib_browser_update_needed_pref)
} catch (e) {}
return updateNeeded
}
function i2pbutton_notify_if_update_needed() {
function setOrClearAttribute(aElement, aAttrName, aValue)
{
if (!aElement || !aAttrName)
return
if (aValue)
aElement.setAttribute(aAttrName, aValue)
else
aElement.removeAttribute(aAttrName)
}
let updateNeeded = i2pbutton_update_is_needed()
// Change look of toolbar item (enable/disable animated update icon).
var btn = i2pbutton_get_toolbutton()
setOrClearAttribute(btn, "ibUpdateNeeded", updateNeeded)
// Make the "check for update" menu item bold if an update is needed.
var item = document.getElementById("i2pbutton-checkForUpdate")
setOrClearAttribute(item, "ibUpdateNeeded", updateNeeded)
}
function i2pbutton_check_for_update() {
// Open the update prompt in the correct mode. The update state
// checks used here were adapted from isPending() and isApplied() in
// Mozilla's browser/base/content/aboutDialog.js code.
let updateMgr = Cc["@mozilla.org/updates/update-manager;1"]
.getService(Ci.nsIUpdateManager)
let update = updateMgr.activeUpdate
let updateState = (update) ? update.state : undefined
let pendingStates = [ "pending", "pending-service",
"applied", "applied-service" ]
let isPending = (updateState && (pendingStates.indexOf(updateState) >= 0))
let prompter = Cc["@mozilla.org/updates/update-prompt;1"]
.createInstance(Ci.nsIUpdatePrompt)
if (isPending)
prompter.showUpdateDownloaded(update, false)
else
prompter.checkForUpdates()
}
function i2pbutton_get_toolbutton() {
var o_toolbutton = false;
i2pbutton_log(1, 'get_toolbutton(): looking for button element');
if (document.getElementById("i2pbutton-button")) {
o_toolbutton = document.getElementById("i2pbutton-button");
} else if (document.getElementById("i2pbutton-button-ib")) {
o_toolbutton = document.getElementById("i2pbutton-button-ib");
} else if (document.getElementById("i2pbutton-button-ib-msg")) {
o_toolbutton = document.getElementById("i2pbutton-button-ib-msg");
} else {
i2pbutton_log(3, 'get_toolbutton(): did not find i2pbutton-button');
}
return o_toolbutton;
}
// This function closes all XUL browser windows except this one. For this
// window, it closes all existing tabs and creates one about:blank tab.
function i2pbutton_close_tabs_on_new_identity() {
if (!m_ib_prefs.getBoolPref("extensions.i2pbutton.close_newnym", true)) {
i2pbutton_log(3, "Not closing tabs");
return;
i2pbutton_log(3, "Not closing tabs")
return
}
// TODO: muck around with browser.tabs.warnOnClose.. maybe..
@ -455,6 +549,28 @@ function i2pbutton_new_identity() {
}
}
/* The "New Identity" implementation does the following:
* 1. Disables Javascript and plugins on all tabs
* 2. Clears state:
* a. OCSP
* b. Cache + image cache
* c. Site-specific zoom
* d. Cookies+DOM Storage+safe browsing key
* e. google wifi geolocation token
* f. http auth
* g. SSL Session IDs
* h. last open location url
* i. clear content prefs
* j. permissions
* k. site security settings (e.g. HSTS)
* l. IndexedDB and asmjscache storage
* 3. Sends tor the NEWNYM signal to get a new circuit
* 4. Opens a new window with the default homepage
* 5. Closes this window
*
* XXX: intermediate SSL certificates are not cleared.
*/
function i2pbutton_do_new_identity() {
var obsSvc = Components.classes["@mozilla.org/observer-service;1"].getService(Ci.nsIObserverService);
// This is todo.
@ -1005,7 +1121,7 @@ var i2pbutton_resizelistener =
// in XUL that should be in an XPCOM component
function i2pbutton_close_window(event) {
i2pbutton_window_pref_observer.unregister();
i2pbutton_tor_check_observer.unregister();
i2pbutton_i2p_check_observer.unregister();
window.removeEventListener("sizemodechange", m_ib_resize_handler,
false);

View File

@ -12,6 +12,8 @@ function i2pbutton_log(nLevel, sMsg) {
return true;
}
function i2pbutton_init_security_ui() {}
// get a preferences branch object
// FIXME: this is lame.
function i2pbutton_get_prefbranch(branch_name) {

View File

@ -20,18 +20,17 @@
accesskey="&i2pbutton.context_menu.new_identity_key;"
insertafter="context-stop"
oncommand="i2pbutton_new_identity()"/>
<menuseparator/>
<menuitem id="i2pbutton-cookie-protector"
label="&i2pbutton.context_menu.cookieProtections;"
accesskey="&i2pbutton.context_menu.cookieProtections.key;"
insertafter="context-stop"
insertafter="i2pbutton-new-identity"
hidden="true"
oncommand="i2pbutton_open_cookie_dialog()"/>
<menuseparator id="i2pbutton-checkForUpdateSeparator"/>
<menuitem id="i2pbutton-checkForUpdate"
label="&i2pbutton.context_menu.downloadUpdate;"
accesskey="&i2pbutton.context_menu.downloadUpdate.key;"
insertafter="context-stop"
insertafter="i2pbutton-cookie-protector"
oncommand="i2pbutton_check_for_update()"/>
</vbox>
</hbox>

View File

@ -0,0 +1,212 @@
const Cc = Components.classes
const Ci = Components.interfaces
const Cu = Components.utils
const kI2PProcessExitedTopic = "I2PProcessExited"
const kBootstrapStatusTopic = "I2PBootstrapStatus"
const kI2PBootstrapErrorTopic = "I2PBootstrapError"
const kI2PLogHasWarnOrErrTopic = "I2PLogHasWarnOrErr"
Cu.import("resource://gre/modules/XPCOMUtils.jsm")
XPCOMUtils.defineLazyModuleGetter(this, "LauncherUtil", "resource://i2pbutton/modules/launcher-util.jsm")
const I2PLauncherLogger = Cc["@geti2p.net/i2pbutton-logger;1"].getService(Ci.nsISupports).wrappedJSObject
const gI2PProcessService = Cc["@geti2p.net/i2pbutton-process-service;1"].getService(Ci.nsISupports).wrappedJSObject
var gObsSvc
var gOpenerCallbackFunc // Set when opened from network settings.
function initDialog()
{
// If i2p bootstrap has already finished, just close the progress dialog.
// This situation can occur if bootstrapping is very fast and/or if this
// window opens s vlowly (observed with Adblock Plus installed).
try
{
let processSvc = Cc["@geti2p.net/i2pbutton-process-service;1"].getService(Ci.nsISupports).wrappedJSObject
if (processSvc.I2PIsBootstrapDone || processSvc.I2PBootstrapErrorOccurred)
{
closeThisWindow(processSvc.I2PIsBootstrapDone)
return
}
}
catch (e) { dump(e + "\n") }
try
{
gObsSvc = Cc["@mozilla.org/observer-service;1"].getService(Ci.nsIObserverService)
gObsSvc.addObserver(gObserver, kI2PProcessExitedTopic, false)
gObsSvc.addObserver(gObserver, kBootstrapStatusTopic, false)
gObsSvc.addObserver(gObserver, kI2PBootstrapErrorTopic, false)
gObsSvc.addObserver(gObserver, kI2PLogHasWarnOrErrTopic, false)
}
catch (e) {}
var isBrowserStartup = false
if (window.arguments)
{
isBrowserStartup = window.arguments[0]
if (window.arguments.length > 1)
gOpenerCallbackFunc = window.arguments[1]
}
if (gOpenerCallbackFunc)
{
// Dialog was opened from network settings: hide Open Settings button.
var extraBtn = document.documentElement.getButton("extra2")
extraBtn.setAttribute("hidden", true)
}
else
{
// Dialog was not opened from network settings: change Cancel to Quit.
var cancelBtn = document.documentElement.getButton("cancel")
var quitKey = (LauncherUtil.isWindows) ? "quit_win" : "quit"
cancelBtn.label = 'Cancel'//LauncherUtil.getLocalizedString(quitKey)
}
// If opened during browser startup, display the "please wait" message.
if (isBrowserStartup)
{
var pleaseWait = document.getElementById("progressPleaseWait")
if (pleaseWait)
pleaseWait.removeAttribute("hidden")
}
}
function cleanup()
{
if (gObsSvc)
{
gObsSvc.removeObserver(gObserver, kI2PProcessExitedTopic)
gObsSvc.removeObserver(gObserver, kBootstrapStatusTopic)
gObsSvc.removeObserver(gObserver, kI2PBootstrapErrorTopic)
gObsSvc.removeObserver(gObserver, kI2PLogHasWarnOrErrTopic)
}
}
function onOpenSettings()
{
//stopI2PBootstrap()
//cleanup()
window.close()
}
function stopI2PBootstrap()
{
// Tell i2p to disable use of the network; this should stop the bootstrap
// process.
const kErrorPrefix = "Setting DisableNetwork=1 failed: ";
try
{
var svc = Cc["@torproject.org/torlauncher-protocol-service;1"]
.getService(Ci.nsISupports);
svc = svc.wrappedJSObject;
var settings = {};
settings["DisableNetwork"] = true;
var errObj = {};
if (!svc.I2PSetConfWithReply(settings, errObj))
I2PLauncherLogger.log(5, kErrorPrefix + errObj.details);
}
catch(e)
{
I2PLauncherLogger.log(5, kErrorPrefix + e);
}
}
// Fake it for now. The main goal is to could say with more confidence that
// the router has had time to start before the user can start using the browser
// as any other browser.
setTimeout(() => {
var meter = document.getElementById("progressMeter")
if (meter)
meter.value = meter.value + 15
}, 5000)
setTimeout(() => {
var meter = document.getElementById("progressMeter")
if (meter)
meter.value = meter.value + 15
}, 10000)
setTimeout(() => {
var meter = document.getElementById("progressMeter")
if (meter)
meter.value = meter.value + 15
}, 15000)
setTimeout(() => {
window.close()
}, 25000)
var gObserver = {
// nsIObserver implementation.
observe: function(aSubject, aTopic, aParam)
{
if ((kI2PProcessExitedTopic == aTopic) ||
(kI2PBootstrapErrorTopic == aTopic))
{
// In these cases, an error alert will be displayed elsewhere so it is
// best to close this window.
// TODO: provide a way to access tor log e.g., leave this dialog open
// and display the open settings button or provide a way to do
// that from our error alerts.
if (kI2PBootstrapErrorTopic == aTopic)
stopI2PBootstrap();
cleanup();
window.close();
}
else if (kBootstrapStatusTopic == aTopic)
{
var statusObj = aSubject.wrappedJSObject
var labelText = LauncherUtil.getLocalizedBootstrapStatus(statusObj, "TAG")
var percentComplete = (statusObj.PROGRESS) ? statusObj.PROGRESS : 0
var meter = document.getElementById("progressMeter")
if (meter)
meter.value = percentComplete
var bootstrapDidComplete = (percentComplete >= 100)
if (percentComplete >= 100)
{
// To ensure that 100% progress is displayed, wait a short while
// before closing this window.
window.setTimeout(function() { closeThisWindow(true) }, 250)
}
else if (statusObj._errorOccurred)
{
var s = LauncherUtil.getLocalizedBootstrapStatus(statusObj, "REASON");
if (s)
labelText = s;
if (meter)
meter.setAttribute("hidden", true);
var pleaseWait = document.getElementById("progressPleaseWait");
if (pleaseWait)
pleaseWait.setAttribute("hidden", true);
}
var desc = document.getElementById("progressDesc");
if (labelText && desc)
desc.textContent = labelText;
}
else if (kI2PLogHasWarnOrErrTopic == aTopic)
{
var extra2Btn = document.documentElement.getButton("extra2");
var clz = extra2Btn.getAttribute("class");
extra2Btn.setAttribute("class", clz ? clz + " i2pWarning" : "i2pWarning");
// TODO: show error / warning message in this dialog?
}
},
}

View File

@ -0,0 +1,44 @@
<?xml version="1.0"?>
<!--
- Copyright (c) 2019, The Invisible Internet Project.
- See LICENSE for licensing information.
- vim: set sw=2 sts=2 ts=8 et syntax=xml:
-->
<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
<?xml-stylesheet href="chrome://i2pbutton/skin/progress.css"
type="text/css"?>
<!DOCTYPE overlay SYSTEM "chrome://i2pbutton/locale/progress.dtd">
<dialog id="I2PProgress"
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
title="&i2pprogress.dialog.title;"
windowtype="I2PLauncher:Progress"
persist="screenX screenY"
buttons="cancel"
buttonlabelextra2="&i2pprogress.openSettings;"
ondialogcancel="return onCancel();"
ondialogextra2="onOpenSettings();"
onload="initDialog();"> <!-- extra2 was removed from buttons for now. -->
<script type="application/x-javascript"
src="chrome://i2pbutton/content/progress.js"/>
<vbox>
<hbox>
<vbox>
<spacer flex="1" />
<image id="ibb-icon" />
<spacer flex="1" />
</vbox>
<separator orient="vertical" />
<vbox flex="1">
<label id="progressHeading" value="&i2pprogress.heading;" />
<description id="progressDesc" />
</vbox>
</hbox>
<progressmeter id="progressMeter" mode="determined" value="0" max="100" />
<description id="progressPleaseWait"
hidden="true">&i2pprogress.pleaseWait;</description>
</vbox>
</dialog>

View File

@ -31,7 +31,7 @@
<!ENTITY aboutI2p.refresh_link "Refresh">
<!ENTITY aboutI2p.site "http://i2p-projekt.i2p/en">
<!ENTITY aboutI2p.routerconsole "http://localhost:17657">
<!ENTITY aboutI2p.routerconsole "http://localhost:7647">
<!ENTITY aboutI2p.github "https://github.com/mikalv">
<!ENTITY aboutI2p.trac "http://trac.i2p2.i2p">

View File

@ -0,0 +1,4 @@
<!ENTITY i2pprogress.dialog.title "Starting the I2P router">
<!ENTITY i2pprogress.openSettings "Settings">
<!ENTITY i2pprogress.heading "I2P Browser">
<!ENTITY i2pprogress.pleaseWait "Please wait while the router establish a connection to the I2P network. This may take several minutes">

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

View File

@ -0,0 +1,44 @@
/*
* Copyright (c) 2019, The Invisible Internet Project.
* See LICENSE for licensing information.
*
* vim: set sw=2 sts=2 ts=8 et syntax=css:
*/
dialog {
width: 400px;
}
#progressHeading {
font-size: 110%;
margin: 8px 0px 8px 0px;
font-weight: bold;
}
#progressPleaseWait {
font-size: 110%;
margin-bottom: 15px;
}
#ibb-icon {
list-style-image: url("chrome://i2pbutton/skin/default48.png");
width: 48px;
height: 48px;
}
#progressDesc {
height: 48px;
}
#progressMeter {
margin-bottom: 16px;
}
.i2pWarning {
list-style-image: url("chrome://i2pbutton/skin/warning.png");
}
/* Ensure that our caution icon is always shown on GTK-based platforms. */
.i2pWarning .button-icon {
display: inline !important;
}

BIN
src/chrome/skin/warning.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

View File

@ -106,7 +106,7 @@ IBI2PCheckService.prototype =
createCheckConsoleRequest: function(aAsync)
{
let prefs = Cc["@mozilla.org/preferences-service;1"].getService(Ci.nsIPrefBranch)
let port = prefs.getIntPref("extensions.i2pbutton.console_port_i2pj", 17657)
let port = prefs.getIntPref("extensions.i2pbutton.console_port_i2pj", 7647)
let url = `http://localhost:${port}/netdb?r=.`
return this._createRequest(url, aAsync, "text/html")
},

View File

@ -8,11 +8,29 @@ const Cu = Components.utils
// ctypes can be disabled at build time
try { Cu.import("resource://gre/modules/ctypes.jsm") } catch(e) {}
Cu.import("resource://gre/modules/XPCOMUtils.jsm")
Cu.import("resource://gre/modules/Services.jsm")
XPCOMUtils.defineLazyModuleGetter(this, "LauncherUtil", "resource://i2pbutton/modules/launcher-util.jsm")
//let observerService = Cc["@mozilla.org/observer-service;1"].getService(Ci.nsIObserverService)
const timer = Cc["@mozilla.org/timer;1"].createInstance(Components.interfaces.nsITimer)
let routerStateLoglines = [
'Router state change from STARTING_1 to STARTING_2',
'Router state change from STARTING_2 to STARTING_3',
'Router state change from STARTING_3 to NETDB_READY',
'Router state change from NETDB_READY to RUNNING'
]
function setTimeout(fn, sleep) {
let event = {
notify: fn
}
return timer.initWithCallback(event, sleep, Components.interfaces.nsITimer.TYPE_ONE_SHOT)
}
function I2PProcessService()
{
this._logger = Cc["@geti2p.net/i2pbutton-logger;1"].getService(Ci.nsISupports).wrappedJSObject
@ -94,19 +112,49 @@ I2PProcessService.prototype =
const self = this
this._logger.log(3, 'Checking if a console is already up (an router already running)')
this._isConsoleRunning(function(res) {
//this._logger.log(3, 'Checking if a console is already up (an router already running)')
let prefs = Cc["@mozilla.org/preferences-service;1"].getService(Ci.nsIPrefBranch)
let shouldShowDelayUserDialog = prefs.getBoolPref("extensions.i2pbutton.delay_user_with_dialog", true)
try {
if (shouldShowDelayUserDialog) {
self.openWaitForRouterDialog()
setTimeout(() => {
let progressmeter = self.mDelayUserDialog.document.getElementById('progressMeter')
progressmeter.value = progressmeter.value + 35
var text = self.mDelayUserDialog.document.getElementById('progressPleaseWait')
text.value = 'Waiting for the router to open the console and proxy port.'
}, 5000)
}
} catch (err) {
self._logger.log(5, `Unknown error while executing delay user dialog: ${err}`)
}
let canStartPromise = self._config_checker.ensure_config()
canStartPromise.then(() => {
self._logger.log(3, 'Starting the router')
self.I2PStartAndControlI2P(true)
})
// After the router process is spawned.
/*if (self.mDelayUserDialog) {
setTimeout(() => {
let progressmeter = self.mDelayUserDialog.document.getElementById('progressMeter')
progressmeter.value = progressmeter.value + 35
var text = self.mDelayUserDialog.document.getElementById('progressPleaseWait')
text.value = 'Waiting for the router to open the console and proxy port.'
}, 5000)
}*/
/*this._isConsoleRunning(function(res) {
if (res!=4) {
// Yes, 4 is success
let canStartPromise = self._config_checker.ensure_config()
canStartPromise.then(() => {
self._logger.log(3, 'Starting the router')
self.I2PStartAndControlI2P(true)
})
} else {
self._logger.log(3, 'Already found a router, won\'t launch.')
}
})
})*/
}
else if ("quit-application-granted" == aTopic)
{
@ -119,8 +167,8 @@ I2PProcessService.prototype =
let prefs = Cc["@mozilla.org/preferences-service;1"].getService(Ci.nsIPrefBranch)
let shouldKillRouter = prefs.getBoolPref("extensions.i2pbutton.kill_router_on_exit", true)
if (shouldKillRouter) this.mI2PProcess.kill()
this._logger.log(4, "Disconnecting from i2p process (pid " + this.mI2PProcess.pid + ")");
this.mI2PProcess = null;
this._logger.log(4, "Disconnecting from i2p process (pid " + this.mI2PProcess.pid + ")")
this.mI2PProcess = null
}
}
else if (("process-failed" == aTopic) || ("process-finished" == aTopic))
@ -135,11 +183,11 @@ I2PProcessService.prototype =
this.mI2PProcessStatus = this.kStatusExited;
this.mIsBootstrapDone = false;
this.mObsSvc.notifyObservers(null, "I2PProcessExited", null);
this.mObsSvc.notifyObservers(null, "I2PProcessExited", null)
if (this.mIsQuitting)
{
LauncherUtil.cleanupTempDirectories();
LauncherUtil.cleanupTempDirectories()
}
else
{
@ -147,9 +195,9 @@ I2PProcessService.prototype =
var cancelBtnLabel = "OK";
try
{
const kSysBundleURI = "chrome://global/locale/commonDialogs.properties";
var sysBundle = Cc["@mozilla.org/intl/stringbundle;1"].getService(Ci.nsIStringBundleService).createBundle(kSysBundleURI);
cancelBtnLabel = sysBundle.GetStringFromName(cancelBtnLabel);
const kSysBundleURI = "chrome://global/locale/commonDialogs.properties"
var sysBundle = Cc["@mozilla.org/intl/stringbundle;1"].getService(Ci.nsIStringBundleService).createBundle(kSysBundleURI)
cancelBtnLabel = sysBundle.GetStringFromName(cancelBtnLabel)
} catch(e) {}
this._logger.log(3, 'The router stopped..')
@ -167,9 +215,9 @@ I2PProcessService.prototype =
this.mObsSvc.notifyObservers(null, "I2PProcessIsReady", null)
}
} else if (kBootstrapStatusTopic == aTopic) {
//this._processBootstrapStatus(aSubject.wrappedJSObject);
this._processBootstrapStatus(aSubject.wrappedJSObject)
} else if (kUserQuitTopic == aTopic) {
this.mQuitSoon = true;
this.mQuitSoon = true
}
},
@ -227,6 +275,40 @@ I2PProcessService.prototype =
},
openWaitForRouterDialog: function() {
const self = this
//var win = ww.openWindow(null, "chrome://i2pbutton/content/progress.xul", "wizard", "chrome,dialog=no,modal,centerscreen", {blabla:0})
const ww = Components.classes["@mozilla.org/embedcomp/window-watcher;1"].getService(Components.interfaces.nsIWindowWatcher)
self.mDelayUserDialog = ww.openWindow(null, "chrome://i2pbutton/content/progress.xul", "startingrouter", "chrome,dialog=no,modal,centerscreen", {blabla:0})
setTimeout(() => {
let progressmeter = self.mDelayUserDialog.document.getElementById('progressMeter')
progressmeter.value = progressmeter.value + 15
var text = self.mDelayUserDialog.document.getElementById('progressPleaseWait')
text.hidden = false
}, 1000)
return self.mDelayUserDialog
},
getWrapperLog: function() {
let wrapperLogFile = LauncherUtil.dataDirectoryObject
wrapperLogFile.append('I2P')
wrapperLogFile.append('wrapper.log')
return this._getFileAsString(wrapperLogFile)
},
getLogsLogTxt: function() {
let logTxtFile = LauncherUtil.dataDirectoryObject
logTxtFile.append('I2P')
logTxtFile.append('logs')
logTxtFile.append('log-0.txt')
return this._getFileAsString(logTxtFile)
},
retrieveBootstrapStatus: function() {},
I2PStartAndControlI2P: function()
{
this._startI2P()
@ -256,8 +338,22 @@ I2PProcessService.prototype =
mLastI2PWarningPhase: null,
mLastI2PWarningReason: null,
mDefaultPreferencesAreLoaded: false,
mDelayUserDialog: null,
// Private Methods /////////////////////////////////////////////////////////
_resetLogFiles: function() {
let wrapperLogFile = LauncherUtil.dataDirectoryObject
wrapperLogFile.append('I2P')
wrapperLogFile.append('wrapper.log')
if (wrapperLogFile.exists()) wrapperLogFile.remove(false)
let logTxtFile = LauncherUtil.dataDirectoryObject
logTxtFile.append('I2P')
logTxtFile.append('logs')
logTxtFile.append('log-0.txt')
if (logTxtFile.exists()) logTxtFile.remove(false)
},
_startI2P: function()
{
this.mI2PProcessStatus = this.kStatusUnknown;
@ -270,8 +366,8 @@ I2PProcessService.prototype =
try
{
// Ideally, we would cd to the Firefox application directory before
// starting tor (but we don't know how to do that). Instead, we
// rely on the TBB launcher to start Firefox from the right place.
// starting i2p (but we don't know how to do that). Instead, we
// rely on the IBB launcher to start Firefox from the right place.
// Get the I2P data directory first so it is created before we try to
// construct paths to files that will be inside it.
@ -294,6 +390,8 @@ I2PProcessService.prototype =
return;
}
this._resetLogFiles()
let args = LauncherUtil.getRouterDefaultArgs()
// Set an environment variable that points to the I2P data directory.
@ -334,42 +432,92 @@ I2PProcessService.prototype =
{
this.mI2PProcessStatus = this.kStatusExited
//var s = LauncherUtil.getLocalizedString("i2p_failed_to_start");
//this._notifyUserOfError(s, null, this.kI2PProcessDidNotStartTopic);
this._notifyUserOfError('Failed to start the I2P router', null, this.kI2PProcessDidNotStartTopic);
this._logger.log(4, "_startI2P error: ", e)
}
}, // _startI2P()
_isConsoleRunning: function(callback) {
let checkSvc = Cc["@geti2p.net/i2pbutton-i2pCheckService;1"].getService(Ci.nsISupports).wrappedJSObject
let req = checkSvc.createCheckConsoleRequest(true);
let obsSvc = Cc["@mozilla.org/observer-service;1"].getService(Ci.nsIObserverService)
let req = checkSvc.createCheckConsoleRequest(true)
const self = this
req.onreadystatechange = function(event) {
if (req.readyState === 4) {
// Done
let result = checkSvc.parseCheckConsoleResponse(req)
self.mIsBootstrapDone = true
self.mI2PProcessStatus = self.kStatusRunning
self._processBootstrapStatus({ PROGRESS: 100, message: 'The router has succcessfully started.' })
var statusObj = { bootstrap: 'done', success: true }
statusObj.wrappedJSObject = statusObj
obsSvc.notifyObservers(statusObj, "I2PBootstrapStatus", null)
callback(result)
}
}
req.send(null)
},
_processBootstrapStatus: function(aStatusObj)
{
if (!aStatusObj)
return
if (100 == aStatusObj.PROGRESS)
{
this.mIsBootstrapDone = true
this.mBootstrapErrorOccurred = false
LauncherUtil.setBoolPref(this.kPrefPromptAtStartup, false)
}
else
{
this.mIsBootstrapDone = false
if (aStatusObj._errorOccurred)
{
this.mBootstrapErrorOccurred = true
LauncherUtil.setBoolPref(this.kPrefPromptAtStartup, true)
let phase = LauncherUtil.getLocalizedBootstrapStatus(aStatusObj,
"TAG")
let reason = LauncherUtil.getLocalizedBootstrapStatus(aStatusObj,
"REASON")
let details = LauncherUtil.getFormattedLocalizedString(
"i2p_bootstrap_failed_details", [phase, reason], 2)
I2PLauncherLogger.log(5, "I2P bootstrap error: [" + aStatusObj.TAG +
"/" + aStatusObj.REASON + "] " + details);
if ((aStatusObj.TAG != this.mLastI2PWarningPhase) ||
(aStatusObj.REASON != this.mLastI2PWarningReason))
{
this.mLastI2PWarningPhase = aStatusObj.TAG
this.mLastI2PWarningReason = aStatusObj.REASON
let msg = LauncherUtil.getLocalizedString("i2p_bootstrap_failed")
this._notifyUserOfError(msg, details, this.kI2PBootstrapErrorTopic)
}
}
}
}, // _processBootstrapStatus()
_controlI2P: function(aIsRunningI2P)
{
try
{
if (aIsRunningI2P)
this._monitorI2PProcessStartup();
this._monitorI2PProcessStartup()
// If the user pressed "Quit" within settings/progress, exit.
if (this.mQuitSoon)
this._quitApp();
this._quitApp()
}
catch (e)
{
this.mI2PProcessStatus = this.kStatusExited;
var s = LauncherUtil.getLocalizedString("i2p_control_failed");
this._notifyUserOfError(s, null, null);
this._logger.log(4, "_controlI2P error: ", e);
this.mI2PProcessStatus = this.kStatusExited
var s = LauncherUtil.getLocalizedString("i2p_control_failed")
this._notifyUserOfError(s, null, null)
this._logger.log(4, "_controlI2P error: ", e)
}
}, // controlI2P()
@ -382,8 +530,8 @@ I2PProcessService.prototype =
this.mI2PProcess.kill()
}
var asSvc = Cc["@mozilla.org/toolkit/app-startup;1"].getService(Ci.nsIAppStartup);
var flags = asSvc.eAttemptQuit;
let asSvc = Cc["@mozilla.org/toolkit/app-startup;1"].getService(Ci.nsIAppStartup);
let flags = asSvc.eAttemptQuit;
asSvc.quit(flags);
}
catch (e)
@ -401,25 +549,25 @@ I2PProcessService.prototype =
_notifyUserOfError: function(aMessage, aDetails, aNotifyTopic)
{
let errorObj = { handled: false, message: aMessage };
let errorObj = { handled: false, message: aMessage }
if (aDetails)
errorObj.details = aDetails;
errorObj.details = aDetails
if (aNotifyTopic)
{
// Give other code an opportunity to handle this error, e.g., if the
// network settings window is open, errors are displayed using an
// overlaid XUL element.
errorObj.wrappedJSObject = errorObj;
this.mObsSvc.notifyObservers(errorObj, aNotifyTopic, null);
errorObj.wrappedJSObject = errorObj
this.mObsSvc.notifyObservers(errorObj, aNotifyTopic, null)
}
if (!errorObj.handled)
{
let msg = aMessage;
let msg = aMessage
if (aDetails)
msg += "\n\n" + aDetails;
I2PLauncherUtil.showAlert(null, msg);
msg += "\n\n" + aDetails
LauncherUtil.showAlert(null, msg)
}
},

View File

@ -11,6 +11,7 @@ const Cu = Components.utils
Cu.import("resource://i2pbutton/modules/default-prefs.js", {}).ensureDefaultPrefs()
Cu.import("resource://gre/modules/Services.jsm")
Cu.import("resource://gre/modules/Log.jsm")
let console = (Cu.import("resource://gre/modules/Console.jsm", {})).console
@ -107,32 +108,32 @@ I2pbuttonLogger.prototype =
},
safe_log: function(level, str, scrub) {
if (this.loglevel < 4) {
this.eclog(level, str+scrub);
} else {
this.eclog(level, str+" [scrubbed]");
}
if (this.loglevel < 4) {
this.eclog(level, str+scrub);
} else {
this.eclog(level, str+" [scrubbed]");
}
},
log: function(level, str) {
switch(this.logmethod) {
case 2: // debuglogger
if(this._debuglog) {
this._debuglog.log((6-level), this.formatLog(str,level));
break;
}
// fallthrough
case 0: // stderr
if(this.loglevel <= level)
dump(this.formatLog(str,level)+"\n");
break;
default:
dump("Bad log method: "+this.logmethod);
case 1: // errorconsole
if(this.loglevel <= level)
this._console.logStringMessage(this.formatLog(str,level));
break;
}
switch(this.logmethod) {
case 2: // debuglogger
if(this._debuglog) {
this._debuglog.log((6-level), this.formatLog(str,level));
break;
}
// fallthrough
case 0: // stderr
if(this.loglevel <= level)
dump(this.formatLog(str,level)+"\n");
break;
default:
dump("Bad log method: "+this.logmethod);
case 1: // errorconsole
if(this.loglevel <= level)
this._console.logStringMessage(this.formatLog(str,level));
break;
}
},
error: function(str) { this.log(6, str) },
@ -149,25 +150,25 @@ I2pbuttonLogger.prototype =
// data: which pref has been changed (relative to subject)
observe: function(subject, topic, data)
{
if (topic != "nsPref:changed") return;
switch (data) {
case "extensions.i2pbutton.logmethod":
this.logmethod = Services.prefs.getIntPref("extensions.i2pbutton.logmethod");
if (this.logmethod === 0) {
Services.prefs.setBoolPref("browser.dom.window.dump.enabled",
true);
} else if (Services.prefs.
getIntPref("extensions.i2plauncher.logmethod", 3) !== 0) {
// If I2P Launcher is not available or its log method is not 0
// then let's reset the dump pref.
Services.prefs.setBoolPref("browser.dom.window.dump.enabled",
false);
}
break;
case "extensions.i2pbutton.loglevel":
this.loglevel = Services.prefs.getIntPref("extensions.i2pbutton.loglevel");
break;
}
if (topic != "nsPref:changed") return;
switch (data) {
case "extensions.i2pbutton.logmethod":
this.logmethod = Services.prefs.getIntPref("extensions.i2pbutton.logmethod");
if (this.logmethod === 0) {
Services.prefs.setBoolPref("browser.dom.window.dump.enabled",
true);
} else if (Services.prefs.
getIntPref("extensions.i2plauncher.logmethod", 3) !== 0) {
// If I2P Launcher is not available or its log method is not 0
// then let's reset the dump pref.
Services.prefs.setBoolPref("browser.dom.window.dump.enabled",
false);
}
break;
case "extensions.i2pbutton.loglevel":
this.loglevel = Services.prefs.getIntPref("extensions.i2pbutton.loglevel");
break;
}
}
}

View File

@ -22,8 +22,8 @@ Cu.import('resource://gre/modules/FileUtils.jsm')
XPCOMUtils.defineLazyModuleGetter(this, "LauncherUtil", "resource://i2pbutton/modules/launcher-util.jsm")
let consolePort = Services.prefs.getIntPref("extensions.i2pbutton.console_port_i2pj", 17657)
let httpProxyPort = Services.prefs.getIntPref("network.proxy.http_port", 14444)
let consolePort = Services.prefs.getIntPref("extensions.i2pbutton.console_port_i2pj", 7647)
let httpProxyPort = Services.prefs.getIntPref("network.proxy.http_port", 7644)
const defaultWebappsConfig = `# Autogenerated by I2P Browser
webapps.jsonrpc.startOnLoad=true
@ -172,28 +172,10 @@ RouterConfigManager.prototype = {
},
_write_router_config: function(configfile,onComplete) {
_write_config: function(configfile, content, onComplete) {
const self = this
LauncherUtil.writeFileWithData(configfile, defaultRouterConfig, file => { onComplete(file) }, (err) => {
this._logger.log(6,`Can't write router config file :( - path was ${configfile.path}`)
})
},
_write_tunnel_config: function(configfile,onComplete) {
const self = this
LauncherUtil.writeFileWithData(configfile, defaultProxyTunnels, file => { onComplete(file) }, (err) => {
this._logger.log(6,`Can't write tunnel proxy config file :( - path was ${configfile.path}`)
})
},
_write_clients_config: function(configfile,onComplete) {
const self = this
LauncherUtil.writeFileWithData(configfile, defaultClientsConfig, file => { onComplete(file) }, (err) => {
this._logger.log(6,`Can't write clients config file :( - path was ${configfile.path}`)
})
},
_write_webapps_config: function(configfile,onComplete) {
const self = this
LauncherUtil.writeFileWithData(configfile, defaultWebappsConfig, file => { onComplete(file) }, (err) => {
this._logger.log(6,`Can't write webapps config file :( - path was ${configfile.path}`)
LauncherUtil.writeFileWithData(configfile, content, file => { onComplete(file) }, (err) => {
this._logger.log(6,`Can't write config file :( - path was ${configfile.path}, error: ${err}`)
})
},
@ -270,36 +252,13 @@ RouterConfigManager.prototype = {
this._logger.log(3, `Copied hosts.txt file`)
}
// Temporary jetty fix
let orgDir = configDirectory.clone()
orgDir.append('org')
if (!orgDir.exists()) {
orgDir.create(orgDir.DIRECTORY_TYPE, 0o700)
orgDir.append('eclipse')
orgDir.create(orgDir.DIRECTORY_TYPE, 0o700)
orgDir.append('jetty')
orgDir.create(orgDir.DIRECTORY_TYPE, 0o700)
orgDir.append('webapp')
orgDir.create(orgDir.DIRECTORY_TYPE, 0o700)
let distJettyFile = LauncherUtil.getI2PBinary().parent.parent
distJettyFile.append('org')
distJettyFile.append('eclipse')
distJettyFile.append('jetty')
distJettyFile.append('webapp')
distJettyFile.append('webdefault.xml')
distJettyFile.copyTo(orgDir, '')
}
this.ensure_docs()
this.ensure_webapps()
// Ensure they exists
const self = this
this.ensureRouterConfigPromise = () => {
return new Promise(resolve => {
if (!routerConfigFile.exists()) {
self._write_router_config(routerConfigFile, file => {
self._write_config(routerConfigFile, defaultRouterConfig, file => {
self.mDoesRouterConfigExists = true
self._logger.log(3, 'Wrote router.config')
if (typeof onCompleteCallback === 'function') onCompleteCallback(file)
@ -316,7 +275,7 @@ RouterConfigManager.prototype = {
this.ensureTunnelConfigPromise = () => {
return new Promise(resolve => {
if (!tunnelConfigFile.exists()) {
self._write_tunnel_config(tunnelConfigFile, tfile => {
self._write_config(tunnelConfigFile, defaultProxyTunnels, tfile => {
self._logger.log(3, 'Wrote i2ptunnel.config')
self.mDoesTunnelConfigExists = true
if (typeof onCompleteCallback === 'function') onCompleteCallback(tfile)
@ -333,7 +292,7 @@ RouterConfigManager.prototype = {
this.ensureClientsConfigPromise = () => {
return new Promise(resolve => {
if (!clientsConfigFile.exists()) {
self._write_clients_config(clientsConfigFile, tfile => {
self._write_config(clientsConfigFile, defaultClientsConfig, tfile => {
self._logger.log(3, 'Wrote clients.config')
self.mDoesClientsConfigExists = true
if (typeof onCompleteCallback === 'function') onCompleteCallback(tfile)
@ -350,7 +309,7 @@ RouterConfigManager.prototype = {
this.ensureWebappsConfigPromise = () => {
return new Promise(resolve => {
if (!webappsConfigFile.exists()) {
self._write_webapps_config(webappsConfigFile, tfile => {
self._write_config(webappsConfigFile, defaultWebappsConfig, tfile => {
self._logger.log(3, 'Wrote webapps.config')
self.mDoesWebappsConfigExists = true
if (typeof onCompleteCallback === 'function') onCompleteCallback(tfile)

View File

@ -73,13 +73,13 @@ StartupObserver.prototype = {
this._prefs.setIntPref("network.proxy.type", 1);
this._prefs.setIntPref("network.proxy.socks_port", 0);
this._prefs.setCharPref("network.proxy.socks", "");
this._prefs.setIntPref("extensions.i2pbutton.console_port_i2pj", 17657);
this._prefs.setIntPref("extensions.i2pbutton.console_port_i2pj", 7647);
this._prefs.setCharPref("network.proxy.http", "127.0.0.1");
this._prefs.setIntPref("network.proxy.http_port", 14444);
this._prefs.setIntPref("network.proxy.http_port", 7644);
this._prefs.setCharPref("network.proxy.ssl", "127.0.0.1");
this._prefs.setIntPref("network.proxy.ssl_port", 14444);
this._prefs.setIntPref("network.proxy.ssl_port", 7644);
this._prefs.setCharPref("network.proxy.ftp", "127.0.0.1");
this._prefs.setIntPref("network.proxy.ftp_port", 14444);
this._prefs.setIntPref("network.proxy.ftp_port", 7644);
this._prefs.setCharPref("network.proxy.no_proxies_on", "localhost, 127.0.0.1");
// Force prefs to be synced to disk

View File

@ -56,7 +56,7 @@ pref("browser.startup.homepage", "chrome://i2pbutton/content/locale/non-localize
pref("extensions.i2pbutton.start_i2p", true);
pref("extensions.i2pbutton.kill_router_on_exit", true);
pref("extensions.i2pbutton.console_host", "127.0.0.1");
pref("extensions.i2pbutton.console_port_i2pj", 17657);
pref("extensions.i2pbutton.console_port_i2pj", 7647);
pref("extensions.i2pbutton.console_port_i2pd", 17070);
// I2P Implementation

View File

@ -6,7 +6,7 @@
<em:name>I2pbutton</em:name>
<em:creator>Meeh, Mikal Villa</em:creator>
<em:id>i2pbutton@geti2p.net</em:id>
<em:version>0.3.4</em:version>
<em:version>0.3.7</em:version>
<em:multiprocessCompatible>true</em:multiprocessCompatible>
<em:homepageURL>https://geti2p.net/en/download/lab</em:homepageURL>
<em:iconURL>chrome://i2pbutton/skin/i2p.png</em:iconURL>

View File

@ -49,7 +49,7 @@ const LauncherUtil = {
{
var wm = Cc["@mozilla.org/appshell/window-mediator;1"].getService(Ci.nsIWindowMediator)
let browserWindow = wm.getMostRecentWindow("navigator:browser")
if (TLUtilInternal._isWindowVisible(browserWindow))
if (LauncherUtilInternal._isWindowVisible(browserWindow))
aParentWindow = browserWindow;
}
@ -85,32 +85,31 @@ const LauncherUtil = {
get _networkSettingsWindow()
{
var wm = Cc["@mozilla.org/appshell/window-mediator;1"]
.getService(Ci.nsIWindowMediator);
return wm.getMostRecentWindow("I2PLauncher:NetworkSettings");
let wm = Cc["@mozilla.org/appshell/window-mediator;1"].getService(Ci.nsIWindowMediator)
return wm.getMostRecentWindow("I2PLauncher:NetworkSettings")
},
_openNetworkSettings: function(aIsInitialBootstrap, aStartAtWizardPanel)
{
var win = this._networkSettingsWindow;
var win = this._networkSettingsWindow
if (win)
{
// Return to "Starting i2p" panel if being asked to open & dlog already exists.
//win.showStartingTorPanel();
win.focus();
//win.showStartingI2PPanel()
win.focus()
return;
}
const kSettingsURL = "chrome://i2pbutton/chrome/content/network-settings.xul";
const kWizardURL = "chrome://i2pbutton/chrome/content/network-settings-wizard.xul";
const kSettingsURL = "chrome://i2pbutton/chrome/content/i2pstartup-confdlg.xul"
const kWizardURL = "chrome://i2pbutton/chrome/content/i2pstartup-confdlg-wizard.xul"
var wwSvc = Cc["@mozilla.org/embedcomp/window-watcher;1"]
.getService(Ci.nsIWindowWatcher);
var winFeatures = "chrome,dialog=yes,modal,all";
var argsArray = this._createOpenWindowArgsArray(aIsInitialBootstrap,
aStartAtWizardPanel);
let isProgress = (this.kWizardProgressPageID == aStartAtWizardPanel);
//let url = (aIsInitialBootstrap || isProgress) ? kWizardURL : kSettingsURL;
wwSvc.openWindow(null, kWizardURL, "_blank", winFeatures, argsArray);
.getService(Ci.nsIWindowWatcher)
var winFeatures = "chrome,dialog=no,modal,all"
var argsArray = this._createOpenWindowArgsArray(aIsInitialBootstrap,aStartAtWizardPanel)
let isProgress = (this.kWizardProgressPageID == aStartAtWizardPanel)
//let url = (aIsInitialBootstrap || isProgress) ? kWizardURL : kSettingsURL
wwSvc.openWindow(null, kWizardURL, "_blank", winFeatures, argsArray)
},
// Returns true if user confirms; false if not.
@ -147,8 +146,8 @@ const LauncherUtil = {
{
try
{
let dirPath = this.getCharPref(TLUtilInternal.kIPCDirPrefName);
this.clearUserPref(TLUtilInternal.kIPCDirPrefName);
let dirPath = this.getCharPref(LauncherUtilInternal.kIPCDirPrefName);
this.clearUserPref(LauncherUtilInternal.kIPCDirPrefName);
if (dirPath)
{
let f = Cc['@mozilla.org/file/local;1'].createInstance(Ci.nsIFile);
@ -168,32 +167,34 @@ const LauncherUtil = {
let dataDir = this.getI2PConfigPath(true)
let exeFile = this.getI2PBinary()
let libDir = dataDir.clone()
let i2pDir = libDir.clone()
let i2pDir = exeFile.parent.parent.clone()
libDir.append('lib')
let args = []
// NOTE: Don't mind spaces as nsIProcess escapes them.
args.push(`-Di2p.dir.base=${i2pDir.path}`)
logger.log(2, `Path for base is => ${i2pDir.path}`)
args.push(`-Duser.dir=${dataDir.path}`) // make PWD equal dataDir
let logFile = dataDir.clone()
logFile.append('wrapper.log')
let nativeLib = libDir.clone()
nativeLib.append('jbigi.jar')
let clientConfigFile = dataDir.clone()
clientConfigFile.append('clients.config')
let routerCofigFile = dataDir.clone()
routerCofigFile.append('router.config')
logger.log(2, `Path for base is => ${i2pDir.path}`)
// NOTE: Don't mind spaces as nsIProcess escapes them.
args.push(`-Di2p.dir.base=${i2pDir.path}`)
args.push(`-Duser.dir=${dataDir.path}`) // make PWD equal dataDir
args.push(`-Dwrapper.logfile=${logFile.path}`)
args.push(`-Djetty.home=${i2pDir.path}`)
args.push(`-Djava.library.path=${libDir.path}`)
args.push(`-Di2p.dir.config=${dataDir.path}`)
args.push(`-Di2p.dir.router=${dataDir.path}`)
args.push(`-Di2p.dir.app=${dataDir.path}`)
let clientConfigFile = dataDir.clone()
clientConfigFile.append('clients.config')
let routerCofigFile = dataDir.clone()
routerCofigFile.append('router.config')
args.push(`-Drouter.clientConfigFile=${clientConfigFile.path}`)
args.push(`-Drouter.configLocation=${routerCofigFile.path}`)
args.push('-Di2p.dir.portableMode=false')
args.push('-Dwrapper.name=i2pbrowser')
args.push('-Dwrapper.displayname=I2PBrowser')
args.push('-cp')
args.push(`${i2pDir.path}:${libDir.path}:${dataDir.path}`)
args.push(`${i2pDir.path}:${nativeLib.path}:${libDir.path}:${dataDir.path}`)
args.push("-Djava.awt.headless=true")
args.push("-Dwrapper.console.loglevel=DEBUG")
// Main class to execute
@ -311,7 +312,7 @@ const LauncherUtil = {
return i2pFile
} else {
logger.log(4, aI2PFileType + " file not found: "+ i2pFile.path)
return ''
return null
}
} catch(e) {
@ -320,22 +321,27 @@ const LauncherUtil = {
}
},
get internal() {
return LauncherUtilInternal
},
get dataDirectoryObject() {
let dataDir = LauncherUtilInternal._dataDir
try { dataDir.normalize() } catch(e) {}
logger.log(3, `Decided to use file ${dataDir.path}`)
return dataDir.clone()
},
get appDirectoryObject() {
return LauncherUtilInternal._appDir.clone()
},
flushLocalizedStringCache: function()
{
LauncherUtilInternal.mStringBundle = undefined
},
// "i2pbutton." is prepended to aStringName.
getLocalizedString: function(aStringName)
{
@ -345,7 +351,7 @@ const LauncherUtil = {
try
{
var key = kPropNamePrefix + aStringName;
return TLUtilInternal._stringBundle.GetStringFromName(key);
return LauncherUtilInternal._stringBundle.GetStringFromName(key);
} catch(e) {}
return aStringName;
@ -360,7 +366,7 @@ const LauncherUtil = {
try
{
var key = kPropNamePrefix + aStringName;
return TLUtilInternal._stringBundle.formatStringFromName(key, aArray, aLen)
return LauncherUtilInternal._stringBundle.formatStringFromName(key, aArray, aLen)
} catch(e) {}
return aStringName;
@ -415,6 +421,7 @@ let LauncherUtilInternal = {
return this.mOS
},
get _stringBundle()
{
if (!this.mStringBundle)

View File

@ -8,12 +8,50 @@ const { utils: Cu } = Components;
const { Services } = Cu.import("resource://gre/modules/Services.jsm", {});
const { LegacyExtensionContext } =
Cu.import("resource://gre/modules/LegacyExtensionsUtils.jsm", {});
const { bindPref } =
Cu.import("resource://i2pbutton/modules/utils.js", {});
let logger = Components.classes["@geti2p.net/i2pbutton-logger;1"]
.getService(Components.interfaces.nsISupports).wrappedJSObject;
let log = (level, msg) => logger.log(level, msg);
// __prefs__. A shortcut to Mozilla Services.prefs.
let prefs = Services.prefs;
// __getPrefValue(prefName)__
// Returns the current value of a preference, regardless of its type.
var getPrefValue = function (prefName) {
switch(prefs.getPrefType(prefName)) {
case prefs.PREF_BOOL: return prefs.getBoolPref(prefName);
case prefs.PREF_INT: return prefs.getIntPref(prefName);
case prefs.PREF_STRING: return prefs.getCharPref(prefName);
default: return null;
}
};
// __bindPref(prefName, prefHandler, init)__
// Applies prefHandler whenever the value of the pref changes.
// If init is true, applies prefHandler to the current value.
// Returns a zero-arg function that unbinds the pref.
var bindPref = function (prefName, prefHandler, init = false) {
let update = () => { prefHandler(getPrefValue(prefName)); },
observer = { observe : function (subject, topic, data) {
if (data === prefName) {
update();
}
} };
prefs.addObserver(prefName, observer, false);
if (init) {
update();
}
return () => { prefs.removeObserver(prefName, observer); };
};
// __bindPrefAndInit(prefName, prefHandler)__
// Applies prefHandler to the current value of pref specified by prefName.
// Re-applies prefHandler whenever the value of the pref changes.
// Returns a zero-arg function that unbinds the pref.
var bindPrefAndInit = (prefName, prefHandler) =>
bindPref(prefName, prefHandler, true);
// ## NoScript settings
// Minimum and maximum capability states as controlled by NoScript.

View File

@ -77,7 +77,7 @@ const getProfileDir = function() {
getService(Ci.nsIProperties)
// this is a reference to the profile dir (ProfD) now.
let localDir = directoryService.get("ProfD", Ci.nsIFile)
return localDir.path
return localDir
}
function openFile(path, mode) {
@ -112,6 +112,22 @@ function array_to_hexdigits(array) {
}).join('');
}
function listExtensions(callbackFn) {
AddonManager.getAddonsByTypes(["extension"], function(addons) {
var addonData = [];
for (let i in addons) {
let cur = addons[i];
addonData.push({
id: cur.id.toString(),
name: cur.name,
});
};
console.log(JSON.stringify(addonData, null, ' '));
callbackFn(addonData)
});
}
//window.open("chrome://browser/content/browser.xul", "bmarks", "chrome,width=600,height=300")
// __prefs__. A shortcut to Mozilla Services.prefs.
@ -135,10 +151,10 @@ var getPrefValue = function (prefName) {
var bindPref = function (prefName, prefHandler, init = false) {
let update = () => { prefHandler(getPrefValue(prefName)); },
observer = { observe : function (subject, topic, data) {
if (data === prefName) {
update();
}
} };
if (data === prefName) {
update();
}
} };
prefs.addObserver(prefName, observer, false);
if (init) {
update();
@ -200,14 +216,14 @@ let dialogsByName = {};
// Like window.openDialog, but if the window is already
// open, just focuses it instead of opening a new one.
var showDialog = function (parent, url, name, features) {
let existingDialog = dialogsByName[name];
let existingDialog = dialogsByName[name]
if (existingDialog && !existingDialog.closed) {
existingDialog.focus();
return existingDialog;
existingDialog.focus()
return existingDialog
} else {
let newDialog = parent.openDialog.apply(parent, Array.slice(arguments, 1));
dialogsByName[name] = newDialog;
return newDialog;
let newDialog = parent.openDialog.apply(parent, Array.slice(arguments, 1))
dialogsByName[name] = newDialog
return newDialog
}
}