mirror of
https://github.com/roytam1/UXP.git
synced 2026-05-26 14:54:25 +00:00
moebius#226: Consider blocking top level window data: URIs (part 2/2 without tests)
https://github.com/MoonchildProductions/moebius/pull/226
This commit is contained in:
@@ -17,6 +17,7 @@
|
||||
#include "nsIHttpChannel.h"
|
||||
#include "nsIScriptSecurityManager.h"
|
||||
#include "nsError.h"
|
||||
#include "nsContentSecurityManager.h"
|
||||
#include "nsCharSeparatedTokenizer.h"
|
||||
#include "nsIConsoleService.h"
|
||||
#include "nsIScriptError.h"
|
||||
@@ -93,6 +94,14 @@ nsDSURIContentListener::DoContent(const nsACString& aContentType,
|
||||
|
||||
if (aOpenedChannel) {
|
||||
aOpenedChannel->GetLoadFlags(&loadFlags);
|
||||
|
||||
// block top-level data URI navigations if triggered by the web
|
||||
if (!nsContentSecurityManager::AllowTopLevelNavigationToDataURI(aOpenedChannel)) {
|
||||
// logging to console happens within AllowTopLevelNavigationToDataURI
|
||||
aRequest->Cancel(NS_ERROR_DOM_BAD_URI);
|
||||
*aAbortProcess = true;
|
||||
return NS_OK;
|
||||
}
|
||||
}
|
||||
|
||||
if (loadFlags & nsIChannel::LOAD_RETARGETED_DOCUMENT_URI) {
|
||||
|
||||
@@ -9885,15 +9885,6 @@ nsDocShell::InternalLoad(nsIURI* aURI,
|
||||
contentType = nsIContentPolicy::TYPE_DOCUMENT;
|
||||
}
|
||||
|
||||
if (!nsContentSecurityManager::AllowTopLevelNavigationToDataURI(
|
||||
aURI,
|
||||
contentType,
|
||||
aTriggeringPrincipal,
|
||||
(aLoadType == LOAD_NORMAL_EXTERNAL))) {
|
||||
// logging to console happens within AllowTopLevelNavigationToDataURI
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
// If there's no targetDocShell, that means we are about to create a new window,
|
||||
// perform a content policy check before creating the window.
|
||||
if (!targetDocShell) {
|
||||
@@ -10962,6 +10953,7 @@ nsDocShell::DoURILoad(nsIURI* aURI,
|
||||
if (aPrincipalToInherit) {
|
||||
loadInfo->SetPrincipalToInherit(aPrincipalToInherit);
|
||||
}
|
||||
loadInfo->SetLoadTriggeredFromExternal(aLoadFromExternal);
|
||||
|
||||
// We have to do this in case our OriginAttributes are different from the
|
||||
// OriginAttributes of the parent document. Or in case there isn't a
|
||||
|
||||
@@ -10,20 +10,16 @@
|
||||
#include "nsIStreamListener.h"
|
||||
#include "nsIDocument.h"
|
||||
#include "nsMixedContentBlocker.h"
|
||||
#include "nsNullPrincipal.h"
|
||||
|
||||
#include "mozilla/dom/Element.h"
|
||||
#include "mozilla/dom/TabChild.h"
|
||||
|
||||
NS_IMPL_ISUPPORTS(nsContentSecurityManager,
|
||||
nsIContentSecurityManager,
|
||||
nsIChannelEventSink)
|
||||
|
||||
/* static */ bool
|
||||
nsContentSecurityManager::AllowTopLevelNavigationToDataURI(
|
||||
nsIURI* aURI,
|
||||
nsContentPolicyType aContentPolicyType,
|
||||
nsIPrincipal* aTriggeringPrincipal,
|
||||
bool aLoadFromExternal)
|
||||
nsContentSecurityManager::AllowTopLevelNavigationToDataURI(nsIChannel* aChannel)
|
||||
{
|
||||
// Let's block all toplevel document navigations to a data: URI.
|
||||
// In all cases where the toplevel document is navigated to a
|
||||
@@ -36,17 +32,24 @@ nsContentSecurityManager::AllowTopLevelNavigationToDataURI(
|
||||
if (!mozilla::net::nsIOService::BlockToplevelDataUriNavigations()) {
|
||||
return true;
|
||||
}
|
||||
if (aContentPolicyType != nsIContentPolicy::TYPE_DOCUMENT) {
|
||||
nsCOMPtr<nsILoadInfo> loadInfo = aChannel->GetLoadInfo();
|
||||
if (!loadInfo) {
|
||||
return true;
|
||||
}
|
||||
if (loadInfo->GetExternalContentPolicyType() != nsIContentPolicy::TYPE_DOCUMENT) {
|
||||
return true;
|
||||
}
|
||||
nsCOMPtr<nsIURI> uri;
|
||||
nsresult rv = NS_GetFinalChannelURI(aChannel, getter_AddRefs(uri));
|
||||
NS_ENSURE_SUCCESS(rv, true);
|
||||
bool isDataURI =
|
||||
(NS_SUCCEEDED(aURI->SchemeIs("data", &isDataURI)) && isDataURI);
|
||||
(NS_SUCCEEDED(uri->SchemeIs("data", &isDataURI)) && isDataURI);
|
||||
if (!isDataURI) {
|
||||
return true;
|
||||
}
|
||||
// Whitelist data: images as long as they are not SVGs
|
||||
nsAutoCString filePath;
|
||||
aURI->GetFilePath(filePath);
|
||||
uri->GetFilePath(filePath);
|
||||
if (StringBeginsWith(filePath, NS_LITERAL_CSTRING("image/")) &&
|
||||
!StringBeginsWith(filePath, NS_LITERAL_CSTRING("image/svg+xml"))) {
|
||||
return true;
|
||||
@@ -56,22 +59,29 @@ nsContentSecurityManager::AllowTopLevelNavigationToDataURI(
|
||||
StringBeginsWith(filePath, NS_LITERAL_CSTRING("application/json"))) {
|
||||
return true;
|
||||
}
|
||||
if (!aLoadFromExternal &&
|
||||
nsContentUtils::IsSystemPrincipal(aTriggeringPrincipal)) {
|
||||
// Redirecting to a toplevel data: URI is not allowed, hence we make
|
||||
// sure the RedirectChain is empty.
|
||||
if (!loadInfo->GetLoadTriggeredFromExternal() &&
|
||||
nsContentUtils::IsSystemPrincipal(loadInfo->TriggeringPrincipal()) &&
|
||||
loadInfo->RedirectChain().IsEmpty()) {
|
||||
return true;
|
||||
}
|
||||
nsAutoCString dataSpec;
|
||||
aURI->GetSpec(dataSpec);
|
||||
uri->GetSpec(dataSpec);
|
||||
if (dataSpec.Length() > 50) {
|
||||
dataSpec.Truncate(50);
|
||||
dataSpec.AppendLiteral("...");
|
||||
}
|
||||
nsCOMPtr<nsITabChild> tabChild = do_QueryInterface(loadInfo->ContextForTopLevelLoad());
|
||||
nsCOMPtr<nsIDocument> doc;
|
||||
if (tabChild) {
|
||||
doc = static_cast<mozilla::dom::TabChild*>(tabChild.get())->GetDocument();
|
||||
}
|
||||
NS_ConvertUTF8toUTF16 specUTF16(NS_UnescapeURL(dataSpec));
|
||||
const char16_t* params[] = { specUTF16.get() };
|
||||
nsContentUtils::ReportToConsole(nsIScriptError::warningFlag,
|
||||
NS_LITERAL_CSTRING("DATA_URI_BLOCKED"),
|
||||
// no doc available, log to browser console
|
||||
nullptr,
|
||||
doc,
|
||||
nsContentUtils::eSECURITY_PROPERTIES,
|
||||
"BlockTopLevelDataURINavigation",
|
||||
params, ArrayLength(params));
|
||||
@@ -541,27 +551,6 @@ nsContentSecurityManager::AsyncOnChannelRedirect(nsIChannel* aOldChannel,
|
||||
}
|
||||
}
|
||||
|
||||
// Redirecting to a toplevel data: URI is not allowed, hence we pass
|
||||
// a NullPrincipal as the TriggeringPrincipal to
|
||||
// AllowTopLevelNavigationToDataURI() which definitely blocks any
|
||||
// data: URI load.
|
||||
nsCOMPtr<nsILoadInfo> newLoadInfo = aNewChannel->GetLoadInfo();
|
||||
if (newLoadInfo) {
|
||||
nsCOMPtr<nsIURI> uri;
|
||||
nsresult rv = NS_GetFinalChannelURI(aNewChannel, getter_AddRefs(uri));
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
nsCOMPtr<nsIPrincipal> nullTriggeringPrincipal = nsNullPrincipal::Create();
|
||||
if (!nsContentSecurityManager::AllowTopLevelNavigationToDataURI(
|
||||
uri,
|
||||
newLoadInfo->GetExternalContentPolicyType(),
|
||||
nullTriggeringPrincipal,
|
||||
false)) {
|
||||
// logging to console happens within AllowTopLevelNavigationToDataURI
|
||||
aOldChannel->Cancel(NS_ERROR_DOM_BAD_URI);
|
||||
return NS_ERROR_DOM_BAD_URI;
|
||||
}
|
||||
}
|
||||
|
||||
// Also verify that the redirecting server is allowed to redirect to the
|
||||
// given URI
|
||||
nsCOMPtr<nsIPrincipal> oldPrincipal;
|
||||
|
||||
@@ -32,10 +32,7 @@ public:
|
||||
static nsresult doContentSecurityCheck(nsIChannel* aChannel,
|
||||
nsCOMPtr<nsIStreamListener>& aInAndOutListener);
|
||||
|
||||
static bool AllowTopLevelNavigationToDataURI(nsIURI* aURI,
|
||||
nsContentPolicyType aContentPolicyType,
|
||||
nsIPrincipal* aTriggeringPrincipal,
|
||||
bool aLoadFromExternal);
|
||||
static bool AllowTopLevelNavigationToDataURI(nsIChannel* aChannel);
|
||||
|
||||
private:
|
||||
static nsresult CheckChannel(nsIChannel* aChannel);
|
||||
|
||||
@@ -3,3 +3,9 @@
|
||||
support-files =
|
||||
file_toplevel_data_navigations.sjs
|
||||
file_toplevel_data_meta_redirect.html
|
||||
[browser_test_data_download.js]
|
||||
support-files =
|
||||
file_data_download.html
|
||||
[browser_test_data_text_csv.js]
|
||||
support-files =
|
||||
file_data_text_csv.html
|
||||
|
||||
@@ -0,0 +1,37 @@
|
||||
"use strict";
|
||||
|
||||
const kTestPath = getRootDirectory(gTestPath)
|
||||
.replace("chrome://mochitests/content", "http://example.com")
|
||||
const kTestURI = kTestPath + "file_data_download.html";
|
||||
|
||||
function addWindowListener(aURL, aCallback) {
|
||||
Services.wm.addListener({
|
||||
onOpenWindow(aXULWindow) {
|
||||
info("window opened, waiting for focus");
|
||||
Services.wm.removeListener(this);
|
||||
var domwindow = aXULWindow.QueryInterface(Ci.nsIInterfaceRequestor)
|
||||
.getInterface(Ci.nsIDOMWindow);
|
||||
waitForFocus(function() {
|
||||
is(domwindow.document.location.href, aURL, "should have seen the right window open");
|
||||
aCallback(domwindow);
|
||||
}, domwindow);
|
||||
},
|
||||
onCloseWindow(aXULWindow) { },
|
||||
onWindowTitleChange(aXULWindow, aNewTitle) { }
|
||||
});
|
||||
}
|
||||
|
||||
function test() {
|
||||
waitForExplicitFinish();
|
||||
Services.prefs.setBoolPref("security.data_uri.block_toplevel_data_uri_navigations", true);
|
||||
registerCleanupFunction(function() {
|
||||
Services.prefs.clearUserPref("security.data_uri.block_toplevel_data_uri_navigations");
|
||||
});
|
||||
addWindowListener("chrome://mozapps/content/downloads/unknownContentType.xul", function(win) {
|
||||
is(win.document.getElementById("location").value, "data-foo.html",
|
||||
"file name of download should match");
|
||||
win.close();
|
||||
finish();
|
||||
});
|
||||
gBrowser.loadURI(kTestURI);
|
||||
}
|
||||
@@ -0,0 +1,37 @@
|
||||
"use strict";
|
||||
|
||||
const kTestPath = getRootDirectory(gTestPath)
|
||||
.replace("chrome://mochitests/content", "http://example.com")
|
||||
const kTestURI = kTestPath + "file_data_text_csv.html";
|
||||
|
||||
function addWindowListener(aURL, aCallback) {
|
||||
Services.wm.addListener({
|
||||
onOpenWindow(aXULWindow) {
|
||||
info("window opened, waiting for focus");
|
||||
Services.wm.removeListener(this);
|
||||
var domwindow = aXULWindow.QueryInterface(Ci.nsIInterfaceRequestor)
|
||||
.getInterface(Ci.nsIDOMWindow);
|
||||
waitForFocus(function() {
|
||||
is(domwindow.document.location.href, aURL, "should have seen the right window open");
|
||||
aCallback(domwindow);
|
||||
}, domwindow);
|
||||
},
|
||||
onCloseWindow(aXULWindow) { },
|
||||
onWindowTitleChange(aXULWindow, aNewTitle) { }
|
||||
});
|
||||
}
|
||||
|
||||
function test() {
|
||||
waitForExplicitFinish();
|
||||
Services.prefs.setBoolPref("security.data_uri.block_toplevel_data_uri_navigations", true);
|
||||
registerCleanupFunction(function() {
|
||||
Services.prefs.clearUserPref("security.data_uri.block_toplevel_data_uri_navigations");
|
||||
});
|
||||
addWindowListener("chrome://mozapps/content/downloads/unknownContentType.xul", function(win) {
|
||||
is(win.document.getElementById("location").value, "text/csv;foo,bar,foobar",
|
||||
"file name of download should match");
|
||||
win.close();
|
||||
finish();
|
||||
});
|
||||
gBrowser.loadURI(kTestURI);
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
<!DOCTYPE HTML>
|
||||
<html>
|
||||
<head>
|
||||
<title>Test download attribute for data: URI</title>
|
||||
</head>
|
||||
<body>
|
||||
<a href="data:text/html,<body>data download</body>" download="data-foo.html" id="testlink">download data</a>
|
||||
<script>
|
||||
// click the link to have the downoad panel appear
|
||||
let testlink = document.getElementById("testlink");
|
||||
testlink.click();
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,14 @@
|
||||
<!DOCTYPE HTML>
|
||||
<html>
|
||||
<head>
|
||||
<title>Test open data:text/csv</title>
|
||||
</head>
|
||||
<body>
|
||||
<a href="data:text/csv;foo,bar,foobar" id="testlink">test text/csv</a>
|
||||
<script>
|
||||
// click the link to have the downoad panel appear
|
||||
let testlink = document.getElementById("testlink");
|
||||
testlink.click();
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -34,15 +34,17 @@ function test_toplevel_data_image_svg() {
|
||||
const DATA_SVG =
|
||||
"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiIgdmlld0JveD0iMCAwIDE2IDE2Ij4KICA8cGF0aCBkPSJNOCwxMkwzLDcsNCw2bDQsNCw0LTQsMSwxWiIgZmlsbD0iIzZBNkE2QSIgLz4KPC9zdmc+Cg==";
|
||||
let win2 = window.open(DATA_SVG);
|
||||
let wrappedWin2 = SpecialPowers.wrap(win2);
|
||||
setTimeout(function () {
|
||||
isnot(wrappedWin2.document.documentElement.localName, "svg",
|
||||
"Loading data:image/svg+xml should be blocked");
|
||||
wrappedWin2.close();
|
||||
SimpleTest.finish();
|
||||
}, 1000);
|
||||
// Unfortunately we can't detect whether the window was closed using some event,
|
||||
// hence we are constantly polling till we see that win == null.
|
||||
// Test times out on failure.
|
||||
var win2Closed = setInterval(function() {
|
||||
if (win2 == null || win2.closed) {
|
||||
clearInterval(win2Closed);
|
||||
ok(true, "Loading data:image/svg+xml should be blocked");
|
||||
SimpleTest.finish();
|
||||
}
|
||||
}, 200);
|
||||
}
|
||||
|
||||
// fire up the tests
|
||||
test_toplevel_data_image();
|
||||
|
||||
|
||||
@@ -21,16 +21,12 @@ function test1() {
|
||||
// simple data: URI click navigation should be prevented
|
||||
let TEST_FILE = "file_block_toplevel_data_navigation.html";
|
||||
let win1 = window.open(TEST_FILE);
|
||||
var readyStateCheckInterval = setInterval(function() {
|
||||
let state = win1.document.readyState;
|
||||
if (state === "interactive" || state === "complete") {
|
||||
clearInterval(readyStateCheckInterval);
|
||||
ok(win1.document.body.innerHTML.indexOf("test1:") !== -1,
|
||||
"toplevel data: URI navigation through click() should be blocked");
|
||||
win1.close();
|
||||
test2();
|
||||
}
|
||||
}, 200);
|
||||
setTimeout(function () {
|
||||
ok(SpecialPowers.wrap(win1).document.body.innerHTML.indexOf("test1:") !== -1,
|
||||
"toplevel data: URI navigation through click() should be blocked");
|
||||
win1.close();
|
||||
test2();
|
||||
}, 1000);
|
||||
}
|
||||
|
||||
function test2() {
|
||||
|
||||
@@ -294,6 +294,7 @@ LoadInfoToLoadInfoArgs(nsILoadInfo *aLoadInfo,
|
||||
aLoadInfo->CorsUnsafeHeaders(),
|
||||
aLoadInfo->GetForcePreflight(),
|
||||
aLoadInfo->GetIsPreflight(),
|
||||
aLoadInfo->GetLoadTriggeredFromExternal(),
|
||||
aLoadInfo->GetForceHSTSPriming(),
|
||||
aLoadInfo->GetMixedContentWouldBlock());
|
||||
|
||||
@@ -370,6 +371,7 @@ LoadInfoArgsToLoadInfo(const OptionalLoadInfoArgs& aOptionalLoadInfoArgs,
|
||||
loadInfoArgs.corsUnsafeHeaders(),
|
||||
loadInfoArgs.forcePreflight(),
|
||||
loadInfoArgs.isPreflight(),
|
||||
loadInfoArgs.loadTriggeredFromExternal(),
|
||||
loadInfoArgs.forceHSTSPriming(),
|
||||
loadInfoArgs.mixedContentWouldBlock()
|
||||
);
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
#include "mozilla/LoadInfo.h"
|
||||
|
||||
#include "mozilla/Assertions.h"
|
||||
#include "mozilla/dom/TabChild.h"
|
||||
#include "mozilla/dom/ToJSValue.h"
|
||||
#include "mozIThirdPartyUtil.h"
|
||||
#include "nsFrameLoader.h"
|
||||
@@ -63,6 +64,7 @@ LoadInfo::LoadInfo(nsIPrincipal* aLoadingPrincipal,
|
||||
, mIsThirdPartyContext(false)
|
||||
, mForcePreflight(false)
|
||||
, mIsPreflight(false)
|
||||
, mLoadTriggeredFromExternal(false)
|
||||
, mForceHSTSPriming(false)
|
||||
, mMixedContentWouldBlock(false)
|
||||
{
|
||||
@@ -235,6 +237,7 @@ LoadInfo::LoadInfo(nsPIDOMWindowOuter* aOuterWindow,
|
||||
, mIsThirdPartyContext(false) // NB: TYPE_DOCUMENT implies not third-party.
|
||||
, mForcePreflight(false)
|
||||
, mIsPreflight(false)
|
||||
, mLoadTriggeredFromExternal(false)
|
||||
, mForceHSTSPriming(false)
|
||||
, mMixedContentWouldBlock(false)
|
||||
{
|
||||
@@ -297,6 +300,7 @@ LoadInfo::LoadInfo(const LoadInfo& rhs)
|
||||
, mCorsUnsafeHeaders(rhs.mCorsUnsafeHeaders)
|
||||
, mForcePreflight(rhs.mForcePreflight)
|
||||
, mIsPreflight(rhs.mIsPreflight)
|
||||
, mLoadTriggeredFromExternal(rhs.mLoadTriggeredFromExternal)
|
||||
, mForceHSTSPriming(rhs.mForceHSTSPriming)
|
||||
, mMixedContentWouldBlock(rhs.mMixedContentWouldBlock)
|
||||
{
|
||||
@@ -325,6 +329,7 @@ LoadInfo::LoadInfo(nsIPrincipal* aLoadingPrincipal,
|
||||
const nsTArray<nsCString>& aCorsUnsafeHeaders,
|
||||
bool aForcePreflight,
|
||||
bool aIsPreflight,
|
||||
bool aLoadTriggeredFromExternal,
|
||||
bool aForceHSTSPriming,
|
||||
bool aMixedContentWouldBlock)
|
||||
: mLoadingPrincipal(aLoadingPrincipal)
|
||||
@@ -348,6 +353,7 @@ LoadInfo::LoadInfo(nsIPrincipal* aLoadingPrincipal,
|
||||
, mCorsUnsafeHeaders(aCorsUnsafeHeaders)
|
||||
, mForcePreflight(aForcePreflight)
|
||||
, mIsPreflight(aIsPreflight)
|
||||
, mLoadTriggeredFromExternal(aLoadTriggeredFromExternal)
|
||||
, mForceHSTSPriming (aForceHSTSPriming)
|
||||
, mMixedContentWouldBlock(aMixedContentWouldBlock)
|
||||
{
|
||||
@@ -872,6 +878,23 @@ LoadInfo::GetIsPreflight(bool* aIsPreflight)
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
LoadInfo::SetLoadTriggeredFromExternal(bool aLoadTriggeredFromExternal)
|
||||
{
|
||||
MOZ_ASSERT(!aLoadTriggeredFromExternal ||
|
||||
mInternalContentPolicyType == nsIContentPolicy::TYPE_DOCUMENT,
|
||||
"can only set load triggered from external for TYPE_DOCUMENT");
|
||||
mLoadTriggeredFromExternal = aLoadTriggeredFromExternal;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
LoadInfo::GetLoadTriggeredFromExternal(bool* aLoadTriggeredFromExternal)
|
||||
{
|
||||
*aLoadTriggeredFromExternal = mLoadTriggeredFromExternal;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
LoadInfo::GetForceHSTSPriming(bool* aForceHSTSPriming)
|
||||
{
|
||||
|
||||
@@ -108,6 +108,7 @@ private:
|
||||
const nsTArray<nsCString>& aUnsafeHeaders,
|
||||
bool aForcePreflight,
|
||||
bool aIsPreflight,
|
||||
bool aLoadTriggeredFromExternal,
|
||||
bool aForceHSTSPriming,
|
||||
bool aMixedContentWouldBlock);
|
||||
LoadInfo(const LoadInfo& rhs);
|
||||
@@ -152,6 +153,7 @@ private:
|
||||
nsTArray<nsCString> mCorsUnsafeHeaders;
|
||||
bool mForcePreflight;
|
||||
bool mIsPreflight;
|
||||
bool mLoadTriggeredFromExternal;
|
||||
|
||||
bool mForceHSTSPriming : 1;
|
||||
bool mMixedContentWouldBlock : 1;
|
||||
|
||||
@@ -574,6 +574,13 @@ interface nsILoadInfo : nsISupports
|
||||
*/
|
||||
[infallible] attribute boolean initialSecurityCheckDone;
|
||||
|
||||
/**
|
||||
* Returns true if the load was triggered from an external application
|
||||
* (e.g. Thunderbird). Please note that this flag will only ever be true
|
||||
* if the load is of TYPE_DOCUMENT.
|
||||
*/
|
||||
[infallible] attribute boolean loadTriggeredFromExternal;
|
||||
|
||||
/**
|
||||
* Whenever a channel gets redirected, append the principal of the
|
||||
* channel [before the channels got redirected] to the loadinfo,
|
||||
|
||||
@@ -53,6 +53,7 @@ struct LoadInfoArgs
|
||||
nsCString[] corsUnsafeHeaders;
|
||||
bool forcePreflight;
|
||||
bool isPreflight;
|
||||
bool loadTriggeredFromExternal;
|
||||
bool forceHSTSPriming;
|
||||
bool mixedContentWouldBlock;
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user