Bug 1316683 - make nsILoadContext non-scriptable. r?ehsan draft
authorNicholas Hurley <hurley@mozilla.com>
Thu, 06 Apr 2017 13:57:12 -0700
changeset 557449 3e894c2bf7fb71a4d01386af50db553c4d623f07
parent 557282 facaf90aeaaf6d7cf5e2966f9f918319536bddea
child 623064 cc353399c5799e5a4fee08ac9653d156c5b634b2
push id52729
push userbmo:hurley@mozilla.com
push dateThu, 06 Apr 2017 21:07:28 +0000
reviewersehsan
bugs1316683
milestone55.0a1
Bug 1316683 - make nsILoadContext non-scriptable. r?ehsan MozReview-Commit-ID: GlWfxZn0ZmD
docshell/base/LoadContext.cpp
docshell/base/LoadContext.h
docshell/build/nsDocShellCID.h
docshell/build/nsDocShellModule.cpp
netwerk/test/unit/test_bug826063.js
netwerk/test/unit/test_cacheflags.js
--- a/docshell/base/LoadContext.cpp
+++ b/docshell/base/LoadContext.cpp
@@ -213,9 +213,39 @@ LoadContext::GetInterface(const nsIID& a
     *aResult = static_cast<nsILoadContext*>(this);
     NS_ADDREF_THIS();
     return NS_OK;
   }
 
   return NS_NOINTERFACE;
 }
 
+static nsresult
+CreateTestInstance(bool aPrivate, nsISupports *aOuter, REFNSIID aIID, void **aResult)
+{
+  // Shamelessly modified from NS_GENERIC_FACTORY_CONSTRUCTOR
+  *aResult = nullptr;
+
+  if (aOuter) {
+    return NS_ERROR_NO_AGGREGATION;
+  }
+
+  OriginAttributes oa;
+  oa.mPrivateBrowsingId = aPrivate ? 1 : 0;
+
+  RefPtr<LoadContext> lc = new LoadContext(oa);
+
+  return lc->QueryInterface(aIID, aResult);
+}
+
+nsresult
+CreateTestLoadContext(nsISupports *aOuter, REFNSIID aIID, void **aResult)
+{
+  return CreateTestInstance(false, aOuter, aIID, aResult);
+}
+
+nsresult
+CreatePrivateTestLoadContext(nsISupports *aOuter, REFNSIID aIID, void **aResult)
+{
+  return CreateTestInstance(true, aOuter, aIID, aResult);
+}
+
 } // namespace mozilla
--- a/docshell/base/LoadContext.h
+++ b/docshell/base/LoadContext.h
@@ -117,11 +117,14 @@ private:
   bool mUseRemoteTabs;
   bool mUseTrackingProtection;
   OriginAttributes mOriginAttributes;
 #ifdef DEBUG
   bool mIsNotNull;
 #endif
 };
 
+nsresult CreateTestLoadContext(nsISupports *aOuter, REFNSIID aIID, void **aResult);
+nsresult CreatePrivateTestLoadContext(nsISupports *aOuter, REFNSIID aIID, void **aResult);
+
 } // namespace mozilla
 
 #endif // LoadContext_h
--- a/docshell/build/nsDocShellCID.h
+++ b/docshell/build/nsDocShellCID.h
@@ -82,9 +82,21 @@
  * An observer service topic that can be listened to to catch destruction
  * of chrome browsing areas (both toplevel ones and subframes).  The
  * subject of the notification will be the nsIWebNavigation being
  * destroyed.  At this time the additional data wstring is not defined
  * to be anything in particular.
  */
 #define NS_CHROME_WEBNAVIGATION_DESTROY "chrome-webnavigation-destroy"
 
+/**
+ * A way to create nsILoadContexts from script
+ */
+#define NS_LOADCONTEXT_CONTRACTID "@mozilla.org/loadcontext;1"
+#define NS_LOADCONTEXT_CID \
+    { 0xd0181d36, 0x19a2, 0x4347, \
+      { 0x8f, 0x00, 0x04, 0x13, 0xa0, 0x70, 0xaa, 0xdc } }
+#define NS_PRIVATELOADCONTEXT_CONTRACTID "@mozilla.org/privateloadcontext;1"
+#define NS_PRIVATELOADCONTEXT_CID \
+    { 0x01629810, 0xd8ae, 0x4455, \
+      { 0x86, 0xe8, 0x69, 0x68, 0x87, 0xd1, 0xf7, 0x8d } }
+
 #endif // nsDocShellCID_h__
--- a/docshell/build/nsDocShellModule.cpp
+++ b/docshell/build/nsDocShellModule.cpp
@@ -34,16 +34,20 @@
 #include "nsSHEntry.h"
 #include "nsSHEntryShared.h"
 #include "nsSHistory.h"
 #include "nsSHTransaction.h"
 
 // download history
 #include "nsDownloadHistory.h"
 
