servo: Merge #17016 - Use struct rather than nsCSSValue::Array to store counter functions in Gecko (from upsuper:bug1366735); r=heycam

This is the Servo side change for [bug 1366735](https://bugzilla.mozilla.org/show_bug.cgi?id=1366735).

Source-Repo: https://github.com/servo/servo
Source-Revision: e457d22f81ac0f45c4dc96867162f276de7bd291

--HG--
extra : subtree_source : https%3A//hg.mozilla.org/projects/converted-servo-linear
extra : subtree_revision : 8ba04dab52e5c46e1719988c5ae9deda17a67a5a
This commit is contained in:
Xidorn Quan 2017-05-24 17:26:03 -05:00
Родитель ce2fe4e709
Коммит ec074c3fbb
5 изменённых файлов: 154 добавлений и 23 удалений

Просмотреть файл

@ -80,6 +80,9 @@ unsafe impl Sync for nsStyleContent {}
use gecko_bindings::structs::nsStyleContentData;
unsafe impl Send for nsStyleContentData {}
unsafe impl Sync for nsStyleContentData {}
use gecko_bindings::structs::nsStyleContentData_CounterFunction;
unsafe impl Send for nsStyleContentData_CounterFunction {}
unsafe impl Sync for nsStyleContentData_CounterFunction {}
use gecko_bindings::structs::nsStyleContentType;
unsafe impl Send for nsStyleContentType {}
unsafe impl Sync for nsStyleContentType {}
@ -919,8 +922,9 @@ extern "C" {
aImageValue: *mut ImageValue);
}
extern "C" {
pub fn Gecko_SetContentDataArray(content_data: *mut nsStyleContentData,
type_: nsStyleContentType, len: u32);
pub fn Gecko_SetCounterFunction(content_data: *mut nsStyleContentData,
type_: nsStyleContentType)
-> *mut nsStyleContentData_CounterFunction;
}
extern "C" {
pub fn Gecko_GetNodeFlags(node: RawGeckoNodeBorrowed) -> u32;

Просмотреть файл

@ -32010,11 +32010,66 @@ pub mod root {
pub mContent: root::nsStyleContentData__bindgen_ty_1,
}
#[repr(C)]
#[derive(Debug)]
pub struct nsStyleContentData_CounterFunction {
pub mIdent: ::nsstring::nsStringRepr,
pub mSeparator: ::nsstring::nsStringRepr,
pub mCounterStyle: root::mozilla::CounterStylePtr,
pub mCounterStyleName: root::nsCOMPtr<root::nsIAtom>,
pub mRefCnt: root::mozilla::ThreadSafeAutoRefCnt,
}
pub type nsStyleContentData_CounterFunction_HasThreadSafeRefCnt =
root::mozilla::TrueType;
#[test]
fn bindgen_test_layout_nsStyleContentData_CounterFunction() {
assert_eq!(::std::mem::size_of::<nsStyleContentData_CounterFunction>()
, 56usize , concat ! (
"Size of: " , stringify ! (
nsStyleContentData_CounterFunction ) ));
assert_eq! (::std::mem::align_of::<nsStyleContentData_CounterFunction>()
, 8usize , concat ! (
"Alignment of " , stringify ! (
nsStyleContentData_CounterFunction ) ));
assert_eq! (unsafe {
& ( * ( 0 as * const nsStyleContentData_CounterFunction )
) . mIdent as * const _ as usize } , 0usize , concat ! (
"Alignment of field: " , stringify ! (
nsStyleContentData_CounterFunction ) , "::" , stringify !
( mIdent ) ));
assert_eq! (unsafe {
& ( * ( 0 as * const nsStyleContentData_CounterFunction )
) . mSeparator as * const _ as usize } , 16usize , concat
! (
"Alignment of field: " , stringify ! (
nsStyleContentData_CounterFunction ) , "::" , stringify !
( mSeparator ) ));
assert_eq! (unsafe {
& ( * ( 0 as * const nsStyleContentData_CounterFunction )
) . mCounterStyle as * const _ as usize } , 32usize ,
concat ! (
"Alignment of field: " , stringify ! (
nsStyleContentData_CounterFunction ) , "::" , stringify !
( mCounterStyle ) ));
assert_eq! (unsafe {
& ( * ( 0 as * const nsStyleContentData_CounterFunction )
) . mCounterStyleName as * const _ as usize } , 40usize ,
concat ! (
"Alignment of field: " , stringify ! (
nsStyleContentData_CounterFunction ) , "::" , stringify !
( mCounterStyleName ) ));
assert_eq! (unsafe {
& ( * ( 0 as * const nsStyleContentData_CounterFunction )
) . mRefCnt as * const _ as usize } , 48usize , concat ! (
"Alignment of field: " , stringify ! (
nsStyleContentData_CounterFunction ) , "::" , stringify !
( mRefCnt ) ));
}
#[repr(C)]
#[derive(Debug, Copy)]
pub struct nsStyleContentData__bindgen_ty_1 {
pub mString: root::__BindgenUnionField<*mut u16>,
pub mImage: root::__BindgenUnionField<*mut root::nsStyleImageRequest>,
pub mCounters: root::__BindgenUnionField<*mut root::nsCSSValue_Array>,
pub mCounters: root::__BindgenUnionField<*mut root::nsStyleContentData_CounterFunction>,
pub bindgen_union_field: u64,
}
#[test]

Просмотреть файл

@ -31499,11 +31499,66 @@ pub mod root {
pub mContent: root::nsStyleContentData__bindgen_ty_1,
}
#[repr(C)]
#[derive(Debug)]
pub struct nsStyleContentData_CounterFunction {
pub mIdent: ::nsstring::nsStringRepr,
pub mSeparator: ::nsstring::nsStringRepr,
pub mCounterStyle: root::mozilla::CounterStylePtr,
pub mCounterStyleName: root::nsCOMPtr,
pub mRefCnt: root::mozilla::ThreadSafeAutoRefCnt,
}
pub type nsStyleContentData_CounterFunction_HasThreadSafeRefCnt =
root::mozilla::TrueType;
#[test]
fn bindgen_test_layout_nsStyleContentData_CounterFunction() {
assert_eq!(::std::mem::size_of::<nsStyleContentData_CounterFunction>()
, 56usize , concat ! (
"Size of: " , stringify ! (
nsStyleContentData_CounterFunction ) ));
assert_eq! (::std::mem::align_of::<nsStyleContentData_CounterFunction>()
, 8usize , concat ! (
"Alignment of " , stringify ! (
nsStyleContentData_CounterFunction ) ));
assert_eq! (unsafe {
& ( * ( 0 as * const nsStyleContentData_CounterFunction )
) . mIdent as * const _ as usize } , 0usize , concat ! (
"Alignment of field: " , stringify ! (
nsStyleContentData_CounterFunction ) , "::" , stringify !
( mIdent ) ));
assert_eq! (unsafe {
& ( * ( 0 as * const nsStyleContentData_CounterFunction )
) . mSeparator as * const _ as usize } , 16usize , concat
! (
"Alignment of field: " , stringify ! (
nsStyleContentData_CounterFunction ) , "::" , stringify !
( mSeparator ) ));
assert_eq! (unsafe {
& ( * ( 0 as * const nsStyleContentData_CounterFunction )
) . mCounterStyle as * const _ as usize } , 32usize ,
concat ! (
"Alignment of field: " , stringify ! (
nsStyleContentData_CounterFunction ) , "::" , stringify !
( mCounterStyle ) ));
assert_eq! (unsafe {
& ( * ( 0 as * const nsStyleContentData_CounterFunction )
) . mCounterStyleName as * const _ as usize } , 40usize ,
concat ! (
"Alignment of field: " , stringify ! (
nsStyleContentData_CounterFunction ) , "::" , stringify !
( mCounterStyleName ) ));
assert_eq! (unsafe {
& ( * ( 0 as * const nsStyleContentData_CounterFunction )
) . mRefCnt as * const _ as usize } , 48usize , concat ! (
"Alignment of field: " , stringify ! (
nsStyleContentData_CounterFunction ) , "::" , stringify !
( mRefCnt ) ));
}
#[repr(C)]
#[derive(Debug, Copy)]
pub struct nsStyleContentData__bindgen_ty_1 {
pub mString: root::__BindgenUnionField<*mut u16>,
pub mImage: root::__BindgenUnionField<*mut root::nsStyleImageRequest>,
pub mCounters: root::__BindgenUnionField<*mut root::nsCSSValue_Array>,
pub mCounters: root::__BindgenUnionField<*mut root::nsStyleContentData_CounterFunction>,
pub bindgen_union_field: u64,
}
#[test]

Просмотреть файл

@ -13,6 +13,13 @@ impl<T> nsCOMPtr<T> {
pub fn raw<U>(&self) -> *mut T {
self.mRawPtr
}
/// Set this pointer from an addrefed raw pointer.
/// It leaks the old pointer.
#[inline]
pub unsafe fn set_raw_from_addrefed<U>(&mut self, ptr: *mut T) {
self.mRawPtr = ptr;
}
}
#[cfg(not(feature = "gecko_debug"))]
@ -22,4 +29,11 @@ impl nsCOMPtr {
pub fn raw<T>(&self) -> *mut T {
self._base.mRawPtr as *mut _
}
/// Set this pointer from an addrefed raw pointer.
/// It leaks the old pointer.
#[inline]
pub unsafe fn set_raw_from_addrefed<T>(&mut self, ptr: *mut T) {
self._base.mRawPtr = ptr as *mut _;
}
}

Просмотреть файл

@ -4211,7 +4211,9 @@ clip-path
use properties::longhands::content::computed_value::T;
use properties::longhands::content::computed_value::ContentItem;
use values::generics::CounterStyleOrNone;
use gecko_bindings::structs::nsCSSValue;
use gecko_bindings::structs::nsIAtom;
use gecko_bindings::structs::nsStyleContentData;
use gecko_bindings::structs::nsStyleContentType;
use gecko_bindings::structs::nsStyleContentType::*;
use gecko_bindings::bindings::Gecko_ClearAndResizeStyleContents;
@ -4225,11 +4227,23 @@ clip-path
ptr
}
fn set_counter_style(style: CounterStyleOrNone, dest: &mut nsCSSValue) {
dest.set_atom_ident(match style {
fn set_counter_function(data: &mut nsStyleContentData,
content_type: nsStyleContentType,
name: &str, sep: &str, style: CounterStyleOrNone) {
debug_assert!(content_type == eStyleContentType_Counter ||
content_type == eStyleContentType_Counters);
let counter_func = unsafe {
bindings::Gecko_SetCounterFunction(data, content_type).as_mut().unwrap()
};
counter_func.mIdent.assign_utf8(name);
if content_type == eStyleContentType_Counters {
counter_func.mSeparator.assign_utf8(sep);
}
let ptr = match style {
CounterStyleOrNone::None_ => atom!("none"),
CounterStyleOrNone::Name(name) => name.0,
});
}.into_addrefed();
unsafe { counter_func.mCounterStyleName.set_raw_from_addrefed::<nsIAtom>(ptr); }
}
match v {
@ -4292,23 +4306,12 @@ clip-path
ContentItem::NoCloseQuote
=> self.gecko.mContents[i].mType = eStyleContentType_NoCloseQuote,
ContentItem::Counter(name, style) => {
unsafe {
bindings::Gecko_SetContentDataArray(&mut self.gecko.mContents[i],
eStyleContentType_Counter, 2)
}
let mut array = unsafe { &mut **self.gecko.mContents[i].mContent.mCounters.as_mut() };
array[0].set_string(&name);
set_counter_style(style, &mut array[1]);
set_counter_function(&mut self.gecko.mContents[i],
eStyleContentType_Counter, &name, "", style);
}
ContentItem::Counters(name, sep, style) => {
unsafe {
bindings::Gecko_SetContentDataArray(&mut self.gecko.mContents[i],
eStyleContentType_Counters, 3)
}
let mut array = unsafe { &mut **self.gecko.mContents[i].mContent.mCounters.as_mut() };
array[0].set_string(&name);
array[1].set_string(&sep);
set_counter_style(style, &mut array[2]);
set_counter_function(&mut self.gecko.mContents[i],
eStyleContentType_Counters, &name, &sep, style);
}
ContentItem::Url(ref url) => {
unsafe {