Bug 1316683 - make nsILoadContext non-scriptable. r?ehsan
MozReview-Commit-ID: GlWfxZn0ZmD
--- 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 });