From fed488cd015310da8cd828fa915ca10ad65817b6 Mon Sep 17 00:00:00 2001 From: Xidorn Quan Date: Wed, 21 Dec 2016 10:14:04 +1100 Subject: [PATCH 1/2] Change SpecifiedUrl::for_cascade to take ServoUrl --- components/script/dom/element.rs | 2 +- components/style/values/specified/image.rs | 2 +- components/style/values/specified/url.rs | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/components/script/dom/element.rs b/components/script/dom/element.rs index 27386eb2da8..d5181e221fb 100644 --- a/components/script/dom/element.rs +++ b/components/script/dom/element.rs @@ -397,7 +397,7 @@ impl LayoutElementHelpers for LayoutJS { PropertyDeclaration::BackgroundImage(DeclaredValue::Value( background_image::SpecifiedValue(vec![ background_image::single_value::SpecifiedValue(Some( - specified::Image::for_cascade(Some(url.into()), specified::url::UrlExtraData { }) + specified::Image::for_cascade(url.into(), specified::url::UrlExtraData { }) )) ]))))); } diff --git a/components/style/values/specified/image.rs b/components/style/values/specified/image.rs index 479d378a680..af0ed3a2baf 100644 --- a/components/style/values/specified/image.rs +++ b/components/style/values/specified/image.rs @@ -45,7 +45,7 @@ impl Image { /// Creates an already specified image value from an already resolved URL /// for insertion in the cascade. - pub fn for_cascade(url: Option, extra_data: UrlExtraData) -> Self { + pub fn for_cascade(url: ServoUrl, extra_data: UrlExtraData) -> Self { Image::Url(SpecifiedUrl::for_cascade(url, extra_data)) } } diff --git a/components/style/values/specified/url.rs b/components/style/values/specified/url.rs index 878fbc018b8..9e56c925ef8 100644 --- a/components/style/values/specified/url.rs +++ b/components/style/values/specified/url.rs @@ -130,10 +130,10 @@ impl SpecifiedUrl { /// Creates an already specified url value from an already resolved URL /// for insertion in the cascade. - pub fn for_cascade(url: Option, extra_data: UrlExtraData) -> Self { + pub fn for_cascade(url: ServoUrl, extra_data: UrlExtraData) -> Self { SpecifiedUrl { original: None, - resolved: url, + resolved: Some(url), extra_data: extra_data, } } From 09ce1320e9436323674f49fe99ceda06dab7a0ff Mon Sep 17 00:00:00 2001 From: Xidorn Quan Date: Wed, 21 Dec 2016 10:14:44 +1100 Subject: [PATCH 2/2] stylo: handle unresolved url value gracefully --- components/style/gecko/conversions.rs | 4 +++- components/style/properties/gecko.mako.rs | 13 ++++++++++--- components/style/values/specified/url.rs | 12 ++++++++---- 3 files changed, 21 insertions(+), 8 deletions(-) diff --git a/components/style/gecko/conversions.rs b/components/style/gecko/conversions.rs index e336dee635e..9c2df76aabf 100644 --- a/components/style/gecko/conversions.rs +++ b/components/style/gecko/conversions.rs @@ -133,7 +133,9 @@ impl nsStyleImage { self.set_gradient(gradient) }, Image::Url(ref url) if with_url => { - let (ptr, len) = url.as_slice_components(); + let (ptr, len) = match url.as_slice_components() { + Ok(value) | Err(value) => value + }; let extra_data = url.extra_data(); unsafe { Gecko_SetUrlImageValue(self, diff --git a/components/style/properties/gecko.mako.rs b/components/style/properties/gecko.mako.rs index 0c9212e2a11..95070b43660 100644 --- a/components/style/properties/gecko.mako.rs +++ b/components/style/properties/gecko.mako.rs @@ -1152,7 +1152,10 @@ fn static_assert() { Either::Second(_none) => debug_assert!(self.gecko.mBinding.mRawPtr.is_null()), Either::First(ref url) => { let extra_data = url.extra_data(); - let (ptr, len) = url.as_slice_components(); + let (ptr, len) = match url.as_slice_components() { + Ok(value) => value, + Err(_) => (ptr::null(), 0), + }; unsafe { Gecko_SetMozBinding(&mut self.gecko, ptr, @@ -1737,7 +1740,9 @@ fn static_assert() { } } Either::First(ref url) => { - let (ptr, len) = url.as_slice_components(); + let (ptr, len) = match url.as_slice_components() { + Ok(value) | Err(value) => value + }; let extra_data = url.extra_data(); unsafe { Gecko_SetListStyleImage(&mut self.gecko, @@ -2433,7 +2438,9 @@ clip-path for i in 0..v.images.len() { let image = &v.images[i]; let extra_data = image.url.extra_data(); - let (ptr, len) = image.url.as_slice_components(); + let (ptr, len) = match image.url.as_slice_components() { + Ok(value) | Err(value) => value, + }; unsafe { Gecko_SetCursorImage(&mut self.gecko.mCursorImages[i], ptr, len as u32, diff --git a/components/style/values/specified/url.rs b/components/style/values/specified/url.rs index 9e56c925ef8..d856aac924a 100644 --- a/components/style/values/specified/url.rs +++ b/components/style/values/specified/url.rs @@ -13,7 +13,6 @@ use parser::ParserContextExtraData; use servo_url::ServoUrl; use std::borrow::Cow; use std::fmt::{self, Write}; -use std::ptr; use std::sync::Arc; use style_traits::ToCss; use values::NoViewportPercentage; @@ -121,10 +120,15 @@ impl SpecifiedUrl { } /// Little helper for Gecko's ffi. - pub fn as_slice_components(&self) -> (*const u8, usize) { + #[cfg(feature = "gecko")] + pub fn as_slice_components(&self) -> Result<(*const u8, usize), (*const u8, usize)> { match self.resolved { - Some(ref url) => (url.as_str().as_ptr(), url.as_str().len()), - None => (ptr::null(), 0), + Some(ref url) => Ok((url.as_str().as_ptr(), url.as_str().len())), + None => { + let url = self.original.as_ref() + .expect("We should always have either the original or the resolved value"); + Err((url.as_str().as_ptr(), url.as_str().len())) + } } }