diff options
author | Rakhi Sharma <rakhish1994@gmail.com> | 2017-09-21 07:07:51 +0000 |
---|---|---|
committer | Josh Matthews <josh@joshmatthews.net> | 2017-10-02 20:31:06 +0200 |
commit | c31b0e4bd2777aaaa822ffa9e7df6e80c793f2db (patch) | |
tree | 473e3039cf722e8a9e1b3e4efe428465017f3290 /components/script/dom/htmlimageelement.rs | |
parent | 8397c5b0a210a33a0991d369e88016dd51f521fd (diff) | |
download | servo-c31b0e4bd2777aaaa822ffa9e7df6e80c793f2db.tar.gz servo-c31b0e4bd2777aaaa822ffa9e7df6e80c793f2db.zip |
Parse sizes attribute values.
Diffstat (limited to 'components/script/dom/htmlimageelement.rs')
-rw-r--r-- | components/script/dom/htmlimageelement.rs | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/components/script/dom/htmlimageelement.rs b/components/script/dom/htmlimageelement.rs index 0410863dc7d..f887b03ac9e 100644 --- a/components/script/dom/htmlimageelement.rs +++ b/components/script/dom/htmlimageelement.rs @@ -3,6 +3,7 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ use app_units::{Au, AU_PER_PX}; +use cssparser::{Parser, ParserInput}; use document_loader::{LoadType, LoadBlocker}; use dom::activation::Activatable; use dom::attr::Attr; @@ -52,10 +53,17 @@ use script_thread::{Runnable, ScriptThread}; use servo_url::ServoUrl; use servo_url::origin::ImmutableOrigin; use std::cell::{Cell, RefMut}; +use std::char; use std::default::Default; use std::i32; use std::sync::{Arc, Mutex}; use style::attr::{AttrValue, LengthOrPercentageOrAuto}; +use style::context::QuirksMode; +use style::media_queries::MediaQuery; +use style::parser::ParserContext; +use style::values::specified::{Length, ViewportPercentageLength}; +use style::values::specified::length::NoCalcLength; +use style_traits::ParsingMode; use task_source::TaskSource; #[derive(Clone, Copy, HeapSizeOf, JSTraceable)] @@ -66,6 +74,13 @@ enum State { CompletelyAvailable, Broken, } + +#[derive(Debug, PartialEq)] +pub struct Size { + pub query: Option<MediaQuery>, + pub length: Length, +} + #[derive(Clone, Copy, HeapSizeOf, JSTraceable)] enum ImageRequestPhase { Pending, @@ -780,6 +795,60 @@ impl LayoutHTMLImageElementHelpers for LayoutJS<HTMLImageElement> { } } +//https://html.spec.whatwg.org/multipage/#parse-a-sizes-attribute +pub fn parse_a_sizes_attribute(input: DOMString, width: Option<u32>) -> Vec<Size> { + let mut sizes = Vec::<Size>::new(); + for unparsed_size in input.split(',') { + let whitespace = unparsed_size.chars().rev().take_while(|c| char::is_whitespace(*c)).count(); + let trimmed: String = unparsed_size.chars().take(unparsed_size.chars().count() - whitespace).collect(); + + if trimmed.is_empty() { + continue; + } + let mut input = ParserInput::new(&trimmed); + let url = ServoUrl::parse("about:blank").unwrap(); + let context = ParserContext::new_for_cssom(&url, + None, + ParsingMode::empty(), + QuirksMode::NoQuirks); + let mut parser = Parser::new(&mut input); + let length = parser.try(|i| Length::parse_non_negative(&context, i)); + match length { + Ok(len) => sizes.push(Size { + length: len, + query: None + }), + Err(_) => { + let mut media_query_parser = parser; + let media_query = media_query_parser.try(|i| MediaQuery::parse(&context, i)); + if let Ok(query) = media_query { + let length = Length::parse_non_negative(&context, &mut media_query_parser); + if let Ok(length) = length { + sizes.push(Size { + length: length, + query: Some(query) + }) + } + } + }, + } + } + if sizes.is_empty() { + let size = match width { + Some(w) => Size { + length: Length::from_px(w as f32), + query: None + }, + None => Size { + length: Length::NoCalc(NoCalcLength::ViewportPercentage(ViewportPercentageLength::Vw(100.))), + query: None + }, + }; + sizes.push(size); + } + sizes +} + impl HTMLImageElementMethods for HTMLImageElement { // https://html.spec.whatwg.org/multipage/#dom-img-alt make_getter!(Alt, "alt"); |