From ebbf9fd4d5119481bc9d6b43bd7fa1c8137b0bc1 Mon Sep 17 00:00:00 2001 From: Ms2ger Date: Tue, 27 Sep 2016 17:22:47 +0200 Subject: [PATCH 1/3] Deindent the main part of handle_stylesheet_url. --- components/script/dom/htmllinkelement.rs | 86 ++++++++++++------------ 1 file changed, 43 insertions(+), 43 deletions(-) diff --git a/components/script/dom/htmllinkelement.rs b/components/script/dom/htmllinkelement.rs index 773f1630489..a3677e8be94 100644 --- a/components/script/dom/htmllinkelement.rs +++ b/components/script/dom/htmllinkelement.rs @@ -203,56 +203,56 @@ impl HTMLLinkElement { return; } - match document.base_url().join(href) { - Ok(url) => { - let element = self.upcast::(); + let url = match document.base_url().join(href) { + Err(e) => return debug!("Parsing url {} failed: {}", href, e), + Ok(url) => url, + }; - let mq_attribute = element.get_attribute(&ns!(), &atom!("media")); - let value = mq_attribute.r().map(|a| a.value()); - let mq_str = match value { - Some(ref value) => &***value, - None => "", - }; - let mut css_parser = CssParser::new(&mq_str); - let media = parse_media_query_list(&mut css_parser); + let element = self.upcast::(); - // TODO: #8085 - Don't load external stylesheets if the node's mq doesn't match. - let elem = Trusted::new(self); + let mq_attribute = element.get_attribute(&ns!(), &atom!("media")); + let value = mq_attribute.r().map(|a| a.value()); + let mq_str = match value { + Some(ref value) => &***value, + None => "", + }; + let mut css_parser = CssParser::new(&mq_str); + let media = parse_media_query_list(&mut css_parser); - let context = Arc::new(Mutex::new(StylesheetContext { - elem: elem, - media: Some(media), - data: vec!(), - metadata: None, - url: url.clone(), - })); + // TODO: #8085 - Don't load external stylesheets if the node's mq doesn't match. + let elem = Trusted::new(self); - let (action_sender, action_receiver) = ipc::channel().unwrap(); - let listener = NetworkListener { - context: context, - script_chan: document.window().networking_task_source(), - wrapper: Some(document.window().get_runnable_wrapper()), - }; - let response_target = AsyncResponseTarget { - sender: action_sender, - }; - ROUTER.add_route(action_receiver.to_opaque(), box move |message| { - listener.notify_action(message.to().unwrap()); - }); + let context = Arc::new(Mutex::new(StylesheetContext { + elem: elem, + media: Some(media), + data: vec!(), + metadata: None, + url: url.clone(), + })); - if self.parser_inserted.get() { - document.increment_script_blocking_stylesheet_count(); - } + let (action_sender, action_receiver) = ipc::channel().unwrap(); + let listener = NetworkListener { + context: context, + script_chan: document.window().networking_task_source(), + wrapper: Some(document.window().get_runnable_wrapper()), + }; + let response_target = AsyncResponseTarget { + sender: action_sender, + }; + ROUTER.add_route(action_receiver.to_opaque(), box move |message| { + listener.notify_action(message.to().unwrap()); + }); - let referrer_policy = match self.RelList().Contains("noreferrer".into()) { - true => Some(ReferrerPolicy::NoReferrer), - false => None, - }; - - document.load_async(LoadType::Stylesheet(url), response_target, referrer_policy); - } - Err(e) => debug!("Parsing url {} failed: {}", href, e) + if self.parser_inserted.get() { + document.increment_script_blocking_stylesheet_count(); } + + let referrer_policy = match self.RelList().Contains("noreferrer".into()) { + true => Some(ReferrerPolicy::NoReferrer), + false => None, + }; + + document.load_async(LoadType::Stylesheet(url), response_target, referrer_policy); } fn handle_favicon_url(&self, rel: &str, href: &str, sizes: &Option) { From c69ce9deefd1b3cf19203b0607df885d92cfa5ee Mon Sep 17 00:00:00 2001 From: Ms2ger Date: Tue, 27 Sep 2016 17:58:04 +0200 Subject: [PATCH 2/3] Add a test for stylesheet links with an empty href. --- tests/wpt/metadata/MANIFEST.json | 24 +++++++++++++++++++ .../stylesheet-empty-href.html.ini | 3 +++ .../the-link-element/resources/empty-href.css | 3 +++ .../stylesheet-empty-href-ref.html | 9 +++++++ .../stylesheet-empty-href.html | 12 ++++++++++ 5 files changed, 51 insertions(+) create mode 100644 tests/wpt/metadata/html/semantics/document-metadata/the-link-element/stylesheet-empty-href.html.ini create mode 100644 tests/wpt/web-platform-tests/html/semantics/document-metadata/the-link-element/resources/empty-href.css create mode 100644 tests/wpt/web-platform-tests/html/semantics/document-metadata/the-link-element/stylesheet-empty-href-ref.html create mode 100644 tests/wpt/web-platform-tests/html/semantics/document-metadata/the-link-element/stylesheet-empty-href.html diff --git a/tests/wpt/metadata/MANIFEST.json b/tests/wpt/metadata/MANIFEST.json index ab77b057ea1..c0df50d48b0 100644 --- a/tests/wpt/metadata/MANIFEST.json +++ b/tests/wpt/metadata/MANIFEST.json @@ -37715,6 +37715,18 @@ "deleted_reftests": {}, "items": { "reftest": { + "html/semantics/document-metadata/the-link-element/stylesheet-empty-href.html": [ + { + "path": "html/semantics/document-metadata/the-link-element/stylesheet-empty-href.html", + "references": [ + [ + "/html/semantics/document-metadata/the-link-element/stylesheet-empty-href-ref.html", + "==" + ] + ], + "url": "/html/semantics/document-metadata/the-link-element/stylesheet-empty-href.html" + } + ], "html/semantics/document-metadata/the-link-element/stylesheet-media.html": [ { "path": "html/semantics/document-metadata/the-link-element/stylesheet-media.html", @@ -37744,6 +37756,18 @@ } }, "reftest_nodes": { + "html/semantics/document-metadata/the-link-element/stylesheet-empty-href.html": [ + { + "path": "html/semantics/document-metadata/the-link-element/stylesheet-empty-href.html", + "references": [ + [ + "/html/semantics/document-metadata/the-link-element/stylesheet-empty-href-ref.html", + "==" + ] + ], + "url": "/html/semantics/document-metadata/the-link-element/stylesheet-empty-href.html" + } + ], "html/semantics/document-metadata/the-link-element/stylesheet-media.html": [ { "path": "html/semantics/document-metadata/the-link-element/stylesheet-media.html", diff --git a/tests/wpt/metadata/html/semantics/document-metadata/the-link-element/stylesheet-empty-href.html.ini b/tests/wpt/metadata/html/semantics/document-metadata/the-link-element/stylesheet-empty-href.html.ini new file mode 100644 index 00000000000..513029063df --- /dev/null +++ b/tests/wpt/metadata/html/semantics/document-metadata/the-link-element/stylesheet-empty-href.html.ini @@ -0,0 +1,3 @@ +[stylesheet-empty-href.html] + type: reftest + expected: FAIL diff --git a/tests/wpt/web-platform-tests/html/semantics/document-metadata/the-link-element/resources/empty-href.css b/tests/wpt/web-platform-tests/html/semantics/document-metadata/the-link-element/resources/empty-href.css new file mode 100644 index 00000000000..60f1eab9713 --- /dev/null +++ b/tests/wpt/web-platform-tests/html/semantics/document-metadata/the-link-element/resources/empty-href.css @@ -0,0 +1,3 @@ +body { + color: red; +} diff --git a/tests/wpt/web-platform-tests/html/semantics/document-metadata/the-link-element/stylesheet-empty-href-ref.html b/tests/wpt/web-platform-tests/html/semantics/document-metadata/the-link-element/stylesheet-empty-href-ref.html new file mode 100644 index 00000000000..63b75d0ae26 --- /dev/null +++ b/tests/wpt/web-platform-tests/html/semantics/document-metadata/the-link-element/stylesheet-empty-href-ref.html @@ -0,0 +1,9 @@ + + +Test + +

This text should be green. diff --git a/tests/wpt/web-platform-tests/html/semantics/document-metadata/the-link-element/stylesheet-empty-href.html b/tests/wpt/web-platform-tests/html/semantics/document-metadata/the-link-element/stylesheet-empty-href.html new file mode 100644 index 00000000000..16b14efacc5 --- /dev/null +++ b/tests/wpt/web-platform-tests/html/semantics/document-metadata/the-link-element/stylesheet-empty-href.html @@ -0,0 +1,12 @@ + + +Test + + + + +

This text should be green. From e2f5ce4893c63d975df7222f9737984f4c6171e1 Mon Sep 17 00:00:00 2001 From: Ms2ger Date: Tue, 27 Sep 2016 17:42:03 +0200 Subject: [PATCH 3/3] Ignore stylesheet links with an empty href. --- components/script/dom/htmllinkelement.rs | 7 +++++++ .../the-link-element/stylesheet-empty-href.html.ini | 3 --- 2 files changed, 7 insertions(+), 3 deletions(-) delete mode 100644 tests/wpt/metadata/html/semantics/document-metadata/the-link-element/stylesheet-empty-href.html.ini diff --git a/components/script/dom/htmllinkelement.rs b/components/script/dom/htmllinkelement.rs index a3677e8be94..7c6cabd345e 100644 --- a/components/script/dom/htmllinkelement.rs +++ b/components/script/dom/htmllinkelement.rs @@ -197,12 +197,19 @@ impl VirtualMethods for HTMLLinkElement { impl HTMLLinkElement { + /// https://html.spec.whatwg.org/multipage/#concept-link-obtain fn handle_stylesheet_url(&self, href: &str) { let document = document_from_node(self); if document.browsing_context().is_none() { return; } + // Step 1. + if href.is_empty() { + return; + } + + // Step 2. let url = match document.base_url().join(href) { Err(e) => return debug!("Parsing url {} failed: {}", href, e), Ok(url) => url, diff --git a/tests/wpt/metadata/html/semantics/document-metadata/the-link-element/stylesheet-empty-href.html.ini b/tests/wpt/metadata/html/semantics/document-metadata/the-link-element/stylesheet-empty-href.html.ini deleted file mode 100644 index 513029063df..00000000000 --- a/tests/wpt/metadata/html/semantics/document-metadata/the-link-element/stylesheet-empty-href.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[stylesheet-empty-href.html] - type: reftest - expected: FAIL