commit 3a0ab3671ad4fd730e938ed04ff4d0328ee92369
Author: Kathy Brade <brade(a)pearlcrescent.com>
Date: Mon Oct 28 15:50:03 2013 -0400
Bug #9570: Private browsing changes since FF ESR 17.
Clear the private browsing image cache as well as the regular one.
---
src/chrome/content/torbutton.js | 67 ++++++++++++++++++++++++++++++++-------
1 file changed, 55 insertions(+), 12 deletions(-)
diff --git a/src/chrome/content/torbutton.js b/src/chrome/content/torbutton.js
index c97a1bd..f364303 100644
--- a/src/chrome/content/torbutton.js
+++ b/src/chrome/content/torbutton.js
@@ -1518,18 +1518,7 @@ function torbutton_do_new_identity() {
m_tb_prefs.setIntPref("browser.sessionstore.max_tabs_undo", tabs);
torbutton_log(3, "New Identity: Clearing Image Cache");
-
- try {
- var imgCache = Components.classes["@mozilla.org/image/cache;1"].
- getService(Components.interfaces.imgICache);
- imgCache.clearCache(false); // evict all but chrome cache
- } catch(e) {
- // FIXME: This can happen in some rare cases involving XULish image data
- // in combination with our image cache isolation patch. Sure isn't
- // a good thing, but it's not really a super-cookie vector either.
- // We should fix it eventually.
- torbutton_log(4, "Exception on image cache clearing: "+e);
- }
+ torbutton_clear_image_caches();
torbutton_log(3, "New Identity: Clearing Offline Cache");
@@ -1634,6 +1623,60 @@ function torbutton_do_new_identity() {
window.close();
}
+function torbutton_clear_image_caches()
+{
+ try {
+ let imgCache;
+ let imgTools = Cc["@mozilla.org/image/tools;1"].getService(Ci.imgITools);
+ if (!("getImgCacheForDocument" in imgTools)) {
+ // In Firefox 17 and older, there is one global image cache. Clear it.
+ imgCache = Cc["@mozilla.org/image/cache;1"].getService(Ci.imgICache);
+ imgCache.clearCache(false); // evict all but chrome cache
+ } else {
+ // In Firefox 18 and newer, there are two image caches: one that is
+ // used for regular browsing and one that is used for private browsing.
+
+ // Clear the non-private browsing image cache.
+ imgCache = imgTools.getImgCacheForDocument(null);
+ imgCache.clearCache(false); // evict all but chrome cache
+
+ // Try to clear the private browsing cache. To do so, we must locate
+ // a content document that is contained within a private browsing window.
+ let didClearPBCache = false;
+ let wm = Cc["@mozilla.org/appshell/window-mediator;1"]
+ .getService(Ci.nsIWindowMediator);
+ let enumerator = wm.getEnumerator("navigator:browser");
+ while (!didClearPBCache && enumerator.hasMoreElements()) {
+ let win = enumerator.getNext();
+ let browserDoc = win.document.documentElement;
+ if (!browserDoc.hasAttribute("privatebrowsingmode"))
+ continue;
+
+ let tabbrowser = win.getBrowser();
+ if (!tabbrowser)
+ continue;
+
+ var tabCount = tabbrowser.browsers.length;
+ for (var i = 0; i < tabCount; i++) {
+ let doc = tabbrowser.browsers[i].contentDocument;
+ if (doc) {
+ imgCache = imgTools.getImgCacheForDocument(doc);
+ imgCache.clearCache(false); // evict all but chrome cache
+ didClearPBCache = true;
+ break;
+ }
+ }
+ }
+ }
+ } catch(e) {
+ // FIXME: This can happen in some rare cases involving XULish image data
+ // in combination with our image cache isolation patch. Sure isn't
+ // a good thing, but it's not really a super-cookie vector either.
+ // We should fix it eventually.
+ torbutton_log(4, "Exception on image cache clearing: "+e);
+ }
+}
+
function torbutton_do_tor_check()
{
let checkSvc = Cc["@torproject.org/torbutton-torCheckService;1"]