Bug 1318727 - BroadcastChannel should support data URL, r=smaug

This commit is contained in:
Andrea Marchesini 2016-11-30 15:13:27 +01:00
parent d5e468da6c
commit a9a05a834d
8 changed files with 86 additions and 26 deletions

View File

@ -58,22 +58,35 @@ nsNullPrincipal::CreateWithInheritedAttributes(nsIDocShell* aDocShell)
}
/* static */ already_AddRefed<nsNullPrincipal>
nsNullPrincipal::Create(const PrincipalOriginAttributes& aOriginAttributes)
nsNullPrincipal::Create(const PrincipalOriginAttributes& aOriginAttributes,
nsIURI* aURI)
{
RefPtr<nsNullPrincipal> nullPrin = new nsNullPrincipal();
nsresult rv = nullPrin->Init(aOriginAttributes);
nsresult rv = nullPrin->Init(aOriginAttributes, aURI);
MOZ_RELEASE_ASSERT(NS_SUCCEEDED(rv));
return nullPrin.forget();
}
nsresult
nsNullPrincipal::Init(const PrincipalOriginAttributes& aOriginAttributes)
nsNullPrincipal::Init(const PrincipalOriginAttributes& aOriginAttributes,
nsIURI* aURI)
{
mOriginAttributes = aOriginAttributes;
mURI = nsNullPrincipalURI::Create();
NS_ENSURE_TRUE(mURI, NS_ERROR_NOT_AVAILABLE);
if (aURI) {
nsAutoCString scheme;
nsresult rv = aURI->GetScheme(scheme);
NS_ENSURE_SUCCESS(rv, rv);
NS_ENSURE_TRUE(scheme.EqualsLiteral(NS_NULLPRINCIPAL_SCHEME),
NS_ERROR_NOT_AVAILABLE);
mURI = aURI;
} else {
mURI = nsNullPrincipalURI::Create();
NS_ENSURE_TRUE(mURI, NS_ERROR_NOT_AVAILABLE);
}
return NS_OK;
}

View File

@ -53,9 +53,11 @@ public:
static already_AddRefed<nsNullPrincipal> CreateWithInheritedAttributes(nsIDocShell* aDocShell);
static already_AddRefed<nsNullPrincipal>
Create(const mozilla::PrincipalOriginAttributes& aOriginAttributes = mozilla::PrincipalOriginAttributes());
Create(const mozilla::PrincipalOriginAttributes& aOriginAttributes = mozilla::PrincipalOriginAttributes(),
nsIURI* aURI = nullptr);
nsresult Init(const mozilla::PrincipalOriginAttributes& aOriginAttributes = mozilla::PrincipalOriginAttributes());
nsresult Init(const mozilla::PrincipalOriginAttributes& aOriginAttributes = mozilla::PrincipalOriginAttributes(),
nsIURI* aURI = nullptr);
virtual nsresult GetScriptLocation(nsACString &aStr) override;

View File

