From 3c3311b16a0a1f0c84d02ff10283fb0800529184 Mon Sep 17 00:00:00 2001 From: Josh Matthews Date: Thu, 13 Apr 2017 16:02:17 +1000 Subject: [PATCH] Allow loading multiple stylesheets for the same link element. --- components/script/dom/htmllinkelement.rs | 6 ++- components/script/stylesheet_loader.rs | 5 +-- tests/wpt/metadata/MANIFEST.json | 43 +++++++++++++++++++ .../the-link-element/resources/bad.css | 4 ++ .../the-link-element/resources/good.css | 3 ++ .../stylesheet-change-href-ref.html | 8 ++++ .../stylesheet-change-href.html | 13 ++++++ 7 files changed, 76 insertions(+), 6 deletions(-) create mode 100644 tests/wpt/web-platform-tests/html/semantics/document-metadata/the-link-element/resources/bad.css create mode 100644 tests/wpt/web-platform-tests/html/semantics/document-metadata/the-link-element/resources/good.css create mode 100644 tests/wpt/web-platform-tests/html/semantics/document-metadata/the-link-element/stylesheet-change-href-ref.html create mode 100644 tests/wpt/web-platform-tests/html/semantics/document-metadata/the-link-element/stylesheet-change-href.html diff --git a/components/script/dom/htmllinkelement.rs b/components/script/dom/htmllinkelement.rs index d29a94a11f0..bb7fe85366d 100644 --- a/components/script/dom/htmllinkelement.rs +++ b/components/script/dom/htmllinkelement.rs @@ -24,6 +24,7 @@ use dom::virtualmethods::VirtualMethods; use dom_struct::dom_struct; use html5ever_atoms::LocalName; use net_traits::ReferrerPolicy; +use script_layout_interface::message::Msg; use script_traits::{MozBrowserEvent, ScriptMsg as ConstellationMsg}; use std::ascii::AsciiExt; use std::borrow::ToOwned; @@ -96,8 +97,9 @@ impl HTMLLinkElement { } pub fn set_stylesheet(&self, s: Arc) { - assert!(self.stylesheet.borrow().is_none()); // Useful for catching timing issues. - *self.stylesheet.borrow_mut() = Some(s); + *self.stylesheet.borrow_mut() = Some(s.clone()); + window_from_node(self).layout_chan().send(Msg::AddStylesheet(s)).unwrap(); + document_from_node(self).invalidate_stylesheets(); } pub fn get_stylesheet(&self) -> Option> { diff --git a/components/script/stylesheet_loader.rs b/components/script/stylesheet_loader.rs index cdafde510c9..37b41f53d70 100644 --- a/components/script/stylesheet_loader.rs +++ b/components/script/stylesheet_loader.rs @@ -22,7 +22,6 @@ use ipc_channel::router::ROUTER; use net_traits::{FetchResponseListener, FetchMetadata, FilteredMetadata, Metadata, NetworkError, ReferrerPolicy}; use net_traits::request::{CorsSettings, CredentialsMode, Destination, RequestInit, RequestMode, Type as RequestType}; use network_listener::{NetworkListener, PreInvoke}; -use script_layout_interface::message::Msg; use servo_url::ServoUrl; use std::mem; use std::sync::{Arc, Mutex}; @@ -151,9 +150,7 @@ impl FetchResponseListener for StylesheetContext { sheet.set_disabled(true); } - link.set_stylesheet(sheet.clone()); - - win.layout_chan().send(Msg::AddStylesheet(sheet)).unwrap(); + link.set_stylesheet(sheet); } } StylesheetContextSource::Import(ref stylesheet) => { diff --git a/tests/wpt/metadata/MANIFEST.json b/tests/wpt/metadata/MANIFEST.json index bdf9832d314..36e78ab453c 100644 --- a/tests/wpt/metadata/MANIFEST.json +++ b/tests/wpt/metadata/MANIFEST.json @@ -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", @@ -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/good.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": [ [ {} @@ -174506,10 +174533,18 @@ "285208d6cf3113ec16bedd107c0740b8c7c8a9d8", "testharness" ], + "html/semantics/document-metadata/the-link-element/resources/bad.css": [ + "b968e6422a283acc772561f8950171b3a5e00397", + "support" + ], "html/semantics/document-metadata/the-link-element/resources/empty-href.css": [ "1dcc57d4f3363562322937979cb7828b0c298daa", "support" ], + "html/semantics/document-metadata/the-link-element/resources/good.css": [ + "04a3a89fe805fc930dc3adfa3a4134b950779697", + "support" + ], "html/semantics/document-metadata/the-link-element/resources/stylesheet.css": [ "2829167c82bafef6cfea06071007a231aa4277f6", "support" @@ -174518,6 +174553,14 @@ "e4a66764ea94d51b42d485d75a3305ea2ab79226", "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": [ "1ac8e070630e58df8489b779bdd75cb2b38c25ef", "support" diff --git a/tests/wpt/web-platform-tests/html/semantics/document-metadata/the-link-element/resources/bad.css b/tests/wpt/web-platform-tests/html/semantics/document-metadata/the-link-element/resources/bad.css new file mode 100644 index 00000000000..4e1fe36165c --- /dev/null +++ b/tests/wpt/web-platform-tests/html/semantics/document-metadata/the-link-element/resources/bad.css @@ -0,0 +1,4 @@ +p { + background-color: red; + color: black; +} \ No newline at end of file diff --git a/tests/wpt/web-platform-tests/html/semantics/document-metadata/the-link-element/resources/good.css b/tests/wpt/web-platform-tests/html/semantics/document-metadata/the-link-element/resources/good.css new file mode 100644 index 00000000000..1da5e2b8cfb --- /dev/null +++ b/tests/wpt/web-platform-tests/html/semantics/document-metadata/the-link-element/resources/good.css @@ -0,0 +1,3 @@ +p { + color: green; +} \ No newline at end of file diff --git a/tests/wpt/web-platform-tests/html/semantics/document-metadata/the-link-element/stylesheet-change-href-ref.html b/tests/wpt/web-platform-tests/html/semantics/document-metadata/the-link-element/stylesheet-change-href-ref.html new file mode 100644 index 00000000000..9ae6e36655d --- /dev/null +++ b/tests/wpt/web-platform-tests/html/semantics/document-metadata/the-link-element/stylesheet-change-href-ref.html @@ -0,0 +1,8 @@ + + + +

This text should be green on a white background diff --git a/tests/wpt/web-platform-tests/html/semantics/document-metadata/the-link-element/stylesheet-change-href.html b/tests/wpt/web-platform-tests/html/semantics/document-metadata/the-link-element/stylesheet-change-href.html new file mode 100644 index 00000000000..6a3f18de986 --- /dev/null +++ b/tests/wpt/web-platform-tests/html/semantics/document-metadata/the-link-element/stylesheet-change-href.html @@ -0,0 +1,13 @@ + + +Obtaining a new stylesheet removes styles from the previous stylesheet. + + + +

This text should be green on a white background