commit 7c712a4ecbd1951503532c0e1f323ab6f0eaa4b3 Author: Kathy Brade brade@pearlcrescent.com Date: Wed Feb 8 11:37:06 2017 -0500
Bug 21268: e10s compatibility for New Identity.
Ignore "not available" errors from appCacheStorage.asyncEvictStorage() since these can occur if the cache has not been used yet.
Change torbutton_close_tabs_on_new_identity() to use browser.removeTab() instead of browser.contentWindow.close() since we cannot directly access the contentWindow when multi-process mode is enabled.
Fix indentation and modernize the torbutton_close_tabs_on_new_identity() code. --- src/chrome/content/torbutton.js | 92 ++++++++++++++++++++++------------------- 1 file changed, 49 insertions(+), 43 deletions(-)
diff --git a/src/chrome/content/torbutton.js b/src/chrome/content/torbutton.js index abf533f..970d2d0 100644 --- a/src/chrome/content/torbutton.js +++ b/src/chrome/content/torbutton.js @@ -1219,7 +1219,12 @@ function torbutton_do_new_identity() { // then we are using the new cache (cache2) which operates synchronously. // If we are using the old cache, then the tor-browser.git patch for // #5715 also makes this synchronous. So we pass a null callback. - appCacheStorage.asyncEvictStorage(null); + try { + appCacheStorage.asyncEvictStorage(null); + } catch (err if err.name == 'NS_ERROR_NOT_AVAILABLE') { + // We ignore "not available" errors because they occur if a cache + // has not been used, e.g., if no browsing has been done. + } } } catch(e) { torbutton_log(5, "Exception on cache clearing: "+e); @@ -1758,56 +1763,57 @@ function torbutton_update_thirdparty_prefs() { m_tb_prefs.savePrefFile(null); }
+// 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 torbutton_close_tabs_on_new_identity() { - var close_newnym = m_tb_prefs.getBoolPref("extensions.torbutton.close_newnym"); - if (!close_newnym) { - torbutton_log(3, "Not closing tabs"); - return; - } - - // TODO: muck around with browser.tabs.warnOnClose.. maybe.. - torbutton_log(3, "Closing tabs..."); - var wm = Components.classes["@mozilla.org/appshell/window-mediator;1"] - .getService(Components.interfaces.nsIWindowMediator); - var enumerator = wm.getEnumerator("navigator:browser"); - var closeWins = new Array(); - while(enumerator.hasMoreElements()) { - var win = enumerator.getNext(); - var browser = win.getBrowser(); - if(!browser) { - torbutton_log(5, "No browser for possible closed window"); - continue; - } - var tabs = browser.browsers.length; - - torbutton_log(3, "Length: "+browser.browsers.length); + if (!m_tb_prefs.getBoolPref("extensions.torbutton.close_newnym")) { + torbutton_log(3, "Not closing tabs"); + return; + }
- var remove = new Array(); - for(var i = 0; i < tabs; i++) { - remove.push(browser.browsers[i]); - } + // TODO: muck around with browser.tabs.warnOnClose.. maybe.. + torbutton_log(3, "Closing tabs..."); + let wm = Cc["@mozilla.org/appshell/window-mediator;1"] + .getService(Ci.nsIWindowMediator); + let enumerator = wm.getEnumerator("navigator:browser"); + let windowsToClose = new Array(); + while (enumerator.hasMoreElements()) { + let win = enumerator.getNext(); + let browser = win.getBrowser(); + if (!browser) { + torbutton_log(5, "No browser for possible closed window"); + continue; + }
- if(browser.browsers.length == remove.length) { - // It is a bad idea to alter the window list while - // iterating over it. - browser.addTab("about:blank"); - if(win != window) { - closeWins.push(win); - } - } + let tabCount = browser.browsers.length; + torbutton_log(3, "Tab count for window: " + tabCount); + let tabsToRemove = new Array(); + for (let i = 0; i < tabCount; i++) { + let tab = browser.getTabForBrowser(browser.browsers[i]); + if (!tab) { + torbutton_log(5, "No tab for browser"); + } else { + tabsToRemove.push(tab); + } + }
- for(var i = 0; i < remove.length; i++) { - remove[i].contentWindow.close(); - } + if (win == window) { + browser.addTab("about:blank"); + } else { + // It is a bad idea to alter the window list while iterating + // over it, so add this window to an array and close it later. + windowsToClose.push(win); }
- torbutton_log(2, "Closing windows..."); + // Close each tab except the new blank one that we created. + tabsToRemove.forEach(aTab => browser.removeTab(aTab)); + }
- for(var i = 0; i < closeWins.length; ++i) { - closeWins[i].close(); - } + // Close all XUL windows except this one. + torbutton_log(2, "Closing windows..."); + windowsToClose.forEach(aWin => aWin.close());
- torbutton_log(3, "Closed all tabs"); + torbutton_log(3, "Closed all tabs"); }
// Bug 1506 P2: This code is only important for disabling