@ -93,11 +93,6 @@ public:
return true;
}
if (NS_WARN_IF(principal->GetIsNullPrincipal())) {
mRv.Throw(NS_ERROR_FAILURE);
return true;
}
mRv = PrincipalToPrincipalInfo(principal, &mPrincipalInfo);
if (NS_WARN_IF(mRv.Failed())) {
return true;
@ -323,11 +318,6 @@ BroadcastChannel::Constructor(const GlobalObject& aGlobal,
return nullptr;
}
if (NS_WARN_IF(principal->GetIsNullPrincipal())) {
aRv.Throw(NS_ERROR_FAILURE);
return nullptr;
}
aRv = principal->GetOrigin(origin);
if (NS_WARN_IF(aRv.Failed())) {
return nullptr;

View File

@ -22,3 +22,4 @@ support-files =
[test_invalidState.html]
[test_ordering.html]
[test_dataCloning.html]
[test_dataURL.html]

View File

@ -0,0 +1,35 @@
<!DOCTYPE HTML>
<html>
<head>
<title>Test for BroadcastChannel in data: URL</title>
<script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
<link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
</head>
<body>
<div id="dataURL">
var a = new BroadcastChannel('a');
var b = new BroadcastChannel('a');
a.onmessage = function(e) { parent.postMessage(e.data, "*"); };
b.postMessage(42);
</div>
<script>
SimpleTest.waitForExplicitFinish();
onmessage= function(e) {
ok(e.data, "42", "BroadcastChannel works with data URLs");
SimpleTest.finish();
}
var url = "data:text/html,<script>" + document.getElementById("dataURL").textContent + "</" + "script>";
var ifr = document.createElement('iframe');
document.body.appendChild(ifr);
ifr.setAttribute('sandbox', 'allow-scripts');
ifr.src = url;
</script>
</body>
</html>

View File

@ -521,11 +521,6 @@ public:
nsCOMPtr<nsIPrincipal> principal = PrincipalInfoToPrincipal(mPrincipalInfo);
if (principal->GetIsNullPrincipal()) {
mContentParent->KillHard("BroadcastChannel killed: no null principal.");
return NS_OK;
}
nsAutoCString origin;
nsresult rv = principal->GetOrigin(origin);
if (NS_FAILED(rv)) {
@ -638,7 +633,6 @@ BackgroundParentImpl::RecvPBroadcastChannelConstructor(
// If the ContentParent is null we are dealing with a same-process actor.
if (!parent) {
MOZ_ASSERT(aPrincipalInfo.type() != PrincipalInfo::TNullPrincipalInfo);
return IPC_OK();
}

View File

@ -62,8 +62,14 @@ PrincipalInfoToPrincipal(const PrincipalInfo& aPrincipalInfo,
case PrincipalInfo::TNullPrincipalInfo: {
const NullPrincipalInfo& info =
aPrincipalInfo.get_NullPrincipalInfo();
principal = nsNullPrincipal::Create(info.attrs());
nsCOMPtr<nsIURI> uri;
rv = NS_NewURI(getter_AddRefs(uri), info.spec());
if (NS_WARN_IF(NS_FAILED(rv))) {
return nullptr;
}
principal = nsNullPrincipal::Create(info.attrs(), uri);
return principal.forget();
}
@ -131,7 +137,25 @@ PrincipalToPrincipalInfo(nsIPrincipal* aPrincipal,
MOZ_ASSERT(aPrincipalInfo);
if (aPrincipal->GetIsNullPrincipal()) {
*aPrincipalInfo = NullPrincipalInfo(BasePrincipal::Cast(aPrincipal)->OriginAttributesRef());
nsCOMPtr<nsIURI> uri;
nsresult rv = aPrincipal->GetURI(getter_AddRefs(uri));
if (NS_WARN_IF(NS_FAILED(rv))) {
return rv;
}
if (NS_WARN_IF(!uri)) {
return NS_ERROR_FAILURE;
}
nsAutoCString spec;
rv = uri->GetSpec(spec);
if (NS_WARN_IF(NS_FAILED(rv))) {
return rv;
}
*aPrincipalInfo =
NullPrincipalInfo(BasePrincipal::Cast(aPrincipal)->OriginAttributesRef(),
spec);
return NS_OK;
}
@ -191,7 +215,7 @@ PrincipalToPrincipalInfo(nsIPrincipal* aPrincipal,
return NS_ERROR_FAILURE;
}
nsCString spec;
nsAutoCString spec;
rv = uri->GetSpec(spec);
if (NS_WARN_IF(NS_FAILED(rv))) {
return rv;

View File

@ -20,6 +20,7 @@ struct SystemPrincipalInfo
struct NullPrincipalInfo
{
PrincipalOriginAttributes attrs;
nsCString spec;
};
struct ExpandedPrincipalInfo