Bug 1608489 - Add relative semantics for baseURL r=emilio

Differential Revision: https://phabricator.services.mozilla.com/D65373

--HG--
extra : moz-landing-system : lando
This commit is contained in:
Erik Nordin 2020-03-04 23:39:33 +00:00
Родитель 8fe2efa8d6
Коммит 8e777fed4b
2 изменённых файлов: 40 добавлений и 12 удалений

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

@ -106,14 +106,19 @@ already_AddRefed<StyleSheet> StyleSheet::Constructor(
MakeRefPtr<StyleSheet>(css::SheetParsingMode::eAuthorSheetFeatures,
CORSMode::CORS_NONE, dom::SRIMetadata());
RefPtr<nsIURI> baseURI = nullptr;
// baseURL not yet in the spec. Implemented based on the following discussion:
// https://github.com/WICG/construct-stylesheets/issues/95#issuecomment-594217180
RefPtr<nsIURI> baseURI;
if (!aOptions.mBaseURL.WasPassed()) {
baseURI = constructorDocument->GetBaseURI();
} else if (NS_FAILED(NS_NewURI(getter_AddRefs(baseURI),
aOptions.mBaseURL.Value()))) {
aRv.ThrowNotAllowedError(
"Constructed style sheets must have a valid base url");
return nullptr;
} else {
nsresult rv = NS_NewURI(getter_AddRefs(baseURI), aOptions.mBaseURL.Value(),
nullptr, constructorDocument->GetBaseURI());
if (NS_FAILED(rv)) {
aRv.ThrowNotAllowedError(
"Constructed style sheets must have a valid base URL");
return nullptr;
}
}
nsIURI* sheetURI = constructorDocument->GetDocumentURI();

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

@ -7,10 +7,10 @@
<script src='/resources/testharnessreport.js'></script>
<script>
function currentPath() {
const pathParts = location.href.split("/")
pathParts.pop();
return pathParts.join("/");
function currentLocation() {
const sections = location.href.split("/")
sections.pop();
return sections.join("/");
}
test(() => {
@ -24,7 +24,7 @@ test(() => {
const baseURL = `${location.origin}/custom/path/`;
const fullURL = `${baseURL}${fileName}`;
const sheet = new CSSStyleSheet({ baseURL: baseURL });
const sheet = new CSSStyleSheet({ baseURL });
span.shadowRoot.adoptedStyleSheets = [sheet];
sheet.replaceSync(`* { background-image: url("${fileName}"); }`);
@ -37,7 +37,30 @@ test(() => {
}, "Constructing sheet with custom base URL ueses that URL for CSS rules");
test(() => {
assert_throws_dom("NotAllowedError", () => { new CSSStyleSheet({ baseURL: "::::"}) });
const span = document.createElement("span");
target.appendChild(span);
span.attachShadow({ mode: "open" })
const shadowDiv = document.createElement("div");
span.shadowRoot.appendChild(shadowDiv);
const fileName = "example.png"
const baseURL = "custom/path/";
const fullURL = `${currentLocation()}/${baseURL}${fileName}`;
const sheet = new CSSStyleSheet({ baseURL });
span.shadowRoot.adoptedStyleSheets = [sheet];
sheet.replaceSync(`* { background-image: url("${fileName}"); }`);
const styleFromRelative = getComputedStyle(shadowDiv).backgroundImage;
sheet.replaceSync(`* { background-image: url("${fullURL}"); }`);
const styleFromFull = getComputedStyle(shadowDiv).backgroundImage;
assert_equals(styleFromRelative, styleFromFull);
}, "Constructing sheet with relative URL adds to the constructor document's base URL");
test(() => {
assert_throws_dom("NotAllowedError", () => { new CSSStyleSheet({ baseURL: "chrome://"}) });
}, "Constructing sheet with invalid base URL throws a NotAllowedError");
</script>