[tor-commits] [tor-browser/tor-browser-24.6.0esr-4.x-1] Add a pref, "privacy.thirdparty.isolate", to allow the activation or deactivation of isolating DOM storage and image caching by first party URI.

mikeperry at torproject.org mikeperry at torproject.org
Thu Jun 26 00:34:39 UTC 2014


commit d0062623b1cb82844bd83af308515d86ccc610a3
Author: Arthur Edelstein <arthuredelstein at gmail.com>
Date:   Thu Apr 17 16:39:37 2014 -0700

    Add a pref, "privacy.thirdparty.isolate", to allow the activation or deactivation of isolating DOM storage and image caching by first party URI.
---
 browser/app/profile/firefox.js                     |    8 ++
 content/base/src/ThirdPartyUtil.cpp                |   34 ++++++++
 content/base/src/ThirdPartyUtil.h                  |    1 +
 content/base/src/nsContentUtils.cpp                |   28 +++----
 docshell/base/nsDocShell.cpp                       |   10 +--
 dom/base/nsGlobalWindow.cpp                        |   28 +++----
 dom/base/nsGlobalWindow.h                          |    2 +-
 dom/interfaces/storage/nsIDOMStorageManager.idl    |   14 ++--
 dom/src/storage/DOMStorageCache.cpp                |    4 +-
 dom/src/storage/DOMStorageCache.h                  |    6 +-
 dom/src/storage/DOMStorageManager.cpp              |   44 +++++-----
 dom/src/storage/DOMStorageManager.h                |    4 +-
 embedding/browser/webBrowser/nsContextMenuInfo.cpp |    8 +-
 image/public/imgILoader.idl                        |    4 +-
 image/src/imgLoader.cpp                            |   84 ++++++++------------
 image/src/imgLoader.h                              |    6 +-
 image/src/imgRequest.cpp                           |    8 +-
 image/src/imgRequest.h                             |    4 +-
 layout/generic/nsImageFrame.cpp                    |   22 ++---
 netwerk/base/public/mozIThirdPartyUtil.idl         |   23 ++++++
 widget/cocoa/nsMenuItemIconX.mm                    |    8 +-
 21 files changed, 200 insertions(+), 150 deletions(-)

diff --git a/browser/app/profile/firefox.js b/browser/app/profile/firefox.js
index 56ae000..ae78798 100644
--- a/browser/app/profile/firefox.js
+++ b/browser/app/profile/firefox.js
@@ -517,6 +517,14 @@ pref("privacy.sanitize.migrateFx3Prefs",    false);
 
 pref("network.proxy.share_proxy_settings",  false); // use the same proxy settings for all protocols
 
+// The privacy.thirdparty.isolate pref determines whether
+// an isolated DOM Storage map and image cache are
+// maintained for each URL bar domain.
+// 0 - No isolation
+// 1 - Enable isolation in private windows
+// 2 - Enable isolation everywhere
+pref("privacy.thirdparty.isolate",          1);
+
 // simple gestures support
 pref("browser.gesture.swipe.left", "Browser:BackOrBackDuplicate");
 pref("browser.gesture.swipe.right", "Browser:ForwardOrForwardDuplicate");
diff --git a/content/base/src/ThirdPartyUtil.cpp b/content/base/src/ThirdPartyUtil.cpp
index 55eb316..06b2a14 100644
--- a/content/base/src/ThirdPartyUtil.cpp
+++ b/content/base/src/ThirdPartyUtil.cpp
@@ -3,6 +3,7 @@
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 #include "ThirdPartyUtil.h"
+#include "mozilla/Preferences.h"
 #include "nsNetUtil.h"
 #include "nsIServiceManager.h"
 #include "nsIHttpChannelInternal.h"
@@ -411,6 +412,39 @@ ThirdPartyUtil::GetBaseDomain(nsIURI* aHostURI,
   return NS_OK;
 }
 
+// Returns true if First Party Isolation is currently active for the given nsIChannel.
+// Depends on Preference setting and possibly the state of Private Browsing mode.
+bool ThirdPartyUtil::IsFirstPartyIsolationActive(nsIChannel *aChannel, nsIDocument *aDoc)
+{
+  int32_t isolationState = mozilla::Preferences::GetInt("privacy.thirdparty.isolate");
+  if (isolationState == 1) {
+    if (!aChannel && aDoc) {
+      // No channel passed directly. Can we get a channel from aDoc?
+      aChannel = aDoc->GetChannel();
+    }
+    return aChannel && NS_UsePrivateBrowsing(aChannel);
+  } else { // (isolationState == 0) || (isolationState == 2)
+    return (isolationState == 2);
+  }
+}
+
+// Produces a URI that uniquely identifies the first party to which
+// image cache and dom storage objects should be isolated. If isolation
+// is deactivated, then aOutput will return null.
+// Not scriptable due to the use of an nsIDocument parameter.
+NS_IMETHODIMP
+ThirdPartyUtil::GetFirstPartyIsolationURI(nsIChannel *aChannel, nsIDocument *aDoc, nsIURI **aOutput)
+{
+  bool isolationActive = IsFirstPartyIsolationActive(aChannel, aDoc);
+  if (isolationActive) {
+    return GetFirstPartyURI(aChannel, aDoc, aOutput);
+  } else {
+    // We return a null pointer when isolation is off.
+    *aOutput = nullptr;
+    return NS_OK;
+  }
+}
+
 // Not scriptable due to the use of an nsIDocument parameter.
 NS_IMETHODIMP
 ThirdPartyUtil::GetFirstPartyURI(nsIChannel *aChannel,
diff --git a/content/base/src/ThirdPartyUtil.h b/content/base/src/ThirdPartyUtil.h
index 8777f44..c90dbad 100644
--- a/content/base/src/ThirdPartyUtil.h
+++ b/content/base/src/ThirdPartyUtil.h
@@ -27,6 +27,7 @@ public:
 private:
   nsresult IsThirdPartyInternal(const nsCString& aFirstDomain,
     nsIURI* aSecondURI, bool* aResult);
+  bool IsFirstPartyIsolationActive(nsIChannel* aChannel, nsIDocument* aDoc);
   bool SchemeIsWhiteListed(nsIURI *aURI);
   static already_AddRefed<nsIURI> GetURIFromWindow(nsIDOMWindow* aWin);
   static nsresult GetOriginatingURI(nsIChannel  *aChannel, nsIURI **aURI);
diff --git a/content/base/src/nsContentUtils.cpp b/content/base/src/nsContentUtils.cpp
index db038bf..308cea8 100644
--- a/content/base/src/nsContentUtils.cpp
+++ b/content/base/src/nsContentUtils.cpp
@@ -2693,22 +2693,22 @@ nsContentUtils::LoadImage(nsIURI* aURI, nsIDocument* aLoadingDocument,
   // Make the URI immutable so people won't change it under us
   NS_TryToSetImmutable(aURI);
  
-  nsCOMPtr<nsIURI> firstPartyURI;
+  nsCOMPtr<nsIURI> firstPartyIsolationURI;
   nsCOMPtr<mozIThirdPartyUtil> thirdPartySvc
                                = do_GetService(THIRDPARTYUTIL_CONTRACTID);
-  thirdPartySvc->GetFirstPartyURI(nullptr, aLoadingDocument,
-                                  getter_AddRefs(firstPartyURI));
-
-  return imgLoader->LoadImage(aURI,                 /* uri to load */
-                              firstPartyURI,        /* firstPartyURI */
-                              aReferrer,            /* referrer */
-                              aLoadingPrincipal,    /* loading principal */
-                              loadGroup,            /* loadgroup */
-                              aObserver,            /* imgINotificationObserver */
-                              aLoadingDocument,     /* uniquification key */
-                              aLoadFlags,           /* load flags */
-                              nullptr,               /* cache key */
-                              channelPolicy,        /* CSP info */
+  thirdPartySvc->GetFirstPartyIsolationURI(nullptr, aLoadingDocument,
+                                           getter_AddRefs(firstPartyIsolationURI));
+
+  return imgLoader->LoadImage(aURI,                   /* uri to load */
+                              firstPartyIsolationURI, /* firstPartyIsolationURI, NULL if isolation is not active */
+                              aReferrer,              /* referrer */
+                              aLoadingPrincipal,      /* loading principal */
+                              loadGroup,              /* loadgroup */
+                              aObserver,              /* imgINotificationObserver */
+                              aLoadingDocument,       /* uniquification key */
+                              aLoadFlags,             /* load flags */
+                              nullptr,                /* cache key */
+                              channelPolicy,          /* CSP info */
                               aRequest);
 }
 
diff --git a/docshell/base/nsDocShell.cpp b/docshell/base/nsDocShell.cpp
index 8963ea0..205b197 100644
--- a/docshell/base/nsDocShell.cpp
+++ b/docshell/base/nsDocShell.cpp
@@ -2698,18 +2698,18 @@ nsDocShell::GetSessionStorageForPrincipal(nsIPrincipal* aPrincipal,
       return NS_ERROR_FAILURE;
 
     nsCOMPtr<nsIDocument> doc(do_GetInterface(GetAsSupports(this)));
-    nsCOMPtr<nsIURI> firstPartyURI;
-    nsresult rv = thirdPartyUtil->GetFirstPartyURI(nullptr, doc,
-                                           getter_AddRefs(firstPartyURI));
+    nsCOMPtr<nsIURI> firstPartyIsolationURI;
+    nsresult rv = thirdPartyUtil->GetFirstPartyIsolationURI(nullptr, doc,
+                                           getter_AddRefs(firstPartyIsolationURI));
     NS_ENSURE_SUCCESS(rv, rv);
 
     if (aCreate) {
-        return manager->CreateStorageForFirstParty(firstPartyURI,
+        return manager->CreateStorageForFirstParty(firstPartyIsolationURI,
                                       aPrincipal, aDocumentURI,
                                       mInPrivateBrowsing, aStorage);
     }
 
-    return manager->GetStorageForFirstParty(firstPartyURI, aPrincipal,
+    return manager->GetStorageForFirstParty(firstPartyIsolationURI, aPrincipal,
                                             mInPrivateBrowsing, aStorage);
 }
 
diff --git a/dom/base/nsGlobalWindow.cpp b/dom/base/nsGlobalWindow.cpp
index 5a0998a..7c742b0 100644
--- a/dom/base/nsGlobalWindow.cpp
+++ b/dom/base/nsGlobalWindow.cpp
@@ -2604,8 +2604,8 @@ nsGlobalWindow::PreloadLocalStorage()
   }
 
   nsresult rv;
-  nsCOMPtr<nsIURI> firstPartyURI;
-  rv = GetFirstPartyURI(getter_AddRefs(firstPartyURI));
+  nsCOMPtr<nsIURI> firstPartyIsolationURI;
+  rv = GetFirstPartyIsolationURI(getter_AddRefs(firstPartyIsolationURI));
   if (NS_FAILED(rv)) {
     return;
   }
@@ -2616,7 +2616,7 @@ nsGlobalWindow::PreloadLocalStorage()
     return;
   }
 
-  storageManager->PrecacheStorageForFirstParty(firstPartyURI, principal);
+  storageManager->PrecacheStorageForFirstParty(firstPartyIsolationURI, principal);
 }
 
 void
@@ -6665,7 +6665,7 @@ nsGlobalWindow::CallerInnerWindow()
 }
 
 nsresult
-nsGlobalWindow::GetFirstPartyURI(nsIURI** aFirstPartyURI)
+nsGlobalWindow::GetFirstPartyIsolationURI(nsIURI** aFirstPartyIsolationURI)
 {
   nsCOMPtr<mozIThirdPartyUtil> thirdPartyUtil =
                                do_GetService(THIRDPARTYUTIL_CONTRACTID);
@@ -6673,7 +6673,7 @@ nsGlobalWindow::GetFirstPartyURI(nsIURI** aFirstPartyURI)
     return NS_ERROR_FAILURE;
 
   nsCOMPtr<nsIDocument> doc = do_QueryInterface(mDoc);
-  return thirdPartyUtil->GetFirstPartyURI(NULL, doc, aFirstPartyURI);
+  return thirdPartyUtil->GetFirstPartyIsolationURI(NULL, doc, aFirstPartyIsolationURI);
 }
 
 
@@ -8984,11 +8984,11 @@ nsGlobalWindow::GetSessionStorage(nsIDOMStorage ** aSessionStorage)
 
     nsCOMPtr<nsILoadContext> loadContext = do_QueryInterface(docShell);
 
-    nsCOMPtr<nsIURI> firstPartyURI;
-    rv = GetFirstPartyURI(getter_AddRefs(firstPartyURI));
+    nsCOMPtr<nsIURI> firstPartyIsolationURI;
+    rv = GetFirstPartyIsolationURI(getter_AddRefs(firstPartyIsolationURI));
     NS_ENSURE_SUCCESS(rv, rv);
 
-    rv = storageManager->CreateStorageForFirstParty(firstPartyURI, principal,
+    rv = storageManager->CreateStorageForFirstParty(firstPartyIsolationURI, principal,
                                        documentURI,
                                        loadContext && loadContext->UsePrivateBrowsing(),
                                        getter_AddRefs(mSessionStorage));
@@ -9056,14 +9056,14 @@ nsGlobalWindow::GetLocalStorage(nsIDOMStorage ** aLocalStorage)
       mDoc->GetDocumentURI(documentURI);
     }
 
-    nsCOMPtr<nsIURI> firstPartyURI;
-    rv = GetFirstPartyURI(getter_AddRefs(firstPartyURI));
+    nsCOMPtr<nsIURI> firstPartyIsolationURI;
+    rv = GetFirstPartyIsolationURI(getter_AddRefs(firstPartyIsolationURI));
     NS_ENSURE_SUCCESS(rv, rv);
 
     nsIDocShell* docShell = GetDocShell();
     nsCOMPtr<nsILoadContext> loadContext = do_QueryInterface(docShell);
 
-    rv = storageManager->CreateStorageForFirstParty(firstPartyURI, principal,
+    rv = storageManager->CreateStorageForFirstParty(firstPartyIsolationURI, principal,
                                        documentURI,
                                        loadContext && loadContext->UsePrivateBrowsing(),
                                        getter_AddRefs(mLocalStorage));
@@ -9681,11 +9681,11 @@ nsGlobalWindow::Observe(nsISupports* aSubject, const char* aTopic,
       nsCOMPtr<nsIDOMStorageManager> storageManager = do_QueryInterface(GetDocShell());
       if (storageManager) {
         nsresult rv;
-        nsCOMPtr<nsIURI> firstPartyURI;
-        rv = GetFirstPartyURI(getter_AddRefs(firstPartyURI));
+        nsCOMPtr<nsIURI> firstPartyIsolationURI;
+        rv = GetFirstPartyIsolationURI(getter_AddRefs(firstPartyIsolationURI));
         NS_ENSURE_SUCCESS(rv, rv);
 
-        rv = storageManager->CheckStorageForFirstParty(firstPartyURI,
+        rv = storageManager->CheckStorageForFirstParty(firstPartyIsolationURI,
                                           principal, changingStorage, &check);
         NS_ENSURE_SUCCESS(rv, rv);
       }
diff --git a/dom/base/nsGlobalWindow.h b/dom/base/nsGlobalWindow.h
index af012bc..da6b54d 100644
--- a/dom/base/nsGlobalWindow.h
+++ b/dom/base/nsGlobalWindow.h
@@ -1092,7 +1092,7 @@ protected:
   nsresult RequestAnimationFrame(const nsIDocument::FrameRequestCallbackHolder& aCallback,
                                  int32_t* aHandle);
 
-  nsresult GetFirstPartyURI(nsIURI** aFirstPartyURI);
+  nsresult GetFirstPartyIsolationURI(nsIURI** aFirstPartyIsolationURI);
 
   // When adding new member variables, be careful not to create cycles
   // through JavaScript.  If there is any chance that a member variable
diff --git a/dom/interfaces/storage/nsIDOMStorageManager.idl b/dom/interfaces/storage/nsIDOMStorageManager.idl
index 6d1c5fc..ea7246e 100644
--- a/dom/interfaces/storage/nsIDOMStorageManager.idl
+++ b/dom/interfaces/storage/nsIDOMStorageManager.idl
@@ -21,13 +21,13 @@ interface nsIDOMStorageManager : nsISupports
    * This starts async preloading of a storage cache for scope
    * defined by the principal.
    *
-   * @param aFirstPartyURI
+   * @param aFirstPartyIsolationURI
    *    First party URI to bound storage to.
    * @param aPrincipal
    *    Principal to bound storage to.
    */
   void precacheStorage(in nsIPrincipal aPrincipal);
-  void precacheStorageForFirstParty(in nsIURI aFirstPartyURI,
+  void precacheStorageForFirstParty(in nsIURI aFirstPartyIsolationURI,
                                     in nsIPrincipal aPrincipal);
 
   /**
@@ -35,7 +35,7 @@ interface nsIDOMStorageManager : nsISupports
    * A new object is always returned and it is ensured there is
    * a storage for the scope created.
    *
-   * @param aFirstPartyURI
+   * @param aFirstPartyIsolationURI
    *    First party URI to bound storage to.
    * @param aPrincipal
    *    Principal to bound storage to.
@@ -47,7 +47,7 @@ interface nsIDOMStorageManager : nsISupports
   nsIDOMStorage createStorage(in nsIPrincipal aPrincipal,
                               in DOMString aDocumentURI,
                               [optional] in bool aPrivate);
-  nsIDOMStorage createStorageForFirstParty(in nsIURI aFirstPartyURI,
+  nsIDOMStorage createStorageForFirstParty(in nsIURI aFirstPartyIsolationURI,
                                            in nsIPrincipal aPrincipal,
                                            in DOMString aDocumentURI,
                                            [optional] in bool aPrivate);
@@ -64,7 +64,7 @@ interface nsIDOMStorageManager : nsISupports
    */
   nsIDOMStorage getStorage(in nsIPrincipal aPrincipal,
                            [optional] in bool aPrivate);
-  nsIDOMStorage getStorageForFirstParty(in nsIURI aFirstPartyURI,
+  nsIDOMStorage getStorageForFirstParty(in nsIURI aFirstPartyIsolationURI,
                                         in nsIPrincipal aPrincipal,
                                         [optional] in bool aPrivate);
 
@@ -83,7 +83,7 @@ interface nsIDOMStorageManager : nsISupports
    * Returns true if the storage belongs to the given principal and is managed
    * (i.e. has been created and is cached) by this storage manager.
    *
-   * @param aFirstPartyURI
+   * @param aFirstPartyIsolationURI
    *    First party URI to check the storage against.
    * @param aPrincipal
    *    Principal to check the storage against.
@@ -97,7 +97,7 @@ interface nsIDOMStorageManager : nsISupports
    */
   bool checkStorage(in nsIPrincipal aPrincipal,
                     in nsIDOMStorage aStorage);
-  bool checkStorageForFirstParty(in nsIURI aFirstPartyURI,
+  bool checkStorageForFirstParty(in nsIURI aFirstPartyIsolationURI,
                                  in nsIPrincipal aPrincipal,
                                  in nsIDOMStorage aStorage);
 
diff --git a/dom/src/storage/DOMStorageCache.cpp b/dom/src/storage/DOMStorageCache.cpp
index 84ef729..b67a559 100644
--- a/dom/src/storage/DOMStorageCache.cpp
+++ b/dom/src/storage/DOMStorageCache.cpp
@@ -120,7 +120,7 @@ DOMStorageCache::Release(void)
 void
 DOMStorageCache::Init(DOMStorageManager* aManager,
                       bool aPersistent,
-                      nsIURI* aFirstPartyURI,
+                      nsIURI* aFirstPartyIsolationURI,
                       nsIPrincipal* aPrincipal,
                       const nsACString& aQuotaScope)
 {
@@ -130,7 +130,7 @@ DOMStorageCache::Init(DOMStorageManager* aManager,
 
   mManager = aManager;
   mInitialized = true;
-  mFirstPartyURI = aFirstPartyURI;
+  mFirstPartyIsolationURI = aFirstPartyIsolationURI;
   mPrincipal = aPrincipal;
   mPersistent = aPersistent;
   mQuotaScope = aQuotaScope.IsEmpty() ? mScope : aQuotaScope;
diff --git a/dom/src/storage/DOMStorageCache.h b/dom/src/storage/DOMStorageCache.h
index 42836ac..2b892fc 100644
--- a/dom/src/storage/DOMStorageCache.h
+++ b/dom/src/storage/DOMStorageCache.h
@@ -72,7 +72,7 @@ public:
   virtual ~DOMStorageCache();
 
   void Init(DOMStorageManager* aManager, bool aPersistent,
-            nsIURI* aFirstPartyURI, nsIPrincipal* aPrincipal,
+            nsIURI* aFirstPartyIsolationURI, nsIPrincipal* aPrincipal,
             const nsACString& aQuotaScope);
 
   // Copies all data from the other storage.
@@ -97,7 +97,7 @@ public:
 
   nsTArray<nsString>* GetKeys(const DOMStorage* aStorage);
 
-  nsIURI* FirstPartyURI() const { return mFirstPartyURI; }
+  nsIURI* FirstPartyIsolationURI() const { return mFirstPartyIsolationURI; }
 
   // Whether the principal equals principal the cache was created for
   bool CheckPrincipal(nsIPrincipal* aPrincipal) const;
@@ -177,7 +177,7 @@ private:
   nsCOMPtr<nsITimer> mKeepAliveTimer;
 
   // The first party URI associated with this cache.
-  nsCOMPtr<nsIURI> mFirstPartyURI;
+  nsCOMPtr<nsIURI> mFirstPartyIsolationURI;
 
   // Principal the cache has been initially created for, this is used only
   // for sessionStorage access checks since sessionStorage objects are strictly
diff --git a/dom/src/storage/DOMStorageManager.cpp b/dom/src/storage/DOMStorageManager.cpp
index 9cc5042..4dbe66c 100644
--- a/dom/src/storage/DOMStorageManager.cpp
+++ b/dom/src/storage/DOMStorageManager.cpp
@@ -132,16 +132,16 @@ DOMStorageManager::~DOMStorageManager()
 namespace { // anon
 
 nsresult
-AppendFirstPartyToKey(nsIURI* aFirstPartyURI, nsACString& aKey)
+AppendFirstPartyToKey(nsIURI* aFirstPartyIsolationURI, nsACString& aKey)
 {
-  if (aFirstPartyURI) {
+  if (aFirstPartyIsolationURI) {
     nsCOMPtr<mozIThirdPartyUtil> thirdPartyUtil =
                             do_GetService(THIRDPARTYUTIL_CONTRACTID);
     if (!thirdPartyUtil)
       return NS_ERROR_FAILURE;
 
     nsAutoCString firstPartyHost;
-    nsresult rv = thirdPartyUtil->GetFirstPartyHostForIsolation(aFirstPartyURI,
+    nsresult rv = thirdPartyUtil->GetFirstPartyHostForIsolation(aFirstPartyIsolationURI,
                                                                 firstPartyHost);
     NS_ENSURE_SUCCESS(rv, rv);
 
@@ -153,7 +153,7 @@ AppendFirstPartyToKey(nsIURI* aFirstPartyURI, nsACString& aKey)
 }
 
 nsresult
-CreateScopeKey(nsIURI* aFirstPartyURI, nsIPrincipal* aPrincipal,
+CreateScopeKey(nsIURI* aFirstPartyIsolationURI, nsIPrincipal* aPrincipal,
                nsACString& aKey)
 {
   nsCOMPtr<nsIURI> uri;
@@ -231,11 +231,11 @@ CreateScopeKey(nsIURI* aFirstPartyURI, nsIPrincipal* aPrincipal,
 
   // Isolate scope keys to the URL bar domain by appending &firstPartyHost
   // if available.
-  return AppendFirstPartyToKey(aFirstPartyURI, aKey);
+  return AppendFirstPartyToKey(aFirstPartyIsolationURI, aKey);
 }
 
 nsresult
-CreateQuotaDBKey(nsIURI* aFirstPartyURI, nsIPrincipal* aPrincipal,
+CreateQuotaDBKey(nsIURI* aFirstPartyIsolationURI, nsIPrincipal* aPrincipal,
                  nsACString& aKey)
 {
   nsresult rv;
@@ -286,7 +286,7 @@ CreateQuotaDBKey(nsIURI* aFirstPartyURI, nsIPrincipal* aPrincipal,
 
   // Isolate scope keys to the URL bar domain by appending &firstPartyHost
   // if available.
-  return AppendFirstPartyToKey(aFirstPartyURI, aKey);
+  return AppendFirstPartyToKey(aFirstPartyIsolationURI, aKey);
 }
 
 } // anon
@@ -304,14 +304,14 @@ DOMStorageManager::GetCache(const nsACString& aScope) const
 
 already_AddRefed<DOMStorageCache>
 DOMStorageManager::PutCache(const nsACString& aScope,
-                            nsIURI* aFirstPartyURI,
+                            nsIURI* aFirstPartyIsolationURI,
                             nsIPrincipal* aPrincipal)
 {
   DOMStorageCacheHashKey* entry = mCaches.PutEntry(aScope);
   nsRefPtr<DOMStorageCache> cache = entry->cache();
 
   nsAutoCString quotaScope;
-  CreateQuotaDBKey(aFirstPartyURI, aPrincipal, quotaScope);
+  CreateQuotaDBKey(aFirstPartyIsolationURI, aPrincipal, quotaScope);
 
   // To avoid ever persisting session storage to disk, initialize LocalStorage
   // like SessionStorage.
@@ -320,7 +320,7 @@ DOMStorageManager::PutCache(const nsACString& aScope,
   case LocalStorage:
     // Lifetime handled by the manager, don't persist
     entry->HardRef();
-    cache->Init(nullptr, false, aFirstPartyURI, aPrincipal, quotaScope);
+    cache->Init(nullptr, false, aFirstPartyIsolationURI, aPrincipal, quotaScope);
     break;
 
   default:
@@ -342,7 +342,7 @@ DOMStorageManager::DropCache(DOMStorageCache* aCache)
 
 nsresult
 DOMStorageManager::GetStorageInternal(bool aCreate,
-                                      nsIURI* aFirstPartyURI,
+                                      nsIURI* aFirstPartyIsolationURI,
                                       nsIPrincipal* aPrincipal,
                                       const nsAString& aDocumentURI,
                                       bool aPrivate,
@@ -351,7 +351,7 @@ DOMStorageManager::GetStorageInternal(bool aCreate,
   nsresult rv;
 
   nsAutoCString scope;
-  rv = CreateScopeKey(aFirstPartyURI, aPrincipal, scope);
+  rv = CreateScopeKey(aFirstPartyIsolationURI, aPrincipal, scope);
   if (NS_FAILED(rv)) {
     return NS_ERROR_NOT_AVAILABLE;
   }
@@ -382,7 +382,7 @@ DOMStorageManager::GetStorageInternal(bool aCreate,
 
     // There is always a single instance of a cache per scope
     // in a single instance of a DOM storage manager.
-    cache = PutCache(scope, aFirstPartyURI, aPrincipal);
+    cache = PutCache(scope, aFirstPartyIsolationURI, aPrincipal);
   } else if (mType == SessionStorage) {
     if (!cache->CheckPrincipal(aPrincipal)) {
       return NS_ERROR_DOM_SECURITY_ERR;
@@ -405,10 +405,10 @@ DOMStorageManager::PrecacheStorage(nsIPrincipal* aPrincipal)
 }
 
 NS_IMETHODIMP
-DOMStorageManager::PrecacheStorageForFirstParty(nsIURI* aFirstPartyURI,
+DOMStorageManager::PrecacheStorageForFirstParty(nsIURI* aFirstPartyIsolationURI,
                                                 nsIPrincipal* aPrincipal)
 {
-  return GetStorageInternal(true, aFirstPartyURI, aPrincipal, EmptyString(),
+  return GetStorageInternal(true, aFirstPartyIsolationURI, aPrincipal, EmptyString(),
                             false, nullptr);
 }
 
@@ -423,13 +423,13 @@ DOMStorageManager::CreateStorage(nsIPrincipal* aPrincipal,
 }
 
 NS_IMETHODIMP
-DOMStorageManager::CreateStorageForFirstParty(nsIURI* aFirstPartyURI,
+DOMStorageManager::CreateStorageForFirstParty(nsIURI* aFirstPartyIsolationURI,
                                               nsIPrincipal* aPrincipal,
                                               const nsAString& aDocumentURI,
                                               bool aPrivate,
                                               nsIDOMStorage** aRetval)
 {
-  return GetStorageInternal(true, aFirstPartyURI, aPrincipal, aDocumentURI,
+  return GetStorageInternal(true, aFirstPartyIsolationURI, aPrincipal, aDocumentURI,
                             aPrivate, aRetval);
 }
 
@@ -443,12 +443,12 @@ DOMStorageManager::GetStorage(nsIPrincipal* aPrincipal,
 }
 
 NS_IMETHODIMP
-DOMStorageManager::GetStorageForFirstParty(nsIURI* aFirstPartyURI,
+DOMStorageManager::GetStorageForFirstParty(nsIURI* aFirstPartyIsolationURI,
                                            nsIPrincipal* aPrincipal,
                                            bool aPrivate,
                                            nsIDOMStorage** aRetval)
 {
-  return GetStorageInternal(false, aFirstPartyURI, aPrincipal,
+  return GetStorageInternal(false, aFirstPartyIsolationURI, aPrincipal,
                             EmptyString(), aPrivate, aRetval);
 }
 
@@ -476,7 +476,7 @@ DOMStorageManager::CloneStorage(nsIDOMStorage* aStorage)
   // Since this manager is sessionStorage manager, PutCache hard references
   // the cache in our hashtable.
   nsRefPtr<DOMStorageCache> newCache = PutCache(origCache->Scope(),
-                                                origCache->FirstPartyURI(),
+                                                origCache->FirstPartyIsolationURI(),
                                                 origCache->Principal());
 
   newCache->CloneFrom(origCache);
@@ -492,7 +492,7 @@ DOMStorageManager::CheckStorage(nsIPrincipal* aPrincipal,
 }
 
 NS_IMETHODIMP
-DOMStorageManager::CheckStorageForFirstParty(nsIURI* aFirstPartyURI,
+DOMStorageManager::CheckStorageForFirstParty(nsIURI* aFirstPartyIsolationURI,
                                              nsIPrincipal* aPrincipal,
                                              nsIDOMStorage* aStorage,
                                              bool* aRetval)
@@ -509,7 +509,7 @@ DOMStorageManager::CheckStorageForFirstParty(nsIURI* aFirstPartyURI,
   }
 
   nsAutoCString scope;
-  nsresult rv = CreateScopeKey(aFirstPartyURI, aPrincipal, scope);
+  nsresult rv = CreateScopeKey(aFirstPartyIsolationURI, aPrincipal, scope);
   NS_ENSURE_SUCCESS(rv, rv);
 
   DOMStorageCache* cache = GetCache(scope);
diff --git a/dom/src/storage/DOMStorageManager.h b/dom/src/storage/DOMStorageManager.h
index 5e044b5..6ed9a70 100644
--- a/dom/src/storage/DOMStorageManager.h
+++ b/dom/src/storage/DOMStorageManager.h
@@ -74,12 +74,12 @@ private:
   // Ensures cache for a scope, when it doesn't exist it is created and initalized,
   // this also starts preload of persistent data.
   already_AddRefed<DOMStorageCache> PutCache(const nsACString& aScope,
-                                             nsIURI* aFirstPartyURI,
+                                             nsIURI* aFirstPartyIsolationURI,
                                              nsIPrincipal* aPrincipal);
 
   // Helper for creation of DOM storage objects
   nsresult GetStorageInternal(bool aCreate,
-                              nsIURI* aFirstPartyURI,
+                              nsIURI* aFirstPartyIsolationURI,
                               nsIPrincipal* aPrincipal,
                               const nsAString& aDocumentURI,
                               bool aPrivate,
diff --git a/embedding/browser/webBrowser/nsContextMenuInfo.cpp b/embedding/browser/webBrowser/nsContextMenuInfo.cpp
index 8cca3e3..092e619 100644
--- a/embedding/browser/webBrowser/nsContextMenuInfo.cpp
+++ b/embedding/browser/webBrowser/nsContextMenuInfo.cpp
@@ -306,13 +306,13 @@ nsContextMenuInfo::GetBackgroundImageRequestInternal(nsIDOMNode *aDOMNode, imgRe
 
           nsRefPtr<imgLoader> il = imgLoader::GetInstance();
           NS_ENSURE_TRUE(il, NS_ERROR_FAILURE);
-          nsCOMPtr<nsIURI> firstPartyURI;
+          nsCOMPtr<nsIURI> firstPartyIsolationURI;
           nsCOMPtr<mozIThirdPartyUtil> thirdPartySvc
               = do_GetService(THIRDPARTYUTIL_CONTRACTID);
-          thirdPartySvc->GetFirstPartyURI(nullptr, doc,
-                                          getter_AddRefs(firstPartyURI));
+          thirdPartySvc->GetFirstPartyIsolationURI(nullptr, doc,
+                                                   getter_AddRefs(firstPartyIsolationURI));
 
-          return il->LoadImage(bgUri, firstPartyURI, nullptr, principal, nullptr,
+          return il->LoadImage(bgUri, firstPartyIsolationURI, nullptr, principal, nullptr,
                                nullptr, nullptr, nsIRequest::LOAD_NORMAL,
                                nullptr, channelPolicy, aRequest);
         }
diff --git a/image/public/imgILoader.idl b/image/public/imgILoader.idl
index c16a30a..e6e7727 100644
--- a/image/public/imgILoader.idl
+++ b/image/public/imgILoader.idl
@@ -38,7 +38,7 @@ interface imgILoader : nsISupports
   /**
    * Start the load and decode of an image.
    * @param aURI the URI to load
-   * @param aFirstPartyURI the urlbar URI that 'initiated' the load -- used for 3rd party blocking
+   * @param aFirstPartyIsolationURI the urlbar URI that 'initiated' the load -- used for 3rd party blocking
    * @param aReferrerURI the 'referring' URI
    * @param aLoadingPrincipal the principal of the loading document
    * @param aLoadGroup Loadgroup to put the image load into
@@ -55,7 +55,7 @@ interface imgILoader : nsISupports
    * goes away.
    */
   imgIRequest loadImageXPCOM(in nsIURI aURI,
-                             in nsIURI aFirstPartyURI,
+                             in nsIURI aFirstPartyIsolationURI,
                              in nsIURI aReferrerURI,
                              in nsIPrincipal aLoadingPrincipal,
                              in nsILoadGroup aLoadGroup,
diff --git a/image/src/imgLoader.cpp b/image/src/imgLoader.cpp
index 7e20aba..60a6b6d 100644
--- a/image/src/imgLoader.cpp
+++ b/image/src/imgLoader.cpp
@@ -427,7 +427,7 @@ static nsresult NewImageChannel(nsIChannel **aResult,
                                 // aLoadingPrincipal and false otherwise.
                                 bool *aForcePrincipalCheckForCacheEntry,
                                 nsIURI *aURI,
-                                nsIURI *aFirstPartyURI,
+                                nsIURI *aFirstPartyIsolationURI,
                                 nsIURI *aReferringURI,
                                 nsILoadGroup *aLoadGroup,
                                 const nsCString& aAcceptHeader,
@@ -479,7 +479,7 @@ static nsresult NewImageChannel(nsIChannel **aResult,
 
     nsCOMPtr<nsIHttpChannelInternal> httpChannelInternal = do_QueryInterface(newHttpChannel);
     NS_ENSURE_TRUE(httpChannelInternal, NS_ERROR_UNEXPECTED);
-    httpChannelInternal->SetDocumentURI(aFirstPartyURI);
+    httpChannelInternal->SetDocumentURI(aFirstPartyIsolationURI);
     newHttpChannel->SetReferrer(aReferringURI);
   }
 
@@ -1107,7 +1107,7 @@ bool imgLoader::SetHasNoProxies(nsIURI *imgURI, imgCacheEntry *entry)
   return true;
 }
 
-bool imgLoader::SetHasProxies(nsIURI *firstPartyURI, nsIURI *imgURI)
+bool imgLoader::SetHasProxies(nsIURI *firstPartyIsolationURI, nsIURI *imgURI)
 {
   VerifyCacheSizes();
 
@@ -1118,7 +1118,7 @@ bool imgLoader::SetHasProxies(nsIURI *firstPartyURI, nsIURI *imgURI)
 
   LOG_STATIC_FUNC_WITH_PARAM(GetImgLog(), "imgLoader::SetHasProxies", "uri", spec.get());
 
-  nsAutoCString key = GetCacheKey(firstPartyURI, imgURI, nullptr);
+  nsAutoCString key = GetCacheKey(firstPartyIsolationURI, imgURI, nullptr);
   nsRefPtr<imgCacheEntry> entry;
   if (cache.Get(key, getter_AddRefs(entry)) && entry && entry->HasNoProxies()) {
     imgCacheQueue &queue = GetCacheQueue(imgURI);
@@ -1173,7 +1173,7 @@ void imgLoader::CheckCacheLimits(imgCacheTable &cache, imgCacheQueue &queue)
 
 bool imgLoader::ValidateRequestWithNewChannel(imgRequest *request,
                                                 nsIURI *aURI,
-                                                nsIURI *aFirstPartyURI,
+                                                nsIURI *aFirstPartyIsolationURI,
                                                 nsIURI *aReferrerURI,
                                                 nsILoadGroup *aLoadGroup,
                                                 imgINotificationObserver *aObserver,
@@ -1223,7 +1223,7 @@ bool imgLoader::ValidateRequestWithNewChannel(imgRequest *request,
     rv = NewImageChannel(getter_AddRefs(newChannel),
                          &forcePrincipalCheck,
                          aURI,
-                         aFirstPartyURI,
+                         aFirstPartyIsolationURI,
                          aReferrerURI,
                          aLoadGroup,
                          mAcceptHeader,
@@ -1293,7 +1293,7 @@ bool imgLoader::ValidateRequestWithNewChannel(imgRequest *request,
 
 bool imgLoader::ValidateEntry(imgCacheEntry *aEntry,
                                 nsIURI *aURI,
-                                nsIURI *aFirstPartyURI,
+                                nsIURI *aFirstPartyIsolationURI,
                                 nsIURI *aReferrerURI,
                                 nsILoadGroup *aLoadGroup,
                                 imgINotificationObserver *aObserver,
@@ -1404,7 +1404,7 @@ bool imgLoader::ValidateEntry(imgCacheEntry *aEntry,
   if (validateRequest && aCanMakeNewChannel) {
     LOG_SCOPE(GetImgLog(), "imgLoader::ValidateRequest |cache hit| must validate");
 
-    return ValidateRequestWithNewChannel(request, aURI, aFirstPartyURI,
+    return ValidateRequestWithNewChannel(request, aURI, aFirstPartyIsolationURI,
                                          aReferrerURI, aLoadGroup, aObserver,
                                          aCX, aLoadFlags, aProxyRequest, aPolicy,
                                          aLoadingPrincipal, aCORSMode);
@@ -1475,12 +1475,12 @@ bool imgLoader::RemoveFromCache(imgCacheEntry *entry)
   nsRefPtr<imgRequest> request(getter_AddRefs(entry->GetRequest()));
   if (request) {
     nsCOMPtr<nsIURI> imgURI = request->mURI;
-    nsCOMPtr<nsIURI> firstPartyURI = request->mFirstPartyURI;
+    nsCOMPtr<nsIURI> firstPartyIsolationURI = request->mFirstPartyIsolationURI;
 
     if (imgURI) {
       imgCacheTable &cache = GetCache(imgURI);
       imgCacheQueue &queue = GetCacheQueue(imgURI);
-      nsAutoCString spec = GetCacheKey(firstPartyURI, imgURI, nullptr);
+      nsAutoCString spec = GetCacheKey(firstPartyIsolationURI, imgURI, nullptr);
 
       LOG_STATIC_FUNC_WITH_PARAM(GetImgLog(), "imgLoader::RemoveFromCache", "entry's uri", spec.get());
 
@@ -1576,7 +1576,7 @@ NS_IMETHODIMP imgLoader::LoadImageXPCOM(nsIURI *aURI,
 /* imgIRequest loadImage (in nsIURI aURI, in nsIURI aUrlBarURI, in nsIPrincipal loadingPrincipal, in nsILoadGroup aLoadGroup, in imgIDecoderObserver aObserver, in nsISupports aCX, in nsLoadFlags aLoadFlags, in nsISupports cacheKey, in imgIRequest aRequest); */
 
 nsresult imgLoader::LoadImage(nsIURI *aURI,
-			      nsIURI *aFirstPartyURI,
+			      nsIURI *aFirstPartyIsolationURI,
 			      nsIURI *aReferrerURI,
 			      nsIPrincipal* aLoadingPrincipal,
 			      nsILoadGroup *aLoadGroup,
@@ -1595,7 +1595,7 @@ nsresult imgLoader::LoadImage(nsIURI *aURI,
     return NS_ERROR_NULL_POINTER;
 
   bool isIsolated = false;
-  nsAutoCString spec = GetCacheKey(aFirstPartyURI, aURI, &isIsolated);
+  nsAutoCString spec = GetCacheKey(aFirstPartyIsolationURI, aURI, &isIsolated);
 
   LOG_SCOPE_WITH_PARAM(GetImgLog(), "imgLoader::LoadImage", "aURI", spec.get());
 
@@ -1662,7 +1662,7 @@ nsresult imgLoader::LoadImage(nsIURI *aURI,
   imgCacheTable &cache = GetCache(aURI);
 
   if (cache.Get(spec, getter_AddRefs(entry)) && entry) {
-    if (ValidateEntry(entry, aURI, aFirstPartyURI, aReferrerURI,
+    if (ValidateEntry(entry, aURI, aFirstPartyIsolationURI, aReferrerURI,
                       aLoadGroup, aObserver, aCX, requestFlags, true,
                       _retval, aPolicy, aLoadingPrincipal, corsmode)) {
       request = getter_AddRefs(entry->GetRequest());
@@ -1701,7 +1701,7 @@ nsresult imgLoader::LoadImage(nsIURI *aURI,
     rv = NewImageChannel(getter_AddRefs(newChannel),
                          &forcePrincipalCheck,
                          aURI,
-                         aFirstPartyURI,
+                         aFirstPartyIsolationURI,
                          aReferrerURI,
                          aLoadGroup,
                          mAcceptHeader,
@@ -1729,7 +1729,7 @@ nsresult imgLoader::LoadImage(nsIURI *aURI,
       childLoadGroup->SetParentLoadGroup(aLoadGroup);
     newChannel->SetLoadGroup(loadGroup);
 
-    request->Init(aURI, aURI, aFirstPartyURI, loadGroup, newChannel, entry,
+    request->Init(aURI, aURI, aFirstPartyIsolationURI, loadGroup, newChannel, entry,
                   aCX, aLoadingPrincipal, corsmode);
 
     // Pass the inner window ID of the loading document, if possible.
@@ -1838,7 +1838,7 @@ nsresult imgLoader::LoadImage(nsIURI *aURI,
   return NS_OK;
 }
 
-nsAutoCString imgLoader::GetCacheKey(nsIURI *firstPartyURI, nsIURI *imgURI,
+nsAutoCString imgLoader::GetCacheKey(nsIURI *firstPartyIsolationURI, nsIURI *imgURI,
                                      bool *isIsolated)
 {
   NS_ASSERTION(imgURI, "imgLoader::GetCacheKey -- NULL imgURI");
@@ -1850,37 +1850,21 @@ nsAutoCString imgLoader::GetCacheKey(nsIURI *firstPartyURI, nsIURI *imgURI,
     imgURI->GetSpec(spec);
 
   nsAutoCString hostKey;
-  if (firstPartyURI && sThirdPartyUtilSvc)
-    sThirdPartyUtilSvc->GetFirstPartyHostForIsolation(firstPartyURI, hostKey);
+  if (firstPartyIsolationURI && sThirdPartyUtilSvc)
+    sThirdPartyUtilSvc->GetFirstPartyHostForIsolation(firstPartyIsolationURI, hostKey);
 
   if (hostKey.Length() > 0) {
     if (isIsolated)
       *isIsolated = true;
+    // Make a new key using host
+    // FIXME: This might involve a couple more copies than necessary.. 
+    // But man, 18 string types? Who knows which one I need to use to do
+    // this cheaply..
+    return hostKey + nsAutoCString("&") + spec;    
   } else {
-    hostKey = "--NoFirstParty--";
-    nsCOMPtr<nsIConsoleService> consoleSvc =
-                                do_GetService(NS_CONSOLESERVICE_CONTRACTID);
-    if (consoleSvc) {
-      nsAutoString msg(NS_LITERAL_STRING(
-                       "imgLoader::GetCacheKey: NULL firstPartyURI for ")
-                       .get());
-      if (!spec.IsEmpty())
-        msg.AppendASCII(spec.get());
-      else
-        msg.Append(NS_LITERAL_STRING("Unknown URI!").get());
-      consoleSvc->LogStringMessage(msg.get());
-    }
-
-#ifdef DEBUG
-    printf("imgLoader::GetCacheKey: NULL firstPartyURI for %s\n", spec.get());
-#endif
+    // No hostKey found, so don't isolate image to a first party.
+    return spec;
   }
-
-  // Make a new key using host
-  // FIXME: This might involve a couple more copies than necessary.. 
-  // But man, 18 string types? Who knows which one I need to use to do
-  // this cheaply..
-  return hostKey + nsAutoCString("&") + spec;
 }
 
 /* imgIRequest loadImageWithChannelXPCOM(in nsIChannel channel, in imgINotificationObserver aObserver, in nsISupports cx, out nsIStreamListener); */
@@ -1911,16 +1895,16 @@ nsresult imgLoader::LoadImageWithChannel(nsIChannel *channel, imgINotificationOb
   nsCOMPtr<nsIURI> uri;
   channel->GetURI(getter_AddRefs(uri));
 
-  nsCOMPtr<nsIURI> firstPartyURI;
-  sThirdPartyUtilSvc->GetFirstPartyURI(channel, nullptr,
-                                       getter_AddRefs(firstPartyURI));
+  nsCOMPtr<nsIURI> firstPartyIsolationURI;
+  sThirdPartyUtilSvc->GetFirstPartyIsolationURI(channel, nullptr,
+                                                getter_AddRefs(firstPartyIsolationURI));
 
   nsLoadFlags requestFlags = nsIRequest::LOAD_NORMAL;
   channel->GetLoadFlags(&requestFlags);
 
   nsRefPtr<imgCacheEntry> entry;
   imgCacheTable &cache = GetCache(uri);
-  nsAutoCString spec = GetCacheKey(firstPartyURI, uri, nullptr);
+  nsAutoCString spec = GetCacheKey(firstPartyIsolationURI, uri, nullptr);
 
   if (requestFlags & nsIRequest::LOAD_BYPASS_CACHE) {
     imgCacheQueue &queue = GetCacheQueue(uri);
@@ -2001,7 +1985,7 @@ nsresult imgLoader::LoadImageWithChannel(nsIChannel *channel, imgINotificationOb
     channel->GetOriginalURI(getter_AddRefs(originalURI));
 
     // No principal specified here, because we're not passed one.
-    request->Init(originalURI, uri, firstPartyURI, channel, channel, entry,
+    request->Init(originalURI, uri, firstPartyIsolationURI, channel, channel, entry,
                   aCX, nullptr, imgIRequest::CORS_NONE);
 
     ProxyListener *pl = new ProxyListener(static_cast<nsIStreamListener *>(request.get()));
@@ -2013,7 +1997,7 @@ nsresult imgLoader::LoadImageWithChannel(nsIChannel *channel, imgINotificationOb
     NS_RELEASE(pl);
 
     bool isIsolated = false;
-    nsAutoCString key = GetCacheKey(firstPartyURI, originalURI, &isIsolated);
+    nsAutoCString key = GetCacheKey(firstPartyIsolationURI, originalURI, &isIsolated);
     if (isIsolated) // Try to add the new request into the cache.
       PutIntoCache(key, entry);
 
@@ -2301,7 +2285,7 @@ NS_IMETHODIMP imgCacheValidator::OnStartRequest(nsIRequest *aRequest, nsISupport
 
   int32_t corsmode = mRequest->GetCORSMode();
   nsCOMPtr<nsIPrincipal> loadingPrincipal = mRequest->GetLoadingPrincipal();
-  nsCOMPtr<nsIURI> firstPartyURI = mRequest->mFirstPartyURI;
+  nsCOMPtr<nsIURI> firstPartyIsolationURI = mRequest->mFirstPartyIsolationURI;
 
   // Doom the old request's cache entry
   mRequest->RemoveFromCache();
@@ -2312,7 +2296,7 @@ NS_IMETHODIMP imgCacheValidator::OnStartRequest(nsIRequest *aRequest, nsISupport
   // We use originalURI here to fulfil the imgIRequest contract on GetURI.
   nsCOMPtr<nsIURI> originalURI;
   channel->GetOriginalURI(getter_AddRefs(originalURI));
-  mNewRequest->Init(originalURI, uri, firstPartyURI, aRequest, channel,
+  mNewRequest->Init(originalURI, uri, firstPartyIsolationURI, aRequest, channel,
                     mNewEntry, mContext, loadingPrincipal, corsmode);
 
   mDestListener = new ProxyListener(mNewRequest);
@@ -2321,7 +2305,7 @@ NS_IMETHODIMP imgCacheValidator::OnStartRequest(nsIRequest *aRequest, nsISupport
   // the cache before the proxies' ownership changes, because adding a proxy
   // changes the caching behaviour for imgRequests.
   bool isIsolated = false;
-  nsAutoCString key = mImgLoader->GetCacheKey(firstPartyURI, originalURI,
+  nsAutoCString key = mImgLoader->GetCacheKey(firstPartyIsolationURI, originalURI,
                                              &isIsolated);
   if (isIsolated)
     mImgLoader->PutIntoCache(key, mNewEntry);
diff --git a/image/src/imgLoader.h b/image/src/imgLoader.h
index 0ab4a5e..3a31ecd 100644
--- a/image/src/imgLoader.h
+++ b/image/src/imgLoader.h
@@ -267,7 +267,7 @@ public:
 
   nsresult InitCache();
 
-  nsAutoCString GetCacheKey(nsIURI *firstPartyURI,
+  nsAutoCString GetCacheKey(nsIURI *firstPartyIsolationURI,
                             nsIURI *imgURI,
                             bool *isIsolated);
   bool RemoveFromCache(imgCacheEntry *entry);
@@ -312,12 +312,12 @@ public:
   // happens, by calling imgRequest::SetCacheEntry() when an entry with no
   // observers is re-requested.
   bool SetHasNoProxies(nsIURI *imgURI, imgCacheEntry *entry);
-  bool SetHasProxies(nsIURI *firstPartyURI, nsIURI *imgURI);
+  bool SetHasProxies(nsIURI *firstPartyIsolationURI, nsIURI *imgURI);
 
 private: // methods
 
   bool ValidateEntry(imgCacheEntry *aEntry, nsIURI *aURI,
-                       nsIURI *aFirstPartyURI, nsIURI *aReferrerURI,
+                       nsIURI *aFirstPartyIsolationURI, nsIURI *aReferrerURI,
                        nsILoadGroup *aLoadGroup,
                        imgINotificationObserver *aObserver, nsISupports *aCX,
                        nsLoadFlags aLoadFlags, bool aCanMakeNewChannel,
diff --git a/image/src/imgRequest.cpp b/image/src/imgRequest.cpp
index 9040679..5758d62 100644
--- a/image/src/imgRequest.cpp
+++ b/image/src/imgRequest.cpp
@@ -89,7 +89,7 @@ imgRequest::~imgRequest()
 
 nsresult imgRequest::Init(nsIURI *aURI,
                           nsIURI *aCurrentURI,
-                          nsIURI *aFirstPartyURI,
+                          nsIURI *aFirstPartyIsolationURI,
                           nsIRequest *aRequest,
                           nsIChannel *aChannel,
                           imgCacheEntry *aCacheEntry,
@@ -109,7 +109,7 @@ nsresult imgRequest::Init(nsIURI *aURI,
 
   mURI = aURI;
   mCurrentURI = aCurrentURI;
-  mFirstPartyURI = aFirstPartyURI;
+  mFirstPartyIsolationURI = aFirstPartyIsolationURI;
   mRequest = aRequest;
   mChannel = aChannel;
   mTimedChannel = do_QueryInterface(mChannel);
@@ -171,7 +171,7 @@ void imgRequest::AddProxy(imgRequestProxy *proxy)
   // proxies.
   if (GetStatusTracker().ConsumerCount() == 0) {
     NS_ABORT_IF_FALSE(mURI, "Trying to SetHasProxies without key uri.");
-    mLoader->SetHasProxies(mFirstPartyURI, mURI);
+    mLoader->SetHasProxies(mFirstPartyIsolationURI, mURI);
   }
 
   GetStatusTracker().AddConsumer(proxy);
@@ -301,7 +301,7 @@ void imgRequest::RemoveFromCache()
     else {
       mLoader->RemoveKeyFromCache(mLoader->GetCache(mURI),
                                   mLoader->GetCacheQueue(mURI),
-                                  mLoader->GetCacheKey(mFirstPartyURI, mURI, nullptr));
+                                  mLoader->GetCacheKey(mFirstPartyIsolationURI, mURI, nullptr));
     }
   }
 
diff --git a/image/src/imgRequest.h b/image/src/imgRequest.h
index 240a33b..f80af17 100644
--- a/image/src/imgRequest.h
+++ b/image/src/imgRequest.h
@@ -51,7 +51,7 @@ public:
 
   nsresult Init(nsIURI *aURI,
                 nsIURI *aCurrentURI,
-                nsIURI *aFirstPartyURI,
+                nsIURI *aFirstPartyIsolationURI,
                 nsIRequest *aRequest,
                 nsIChannel *aChannel,
                 imgCacheEntry *aCacheEntry,
@@ -195,7 +195,7 @@ private:
   // The URI of the resource we ended up loading after all redirects, etc.
   nsCOMPtr<nsIURI> mCurrentURI;
   // The first party that triggered the load -- for cookie + cache isolation
-  nsCOMPtr<nsIURI> mFirstPartyURI;
+  nsCOMPtr<nsIURI> mFirstPartyIsolationURI;
   // The principal of the document which loaded this image. Used when validating for CORS.
   nsCOMPtr<nsIPrincipal> mLoadingPrincipal;
   // The principal of this image.
diff --git a/layout/generic/nsImageFrame.cpp b/layout/generic/nsImageFrame.cpp
index 8f4bf25..6daa959 100644
--- a/layout/generic/nsImageFrame.cpp
+++ b/layout/generic/nsImageFrame.cpp
@@ -1810,26 +1810,26 @@ nsImageFrame::LoadIcon(const nsAString& aSpec,
   // For icon loads, we don't need to merge with the loadgroup flags
   nsLoadFlags loadFlags = nsIRequest::LOAD_NORMAL;
 
-  nsCOMPtr<nsIURI> firstPartyURI;
+  nsCOMPtr<nsIURI> firstPartyIsolationURI;
   nsCOMPtr<mozIThirdPartyUtil> thirdPartySvc
       = do_GetService(THIRDPARTYUTIL_CONTRACTID);
   // XXX: Should we pass the loadgroup, too? Is document ever likely
   // to be unset?
-  thirdPartySvc->GetFirstPartyURI(nullptr, aPresContext->Document(),
-                                 getter_AddRefs(firstPartyURI));
+  thirdPartySvc->GetFirstPartyIsolationURI(nullptr, aPresContext->Document(),
+                                           getter_AddRefs(firstPartyIsolationURI));
  
-  return il->LoadImage(realURI,     /* icon URI */
-                       firstPartyURI, /* initial document URI; this is only
-                                       relevant for cookies, so does not
-                                       apply to icons. */
-                       nullptr,      /* referrer (not relevant for icons) */
-                       nullptr,      /* principal (not relevant for icons) */
+  return il->LoadImage(realURI,                /* icon URI */
+                       firstPartyIsolationURI, /* initial document URI; this is only
+                                                  relevant for cookies, so does not
+                                                  apply to icons. */
+                       nullptr,                /* referrer (not relevant for icons) */
+                       nullptr,                /* principal (not relevant for icons) */
                        loadGroup,
                        gIconLoad,
-                       nullptr,      /* Not associated with any particular document */
+                       nullptr,                /* Not associated with any particular document */
                        loadFlags,
                        nullptr,
-                       nullptr,      /* channel policy not needed */
+                       nullptr,                /* channel policy not needed */
                        aRequest);
 }
 
diff --git a/netwerk/base/public/mozIThirdPartyUtil.idl b/netwerk/base/public/mozIThirdPartyUtil.idl
index 6137274..87fb630 100644
--- a/netwerk/base/public/mozIThirdPartyUtil.idl
+++ b/netwerk/base/public/mozIThirdPartyUtil.idl
@@ -165,6 +165,29 @@ interface mozIThirdPartyUtil : nsISupports
                                      in nsIDocument aDoc);
 
   /**
+   * getFirstPartyIsolationURI
+   *
+   * If first-party isolation is active, then
+   * obtains the top-level url bar URI for either a channel or a document.
+   * Otherwise returns null.
+   * Either parameter may be null (but not both).
+   *
+   * @param aChannel
+   *        An arbitrary channel for some content element of a first party
+   *        load. Can be null.
+   *
+   * @param aDoc
+   *        An arbitrary third party document. Can be null.
+   *
+   * @return the first party url bar URI for the load.
+   *
+   * @throws if the URI cannot be obtained or the URI lacks a hostname and the
+   *         URI's scheme is not white listed.
+   */
+  [noscript] nsIURI getFirstPartyIsolationURI(in nsIChannel aChannel,
+                                     in nsIDocument aDoc);
+
+  /**
    * getFirstPartyURIFromChannel
    *
    * Obtain the top-level url bar URI for a channel.
diff --git a/widget/cocoa/nsMenuItemIconX.mm b/widget/cocoa/nsMenuItemIconX.mm
index bd1f2f3..397239e 100644
--- a/widget/cocoa/nsMenuItemIconX.mm
+++ b/widget/cocoa/nsMenuItemIconX.mm
@@ -314,15 +314,15 @@ nsMenuItemIconX::LoadIcon(nsIURI* aIconURI)
       [mNativeMenuItem setImage:sPlaceholderIconImage];
   }
 
-  nsCOMPtr<nsIURI> firstPartyURI;
+  nsCOMPtr<nsIURI> firstPartyIsolationURI;
   nsCOMPtr<mozIThirdPartyUtil> thirdPartySvc
                                = do_GetService(THIRDPARTYUTIL_CONTRACTID);
-  thirdPartySvc->GetFirstPartyURI(nullptr, document,
-                                  getter_AddRefs(firstPartyURI));
+  thirdPartySvc->GetFirstPartyIsolationURI(nullptr, document,
+                                           getter_AddRefs(firstPartyIsolationURI));
 
   // Passing in null for channelPolicy here since nsMenuItemIconX::LoadIcon is
   // not exposed to web content
-  nsresult rv = loader->LoadImage(aIconURI, firstPartyURI, nullptr, nullptr, loadGroup, this,
+  nsresult rv = loader->LoadImage(aIconURI, firstPartyIsolationURI, nullptr, nullptr, loadGroup, this,
                                    nullptr, nsIRequest::LOAD_NORMAL, nullptr,
                                    nullptr, getter_AddRefs(mIconRequest));
   if (NS_FAILED(rv)) return rv;



More information about the tor-commits mailing list