Allow loading multiple stylesheets for the same link element.

This commit is contained in:
Josh Matthews 2017-04-13 16:02:17 +10:00
parent ca3cd64d6b
commit 3c3311b16a
7 changed files with 76 additions and 6 deletions

View file

@ -24,6 +24,7 @@ use dom::virtualmethods::VirtualMethods;
use dom_struct::dom_struct; use dom_struct::dom_struct;
use html5ever_atoms::LocalName; use html5ever_atoms::LocalName;
use net_traits::ReferrerPolicy; use net_traits::ReferrerPolicy;
use script_layout_interface::message::Msg;
use script_traits::{MozBrowserEvent, ScriptMsg as ConstellationMsg}; use script_traits::{MozBrowserEvent, ScriptMsg as ConstellationMsg};
use std::ascii::AsciiExt; use std::ascii::AsciiExt;
use std::borrow::ToOwned; use std::borrow::ToOwned;
@ -96,8 +97,9 @@ impl HTMLLinkElement {
} }
pub fn set_stylesheet(&self, s: Arc<Stylesheet>) { pub fn set_stylesheet(&self, s: Arc<Stylesheet>) {
assert!(self.stylesheet.borrow().is_none()); // Useful for catching timing issues. *self.stylesheet.borrow_mut() = Some(s.clone());
*self.stylesheet.borrow_mut() = Some(s); window_from_node(self).layout_chan().send(Msg::AddStylesheet(s)).unwrap();
document_from_node(self).invalidate_stylesheets();
} }
pub fn get_stylesheet(&self) -> Option<Arc<Stylesheet>> { pub fn get_stylesheet(&self) -> Option<Arc<Stylesheet>> {

View file

@ -22,7 +22,6 @@ use ipc_channel::router::ROUTER;
use net_traits::{FetchResponseListener, FetchMetadata, FilteredMetadata, Metadata, NetworkError, ReferrerPolicy}; use net_traits::{FetchResponseListener, FetchMetadata, FilteredMetadata, Metadata, NetworkError, ReferrerPolicy};
use net_traits::request::{CorsSettings, CredentialsMode, Destination, RequestInit, RequestMode, Type as RequestType}; use net_traits::request::{CorsSettings, CredentialsMode, Destination, RequestInit, RequestMode, Type as RequestType};
use network_listener::{NetworkListener, PreInvoke}; use network_listener::{NetworkListener, PreInvoke};
use script_layout_interface::message::Msg;
use servo_url::ServoUrl; use servo_url::ServoUrl;
use std::mem; use std::mem;
use std::sync::{Arc, Mutex}; use std::sync::{Arc, Mutex};
@ -151,9 +150,7 @@ impl FetchResponseListener for StylesheetContext {
sheet.set_disabled(true); sheet.set_disabled(true);
} }
link.set_stylesheet(sheet.clone()); link.set_stylesheet(sheet);
win.layout_chan().send(Msg::AddStylesheet(sheet)).unwrap();
} }
} }
StylesheetContextSource::Import(ref stylesheet) => { StylesheetContextSource::Import(ref stylesheet) => {

View file

@ -8229,6 +8229,18 @@
{} {}
] ]
], ],
"html/semantics/document-metadata/the-link-element/stylesheet-change-href.html": [
[
"/html/semantics/document-metadata/the-link-element/stylesheet-change-href.html",
[
[
"/html/semantics/document-metadata/the-link-element/stylesheet-change-href-ref.html",
"=="
]
],
{}
]
],
"html/semantics/document-metadata/the-link-element/stylesheet-empty-href.html": [ "html/semantics/document-metadata/the-link-element/stylesheet-empty-href.html": [
[ [
"/html/semantics/document-metadata/the-link-element/stylesheet-empty-href.html", "/html/semantics/document-metadata/the-link-element/stylesheet-empty-href.html",
@ -51859,11 +51871,21 @@
{} {}
] ]
], ],
"html/semantics/document-metadata/the-link-element/resources/bad.css": [
[
{}
]
],
"html/semantics/document-metadata/the-link-element/resources/empty-href.css": [ "html/semantics/document-metadata/the-link-element/resources/empty-href.css": [
[ [
{} {}
] ]
], ],
"html/semantics/document-metadata/the-link-element/resources/good.css": [
[
{}
]
],
"html/semantics/document-metadata/the-link-element/resources/stylesheet.css": [ "html/semantics/document-metadata/the-link-element/resources/stylesheet.css": [
[ [
{} {}
@ -51874,6 +51896,11 @@
{} {}
] ]
], ],
"html/semantics/document-metadata/the-link-element/stylesheet-change-href-ref.html": [
[
{}
]
],
"html/semantics/document-metadata/the-link-element/stylesheet-empty-href-ref.html": [ "html/semantics/document-metadata/the-link-element/stylesheet-empty-href-ref.html": [
[ [
{} {}
@ -174506,10 +174533,18 @@
"285208d6cf3113ec16bedd107c0740b8c7c8a9d8", "285208d6cf3113ec16bedd107c0740b8c7c8a9d8",
"testharness" "testharness"
], ],
"html/semantics/document-metadata/the-link-element/resources/bad.css": [
"b968e6422a283acc772561f8950171b3a5e00397",
"support"
],
"html/semantics/document-metadata/the-link-element/resources/empty-href.css": [ "html/semantics/document-metadata/the-link-element/resources/empty-href.css": [
"1dcc57d4f3363562322937979cb7828b0c298daa", "1dcc57d4f3363562322937979cb7828b0c298daa",
"support" "support"
], ],
"html/semantics/document-metadata/the-link-element/resources/good.css": [
"04a3a89fe805fc930dc3adfa3a4134b950779697",
"support"
],
"html/semantics/document-metadata/the-link-element/resources/stylesheet.css": [ "html/semantics/document-metadata/the-link-element/resources/stylesheet.css": [
"2829167c82bafef6cfea06071007a231aa4277f6", "2829167c82bafef6cfea06071007a231aa4277f6",
"support" "support"
@ -174518,6 +174553,14 @@
"e4a66764ea94d51b42d485d75a3305ea2ab79226", "e4a66764ea94d51b42d485d75a3305ea2ab79226",
"support" "support"
], ],
"html/semantics/document-metadata/the-link-element/stylesheet-change-href-ref.html": [
"cca943d35bd18e99249d50c6d40cc6fe2e328354",
"support"
],
"html/semantics/document-metadata/the-link-element/stylesheet-change-href.html": [
"6083446e9ef1b70f044a353ef96b459956afb1ef",
"reftest"
],
"html/semantics/document-metadata/the-link-element/stylesheet-empty-href-ref.html": [ "html/semantics/document-metadata/the-link-element/stylesheet-empty-href-ref.html": [
"1ac8e070630e58df8489b779bdd75cb2b38c25ef", "1ac8e070630e58df8489b779bdd75cb2b38c25ef",
"support" "support"

View file

@ -0,0 +1,4 @@
p {
background-color: red;
color: black;
}

View file

@ -0,0 +1,8 @@
<!doctype html>
<meta charset="utf-8">
<style>
p {
color: green;
}
</style>
<p>This text should be green on a white background

View file

@ -0,0 +1,13 @@
<!doctype html>
<meta charset="utf-8">
<title>Obtaining a new stylesheet removes styles from the previous stylesheet.</title>
<link rel=match href=stylesheet-change-href-ref.html>
<script>
function changeHref() {
var elem = document.getElementById('stylesheet');
elem.href = 'resources/good.css';
elem.onload = null;
}
</script>
<link id=stylesheet rel=stylesheet href="resources/bad.css" onload="changeHref()">
<p>This text should be green on a white background