Bug 1107516 P2 Add nsILoadGroup helpers to nsNetUtil.h. r=mcmanus
☠☠ backed out by 7bc8853f1230 ☠ ☠
authorBen Kelly <ben@wanderview.com>
Fri, 12 Dec 2014 16:41:36 -0500
changeset 219590 ce51e5cd2a85ad012f5698bbde9df52d37b01f5d
parent 219589 c3b2309fdf93f05d8d986353ae674c9b39d3cfc2
child 219591 5fe0df3298aa6ce53ff5717bb131d1514cb3bd25
push idunknown
push userunknown
push dateunknown
reviewersmcmanus
bugs1107516
milestone37.0a1
Bug 1107516 P2 Add nsILoadGroup helpers to nsNetUtil.h. r=mcmanus
netwerk/base/public/nsNetUtil.h
netwerk/base/src/nsNetUtil.cpp
--- a/netwerk/base/public/nsNetUtil.h
+++ b/netwerk/base/public/nsNetUtil.h
@@ -987,16 +987,24 @@ NS_NewLoadGroup(nsILoadGroup      **resu
         if (NS_SUCCEEDED(rv)) {
             *result = nullptr;
             group.swap(*result);
         }
     }
     return rv;
 }
 
+// Create a new nsILoadGroup that will match the given principal.
+nsresult
+NS_NewLoadGroup(nsILoadGroup** aResult, nsIPrincipal* aPrincipal);
+
+bool
+NS_LoadGroupMatchesPrincipal(nsILoadGroup* aLoadGroup,
+                             nsIPrincipal* aPrincipal);
+
 inline nsresult
 NS_NewDownloader(nsIStreamListener   **result,
                  nsIDownloadObserver  *observer,
                  nsIFile              *downloadLocation = nullptr)
 {
     nsresult rv;
     nsCOMPtr<nsIDownloader> downloader =
         do_CreateInstance(NS_DOWNLOADER_CONTRACTID, &rv);
--- a/netwerk/base/src/nsNetUtil.cpp
+++ b/netwerk/base/src/nsNetUtil.cpp
@@ -1,18 +1,69 @@
 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
 /* vim:set ts=4 sw=4 sts=4 et cin: */
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
+#include "mozilla/LoadContext.h"
 #include "nsNetUtil.h"
 #include "nsHttp.h"
 
 bool NS_IsReasonableHTTPHeaderValue(const nsACString& aValue)
 {
   return mozilla::net::nsHttp::IsReasonableHeaderValue(aValue);
 }
 
 bool NS_IsValidHTTPToken(const nsACString& aToken)
 {
   return mozilla::net::nsHttp::IsValidToken(aToken);
 }
+
+nsresult
+NS_NewLoadGroup(nsILoadGroup** aResult, nsIPrincipal* aPrincipal)
+{
+    using mozilla::LoadContext;
+    nsresult rv;
+
+    nsCOMPtr<nsILoadGroup> group =
+        do_CreateInstance(NS_LOADGROUP_CONTRACTID, &rv);
+    NS_ENSURE_SUCCESS(rv, rv);
+
+    nsRefPtr<LoadContext> loadContext = new LoadContext(aPrincipal);
+    rv = group->SetNotificationCallbacks(loadContext);
+    NS_ENSURE_SUCCESS(rv, rv);
+
+    group.forget(aResult);
+    return rv;
+}
+
+bool
+NS_LoadGroupMatchesPrincipal(nsILoadGroup* aLoadGroup,
+                             nsIPrincipal* aPrincipal)
+{
+    if (!aLoadGroup || !aPrincipal) {
+        return false;
+    }
+
+    nsCOMPtr<nsILoadContext> loadContext;
+    NS_QueryNotificationCallbacks(nullptr, aLoadGroup, NS_GET_IID(nsILoadContext),
+                                  getter_AddRefs(loadContext));
+    NS_ENSURE_TRUE(loadContext, false);
+
+    // Verify load context appId and browser flag match the principal
+    uint32_t contextAppId;
+    bool contextInBrowserElement;
+    nsresult rv = loadContext->GetAppId(&contextAppId);
+    NS_ENSURE_SUCCESS(rv, false);
+    rv = loadContext->GetIsInBrowserElement(&contextInBrowserElement);
+    NS_ENSURE_SUCCESS(rv, false);
+
+    uint32_t principalAppId;
+    bool principalInBrowserElement;
+    rv = aPrincipal->GetAppId(&principalAppId);
+    NS_ENSURE_SUCCESS(rv, false);
+    rv = aPrincipal->GetIsInBrowserElement(&principalInBrowserElement);
+    NS_ENSURE_SUCCESS(rv, false);
+
+    return contextAppId == principalAppId &&
+           contextInBrowserElement == principalInBrowserElement;
+}