Commit 17a284d4 authored by Mike Perry's avatar Mike Perry
Browse files

Bug 4718: Perform version check periodically in the background

We check every 12 hours.

I also made the update check at startup async as part of this.
parent f61f4ae6
......@@ -885,6 +885,71 @@ function torbutton_restore_nontor_settings()
torbutton_log(2, 'settings restored');
}
function torbutton_do_async_versioncheck() {
if (!m_tb_tbb || !m_tb_prefs.getBoolPref("extensions.torbutton.versioncheck_enabled")) {
return;
}
torbutton_log(3, "Checking version");
try {
var req = Components.classes["@mozilla.org/xmlextras/xmlhttprequest;1"]
.createInstance(Components.interfaces.nsIXMLHttpRequest);
//var req = new XMLHttpRequest(); Blocked by content policy
var url = m_tb_prefs.getCharPref("extensions.torbutton.versioncheck_url");
req.open('GET', url, true);
req.channel.loadFlags |= Ci.nsIRequest.LOAD_BYPASS_CACHE;
req.overrideMimeType("text/json");
req.onreadystatechange = function (oEvent) {
if (req.readyState === 4) {
if(req.status == 200) {
if(!req.responseText) {
torbutton_log(5, "Version check failed! No JSON present!");
return -1;
}
try {
var locale = m_tb_prefs.getCharPref("general.useragent.locale");
var version_list = JSON.parse(req.responseText);
var my_version = m_tb_prefs.getCharPref("torbrowser.version");
for (var v in version_list) {
if (version_list[v] == my_version) {
torbutton_log(3, "Version check passed.");
var homepage = m_tb_prefs.getCharPref("browser.startup.homepage");
if (homepage.indexOf("https://check.torproject.org/") == 0) {
m_tb_prefs.setCharPref("browser.startup.homepage",
"https://check.torproject.org/?lang="+locale+"&small=1&uptodate=1");
}
return;
}
}
torbutton_log(5, "Your Tor Browser is out of date.");
// Not up to date
m_tb_prefs.setCharPref("browser.startup.homepage",
"https://check.torproject.org/?lang="+locale+"&small=1&uptodate=0");
return;
} catch(e) {
torbutton_log(5, "Version check failed! JSON parsing error: "+e);
return;
}
} else if (req.status == 404) {
// We're going to assume 404 means the service is not implemented yet.
torbutton_log(3, "Version check failed. Versions file is 404.");
return -1;
}
torbutton_log(5, "Version check failed! Web server error: "+req.status);
return -1;
}
};
req.send(null);
} catch(e) {
if(e.result == 0x80004005) { // NS_ERROR_FAILURE
torbutton_log(5, "Version check failed! Is tor running?");
return -1;
}
torbutton_log(5, "Version check failed! Tor internal error: "+e);
return -1;
}
}
function torbutton_check_version() {
torbutton_log(3, "Checking version");
try {
......@@ -2967,7 +3032,7 @@ function torbutton_set_launch_state(state, session_restore) {
torbutton_enable_tor(true);
torbutton_log(3, "Tor state updated.");
torbutton_do_versioncheck();
torbutton_do_async_versioncheck();
// Load our homepage again. We just killed it via the toggle.
if (!session_restore) {
......@@ -2982,7 +3047,7 @@ function torbutton_set_launch_state(state, session_restore) {
if(state) torbutton_enable_tor(true);
else torbutton_disable_tor();
torbutton_do_versioncheck();
torbutton_do_async_versioncheck();
// Load our homepage again. We just killed it via the toggle.
if (!session_restore) {
......
......@@ -494,6 +494,7 @@ function CookieJarSelector() {
var jarThis = this;
this.timerCallback = {
cookie_changed: false,
update_counter: 0,
QueryInterface: function(iid) {
if (!iid.equals(Component.interfaces.nsISupports) &&
......@@ -504,6 +505,27 @@ function CookieJarSelector() {
return this;
},
notify: function() {
// XXX: ========== WARNING! Ultra-mega hack: ===============
// For various reasons, we want to totally refactor Torbutton.
// (see #5709). Since there's no great place to place this timer,
// I figured we might as well place it here.
//
// Additionally, mobile should verify that nsITimer.TYPE_REPEATING_SLACK
// is smart wrt suspend.
//
// We want to perform an update check *about* twice per day.
// I thought about randomizing it, but the slack will probably
// introduce enough noise over the course of 12 hours or so...
// Might as well KISS.
if (++this.update_counter > 720) {
jarThis.logger.log(3, "Performing async version check");
this.update_counter = 0;
var wm = Cc["@mozilla.org/appshell/window-mediator;1"]
.getService(Components.interfaces.nsIWindowMediator);
var chrome = wm.getMostRecentWindow("navigator:browser");
chrome.torbutton_do_async_versioncheck();
}
// this refers to timerCallback object. use jarThis to reference
// CookieJarSelector object.
if(!this.cookie_changed) {
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment