Compare commits
14 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
a6d97dc00a | ||
![]() |
92a908907b | ||
![]() |
b40d5578f8 | ||
![]() |
199f3b839e | ||
![]() |
dbf0d53e5c | ||
![]() |
00f3ac2afb | ||
![]() |
32bb96b18e | ||
![]() |
52c3c6a6c2 | ||
![]() |
301bcf6d33 | ||
![]() |
b52f7f7510 | ||
![]() |
116f787d25 | ||
![]() |
abc0ce454f | ||
![]() |
b90ed676fd | ||
![]() |
91b0d0500e |
@@ -53,8 +53,8 @@ window.addEventListener("pageshow", function() {
|
||||
|
||||
&aboutI2p.warn_experimental;
|
||||
</p>
|
||||
<p class="hideIfI2POn">&aboutI2p.warn_not_running; <a href="about:i2p">&aboutI2p.refresh_text;</a> &aboutI2p.reccommend_not_running;</p>
|
||||
<p class="hideIfI2POff">&aboutI2p.all_checks_ok;</p>
|
||||
<!--<p class="hideIfI2POn">&aboutI2p.warn_not_running; <a href="about:i2p">&aboutI2p.refresh_text;</a> &aboutI2p.reccommend_not_running;</p>-->
|
||||
<p class="hideIfI2PConsoleOff">&aboutI2p.all_checks_ok;</p>
|
||||
<p class="hideIfI2PConsoleOff">
|
||||
<ul>
|
||||
<li>&aboutI2p.i2ptunnel_visit_msg; <a href="&aboutI2p.routerconsole;/i2ptunnelmgr">&aboutI2p.i2ptunnel;</a></li>
|
||||
|
@@ -8,16 +8,22 @@ const kI2PBootstrapErrorTopic = "I2PBootstrapError"
|
||||
const kI2PLogHasWarnOrErrTopic = "I2PLogHasWarnOrErr"
|
||||
|
||||
|
||||
Cu.import("resource://gre/modules/Services.jsm")
|
||||
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.
|
||||
var gIsInitialBootstrap
|
||||
var gInitialPanelID
|
||||
|
||||
function closeThisWindow(reason) {
|
||||
dump('closeThisWindow\n')
|
||||
window.close()
|
||||
}
|
||||
|
||||
function initDialog()
|
||||
{
|
||||
@@ -33,7 +39,7 @@ function initDialog()
|
||||
return
|
||||
}
|
||||
}
|
||||
catch (e) { dump(e + "\n") }
|
||||
catch (e) { dump(`${e}\n`) }
|
||||
|
||||
try
|
||||
{
|
||||
@@ -42,39 +48,64 @@ function initDialog()
|
||||
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]
|
||||
var isBrowserStartup = false
|
||||
if (window.arguments)
|
||||
{
|
||||
let wargs = window.arguments || window.arguments.wrappedJSObject
|
||||
isBrowserStartup = wargs[0]
|
||||
dump(`window.arguments = ${wargs}\n`)
|
||||
dump(`window.arguments.length = ${wargs.length}\n`)
|
||||
|
||||
if (window.arguments.length > 1)
|
||||
gOpenerCallbackFunc = window.arguments[1]
|
||||
}
|
||||
if (window.arguments.length > 1)
|
||||
gInitialPanelID = 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 (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")
|
||||
// If opened during browser startup, display the "please wait" message.
|
||||
if (isBrowserStartup)
|
||||
{
|
||||
var pleaseWait = document.getElementById("progressPleaseWait")
|
||||
if (pleaseWait)
|
||||
pleaseWait.removeAttribute("hidden")
|
||||
}
|
||||
|
||||
// Test if the i2p console port is open or not
|
||||
|
||||
let consolePort = Services.prefs.getIntPref("extensions.i2pbutton.console_port_i2pj", 7647)
|
||||
LauncherUtil.waitForPortToOpen(consolePort, () => {
|
||||
var meter = document.getElementById("progressMeter")
|
||||
if (meter) {
|
||||
meter.value = meter.value + 30
|
||||
}
|
||||
setTimeout(() => {
|
||||
window.close()
|
||||
}, 5000)
|
||||
})
|
||||
}
|
||||
catch (e) {
|
||||
dump(`Error: ${e}\n`)
|
||||
}
|
||||
dump('initDialog done\n')
|
||||
}
|
||||
|
||||
function onCancel() {
|
||||
//
|
||||
dump('onCancel\n')
|
||||
cleanup()
|
||||
}
|
||||
|
||||
|
||||
@@ -104,13 +135,9 @@ function stopI2PBootstrap()
|
||||
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)
|
||||
@@ -119,31 +146,8 @@ function stopI2PBootstrap()
|
||||
}
|
||||
}
|
||||
|
||||
// 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 = {
|
||||
|
@@ -6,8 +6,7 @@
|
||||
-->
|
||||
|
||||
<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
|
||||
<?xml-stylesheet href="chrome://i2pbutton/skin/progress.css"
|
||||
type="text/css"?>
|
||||
<?xml-stylesheet href="chrome://i2pbutton/skin/progress.css" type="text/css"?>
|
||||
|
||||
<!DOCTYPE overlay SYSTEM "chrome://i2pbutton/locale/progress.dtd">
|
||||
|
||||
@@ -18,7 +17,7 @@
|
||||
persist="screenX screenY"
|
||||
buttons="cancel"
|
||||
buttonlabelextra2="&i2pprogress.openSettings;"
|
||||
ondialogcancel="return onCancel();"
|
||||
ondialogcancel="onCancel();"
|
||||
ondialogextra2="onOpenSettings();"
|
||||
onload="initDialog();"> <!-- extra2 was removed from buttons for now. -->
|
||||
|
||||
|
@@ -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">
|
||||
|
||||
|
@@ -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")
|
||||
},
|
||||
|
@@ -117,6 +117,13 @@ I2PProcessService.prototype =
|
||||
let prefs = Cc["@mozilla.org/preferences-service;1"].getService(Ci.nsIPrefBranch)
|
||||
let shouldShowDelayUserDialog = prefs.getBoolPref("extensions.i2pbutton.delay_user_with_dialog", true)
|
||||
|
||||
let canStartPromise = self._config_checker.ensure_config()
|
||||
canStartPromise.then(() => {
|
||||
self._logger.log(3, 'Starting the router')
|
||||
self.I2PStartAndControlI2P(true)
|
||||
|
||||
})
|
||||
|
||||
try {
|
||||
if (shouldShowDelayUserDialog) {
|
||||
self.openWaitForRouterDialog()
|
||||
@@ -131,13 +138,6 @@ I2PProcessService.prototype =
|
||||
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(() => {
|
||||
@@ -280,7 +280,13 @@ I2PProcessService.prototype =
|
||||
//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})
|
||||
self.mDelayUserDialog = ww.openWindow(
|
||||
null,
|
||||
"chrome://i2pbutton/content/progress.xul",
|
||||
"startingrouter",
|
||||
"chrome,dialog=no,modal,centerscreen",
|
||||
[true])
|
||||
this._logger.log(3, 'After open wait for router dialog')
|
||||
|
||||
setTimeout(() => {
|
||||
let progressmeter = self.mDelayUserDialog.document.getElementById('progressMeter')
|
||||
@@ -396,7 +402,7 @@ I2PProcessService.prototype =
|
||||
|
||||
// Set an environment variable that points to the I2P data directory.
|
||||
let env = Cc["@mozilla.org/process/environment;1"].getService(Ci.nsIEnvironment)
|
||||
env.set("I2P_BROWSER_I2P_DATA_DIR", dataDir.path)
|
||||
env.set('I2P_BROWSER_I2P_DATA_DIR', dataDir.path)
|
||||
|
||||
// On Windows, prepend the I2P program directory to PATH. This is
|
||||
// needed so that pluggable transports can find OpenSSL DLLs, etc.
|
||||
@@ -418,7 +424,7 @@ I2PProcessService.prototype =
|
||||
p.init(exeFile)
|
||||
|
||||
for (var i = 0; i < args.length; ++i)
|
||||
this._logger.log(2, " " + args[i])
|
||||
this._logger.log(2, ` ${args[i]}`)
|
||||
|
||||
// Possible fix for Windows and cmd.exe window spawn.
|
||||
p.startHidden = true
|
||||
@@ -478,10 +484,8 @@ I2PProcessService.prototype =
|
||||
{
|
||||
this.mBootstrapErrorOccurred = true
|
||||
LauncherUtil.setBoolPref(this.kPrefPromptAtStartup, true)
|
||||
let phase = LauncherUtil.getLocalizedBootstrapStatus(aStatusObj,
|
||||
"TAG")
|
||||
let reason = LauncherUtil.getLocalizedBootstrapStatus(aStatusObj,
|
||||
"REASON")
|
||||
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 +
|
||||
|
@@ -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
|
||||
@@ -137,6 +137,8 @@ router.startup.jetty9.migrated=true
|
||||
routerconsole.welcomeWizardComplete=true
|
||||
`
|
||||
|
||||
let noscript = Cu.import("resource://i2pbutton/modules/noscript-control.js")
|
||||
noscript.initialize()
|
||||
|
||||
function RouterConfigManager() {
|
||||
this.version = '0.1'
|
||||
@@ -252,6 +254,26 @@ 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, '')
|
||||
}
|
||||
|
||||
// Ensure they exists
|
||||
const self = this
|
||||
|
||||
|
@@ -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
|
||||
|
@@ -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
|
||||
|
@@ -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.6</em:version>
|
||||
<em:version>0.3.8</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>
|
||||
|
93
src/modules/jsonrpc-client.jsm
Normal file
93
src/modules/jsonrpc-client.jsm
Normal file
@@ -0,0 +1,93 @@
|
||||
const EXPORTED_SYMBOLS = ['JsonPrcClient']
|
||||
// vim: set sw=2 sts=2 ts=8 et syntax=javascript:
|
||||
|
||||
const Cc = Components.classes
|
||||
const Ci = Components.interfaces
|
||||
const Cr = Components.results
|
||||
const Cu = Components.utils
|
||||
|
||||
Cu.import("resource://gre/modules/Services.jsm")
|
||||
Cu.import("resource://gre/modules/XPCOMUtils.jsm")
|
||||
Cu.import("resource://gre/modules/Log.jsm")
|
||||
Cu.import("resource://i2pbutton/modules/http.jsm")
|
||||
|
||||
Cu.importGlobalProperties(["XMLHttpRequest"])
|
||||
|
||||
var log = Log.repository.getLogger("i2pbutton.jsonrpc-client")
|
||||
log.level = Log.Level.Debug
|
||||
// A console appender logs to the browser console.
|
||||
log.addAppender(new Log.ConsoleAppender(new Log.BasicFormatter()))
|
||||
|
||||
class JsonRpcClient {
|
||||
constructor(url) {
|
||||
this.serverUrl = url
|
||||
this.mReqIdSequence = 0
|
||||
this.responses = new Array()
|
||||
this.token = ''
|
||||
}
|
||||
|
||||
_createTemplateData(method, params, id) {
|
||||
this.mReqIdSequence++
|
||||
return JSON.stringify({
|
||||
'id': id || this.mReqIdSequence,
|
||||
'method': method,
|
||||
'params': params || {},
|
||||
'jsonrpc': '2.0'
|
||||
})
|
||||
}
|
||||
|
||||
_onload(method, callback) {
|
||||
const self = this
|
||||
return () => {
|
||||
console.log('done', method)
|
||||
switch (method) {
|
||||
case 'Authenticate':
|
||||
let jData = JSON.parse(self.xhr.response)
|
||||
let token = jData.result.Token
|
||||
self.token = token
|
||||
break
|
||||
case 'RouterManager':
|
||||
break
|
||||
default:
|
||||
console.log('Unknown method')
|
||||
}
|
||||
if('function' === typeof callback) {
|
||||
callback(self.xhr)
|
||||
}
|
||||
self.responses.push(self.xhr.response)
|
||||
console.log(self.xhr.responseText)
|
||||
}
|
||||
}
|
||||
|
||||
makeRequest(method, params, callback) {
|
||||
this.xhr = new XMLHttpRequest()
|
||||
this.xhr.open('POST', this.serverUrl)
|
||||
let data = this._createTemplateData(method, params)
|
||||
this.xhr.onload = this._onload(method, callback)
|
||||
this.xhr.setRequestHeader('Content-Length', `${data.length}`)
|
||||
this.xhr.setRequestHeader('Content-Type', 'application/json')
|
||||
this.xhr.send(data)
|
||||
}
|
||||
}
|
||||
|
||||
class I2PControlClient extends JsonRpcClient {
|
||||
constructor() {
|
||||
super('http://127.0.0.1:7647/jsonrpc/')
|
||||
}
|
||||
|
||||
authenticate(password, callback) {
|
||||
this.makeRequest('Authenticate', {'API':1, 'Password':password}, callback)
|
||||
}
|
||||
|
||||
shutdownRouter(callback) {
|
||||
this.makeRequest('RouterManager', {'API':1,'Token':this.token, 'Shutdown': true}, callback)
|
||||
}
|
||||
|
||||
reseedRouter(callback) {
|
||||
this.makeRequest('RouterManager', {'API':1,'Token':this.token, 'Reseed': true}, callback)
|
||||
}
|
||||
|
||||
restartRouter(callback) {
|
||||
this.makeRequest('RouterManager', {'API':1,'Token':this.token, 'Restart': true}, callback)
|
||||
}
|
||||
}
|
@@ -5,6 +5,8 @@ const Ci = Components.interfaces
|
||||
const Cu = Components.utils
|
||||
const Cr = Components.results
|
||||
|
||||
Cu.importGlobalProperties(["XMLHttpRequest"])
|
||||
|
||||
const kPropBundleURI = "chrome://i2pbutton/locale/i2pbutton.properties"
|
||||
const kPropNamePrefix = "i2pbutton."
|
||||
|
||||
@@ -19,6 +21,38 @@ let logger = {
|
||||
}
|
||||
}
|
||||
|
||||
const Timer = Components.Constructor("@mozilla.org/timer;1", "nsITimer", "initWithCallback");
|
||||
|
||||
function delay(timeout, func) {
|
||||
let timer = new Timer(function () {
|
||||
// Remove the reference so that it can be reaped.
|
||||
delete delay.timers[idx];
|
||||
|
||||
func();
|
||||
}, timeout, Ci.nsITimer.TYPE_ONE_SHOT);
|
||||
|
||||
// Store a reference to the timer so that it's not reaped before it fires.
|
||||
let idx = delay.timers.push(timer) - 1;
|
||||
return idx
|
||||
}
|
||||
delay.timers = []
|
||||
|
||||
function repeat(timeout, func) {
|
||||
let timer = new Timer(function () {
|
||||
func();
|
||||
}, timeout, Ci.nsITimer.TYPE_REPEATING_SLACK);
|
||||
|
||||
// Store a reference to the timer so that it's not reaped before it fires.
|
||||
let idx = delay.timers.push(timer) - 1;
|
||||
return idx
|
||||
}
|
||||
repeat.timers = []
|
||||
|
||||
// Wrapper since window.setTimeout isn't always available in context/scope.
|
||||
function setTimeout(func, interval) {
|
||||
delay(interval, func)
|
||||
}
|
||||
|
||||
|
||||
const LauncherUtil = {
|
||||
get isMac()
|
||||
@@ -83,6 +117,13 @@ const LauncherUtil = {
|
||||
return argsArray;
|
||||
},
|
||||
|
||||
setTimeout: (func, interval) => {
|
||||
delay(interval, func)
|
||||
},
|
||||
setInterval: (func, interval) => {
|
||||
repeat(interval, func)
|
||||
},
|
||||
|
||||
get _networkSettingsWindow()
|
||||
{
|
||||
let wm = Cc["@mozilla.org/appshell/window-mediator;1"].getService(Ci.nsIWindowMediator)
|
||||
@@ -163,6 +204,33 @@ const LauncherUtil = {
|
||||
asSvc.quit(0x12) // eAttemptQuit (0x02) + eRestart (0x10)
|
||||
},
|
||||
|
||||
|
||||
|
||||
waitForPortToOpen: function(portNum, doneCallback, interval) {
|
||||
interval = interval || 3000
|
||||
let portOpen = false
|
||||
let testPort = () => {
|
||||
var xhr = new XMLHttpRequest()
|
||||
xhr.open('GET', `http://127.0.0.1:${portNum}`)
|
||||
xhr.onerror = () => {
|
||||
console.log(`Still waiting for ${portNum} to open`)
|
||||
if (!portOpen) {
|
||||
setTimeout(testPort, interval)
|
||||
}
|
||||
}
|
||||
xhr.onload = () => {
|
||||
console.log(`Port ${portNum} seem open now finally`)
|
||||
portOpen = true
|
||||
if ('function' === typeof doneCallback) {
|
||||
doneCallback(portNum)
|
||||
}
|
||||
}
|
||||
xhr.send()
|
||||
}
|
||||
testPort()
|
||||
},
|
||||
//waitForPortToOpen(7647, () => { console.log('ALL DONE') })
|
||||
|
||||
getRouterDefaultArgs: function() {
|
||||
let dataDir = this.getI2PConfigPath(true)
|
||||
let exeFile = this.getI2PBinary()
|
||||
|
Reference in New Issue
Block a user