style: Centralize specified url value handling, and refcount urls.

This commit is contained in:
Emilio Cobos Álvarez 2016-10-16 15:08:30 +02:00
parent 89c46369a2
commit 5f2e7af864
No known key found for this signature in database
GPG key ID: 056B727BB9C1027C
22 changed files with 267 additions and 187 deletions

View file

@ -1036,11 +1036,13 @@ fn static_assert() {
use properties::longhands::_moz_binding::computed_value::T as BindingValue;
match v {
BindingValue::None => debug_assert!(self.gecko.mBinding.mRawPtr.is_null()),
BindingValue::Url(ref url, ref extra_data) => {
BindingValue::Url(ref url) => {
let extra_data = url.extra_data();
let (ptr, len) = url.as_slice_components();
unsafe {
Gecko_SetMozBinding(&mut self.gecko,
url.as_str().as_ptr(),
url.as_str().len() as u32,
ptr,
len as u32,
extra_data.base.get(),
extra_data.referrer.get(),
extra_data.principal.get());
@ -1441,11 +1443,13 @@ fn static_assert() {
Gecko_SetListStyleImageNone(&mut self.gecko);
}
}
UrlOrNone::Url(ref url, ref extra_data) => {
UrlOrNone::Url(ref url) => {
let (ptr, len) = url.as_slice_components();
let extra_data = url.extra_data();
unsafe {
Gecko_SetListStyleImage(&mut self.gecko,
url.as_str().as_ptr(),
url.as_str().len() as u32,
ptr,
len as u32,
extra_data.base.get(),
extra_data.referrer.get(),
extra_data.principal.get());

View file

@ -149,20 +149,21 @@ ${helpers.single_keyword("mask-composite",
has_uncacheable_values="${product == 'gecko'}">
use std::fmt;
use style_traits::ToCss;
use url::Url;
use values::specified::{Image, UrlExtraData};
use std::sync::Arc;
use values::specified::Image;
use values::specified::url::SpecifiedUrl;
use values::NoViewportPercentage;
pub mod computed_value {
use std::fmt;
use style_traits::ToCss;
use url::Url;
use values::computed;
use values::specified::url::SpecifiedUrl;
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "servo", derive(HeapSizeOf))]
pub enum T {
Image(computed::Image),
Url(Url, computed::UrlExtraData),
Url(SpecifiedUrl),
None
}
@ -171,7 +172,7 @@ ${helpers.single_keyword("mask-composite",
match *self {
T::None => dest.write_str("none"),
T::Image(ref image) => image.to_css(dest),
T::Url(ref url, _) => url.to_css(dest),
T::Url(ref url) => url.to_css(dest),
}
}
}
@ -183,7 +184,7 @@ ${helpers.single_keyword("mask-composite",
#[cfg_attr(feature = "servo", derive(HeapSizeOf))]
pub enum SpecifiedValue {
Image(Image),
Url(Url, UrlExtraData),
Url(SpecifiedUrl),
None
}
@ -191,7 +192,7 @@ ${helpers.single_keyword("mask-composite",
fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write {
match *self {
SpecifiedValue::Image(ref image) => image.to_css(dest),
SpecifiedValue::Url(ref url, _) => url.to_css(dest),
SpecifiedValue::Url(ref url) => url.to_css(dest),
SpecifiedValue::None => dest.write_str("none"),
}
}
@ -211,11 +212,16 @@ ${helpers.single_keyword("mask-composite",
} else {
let image = try!(Image::parse(context, input));
match image {
Image::Url(url, data) => {
if url.fragment().is_some() {
Ok(SpecifiedValue::Url(url, data))
Image::Url(url_value) => {
let has_valid_url = match url_value.url() {
Some(url) => url.fragment().is_some(),
None => false,
};
if has_valid_url {
Ok(SpecifiedValue::Url(url_value))
} else {
Ok(SpecifiedValue::Image(Image::Url(url, data)))
Ok(SpecifiedValue::Image(Image::Url(url_value)))
}
}
image => Ok(SpecifiedValue::Image(image))
@ -231,8 +237,8 @@ ${helpers.single_keyword("mask-composite",
SpecifiedValue::None => computed_value::T::None,
SpecifiedValue::Image(ref image) =>
computed_value::T::Image(image.to_computed_value(context)),
SpecifiedValue::Url(ref url, ref data) =>
computed_value::T::Url(url.clone(), data.clone()),
SpecifiedValue::Url(ref url) =>
computed_value::T::Url(url.clone()),
}
}
@ -242,8 +248,8 @@ ${helpers.single_keyword("mask-composite",
computed_value::T::None => SpecifiedValue::None,
computed_value::T::Image(ref image) =>
SpecifiedValue::Image(ToComputedValue::from_computed_value(image)),
computed_value::T::Url(ref url, ref data) =>
SpecifiedValue::Url(url.clone(), data.clone()),
computed_value::T::Url(ref url) =>
SpecifiedValue::Url(url.clone()),
}
}
}