Bug 732209 part 6. Allow web pages to access cross-origin stylesheets if the CORS headers say so. r=dbaron,sicking

When gaining such access, the web page resets the stylesheet to its principal, because it can now edit the sheet.
This commit is contained in:
Boris Zbarsky 2012-08-28 13:10:09 -04:00
Родитель 61bf222c11
Коммит 084717cd7b
3 изменённых файлов: 38 добавлений и 5 удалений

Просмотреть файл

@ -1589,7 +1589,7 @@ nsCSSStyleSheet::DidDirty()
} }
nsresult nsresult
nsCSSStyleSheet::SubjectSubsumesInnerPrincipal() const nsCSSStyleSheet::SubjectSubsumesInnerPrincipal()
{ {
// Get the security manager and do the subsumes check // Get the security manager and do the subsumes check
nsIScriptSecurityManager *securityManager = nsIScriptSecurityManager *securityManager =
@ -1612,9 +1612,28 @@ nsCSSStyleSheet::SubjectSubsumesInnerPrincipal() const
} }
if (!nsContentUtils::IsCallerTrustedForWrite()) { if (!nsContentUtils::IsCallerTrustedForWrite()) {
// Allow access only if CORS mode is not NONE
if (GetCORSMode() == CORS_NONE) {
return NS_ERROR_DOM_SECURITY_ERR; return NS_ERROR_DOM_SECURITY_ERR;
} }
// Now make sure we set the principal of our inner to the
// subjectPrincipal. That means we need a unique inner, of
// course. But we don't want to do that if we're not complete
// yet. Luckily, all the callers of this method throw anyway if
// not complete, so we can just do that here too.
if (!mInner->mComplete) {
return NS_ERROR_DOM_INVALID_ACCESS_ERR;
}
rv = WillDirty();
NS_ENSURE_SUCCESS(rv, rv);
mInner->mPrincipal = subjectPrincipal;
DidDirty();
}
return NS_OK; return NS_OK;
} }

Просмотреть файл

@ -265,8 +265,9 @@ protected:
// Return success if the subject principal subsumes the principal of our // Return success if the subject principal subsumes the principal of our
// inner, error otherwise. This will also succeed if the subject has // inner, error otherwise. This will also succeed if the subject has
// UniversalXPConnect. // UniversalXPConnect or if access is allowed by CORS. In the latter case,
nsresult SubjectSubsumesInnerPrincipal() const; // it will set the principal of the inner to the subject principal.
nsresult SubjectSubsumesInnerPrincipal();
// Add the namespace mapping from this @namespace rule to our namespace map // Add the namespace mapping from this @namespace rule to our namespace map
nsresult RegisterNamespaceRule(mozilla::css::Rule* aRule); nsresult RegisterNamespaceRule(mozilla::css::Rule* aRule);

Просмотреть файл

@ -27,7 +27,7 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=732209
crossorigin="use-credentials"> crossorigin="use-credentials">
<link rel="stylesheet" <link rel="stylesheet"
href="http://example.com/tests/layout/style/test/bug732209-css.sjs?seven&cors-anonymous"> href="http://example.com/tests/layout/style/test/bug732209-css.sjs?seven&cors-anonymous">
<link rel="stylesheet" <link rel="stylesheet" id="cross-origin-sheet"
href="http://example.com/tests/layout/style/test/bug732209-css.sjs?eight&cors-anonymous" href="http://example.com/tests/layout/style/test/bug732209-css.sjs?eight&cors-anonymous"
crossorigin> crossorigin>
<link rel="stylesheet" <link rel="stylesheet"
@ -71,6 +71,19 @@ addLoadEvent(function() {
is(getComputedStyle(spans[i], "").color, "rgb(0, 128, 0)", is(getComputedStyle(spans[i], "").color, "rgb(0, 128, 0)",
"Span " + spans[i].id + " should be green"); "Span " + spans[i].id + " should be green");
} }
try {
var sheet = $("cross-origin-sheet").sheet;
dump('aaa');
is(sheet.cssRules.length, 2,
"Should be able to get length of list of rules");
is(sheet.cssRules[0].style.color, "green",
"Should be able to read individual rules");
} catch (e) {
ok(false,
"Should be allowed to access cross-origin sheet that opted in with CORS: " + e);
}
SimpleTest.finish(); SimpleTest.finish();
}); });