From 6d57cbd8816825cae473d0d4552cc3354a3fdcc0 Mon Sep 17 00:00:00 2001 From: Brad Werth Date: Tue, 11 Sep 2018 18:11:05 +0000 Subject: [PATCH] style: Expand the Parser trait to allow anonymous CORS to be applied. Depends on D5106 Differential Revision: https://phabricator.services.mozilla.com/D5341 --- components/style/gecko/url.rs | 14 ++++++++++++++ .../style/values/specified/basic_shape.rs | 19 ++++++++++++------- components/style/values/specified/image.rs | 12 ++++++++++++ 3 files changed, 38 insertions(+), 7 deletions(-) diff --git a/components/style/gecko/url.rs b/components/style/gecko/url.rs index 2a1307985973..c00fc8c27e33 100644 --- a/components/style/gecko/url.rs +++ b/components/style/gecko/url.rs @@ -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> { + CssUrl::parse(context, input).map(Self::from_css_url_with_cors_anonymous) + } } impl Parse for SpecifiedImageUrl { diff --git a/components/style/values/specified/basic_shape.rs b/components/style/values/specified/basic_shape.rs index cdafbf14b371..e4c0544af9d9 100644 --- a/components/style/values/specified/basic_shape.rs +++ b/components/style/values/specified/basic_shape.rs @@ -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) } } @@ -81,7 +86,11 @@ impl Parse for FloatAreaShape { context: &ParserContext, input: &mut Parser<'i, 't>, ) -> Result> { - 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) } } @@ -91,7 +100,7 @@ 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> { @@ -99,10 +108,6 @@ where 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( context: &ParserContext, input: &mut Parser, diff --git a/components/style/values/specified/image.rs b/components/style/values/specified/image.rs index 1c0a613e488a..2eabb452f02c 100644 --- a/components/style/values/specified/image.rs +++ b/components/style/values/specified/image.rs @@ -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> { + 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 {