stylo: handle unresolved url value gracefully

This commit is contained in:
Xidorn Quan 2016-12-21 10:14:44 +11:00
parent fed488cd01
commit 09ce1320e9
3 changed files with 21 additions and 8 deletions

View file

@ -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,

View file

@ -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,

View file

@ -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()))
}
}
}