mirror of
https://github.com/servo/servo.git
synced 2025-08-03 20:50:07 +01:00
Auto merge of #12241 - jdm:multiple-stylesheets, r=notriddle
Don't load stylesheets in documents without browsing contexts Per https://github.com/whatwg/html/issues/1495, this fixes the most commonly reported panic in nightlies by making us match what other browsers do. --- - [X] `./mach build -d` does not report any errors - [X] `./mach test-tidy` does not report any errors - [X] These changes fix #12047 (github issue number if applicable). - [X] There are tests for these changes OR <!-- Reviewable:start --> --- This change is [<img src="https://reviewable.io/review_button.svg" height="35" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/servo/servo/12241) <!-- Reviewable:end -->
This commit is contained in:
commit
61491447e2
4 changed files with 54 additions and 0 deletions
|
@ -194,6 +194,10 @@ impl VirtualMethods for HTMLLinkElement {
|
||||||
impl HTMLLinkElement {
|
impl HTMLLinkElement {
|
||||||
fn handle_stylesheet_url(&self, href: &str) {
|
fn handle_stylesheet_url(&self, href: &str) {
|
||||||
let document = document_from_node(self);
|
let document = document_from_node(self);
|
||||||
|
if document.browsing_context().is_none() {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
match document.base_url().join(href) {
|
match document.base_url().join(href) {
|
||||||
Ok(url) => {
|
Ok(url) => {
|
||||||
let element = self.upcast::<Element>();
|
let element = self.upcast::<Element>();
|
||||||
|
|
|
@ -36270,6 +36270,12 @@
|
||||||
"path": "html/browsers/browsing-the-web/navigating-across-documents/empty_fragment.html",
|
"path": "html/browsers/browsing-the-web/navigating-across-documents/empty_fragment.html",
|
||||||
"url": "/html/browsers/browsing-the-web/navigating-across-documents/empty_fragment.html"
|
"url": "/html/browsers/browsing-the-web/navigating-across-documents/empty_fragment.html"
|
||||||
}
|
}
|
||||||
|
],
|
||||||
|
"html/semantics/document-metadata/the-link-element/document-without-browsing-context.html": [
|
||||||
|
{
|
||||||
|
"path": "html/semantics/document-metadata/the-link-element/document-without-browsing-context.html",
|
||||||
|
"url": "/html/semantics/document-metadata/the-link-element/document-without-browsing-context.html"
|
||||||
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
|
@ -0,0 +1,35 @@
|
||||||
|
<!doctype html>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<title>Documents without browsing contexts should not load stylesheets</title>
|
||||||
|
<script src="/resources/testharness.js"></script>
|
||||||
|
<script src="/resources/testharnessreport.js"></script>
|
||||||
|
<script src="/common/utils.js"></script>
|
||||||
|
<body>
|
||||||
|
<script>
|
||||||
|
function count(id, t) {
|
||||||
|
var xhr = new XMLHttpRequest();
|
||||||
|
xhr.open('GET', 'stylesheet.py?count=1&id=' + id);
|
||||||
|
xhr.onload = t.step_func_done(function() {
|
||||||
|
assert_equals(xhr.responseText, "1");
|
||||||
|
});
|
||||||
|
xhr.onerror = t.unreached_func();
|
||||||
|
xhr.send();
|
||||||
|
}
|
||||||
|
|
||||||
|
async_test(function(t) {
|
||||||
|
var id = token();
|
||||||
|
var doc = (new DOMParser()).parseFromString('<link rel="stylesheet" href="stylesheet.py?id=' + id + '"></link>', 'text/html');
|
||||||
|
var link = doc.querySelector('link');
|
||||||
|
document.head.appendChild(link);
|
||||||
|
t.step_timeout(function() { count(id, t) }, 500);
|
||||||
|
}, 'Create a document, adopt the node');
|
||||||
|
|
||||||
|
async_test(function(t) {
|
||||||
|
var id = token();
|
||||||
|
var d = document.createElement('div');
|
||||||
|
document.body.appendChild(d);
|
||||||
|
d.innerHTML = '<link rel="stylesheet" href="stylesheet.py?id=' + id + '"></link>';
|
||||||
|
t.step_timeout(function() { count(id, t) }, 500);
|
||||||
|
}, 'Create a stylesheet in innerHTML document');
|
||||||
|
</script>
|
||||||
|
</body>
|
|
@ -0,0 +1,9 @@
|
||||||
|
def main(request, response):
|
||||||
|
try:
|
||||||
|
count = int(request.server.stash.take(request.GET["id"]))
|
||||||
|
except:
|
||||||
|
count = 0
|
||||||
|
if "count" in request.GET:
|
||||||
|
return str(count)
|
||||||
|
request.server.stash.put(request.GET["id"], str(count + 1))
|
||||||
|
return 'body { color: red }'
|
Loading…
Add table
Add a link
Reference in a new issue