+
+// LoadContexts (used for testing)
+#include "LoadContext.h"
+
 using mozilla::dom::ContentHandlerService;
 
 static bool gInitialized = false;
 
 // The one time initialization for this module
 static nsresult
 Initialize()
 {
@@ -119,16 +123,18 @@ NS_DEFINE_NAMED_CID(NS_EXTERNALSHARINGAP
 NS_DEFINE_NAMED_CID(NS_EXTERNALURLHANDLERSERVICE_CID);
 #endif
 NS_DEFINE_NAMED_CID(NS_SHENTRY_CID);
 NS_DEFINE_NAMED_CID(NS_SHTRANSACTION_CID);
 NS_DEFINE_NAMED_CID(NS_SHISTORY_CID);
 NS_DEFINE_NAMED_CID(NS_SHISTORY_INTERNAL_CID);
 NS_DEFINE_NAMED_CID(NS_DOWNLOADHISTORY_CID);
 NS_DEFINE_NAMED_CID(NS_CONTENTHANDLERSERVICE_CID);
+NS_DEFINE_NAMED_CID(NS_LOADCONTEXT_CID);
+NS_DEFINE_NAMED_CID(NS_PRIVATELOADCONTEXT_CID);
 
 const mozilla::Module::CIDEntry kDocShellCIDs[] = {
   { &kNS_DOCSHELL_CID, false, nullptr, nsDocShellConstructor },
   { &kNS_DEFAULTURIFIXUP_CID, false, nullptr, nsDefaultURIFixupConstructor },
   { &kNS_WEBNAVIGATION_INFO_CID, false, nullptr, nsWebNavigationInfoConstructor },
   { &kNS_ABOUT_REDIRECTOR_MODULE_CID, false, nullptr, nsAboutRedirector::Create },
   { &kNS_URI_LOADER_CID, false, nullptr, nsURILoaderConstructor },
   { &kNS_DOCUMENTLOADER_SERVICE_CID, false, nullptr, nsDocLoaderConstructor },
@@ -147,16 +153,18 @@ const mozilla::Module::CIDEntry kDocShel
   { &kNS_EXTERNALSHARINGAPPSERVICE_CID, false, nullptr, nsExternalSharingAppServiceConstructor },
   { &kNS_EXTERNALURLHANDLERSERVICE_CID, false, nullptr, nsExternalURLHandlerServiceConstructor },
 #endif
   { &kNS_SHENTRY_CID, false, nullptr, nsSHEntryConstructor },
   { &kNS_SHTRANSACTION_CID, false, nullptr, nsSHTransactionConstructor },
   { &kNS_SHISTORY_CID, false, nullptr, nsSHistoryConstructor },
   { &kNS_SHISTORY_INTERNAL_CID, false, nullptr, nsSHistoryConstructor },
   { &kNS_DOWNLOADHISTORY_CID, false, nullptr, nsDownloadHistoryConstructor },
+  { &kNS_LOADCONTEXT_CID, false, nullptr, mozilla::CreateTestLoadContext },
+  { &kNS_PRIVATELOADCONTEXT_CID, false, nullptr, mozilla::CreatePrivateTestLoadContext },
   { nullptr }
 };
 
 const mozilla::Module::ContractIDEntry kDocShellContracts[] = {
   { "@mozilla.org/docshell;1", &kNS_DOCSHELL_CID },
   { NS_URIFIXUP_CONTRACTID, &kNS_DEFAULTURIFIXUP_CID },
   { NS_WEBNAVIGATION_INFO_CONTRACTID, &kNS_WEBNAVIGATION_INFO_CID },
   { NS_ABOUT_MODULE_CONTRACTID_PREFIX "", &kNS_ABOUT_REDIRECTOR_MODULE_CID },
@@ -208,16 +216,18 @@ const mozilla::Module::ContractIDEntry k
   { NS_EXTERNALSHARINGAPPSERVICE_CONTRACTID, &kNS_EXTERNALSHARINGAPPSERVICE_CID },
   { NS_EXTERNALURLHANDLERSERVICE_CONTRACTID, &kNS_EXTERNALURLHANDLERSERVICE_CID },
 #endif
   { NS_SHENTRY_CONTRACTID, &kNS_SHENTRY_CID },
   { NS_SHTRANSACTION_CONTRACTID, &kNS_SHTRANSACTION_CID },
   { NS_SHISTORY_CONTRACTID, &kNS_SHISTORY_CID },
   { NS_SHISTORY_INTERNAL_CONTRACTID, &kNS_SHISTORY_INTERNAL_CID },
   { NS_DOWNLOADHISTORY_CONTRACTID, &kNS_DOWNLOADHISTORY_CID },
+  { NS_LOADCONTEXT_CONTRACTID, &kNS_LOADCONTEXT_CID },
+  { NS_PRIVATELOADCONTEXT_CONTRACTID, &kNS_PRIVATELOADCONTEXT_CID },
   { nullptr }
 };
 
 static const mozilla::Module kDocShellModule = {
   mozilla::Module::kVersion,
   kDocShellCIDs,
   kDocShellContracts,
   nullptr,
--- a/netwerk/test/unit/test_bug826063.js
+++ b/netwerk/test/unit/test_bug826063.js
@@ -11,24 +11,18 @@ Cu.import("resource://gre/modules/NetUti
 
 
 var URIs = [
   "http://example.org",
   "https://example.org",
   "ftp://example.org"
   ];
 
-function LoadContext(usePrivateBrowsing) {
-  this.usePrivateBrowsing = usePrivateBrowsing;
-}
-LoadContext.prototype = {
-  originAttributes: {},
-  QueryInterface: XPCOMUtils.generateQI([Ci.nsILoadContext, Ci.nsIInterfaceRequestor]),
-  getInterface: XPCOMUtils.generateQI([Ci.nsILoadContext])
-};
+var privateContext = Cc["@mozilla.org/privateloadcontext;1"].createInstance(Ci.nsILoadContext);
+var nonPrivateContext = Cc["@mozilla.org/loadcontext;1"].createInstance(Ci.nsILoadContext);
 
 function* getChannels() {
   for (let u of URIs) {
     yield NetUtil.newChannel({
       uri: u,
       loadUsingSystemPrincipal: true
     });
   }
@@ -71,31 +65,29 @@ add_test(function test_setPrivate_regula
   }
   run_next_test();
 });
 
 /**
  * Load context mandates private mode
  */
 add_test(function test_LoadContextPrivate() {
-  let ctx = new LoadContext(true);
   for (let c of getChannels()) {
-    c.notificationCallbacks = ctx;
+    c.notificationCallbacks = privateContext;
     checkPrivate(c, true);
   }
   run_next_test();
 });
 
 /**
  * Load context mandates regular mode
  */
 add_test(function test_LoadContextRegular() {
-  let ctx = new LoadContext(false);
   for (let c of getChannels()) {
-    c.notificationCallbacks = ctx;
+    c.notificationCallbacks = nonPrivateContext;
     checkPrivate(c, false);
   }
   run_next_test();
 });
 
 
 // Do not test simultanous uses of .setPrivate and load context.
 // There is little merit in doing so, and combining both will assert in
--- a/netwerk/test/unit/test_cacheflags.js
+++ b/netwerk/test/unit/test_cacheflags.js
@@ -12,43 +12,17 @@ var httpsBase = "http://localhost:4445";
 var shortexpPath = "/shortexp" + suffix;
 var longexpPath = "/longexp/" + suffix;
 var longexp2Path = "/longexp/2/" + suffix;
 var nocachePath = "/nocache" + suffix;
 var nostorePath = "/nostore" + suffix;
 var test410Path = "/test410" + suffix;
 var test404Path = "/test404" + suffix;
 
-// We attach this to channel when we want to test Private Browsing mode
-function LoadContext(usePrivateBrowsing) {
-  this.usePrivateBrowsing = usePrivateBrowsing;
-  this.originAttributes.privateBrowsingId = usePrivateBrowsing ? 1 : 0;
-}
-
-LoadContext.prototype = {
-  originAttributes: {
-    privateBrowsingId : 0
-  },
-  usePrivateBrowsing: false,
-  // don't bother defining rest of nsILoadContext fields: don't need 'em
-
-  QueryInterface: function(iid) {
-    if (iid.equals(Ci.nsILoadContext))
-      return this;
-    throw Cr.NS_ERROR_NO_INTERFACE;
-  },
-
-  getInterface: function(iid) {
-    if (iid.equals(Ci.nsILoadContext))
-      return this;
-    throw Cr.NS_ERROR_NO_INTERFACE;
-  },
-};
-
-var PrivateBrowsingLoadContext = new LoadContext(true);
+var PrivateBrowsingLoadContext = Cc["@mozilla.org/privateloadcontext;1"].createInstance(Ci.nsILoadContext);
 
 function make_channel(url, flags, usePrivateBrowsing) {
   var securityFlags = Ci.nsILoadInfo.SEC_ALLOW_CROSS_ORIGIN_DATA_IS_NULL;
 
   var uri = Services.io.newURI(url);
   var principal = Services.scriptSecurityManager.createCodebasePrincipal(uri,
     { privateBrowsingId : usePrivateBrowsing ? 1 : 0 });