
commit 5e573e043a135d89a426f1d296d2df6944c600d0 Author: Kathleen Brade <brade@pearlcrescent.com> Date: Wed Feb 13 18:04:47 2013 -0800 Browser-based update notification. --- src/chrome/content/popup.xul | 9 +++++ src/chrome/content/torbutton.js | 54 ++++++++++++++++++++++++++++++- src/chrome/locale/en/torbutton.dtd | 2 + src/chrome/skin/tor-update-16.gif | Bin 0 -> 1304 bytes src/chrome/skin/tor-update-24.gif | Bin 0 -> 1732 bytes src/chrome/skin/torbutton.css | 9 +++++ src/defaults/preferences/preferences.js | 1 + 7 files changed, 74 insertions(+), 1 deletions(-) diff --git a/src/chrome/content/popup.xul b/src/chrome/content/popup.xul index dd7a398..6dc8451 100644 --- a/src/chrome/content/popup.xul +++ b/src/chrome/content/popup.xul @@ -36,6 +36,15 @@ accesskey="&torbutton.context_menu.about.key;" insertafter="context-stop" oncommand="window.open('chrome://torbutton/content/about.xul', '', 'chrome,centerscreen');"/> + + <menuseparator hidden="true"/> + <menuitem id="torbutton-downloadUpdate" + label="&torbutton.context_menu.downloadUpdate;" + accesskey="&torbutton.context_menu.downloadUpdate.key;" + insertafter="context-stop" + oncommand="torbutton_download_update()" + hidden="true"/> + </menupopup> </overlay> diff --git a/src/chrome/content/torbutton.js b/src/chrome/content/torbutton.js index c3320f6..649cddf 100644 --- a/src/chrome/content/torbutton.js +++ b/src/chrome/content/torbutton.js @@ -7,6 +7,8 @@ // TODO: Double-check there are no strange exploits to defeat: // http://kb.mozillazine.org/Links_to_local_pages_don%27t_work +const k_tb_browser_update_needed_pref = "extensions.torbutton.updateNeeded"; + // status var m_tb_wasinited = false; var m_tb_prefs = false; @@ -69,6 +71,9 @@ var torbutton_window_pref_observer = torbutton_update_toolbutton(mode); torbutton_update_statusbar(mode); break; + case k_tb_browser_update_needed_pref: + torbutton_notify_if_update_needed(); + break; } } } @@ -441,6 +446,7 @@ function torbutton_init() { var mode = m_tb_prefs.getBoolPref("extensions.torbutton.tor_enabled"); torbutton_update_toolbutton(mode); torbutton_update_statusbar(mode); + torbutton_notify_if_update_needed(); torbutton_log(3, 'init completed'); } @@ -593,6 +599,50 @@ function torbutton_get_statuspanel() { return o_statuspanel; } +function torbutton_notify_if_update_needed() { + function setOrClearAttribute(aElement, aAttrName, aValue) + { + if (!aElement || !aAttrName) + return; + + if (aValue) + aElement.setAttribute(aAttrName, aValue); + else + aElement.removeAttribute(aAttrName); + } + + var updateNeeded = false; + try { + updateNeeded = m_tb_prefs.getBoolPref(k_tb_browser_update_needed_pref); + } catch (e) {} + + // Change look of toolbar item (enable/disable animated update icon). + var btn = torbutton_get_toolbutton(); + setOrClearAttribute(btn, "tbUpdateNeeded", updateNeeded); + + // Hide/show download menu item and preceding separator. + var item = document.getElementById("torbutton-downloadUpdate"); + setOrClearAttribute(item, "hidden", !updateNeeded); + if (item) + setOrClearAttribute(item.previousSibling, "hidden", !updateNeeded); +} + +function torbutton_download_update() { + var downloadURI = "https://www.torproject.org/download/download-easy.html"; + var rtSvc = Components.classes["@mozilla.org/xre/app-info;1"] + .getService(Components.interfaces.nsIXULRuntime); + downloadURI += "?os=" + rtSvc.OS + "&arch=" + rtSvc.XPCOMABI; + if (rtSvc.OS == "Darwin") + downloadURI += "#mac"; + else if (rtSvc.OS == "WINNT") + downloadURI += "#win"; + else if (rtSvc.OS == "Linux") + downloadURI += "#linux"; + + var newTab = gBrowser.addTab(downloadURI); + gBrowser.selectedTab = newTab; +} + // Bug 1506 P0: Toggle. Kill kill kill. function torbutton_save_nontor_settings() { @@ -690,7 +740,7 @@ function torbutton_do_async_versioncheck() { } // Suppress update check if done recently. - const kLastCheckPref = "extension.torbutton.lastUpdateCheck"; + const kLastCheckPref = "extensions.torbutton.lastUpdateCheck"; const kMinSecsBetweenChecks = 90 * 60; // 1.5 hours var now = Date.now() / 1000; var lastCheckTime; @@ -729,6 +779,7 @@ function torbutton_do_async_versioncheck() { for (var v in version_list) { if (version_list[v] == my_version) { torbutton_log(3, "Version check passed."); + m_tb_prefs.setBoolPref(k_tb_browser_update_needed_pref, false); var homepage = m_tb_prefs.getComplexValue("browser.startup.homepage", Components.interfaces.nsIPrefLocalizedString).data; if (homepage.indexOf("https://check.torproject.org/") == 0) { @@ -743,6 +794,7 @@ function torbutton_do_async_versioncheck() { } } torbutton_log(5, "Your Tor Browser is out of date."); + m_tb_prefs.setBoolPref(k_tb_browser_update_needed_pref, true); // Not up to date var str = Components.classes["@mozilla.org/supports-string;1"] .createInstance(Components.interfaces.nsISupportsString); diff --git a/src/chrome/locale/en/torbutton.dtd b/src/chrome/locale/en/torbutton.dtd index cfd014c..cbda0a2 100644 --- a/src/chrome/locale/en/torbutton.dtd +++ b/src/chrome/locale/en/torbutton.dtd @@ -35,6 +35,8 @@ <!ENTITY torbutton.context_menu.preferences.key "P"> <!ENTITY torbutton.context_menu.about "About Torbutton..."> <!ENTITY torbutton.context_menu.about.key "A"> +<!ENTITY torbutton.context_menu.downloadUpdate "Download Tor Browser Bundle Update..."> +<!ENTITY torbutton.context_menu.downloadUpdate.key "U"> <!ENTITY torbutton.context_menu.cookieProtections "Cookie Protections"> <!ENTITY torbutton.context_menu.cookieProtections.key "C"> <!ENTITY torbutton.context_menu.copyTor "Copy Tor URL"> diff --git a/src/chrome/skin/tor-update-16.gif b/src/chrome/skin/tor-update-16.gif new file mode 100644 index 0000000..d006458 Binary files /dev/null and b/src/chrome/skin/tor-update-16.gif differ diff --git a/src/chrome/skin/tor-update-24.gif b/src/chrome/skin/tor-update-24.gif new file mode 100644 index 0000000..72591a8 Binary files /dev/null and b/src/chrome/skin/tor-update-24.gif differ diff --git a/src/chrome/skin/torbutton.css b/src/chrome/skin/torbutton.css index 676122e..2218e9f 100644 --- a/src/chrome/skin/torbutton.css +++ b/src/chrome/skin/torbutton.css @@ -7,6 +7,9 @@ #torbutton-button[tbstatus="off"] { list-style-image: url("chrome://torbutton/skin/tor-disabled-24.png"); } +#torbutton-button[tbUpdateNeeded="true"] { + list-style-image: url("chrome://torbutton/skin/tor-update-24.gif"); +} toolbar[iconsize="small"] #torbutton-button { list-style-image: url("chrome://torbutton/skin/tor-16.png"); } @@ -16,6 +19,9 @@ toolbar[iconsize="small"] #torbutton-button[tbstatus="on"] { toolbar[iconsize="small"] #torbutton-button[tbstatus="off"] { list-style-image: url("chrome://torbutton/skin/tor-disabled-16.png"); } +toolbar[iconsize="small"] #torbutton-button[tbUpdateNeeded="true"] { + list-style-image: url("chrome://torbutton/skin/tor-update-16.gif"); +} #torbutton-panel { list-style-image: url("chrome://torbutton/skin/tor-16.png"); @@ -86,3 +92,6 @@ statusbarpanel#plugins-status[status="0"] { list-style-image: url("chrome://torbutton/skin/poff.png"); } +#torbutton-downloadUpdate { + font-weight: bold; +} diff --git a/src/defaults/preferences/preferences.js b/src/defaults/preferences/preferences.js index 26cd2f3..4f81acc 100644 --- a/src/defaults/preferences/preferences.js +++ b/src/defaults/preferences/preferences.js @@ -7,6 +7,7 @@ pref("extensions.torbutton.logmethod",1); // 0=stdout, 1=errorconsole, 2=debuglo pref("extensions.torbutton.display_panel",true); pref("extensions.torbutton.panel_style",'text'); pref("extensions.torbutton@torproject.org.description", "chrome://torbutton/locale/torbutton.properties"); +pref("extensions.torbutton.updateNeeded", false); // proxy prefs pref("extensions.torbutton.settings_method",'recommended');