aboutsummaryrefslogtreecommitdiffstats
path: root/components
diff options
context:
space:
mode:
Diffstat (limited to 'components')
-rw-r--r--components/compositing/lib.rs1
-rw-r--r--components/constellation/lib.rs1
-rw-r--r--components/net_traits/lib.rs3
-rw-r--r--components/script/body.rs2
-rw-r--r--components/script/fetch.rs4
-rwxr-xr-xcomponents/style/binding_tools/regen.py8
-rw-r--r--components/style/gecko/wrapper.rs12
-rw-r--r--components/style/gecko_bindings/bindings.rs20
-rw-r--r--components/style/gecko_bindings/sugar/ownership.rs160
-rw-r--r--components/style/properties/gecko.mako.rs3
-rw-r--r--components/style/properties/properties.mako.rs46
11 files changed, 84 insertions, 176 deletions
diff --git a/components/compositing/lib.rs b/components/compositing/lib.rs
index 3888b03e6d3..8ce9a6370e6 100644
--- a/components/compositing/lib.rs
+++ b/components/compositing/lib.rs
@@ -5,7 +5,6 @@
#![feature(box_syntax)]
#![feature(custom_derive)]
#![feature(plugin)]
-#![feature(plugin)]
#![plugin(plugins)]
#![deny(unsafe_code)]
diff --git a/components/constellation/lib.rs b/components/constellation/lib.rs
index d4df0d47b1a..a7d7fad33ce 100644
--- a/components/constellation/lib.rs
+++ b/components/constellation/lib.rs
@@ -6,7 +6,6 @@
#![feature(custom_derive)]
#![feature(plugin)]
#![feature(mpsc_select)]
-#![feature(plugin)]
#![plugin(plugins)]
#![deny(unsafe_code)]
diff --git a/components/net_traits/lib.rs b/components/net_traits/lib.rs
index 7f4a3abd164..bc920ccd2dd 100644
--- a/components/net_traits/lib.rs
+++ b/components/net_traits/lib.rs
@@ -463,9 +463,6 @@ pub enum CoreResourceMsg {
Exit(IpcSender<()>),
}
-/// Initialized but unsent request. Encapsulates everything necessary to instruct
-/// the resource thread to make a new request. The `load` method *must* be called before
-/// destruction or the thread will panic.
struct LoadOriginData {
pipeline: Option<PipelineId>,
referrer_policy: Option<ReferrerPolicy>,
diff --git a/components/script/body.rs b/components/script/body.rs
index 814a62c30eb..36a18134c98 100644
--- a/components/script/body.rs
+++ b/components/script/body.rs
@@ -25,7 +25,6 @@ use std::str;
use url::form_urlencoded;
pub enum BodyType {
- ArrayBuffer,
Blob,
FormData,
Json,
@@ -92,7 +91,6 @@ fn run_package_data_algorithm<T: BodyOperations + Reflectable>(object: &T,
BodyType::Json => run_json_data_algorithm(cx, bytes),
BodyType::Blob => run_blob_data_algorithm(object.global().r(), bytes, mime),
BodyType::FormData => run_form_data_algorithm(object.global().r(), bytes, mime),
- _ => Err(Error::Type("Unable to process body type".to_string()))
}
}
diff --git a/components/script/fetch.rs b/components/script/fetch.rs
index 0fc0fef1f89..d60d174daad 100644
--- a/components/script/fetch.rs
+++ b/components/script/fetch.rs
@@ -153,12 +153,12 @@ impl FetchResponseListener for FetchContext {
self.fetch_promise = Some(TrustedPromise::new(promise));
}
- fn process_response_chunk(&mut self, mut chunk: Vec<u8>) {
+ fn process_response_chunk(&mut self, _chunk: Vec<u8>) {
// TODO when body is implemented
// ... this will append the chunk to Response's body.
}
- fn process_response_eof(&mut self, response: Result<(), NetworkError>) {
+ fn process_response_eof(&mut self, _response: Result<(), NetworkError>) {
// TODO
// ... trailerObject is not supported in Servo yet.
}
diff --git a/components/style/binding_tools/regen.py b/components/style/binding_tools/regen.py
index 18fef011d74..49593e91f74 100755
--- a/components/style/binding_tools/regen.py
+++ b/components/style/binding_tools/regen.py
@@ -442,7 +442,7 @@ def build(objdir, target_name, debug, debugger, kind_name=None,
flags.append("{}BorrowedOrNull".format(ty))
flags.append("--raw-line")
flags.append("pub type {0}BorrowedOrNull<'a> = \
-::gecko_bindings::sugar::ownership::Borrowed<'a, {0}>;".format(ty))
+Option<&'a {0}>;".format(ty))
flags.append("--blacklist-type")
flags.append("{}Borrowed".format(ty))
flags.append("--raw-line")
@@ -459,7 +459,7 @@ def build(objdir, target_name, debug, debugger, kind_name=None,
flags.append("{}BorrowedOrNull".format(ty))
flags.append("--raw-line")
flags.append("pub type {0}BorrowedOrNull<'a> = \
-::gecko_bindings::sugar::ownership::Borrowed<'a, {0}>;".format(ty))
+Option<&'a {0}>;".format(ty))
# Right now the only immutable borrow types are ones which we import
# from the |structs| module. As such, we don't need to create an opaque
# type with zero_size_type. If we ever introduce immutable borrow types
@@ -489,12 +489,12 @@ def build(objdir, target_name, debug, debugger, kind_name=None,
flags.append("--blacklist-type")
flags.append("{}BorrowedOrNull".format(ty))
flags.append("--raw-line")
- flags.append("pub type {0}BorrowedOrNull<'a> = ::gecko_bindings::sugar::ownership::Borrowed<'a, {0}>;"
+ flags.append("pub type {0}BorrowedOrNull<'a> = Option<&'a {0}>;"
.format(ty))
flags.append("--blacklist-type")
flags.append("{}BorrowedMutOrNull".format(ty))
flags.append("--raw-line")
- flags.append("pub type {0}BorrowedMutOrNull<'a> = ::gecko_bindings::sugar::ownership::BorrowedMut<'a, {0}>;"
+ flags.append("pub type {0}BorrowedMutOrNull<'a> = Option<&'a mut {0}>;"
.format(ty))
flags.append("--blacklist-type")
flags.append("{}OwnedOrNull".format(ty))
diff --git a/components/style/gecko/wrapper.rs b/components/style/gecko/wrapper.rs
index 9be91c87178..fd35c6c6c83 100644
--- a/components/style/gecko/wrapper.rs
+++ b/components/style/gecko/wrapper.rs
@@ -156,7 +156,7 @@ impl TRestyleDamage for GeckoRestyleDamage {
fn compute(source: &nsStyleContext,
new_style: &Arc<ComputedValues>) -> Self {
let context = source as *const nsStyleContext as *mut nsStyleContext;
- let hint = unsafe { Gecko_CalcStyleDifference(context, new_style.as_borrowed()) };
+ let hint = unsafe { Gecko_CalcStyleDifference(context, new_style.as_borrowed_opt().unwrap()) };
GeckoRestyleDamage(hint)
}
@@ -330,7 +330,7 @@ impl<'ln> TNode for GeckoNode<'ln> {
}
fn last_child(&self) -> Option<GeckoNode<'ln>> {
- unsafe { Gecko_GetLastChild(self.0).borrow_opt().map(GeckoNode) }
+ unsafe { Gecko_GetLastChild(self.0).map(GeckoNode) }
}
fn prev_sibling(&self) -> Option<GeckoNode<'ln>> {
@@ -398,7 +398,7 @@ impl<'a> Iterator for GeckoChildrenIterator<'a> {
curr
},
GeckoChildrenIterator::GeckoIterator(ref it) => unsafe {
- Gecko_GetNextStyleChild(&it).borrow_opt().map(GeckoNode)
+ Gecko_GetNextStyleChild(&it).map(GeckoNode)
}
}
}
@@ -417,7 +417,7 @@ impl<'ld> TDocument for GeckoDocument<'ld> {
fn root_node(&self) -> Option<GeckoNode<'ld>> {
unsafe {
- Gecko_GetDocumentElement(self.0).borrow_opt().map(|el| GeckoElement(el).as_node())
+ Gecko_GetDocumentElement(self.0).map(|el| GeckoElement(el).as_node())
}
}
@@ -471,10 +471,10 @@ impl<'le> TElement for GeckoElement<'le> {
fn style_attribute(&self) -> Option<&Arc<RwLock<PropertyDeclarationBlock>>> {
let declarations = unsafe { Gecko_GetServoDeclarationBlock(self.0) };
- if declarations.is_null() {
+ if declarations.is_none() {
None
} else {
- let declarations = declarations.as_arc::<GeckoDeclarationBlock>();
+ let declarations = GeckoDeclarationBlock::arc_from_borrowed(&declarations).unwrap();
declarations.declarations.as_ref().map(|r| r as *const Arc<_>).map(|ptr| unsafe { &*ptr })
}
}
diff --git a/components/style/gecko_bindings/bindings.rs b/components/style/gecko_bindings/bindings.rs
index 52dbffd9a2c..97194ec3601 100644
--- a/components/style/gecko_bindings/bindings.rs
+++ b/components/style/gecko_bindings/bindings.rs
@@ -2,39 +2,39 @@
use heapsize::HeapSizeOf;
pub type ServoComputedValuesStrong = ::gecko_bindings::sugar::ownership::Strong<ServoComputedValues>;
-pub type ServoComputedValuesBorrowedOrNull<'a> = ::gecko_bindings::sugar::ownership::Borrowed<'a, ServoComputedValues>;
+pub type ServoComputedValuesBorrowedOrNull<'a> = Option<&'a ServoComputedValues>;
pub type ServoComputedValuesBorrowed<'a> = &'a ServoComputedValues;
enum ServoComputedValuesVoid{ }
pub struct ServoComputedValues(ServoComputedValuesVoid);
pub type RawServoStyleSheetStrong = ::gecko_bindings::sugar::ownership::Strong<RawServoStyleSheet>;
-pub type RawServoStyleSheetBorrowedOrNull<'a> = ::gecko_bindings::sugar::ownership::Borrowed<'a, RawServoStyleSheet>;
+pub type RawServoStyleSheetBorrowedOrNull<'a> = Option<&'a RawServoStyleSheet>;
pub type RawServoStyleSheetBorrowed<'a> = &'a RawServoStyleSheet;
enum RawServoStyleSheetVoid{ }
pub struct RawServoStyleSheet(RawServoStyleSheetVoid);
pub type ServoDeclarationBlockStrong = ::gecko_bindings::sugar::ownership::Strong<ServoDeclarationBlock>;
-pub type ServoDeclarationBlockBorrowedOrNull<'a> = ::gecko_bindings::sugar::ownership::Borrowed<'a, ServoDeclarationBlock>;
+pub type ServoDeclarationBlockBorrowedOrNull<'a> = Option<&'a ServoDeclarationBlock>;
pub type ServoDeclarationBlockBorrowed<'a> = &'a ServoDeclarationBlock;
enum ServoDeclarationBlockVoid{ }
pub struct ServoDeclarationBlock(ServoDeclarationBlockVoid);
pub type RawGeckoNodeBorrowed<'a> = &'a RawGeckoNode;
-pub type RawGeckoNodeBorrowedOrNull<'a> = ::gecko_bindings::sugar::ownership::Borrowed<'a, RawGeckoNode>;
+pub type RawGeckoNodeBorrowedOrNull<'a> = Option<&'a RawGeckoNode>;
pub type RawGeckoElementBorrowed<'a> = &'a RawGeckoElement;
-pub type RawGeckoElementBorrowedOrNull<'a> = ::gecko_bindings::sugar::ownership::Borrowed<'a, RawGeckoElement>;
+pub type RawGeckoElementBorrowedOrNull<'a> = Option<&'a RawGeckoElement>;
pub type RawGeckoDocumentBorrowed<'a> = &'a RawGeckoDocument;
-pub type RawGeckoDocumentBorrowedOrNull<'a> = ::gecko_bindings::sugar::ownership::Borrowed<'a, RawGeckoDocument>;
+pub type RawGeckoDocumentBorrowedOrNull<'a> = Option<&'a RawGeckoDocument>;
pub type RawServoStyleSetBorrowed<'a> = &'a RawServoStyleSet;
pub type RawServoStyleSetBorrowedMut<'a> = &'a mut RawServoStyleSet;
pub type RawServoStyleSetOwned = ::gecko_bindings::sugar::ownership::Owned<RawServoStyleSet>;
-pub type RawServoStyleSetBorrowedOrNull<'a> = ::gecko_bindings::sugar::ownership::Borrowed<'a, RawServoStyleSet>;
-pub type RawServoStyleSetBorrowedMutOrNull<'a> = ::gecko_bindings::sugar::ownership::BorrowedMut<'a, RawServoStyleSet>;
+pub type RawServoStyleSetBorrowedOrNull<'a> = Option<&'a RawServoStyleSet>;
+pub type RawServoStyleSetBorrowedMutOrNull<'a> = Option<&'a mut RawServoStyleSet>;
pub type RawServoStyleSetOwnedOrNull = ::gecko_bindings::sugar::ownership::OwnedOrNull<RawServoStyleSet>;
enum RawServoStyleSetVoid{ }
pub struct RawServoStyleSet(RawServoStyleSetVoid);
pub type StyleChildrenIteratorBorrowed<'a> = &'a StyleChildrenIterator;
pub type StyleChildrenIteratorBorrowedMut<'a> = &'a mut StyleChildrenIterator;
pub type StyleChildrenIteratorOwned = ::gecko_bindings::sugar::ownership::Owned<StyleChildrenIterator>;
-pub type StyleChildrenIteratorBorrowedOrNull<'a> = ::gecko_bindings::sugar::ownership::Borrowed<'a, StyleChildrenIterator>;
-pub type StyleChildrenIteratorBorrowedMutOrNull<'a> = ::gecko_bindings::sugar::ownership::BorrowedMut<'a, StyleChildrenIterator>;
+pub type StyleChildrenIteratorBorrowedOrNull<'a> = Option<&'a StyleChildrenIterator>;
+pub type StyleChildrenIteratorBorrowedMutOrNull<'a> = Option<&'a mut StyleChildrenIterator>;
pub type StyleChildrenIteratorOwnedOrNull = ::gecko_bindings::sugar::ownership::OwnedOrNull<StyleChildrenIterator>;
enum StyleChildrenIteratorVoid{ }
pub struct StyleChildrenIterator(StyleChildrenIteratorVoid);
diff --git a/components/style/gecko_bindings/sugar/ownership.rs b/components/style/gecko_bindings/sugar/ownership.rs
index 39b4cf59f41..b8652b4cecf 100644
--- a/components/style/gecko_bindings/sugar/ownership.rs
+++ b/components/style/gecko_bindings/sugar/ownership.rs
@@ -72,16 +72,16 @@ pub unsafe trait HasArcFFI : HasFFI {
// these methods can't be on Borrowed because it leads to an unspecified
// impl parameter
/// Artificially increments the refcount of a (possibly null) borrowed Arc over FFI.
- unsafe fn addref_opt(ptr: Borrowed<Self::FFIType>) {
- forget(ptr.as_arc_opt::<Self>().clone())
+ unsafe fn addref_opt(ptr: Option<&Self::FFIType>) {
+ forget(Self::arc_from_borrowed(&ptr).clone())
}
/// Given a (possibly null) borrowed FFI reference, decrements the refcount.
/// Unsafe since it doesn't consume the backing Arc. Run it only when you
/// know that a strong reference to the backing Arc is disappearing
/// (usually on the C++ side) without running the Arc destructor.
- unsafe fn release_opt(ptr: Borrowed<Self::FFIType>) {
- if let Some(arc) = ptr.as_arc_opt::<Self>() {
+ unsafe fn release_opt(ptr: Option<&Self::FFIType>) {
+ if let Some(arc) = Self::arc_from_borrowed(&ptr) {
let _: Arc<_> = ptr::read(arc as *const Arc<_>);
}
}
@@ -108,140 +108,17 @@ pub unsafe trait HasArcFFI : HasFFI {
transmute::<&&Self::FFIType, &Arc<Self>>(ptr)
}
}
-}
-
-#[repr(C)]
-/// Gecko-FFI-safe borrowed type
-/// This can be null.
-pub struct Borrowed<'a, T: 'a> {
- ptr: *const T,
- _marker: PhantomData<&'a T>,
-}
-
-#[repr(C)]
-/// Gecko-FFI-safe mutably borrowed type
-/// This can be null.
-pub struct BorrowedMut<'a, T: 'a> {
- ptr: *mut T,
- _marker: PhantomData<&'a mut T>,
-}
-
-// manual impls because derive doesn't realize that `T: Clone` isn't necessary
-impl<'a, T> Copy for Borrowed<'a, T> {}
-
-impl<'a, T> Clone for Borrowed<'a, T> {
- #[inline]
- fn clone(&self) -> Self { *self }
-}
-
-impl<'a, T> Borrowed<'a, T> {
- #[inline]
- pub fn is_null(self) -> bool {
- self.ptr == ptr::null()
- }
#[inline]
- /// Like Deref, but gives an Option
- pub fn borrow_opt(self) -> Option<&'a T> {
- if self.is_null() {
- None
- } else {
- Some(unsafe { &*self.ptr })
- }
- }
-
- #[inline]
- /// Borrowed<GeckoType> -> Option<&Arc<ServoType>>
- pub fn as_arc_opt<U>(&self) -> Option<&Arc<U>> where U: HasArcFFI<FFIType = T> {
+ fn arc_from_borrowed<'a>(ptr: &'a Option<&Self::FFIType>) -> Option<&'a Arc<Self>> {
unsafe {
- if self.is_null() {
- None
+ if let Some(ref reference) = *ptr {
+ Some(transmute::<&&Self::FFIType, &Arc<_>>(reference))
} else {
- Some(transmute::<&Borrowed<_>, &Arc<_>>(self))
+ None
}
}
}
-
- #[inline]
- /// Converts a borrowed FFI reference to a borrowed Arc.
- /// Panics on null.
- ///
- /// &Borrowed<GeckoType> -> &Arc<ServoType>
- pub fn as_arc<U>(&self) -> &Arc<U> where U: HasArcFFI<FFIType = T> {
- self.as_arc_opt().unwrap()
- }
-
- #[inline]
- /// Borrowed<ServoType> -> Borrowed<GeckoType>
- pub fn as_ffi(self) -> Borrowed<'a, <Self as HasFFI>::FFIType> where Self: HasSimpleFFI {
- unsafe { transmute(self) }
- }
-
- #[inline]
- /// Borrowed<GeckoType> -> Borrowed<ServoType>
- pub fn from_ffi<U>(self) -> Borrowed<'a, U> where U: HasSimpleFFI<FFIType = T> {
- unsafe { transmute(self) }
- }
-
- #[inline]
- /// Borrowed<GeckoType> -> &ServoType
- pub fn as_servo_ref<U>(self) -> Option<&'a U> where U: HasSimpleFFI<FFIType = T> {
- self.borrow_opt().map(HasSimpleFFI::from_ffi)
- }
-
- pub fn null() -> Borrowed<'static, T> {
- Borrowed {
- ptr: ptr::null_mut(),
- _marker: PhantomData
- }
- }
-}
-
-impl<'a, T> BorrowedMut<'a, T> {
- #[inline]
- /// Like DerefMut, but gives an Option
- pub fn borrow_mut_opt(self) -> Option<&'a mut T> {
- // We have two choices for the signature here, it can either be
- // Self -> Option<&'a mut T> or
- // &'b mut Self -> Option<'b mut T>
- // The former consumes the BorrowedMut (which isn't Copy),
- // which can be annoying. The latter only temporarily
- // borrows it, so the return value can't exit the scope
- // even if Self has a longer lifetime ('a)
- //
- // This is basically the implicit "reborrow" pattern used with &mut
- // not cleanly translating to our custom types.
-
- // I've chosen the former solution -- you can manually convert back
- // if you need to reuse the BorrowedMut.
- if self.is_null() {
- None
- } else {
- Some(unsafe { &mut *self.ptr })
- }
- }
-
- #[inline]
- /// BorrowedMut<GeckoType> -> &mut ServoType
- pub fn as_servo_mut_ref<U>(self) -> Option<&'a mut U> where U: HasSimpleFFI<FFIType = T> {
- self.borrow_mut_opt().map(HasSimpleFFI::from_ffi_mut)
- }
-
- pub fn null_mut() -> BorrowedMut<'static, T> {
- BorrowedMut {
- ptr: ptr::null_mut(),
- _marker: PhantomData
- }
- }
-}
-
-// technically not how we're supposed to use
-// Deref, but that's a minor style issue
-impl<'a, T> Deref for BorrowedMut<'a, T> {
- type Target = Borrowed<'a, T>;
- fn deref(&self) -> &Self::Target {
- unsafe { transmute(self) }
- }
}
#[repr(C)]
@@ -299,12 +176,8 @@ pub unsafe trait FFIArcHelpers {
fn into_strong(self) -> Strong<<Self::Inner as HasFFI>::FFIType>;
/// Produces a (nullable) borrowed FFI reference by borrowing an Arc.
///
- /// &Arc<ServoType> -> Borrowed<GeckoType>
- fn as_borrowed_opt(&self) -> Borrowed<<Self::Inner as HasFFI>::FFIType>;
- /// Produces a borrowed FFI reference by borrowing an Arc.
- ///
- /// &Arc<ServoType> -> &GeckoType
- fn as_borrowed(&self) -> &<Self::Inner as HasFFI>::FFIType;
+ /// &Arc<ServoType> -> Option<&GeckoType>
+ fn as_borrowed_opt(&self) -> Option<&<Self::Inner as HasFFI>::FFIType>;
}
unsafe impl<T: HasArcFFI> FFIArcHelpers for Arc<T> {
@@ -314,13 +187,8 @@ unsafe impl<T: HasArcFFI> FFIArcHelpers for Arc<T> {
unsafe { transmute(self) }
}
#[inline]
- fn as_borrowed_opt(&self) -> Borrowed<T::FFIType> {
- let borrowedptr = self as *const Arc<T> as *const Borrowed<T::FFIType>;
- unsafe { ptr::read(borrowedptr) }
- }
- #[inline]
- fn as_borrowed(&self) -> &T::FFIType {
- let borrowedptr = self as *const Arc<T> as *const & T::FFIType;
+ fn as_borrowed_opt(&self) -> Option<&T::FFIType> {
+ let borrowedptr = self as *const Arc<T> as *const Option<&T::FFIType>;
unsafe { ptr::read(borrowedptr) }
}
}
@@ -387,11 +255,11 @@ impl<T> OwnedOrNull<T> {
}
}
- pub fn borrow(&self) -> Borrowed<T> {
+ pub fn borrow(&self) -> Option<&T> {
unsafe { transmute(self) }
}
- pub fn borrow_mut(&self) -> BorrowedMut<T> {
+ pub fn borrow_mut(&self) -> Option<&mut T> {
unsafe { transmute(self) }
}
}
diff --git a/components/style/properties/gecko.mako.rs b/components/style/properties/gecko.mako.rs
index acc3ee86fa6..3d08c822c6a 100644
--- a/components/style/properties/gecko.mako.rs
+++ b/components/style/properties/gecko.mako.rs
@@ -27,6 +27,7 @@ use gecko_bindings::bindings::{Gecko_FontFamilyList_Clear, Gecko_InitializeImage
use gecko_bindings::bindings::ServoComputedValuesBorrowedOrNull;
use gecko_bindings::structs;
use gecko_bindings::sugar::ns_style_coord::{CoordDataValue, CoordData, CoordDataMut};
+use gecko_bindings::sugar::ownership::HasArcFFI;
use gecko::values::{StyleCoordHelpers, GeckoStyleCoordConvertible, convert_nscolor_to_rgba};
use gecko::values::convert_rgba_to_nscolor;
use gecko::values::round_border_to_device_pixels;
@@ -1934,7 +1935,7 @@ clip-path
#[allow(non_snake_case, unused_variables)]
pub extern "C" fn Servo_GetStyle${style_struct.gecko_name}(computed_values:
ServoComputedValuesBorrowedOrNull) -> *const ${style_struct.gecko_ffi_name} {
- computed_values.as_arc::<ComputedValues>().get_${style_struct.name_lower}().get_gecko()
+ ComputedValues::arc_from_borrowed(&computed_values).unwrap().get_${style_struct.name_lower}().get_gecko()
as *const ${style_struct.gecko_ffi_name}
}
</%def>
diff --git a/components/style/properties/properties.mako.rs b/components/style/properties/properties.mako.rs
index 2a680464490..46db65c68c6 100644
--- a/components/style/properties/properties.mako.rs
+++ b/components/style/properties/properties.mako.rs
@@ -317,6 +317,42 @@ impl PropertyDeclarationBlock {
}
}
+impl PropertyDeclarationBlock {
+ // Take a declaration block known to contain a single property,
+ // and serialize it
+ pub fn to_css_single_value<W>(&self, dest: &mut W, name: &str)
+ -> fmt::Result where W: fmt::Write {
+ match self.declarations.len() {
+ 0 => Err(fmt::Error),
+ 1 if self.declarations[0].0.name().eq_str_ignore_ascii_case(name) => {
+ self.declarations[0].0.to_css(dest)
+ }
+ _ => {
+ // we use this function because a closure won't be `Clone`
+ fn get_declaration(dec: &(PropertyDeclaration, Importance))
+ -> &PropertyDeclaration {
+ &dec.0
+ }
+ let shorthand = try!(Shorthand::from_name(name).ok_or(fmt::Error));
+ if !self.declarations.iter().all(|decl| decl.0.shorthands().contains(&shorthand)) {
+ return Err(fmt::Error)
+ }
+ let success = try!(shorthand.serialize_shorthand_to_buffer(
+ dest,
+ self.declarations.iter()
+ .map(get_declaration as fn(_) -> _),
+ &mut true)
+ );
+ if success {
+ Ok(())
+ } else {
+ Err(fmt::Error)
+ }
+ }
+ }
+ }
+}
+
impl ToCss for PropertyDeclarationBlock {
// https://drafts.csswg.org/cssom/#serialize-a-css-declaration-block
fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write {
@@ -893,6 +929,16 @@ pub enum PropertyDeclarationName {
Internal
}
+impl PropertyDeclarationName {
+ pub fn eq_str_ignore_ascii_case(&self, other: &str) -> bool {
+ match *self {
+ PropertyDeclarationName::Longhand(s) => s.eq_ignore_ascii_case(other),
+ PropertyDeclarationName::Custom(ref n) => n.eq_str_ignore_ascii_case(other),
+ PropertyDeclarationName::Internal => false
+ }
+ }
+}
+
impl PartialEq<str> for PropertyDeclarationName {
fn eq(&self, other: &str) -> bool {
match *self {