Skip to content

Commit

Permalink
style: Expand the Parser trait to allow anonymous CORS to be applied.
Browse files Browse the repository at this point in the history
Depends on D5106

Differential Revision: https://phabricator.services.mozilla.com/D5341
  • Loading branch information
bradwerth authored and emilio committed Sep 15, 2018
1 parent b96d44e commit 6d57cbd
Show file tree
Hide file tree
Showing 3 changed files with 38 additions and 7 deletions.
14 changes: 14 additions & 0 deletions components/style/gecko/url.rs
Expand Up @@ -201,6 +201,20 @@ impl SpecifiedImageUrl {
use gecko_bindings::structs::root::mozilla::CORSMode_CORS_NONE;
Self::from_css_url_with_cors(url, CORSMode_CORS_NONE)
}

fn from_css_url_with_cors_anonymous(url: CssUrl) -> Self {
use gecko_bindings::structs::root::mozilla::CORSMode_CORS_ANONYMOUS;
Self::from_css_url_with_cors(url, CORSMode_CORS_ANONYMOUS)
}

/// Provides an alternate method for parsing that associates the URL
/// with anonymous CORS headers.
pub fn parse_with_cors_anonymous<'i, 't>(
context: &ParserContext,
input: &mut Parser<'i, 't>,
) -> Result<Self, ParseError<'i>> {
CssUrl::parse(context, input).map(Self::from_css_url_with_cors_anonymous)
}
}

impl Parse for SpecifiedImageUrl {
Expand Down
19 changes: 12 additions & 7 deletions components/style/values/specified/basic_shape.rs
Expand Up @@ -71,7 +71,12 @@ impl Parse for ClippingShape {
return Ok(ShapeSource::Path(p));
}
}
Self::parse_internal(context, input)

if let Ok(url) = input.try(|i| SpecifiedUrl::parse(context, i)) {
return Ok(ShapeSource::ImageOrUrl(url));
}

Self::parse_common(context, input)
}
}

Expand All @@ -81,7 +86,11 @@ impl Parse for FloatAreaShape {
context: &ParserContext,
input: &mut Parser<'i, 't>,
) -> Result<Self, ParseError<'i>> {
Self::parse_internal(context, input)
if let Ok(image) = input.try(|i| Image::parse_with_cors_anonymous(context, i)) {
return Ok(ShapeSource::ImageOrUrl(image));
}

Self::parse_common(context, input)
}
}

Expand All @@ -91,18 +100,14 @@ where
ImageOrUrl: Parse,
{
/// The internal parser for ShapeSource.
fn parse_internal<'i, 't>(
fn parse_common<'i, 't>(
context: &ParserContext,
input: &mut Parser<'i, 't>,
) -> Result<Self, ParseError<'i>> {
if input.try(|i| i.expect_ident_matching("none")).is_ok() {
return Ok(ShapeSource::None);
}

if let Ok(image_or_url) = input.try(|i| ImageOrUrl::parse(context, i)) {
return Ok(ShapeSource::ImageOrUrl(image_or_url));
}

fn parse_component<U: Parse>(
context: &ParserContext,
input: &mut Parser,
Expand Down
12 changes: 12 additions & 0 deletions components/style/values/specified/image.rs
Expand Up @@ -166,6 +166,18 @@ impl Image {
ref t => Err(location.new_unexpected_token_error(t.clone())),
})
}

/// Provides an alternate method for parsing that associates the URL
/// with anonymous CORS headers.
pub fn parse_with_cors_anonymous<'i, 't>(
context: &ParserContext,
input: &mut Parser<'i, 't>,
) -> Result<Image, ParseError<'i>> {
if let Ok(url) = input.try(|input| SpecifiedImageUrl::parse_with_cors_anonymous(context, input)) {
return Ok(generic::Image::Url(url));
}
Self::parse(context, input)
}
}

impl Parse for Gradient {
Expand Down

0 comments on commit 6d57cbd

Please sign in to comment.