Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix parsing behavior of text-shadow property #16754

Merged
merged 2 commits into from May 6, 2017
Merged
Changes from 1 commit
Commits
File filter...
Filter file types
Jump to…
Jump to file
Failed to load files.

Always

Just for now

Next

Properly parse text-shadow property

  • Loading branch information
canova committed May 6, 2017
commit 1e975b983382027ff5126eb1a9abf016f6ebc8e7
@@ -720,6 +720,7 @@ ${helpers.single_keyword("text-align-last",
use cssparser;
use std::fmt;
use style_traits::ToCss;
use values::specified::Shadow;
use values::HasViewportPercentage;

impl HasViewportPercentage for SpecifiedValue {
@@ -750,6 +751,17 @@ ${helpers.single_keyword("text-align-last",
pub color: Option<specified::CSSColor>,
}

impl From<Shadow> for SpecifiedTextShadow {
fn from(shadow: Shadow) -> SpecifiedTextShadow {

This comment has been minimized.

@emilio

emilio May 6, 2017

Member

Given it's pretty much the same type, and they share parsing, the only thing that differs is the to_computed_value impl, right?

This comment has been minimized.

@canova

canova May 6, 2017

Author Member

Yes, also Shadow has 2 additional fields but they are not getting parsed if disable_spread_and_inset argument is true in parse method(which is true in that property).

SpecifiedTextShadow {
offset_x: shadow.offset_x,
offset_y: shadow.offset_y,
blur_radius: shadow.blur_radius,
color: shadow.color,
}
}
}

pub mod computed_value {
use app_units::Au;
use cssparser::Color;
@@ -842,61 +854,12 @@ ${helpers.single_keyword("text-align-last",
if input.try(|input| input.expect_ident_matching("none")).is_ok() {
Ok(SpecifiedValue(Vec::new()))
} else {
input.parse_comma_separated(|i| parse_one_text_shadow(context, i)).map(SpecifiedValue)
input.parse_comma_separated(|i| {
Ok(SpecifiedTextShadow::from(Shadow::parse(context, i, true)?))
}).map(SpecifiedValue)
}
}

fn parse_one_text_shadow(context: &ParserContext, input: &mut Parser) -> Result<SpecifiedTextShadow,()> {
use app_units::Au;
let mut lengths = [specified::Length::zero(), specified::Length::zero(), specified::Length::zero()];
let mut lengths_parsed = false;
let mut color = None;

loop {
if !lengths_parsed {
if let Ok(value) = input.try(|i| specified::Length::parse(context, i)) {
lengths[0] = value;
let mut length_parsed_count = 1;
while length_parsed_count < 3 {
if let Ok(value) = input.try(|i| specified::Length::parse(context, i)) {
lengths[length_parsed_count] = value
} else {
break
}
length_parsed_count += 1;
}

// The first two lengths must be specified.
if length_parsed_count < 2 {
return Err(())
}

lengths_parsed = true;
continue
}
}
if color.is_none() {
if let Ok(value) = input.try(|i| specified::CSSColor::parse(context, i)) {
color = Some(value);
continue
}
}
break
}

// Lengths must be specified.
if !lengths_parsed {
return Err(())
}

Ok(SpecifiedTextShadow {
offset_x: lengths[0].take(),
offset_y: lengths[1].take(),
blur_radius: lengths[2].take(),
color: color,
})
}

impl ToComputedValue for SpecifiedValue {
type ComputedValue = computed_value::T;

ProTip! Use n and p to navigate between commits in a pull request.
You can’t perform that action at this time.