servo: Merge #15900 - Process css animations for gecko (from hiikezoe:process-css-animations); r=heycam

<!-- Please describe your changes on the following line: -->
This is a PR for https://bugzilla.mozilla.org/show_bug.cgi?id=1341985 .

---
<!-- Thank you for contributing to Servo! Please replace each `[ ]` by `[X]` when the step is complete, and replace `__` with appropriate data: -->
- [X] `./mach build -d` does not report any errors
- [X] `./mach test-tidy` does not report any errors
- [ ] These changes fix #__ (github issue number if applicable).

<!-- Either: -->
- [ ] There are tests for these changes OR
- [X] These changes do not require tests because it's for stylo

<!-- Pull requests that do not address these steps are welcome, but they will require additional verification as part of the review process. -->

Source-Repo: https://github.com/servo/servo
Source-Revision: 63bed270734aee1956d1c1ec131aa1de9d5bb5a0

--HG--
extra : subtree_source : https%3A//hg.mozilla.org/projects/converted-servo-linear
extra : subtree_revision : 69544f0d05b3b246aaa3d206e46661e0bc18266f
This commit is contained in:
Hiroyuki Ikezoe 2017-03-09 20:23:21 -08:00
Родитель eb74600c49
Коммит 2505a45477
12 изменённых файлов: 554 добавлений и 481 удалений

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

@ -446,6 +446,14 @@ impl<'le> TElement for ServoLayoutElement<'le> {
fn has_selector_flags(&self, flags: ElementSelectorFlags) -> bool {
self.element.has_selector_flags(flags)
}
fn update_animations(&self, _pseudo: Option<&PseudoElement>) {
panic!("this should be only called on gecko");
}
fn has_css_animations(&self, _pseudo: Option<&PseudoElement>) -> bool {
panic!("this should be only called on gecko");
}
}
impl<'le> PartialEq for ServoLayoutElement<'le> {

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

@ -539,6 +539,7 @@ mod bindings {
"RawServoDeclarationBlock",
"RawGeckoPresContext",
"RawGeckoPresContextOwned",
"RawGeckoStyleAnimationList",
"GeckoParserExtraData",
"RefPtr",
"ThreadSafeURIHolder",
@ -636,6 +637,7 @@ mod bindings {
"RawGeckoDocument",
"RawServoDeclarationBlockStrong",
"RawGeckoPresContext",
"RawGeckoStyleAnimationList",
];
let servo_borrow_types = [
"nsCSSValue",

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

@ -15,6 +15,7 @@ use euclid::Size2D;
use matching::StyleSharingCandidateCache;
use parking_lot::RwLock;
use properties::ComputedValues;
use selector_parser::PseudoElement;
use selectors::matching::ElementSelectorFlags;
use servo_config::opts;
use std::collections::HashMap;
@ -181,6 +182,10 @@ pub enum SequentialTask<E: TElement> {
/// Sets selector flags. This is used when we need to set flags on an
/// element that we don't have exclusive access to (i.e. the parent).
SetSelectorFlags(SendElement<E>, ElementSelectorFlags),
/// Marks that we need to create/remove/update CSS animations after the
/// first traversal.
UpdateAnimations(SendElement<E>, Option<PseudoElement>),
}
impl<E: TElement> SequentialTask<E> {
@ -192,6 +197,9 @@ impl<E: TElement> SequentialTask<E> {
SetSelectorFlags(el, flags) => {
unsafe { el.set_selector_flags(flags) };
}
UpdateAnimations(el, pseudo) => {
unsafe { el.update_animations(pseudo.as_ref()) };
}
}
}
@ -200,6 +208,12 @@ impl<E: TElement> SequentialTask<E> {
use self::SequentialTask::*;
SetSelectorFlags(unsafe { SendElement::new(el) }, flags)
}
/// Creates a task to update CSS Animations on a given (pseudo-)element.
pub fn update_animations(el: E, pseudo: Option<PseudoElement>) -> Self {
use self::SequentialTask::*;
UpdateAnimations(unsafe { SendElement::new(el) }, pseudo)
}
}
/// A thread-local style context.

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

@ -335,6 +335,13 @@ pub trait TElement : PartialEq + Debug + Sized + Copy + Clone + ElementExt + Pre
/// Returns true if the element has all the specified selector flags.
fn has_selector_flags(&self, flags: ElementSelectorFlags) -> bool;
/// Creates a task to update CSS Animations on a given (pseudo-)element.
/// Note: Gecko only.
fn update_animations(&self, _pseudo: Option<&PseudoElement>);
/// Returns true if the element has a CSS animation.
fn has_css_animations(&self, _pseudo: Option<&PseudoElement>) -> bool;
}
/// TNode and TElement aren't Send because we want to be careful and explicit

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

@ -7,11 +7,13 @@
use cssparser::ToCss;
use element_state::ElementState;
use gecko_bindings::structs::CSSPseudoClassType;
use gecko_bindings::structs::nsIAtom;
use selector_parser::{SelectorParser, PseudoElementCascadeType};
use selector_parser::{attr_equals_selector_is_shareable, attr_exists_selector_is_shareable};
use selectors::parser::AttrSelector;
use std::borrow::Cow;
use std::fmt;
use std::ptr;
use string_cache::{Atom, Namespace, WeakAtom, WeakNamespace};
/// A representation of a CSS pseudo-element.
@ -111,6 +113,12 @@ impl PseudoElement {
None
}
/// Returns null or nsIAtom pointer corresponding to a given PseudoElement.
#[inline]
pub fn ns_atom_or_null_from_opt(pseudo: Option<&PseudoElement>) -> *mut nsIAtom {
pseudo.map(|p| p.as_atom().as_ptr()).unwrap_or(ptr::null_mut())
}
}
impl ToCss for PseudoElement {

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

@ -29,16 +29,19 @@ use gecko_bindings::bindings::{Gecko_IsLink, Gecko_IsRootElement, Gecko_MatchesE
use gecko_bindings::bindings::{Gecko_IsUnvisitedLink, Gecko_IsVisitedLink, Gecko_Namespace};
use gecko_bindings::bindings::{Gecko_SetNodeFlags, Gecko_UnsetNodeFlags};
use gecko_bindings::bindings::Gecko_ClassOrClassList;
use gecko_bindings::bindings::Gecko_ElementHasCSSAnimations;
use gecko_bindings::bindings::Gecko_GetAnimationRule;
use gecko_bindings::bindings::Gecko_GetHTMLPresentationAttrDeclarationBlock;
use gecko_bindings::bindings::Gecko_GetStyleAttrDeclarationBlock;
use gecko_bindings::bindings::Gecko_GetStyleContext;
use gecko_bindings::bindings::Gecko_UpdateAnimations;
use gecko_bindings::structs;
use gecko_bindings::structs::{RawGeckoElement, RawGeckoNode};
use gecko_bindings::structs::{nsIAtom, nsIContent, nsStyleContext};
use gecko_bindings::structs::EffectCompositor_CascadeLevel as CascadeLevel;
use gecko_bindings::structs::NODE_HAS_DIRTY_DESCENDANTS_FOR_SERVO;
use gecko_bindings::structs::NODE_IS_IN_NATIVE_ANONYMOUS_SUBTREE;
use gecko_bindings::sugar::ownership::HasArcFFI;
use parking_lot::RwLock;
use parser::ParserContextExtraData;
use properties::{ComputedValues, parse_style_attribute};
@ -416,7 +419,7 @@ impl<'le> TElement for GeckoElement<'le> {
}
fn get_animation_rules(&self, pseudo: Option<&PseudoElement>) -> AnimationRules {
let atom_ptr = pseudo.map(|p| p.as_atom().as_ptr()).unwrap_or(ptr::null_mut());
let atom_ptr = PseudoElement::ns_atom_or_null_from_opt(pseudo);
unsafe {
AnimationRules(
Gecko_GetAnimationRule(self.0, atom_ptr, CascadeLevel::Animations).into_arc_opt(),
@ -454,9 +457,8 @@ impl<'le> TElement for GeckoElement<'le> {
_existing_values: &'a Arc<ComputedValues>,
pseudo: Option<&PseudoElement>)
-> Option<&'a nsStyleContext> {
let atom_ptr = PseudoElement::ns_atom_or_null_from_opt(pseudo);
unsafe {
let atom_ptr = pseudo.map(|p| p.as_atom().as_ptr())
.unwrap_or(ptr::null_mut());
let context_ptr = Gecko_GetStyleContext(self.as_node().0, atom_ptr);
context_ptr.as_ref()
}
@ -505,6 +507,37 @@ impl<'le> TElement for GeckoElement<'le> {
let node_flags = selector_flags_to_node_flags(flags);
(self.flags() & node_flags) == node_flags
}
fn update_animations(&self, pseudo: Option<&PseudoElement>) {
let atom_ptr = PseudoElement::ns_atom_or_null_from_opt(pseudo);
// We have to update animations even if the element has no computed style
// since it means the element is in a display:none subtree, we should destroy
// all CSS animations in display:none subtree.
let computed_data = self.borrow_data();
let computed_values = computed_data.as_ref().map(|d| d.styles().primary.values());
let computed_values_opt = computed_values.map(|v|
*HasArcFFI::arc_as_borrowed(v)
);
let parent_element = self.parent_element();
let parent_data = parent_element.as_ref().and_then(|e| e.borrow_data());
let parent_values = parent_data.as_ref().map(|d| d.styles().primary.values());
let parent_values_opt = parent_values.map(|v|
*HasArcFFI::arc_as_borrowed(v)
);
unsafe {
Gecko_UpdateAnimations(self.0, atom_ptr,
computed_values_opt,
parent_values_opt);
}
}
fn has_css_animations(&self, pseudo: Option<&PseudoElement>) -> bool {
let atom_ptr = PseudoElement::ns_atom_or_null_from_opt(pseudo);
unsafe { Gecko_ElementHasCSSAnimations(self.0, atom_ptr) }
}
}
impl<'le> PartialEq for GeckoElement<'le> {

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

@ -14,6 +14,7 @@ use gecko_bindings::structs::RawServoAnimationValue;
use gecko_bindings::structs::RawServoDeclarationBlock;
use gecko_bindings::structs::RawGeckoPresContext;
use gecko_bindings::structs::RawGeckoPresContextOwned;
use gecko_bindings::structs::RawGeckoStyleAnimationList;
use gecko_bindings::structs::GeckoParserExtraData;
use gecko_bindings::structs::RefPtr;
use gecko_bindings::structs::ThreadSafeURIHolder;
@ -232,6 +233,8 @@ pub type RawServoDeclarationBlockStrongBorrowed<'a> = &'a RawServoDeclarationBlo
pub type RawServoDeclarationBlockStrongBorrowedOrNull<'a> = Option<&'a RawServoDeclarationBlockStrong>;
pub type RawGeckoPresContextBorrowed<'a> = &'a RawGeckoPresContext;
pub type RawGeckoPresContextBorrowedOrNull<'a> = Option<&'a RawGeckoPresContext>;
pub type RawGeckoStyleAnimationListBorrowed<'a> = &'a RawGeckoStyleAnimationList;
pub type RawGeckoStyleAnimationListBorrowedOrNull<'a> = Option<&'a RawGeckoStyleAnimationList>;
pub type nsCSSValueBorrowed<'a> = &'a nsCSSValue;
pub type nsCSSValueBorrowedOrNull<'a> = Option<&'a nsCSSValue>;
pub type nsCSSValueBorrowedMut<'a> = &'a mut nsCSSValue;
@ -531,6 +534,26 @@ extern "C" {
EffectCompositor_CascadeLevel)
-> RawServoDeclarationBlockStrong;
}
extern "C" {
pub fn Gecko_StyleAnimationsEquals(arg1:
RawGeckoStyleAnimationListBorrowed,
arg2:
RawGeckoStyleAnimationListBorrowed)
-> bool;
}
extern "C" {
pub fn Gecko_UpdateAnimations(aElement: RawGeckoElementBorrowed,
aPseudoTagOrNull: *mut nsIAtom,
aComputedValues:
ServoComputedValuesBorrowedOrNull,
aParentComputedValues:
ServoComputedValuesBorrowedOrNull);
}
extern "C" {
pub fn Gecko_ElementHasCSSAnimations(aElement: RawGeckoElementBorrowed,
aPseudoTagOrNull: *mut nsIAtom)
-> bool;
}
extern "C" {
pub fn Gecko_Atomize(aString: *const ::std::os::raw::c_char, aLength: u32)
-> *mut nsIAtom;

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

@ -6044,7 +6044,7 @@ pub mod root {
UnstyledChildrenOnly = 1,
}
pub type CSSPseudoElementTypeBase = u8;
pub const CSSPseudoElementType_AnonBox:
pub const CSSPseudoElementType_InheritingAnonBox:
root::mozilla::CSSPseudoElementType =
CSSPseudoElementType::Count;
#[repr(u8)]
@ -6075,9 +6075,10 @@ pub mod root {
placeholder = 22,
mozColorSwatch = 23,
Count = 24,
XULTree = 25,
NotPseudo = 26,
MAX = 27,
NonInheritingAnonBox = 25,
XULTree = 26,
NotPseudo = 27,
MAX = 28,
}
pub mod widget {
#[allow(unused_imports)]
@ -7836,12 +7837,6 @@ pub mod root {
pub type pair_first_type<_T1> = _T1;
pub type pair_second_type<_T2> = _T2;
#[repr(C)]
pub struct atomic<_Tp> {
pub _base: (),
pub _phantom_0: ::std::marker::PhantomData<_Tp>,
}
pub type atomic___base = [u8; 0usize];
#[repr(C)]
#[derive(Debug, Copy)]
pub struct input_iterator_tag {
pub _address: u8,
@ -7860,62 +7855,6 @@ pub mod root {
fn clone(&self) -> Self { *self }
}
#[repr(C)]
#[derive(Debug, Copy)]
pub struct forward_iterator_tag {
pub _address: u8,
}
#[test]
fn bindgen_test_layout_forward_iterator_tag() {
assert_eq!(::std::mem::size_of::<forward_iterator_tag>() , 1usize
, concat ! (
"Size of: " , stringify ! ( forward_iterator_tag ) ));
assert_eq! (::std::mem::align_of::<forward_iterator_tag>() ,
1usize , concat ! (
"Alignment of " , stringify ! ( forward_iterator_tag )
));
}
impl Clone for forward_iterator_tag {
fn clone(&self) -> Self { *self }
}
#[repr(C)]
#[derive(Debug, Copy)]
pub struct bidirectional_iterator_tag {
pub _address: u8,
}
#[test]
fn bindgen_test_layout_bidirectional_iterator_tag() {
assert_eq!(::std::mem::size_of::<bidirectional_iterator_tag>() ,
1usize , concat ! (
"Size of: " , stringify ! ( bidirectional_iterator_tag
) ));
assert_eq! (::std::mem::align_of::<bidirectional_iterator_tag>() ,
1usize , concat ! (
"Alignment of " , stringify ! (
bidirectional_iterator_tag ) ));
}
impl Clone for bidirectional_iterator_tag {
fn clone(&self) -> Self { *self }
}
#[repr(C)]
#[derive(Debug, Copy)]
pub struct random_access_iterator_tag {
pub _address: u8,
}
#[test]
fn bindgen_test_layout_random_access_iterator_tag() {
assert_eq!(::std::mem::size_of::<random_access_iterator_tag>() ,
1usize , concat ! (
"Size of: " , stringify ! ( random_access_iterator_tag
) ));
assert_eq! (::std::mem::align_of::<random_access_iterator_tag>() ,
1usize , concat ! (
"Alignment of " , stringify ! (
random_access_iterator_tag ) ));
}
impl Clone for random_access_iterator_tag {
fn clone(&self) -> Self { *self }
}
#[repr(C)]
#[derive(Debug, Copy, Clone)]
pub struct iterator<_Category, _Tp, _Distance, _Pointer, _Reference> {
pub _address: u8,
@ -7925,209 +7864,250 @@ pub mod root {
pub _phantom_3: ::std::marker::PhantomData<_Pointer>,
pub _phantom_4: ::std::marker::PhantomData<_Reference>,
}
pub type iterator_iterator_category<_Category> = _Category;
pub type iterator_value_type<_Tp> = _Tp;
pub type iterator_difference_type<_Distance> = _Distance;
pub type iterator_pointer<_Pointer> = _Pointer;
pub type iterator_reference<_Reference> = _Reference;
pub type iterator_iterator_category<_Category> = _Category;
#[repr(C)]
#[derive(Debug, Copy, Clone)]
pub struct __bit_const_reference<_Cp> {
pub __seg_: root::std::__bit_const_reference___storage_pointer<_Cp>,
pub __mask_: root::std::__bit_const_reference___storage_type<_Cp>,
#[derive(Debug)]
pub struct atomic<_Tp> {
pub _M_i: _Tp,
}
pub mod chrono {
#[allow(unused_imports)]
use self::super::super::super::root;
}
pub type __bit_const_reference___storage_type<_Cp> = _Cp;
pub type __bit_const_reference___storage_pointer<_Cp> = _Cp;
}
pub type __int64_t = ::std::os::raw::c_longlong;
pub type __darwin_va_list = root::__builtin_va_list;
pub type __darwin_off_t = root::__int64_t;
pub type va_list = root::__darwin_va_list;
pub type fpos_t = root::__darwin_off_t;
pub mod __gnu_cxx {
#[allow(unused_imports)]
use self::super::super::root;
}
pub type __off_t = ::std::os::raw::c_long;
pub type __off64_t = ::std::os::raw::c_long;
#[repr(C)]
#[derive(Debug, Copy)]
pub struct __sbuf {
pub _base: *mut ::std::os::raw::c_uchar,
pub _size: ::std::os::raw::c_int,
pub struct _IO_FILE {
pub _flags: ::std::os::raw::c_int,
pub _IO_read_ptr: *mut ::std::os::raw::c_char,
pub _IO_read_end: *mut ::std::os::raw::c_char,
pub _IO_read_base: *mut ::std::os::raw::c_char,
pub _IO_write_base: *mut ::std::os::raw::c_char,
pub _IO_write_ptr: *mut ::std::os::raw::c_char,
pub _IO_write_end: *mut ::std::os::raw::c_char,
pub _IO_buf_base: *mut ::std::os::raw::c_char,
pub _IO_buf_end: *mut ::std::os::raw::c_char,
pub _IO_save_base: *mut ::std::os::raw::c_char,
pub _IO_backup_base: *mut ::std::os::raw::c_char,
pub _IO_save_end: *mut ::std::os::raw::c_char,
pub _markers: *mut root::_IO_marker,
pub _chain: *mut root::_IO_FILE,
pub _fileno: ::std::os::raw::c_int,
pub _flags2: ::std::os::raw::c_int,
pub _old_offset: root::__off_t,
pub _cur_column: ::std::os::raw::c_ushort,
pub _vtable_offset: ::std::os::raw::c_char,
pub _shortbuf: [::std::os::raw::c_char; 1usize],
pub _lock: *mut root::_IO_lock_t,
pub _offset: root::__off64_t,
pub __pad1: *mut ::std::os::raw::c_void,
pub __pad2: *mut ::std::os::raw::c_void,
pub __pad3: *mut ::std::os::raw::c_void,
pub __pad4: *mut ::std::os::raw::c_void,
pub __pad5: usize,
pub _mode: ::std::os::raw::c_int,
pub _unused2: [::std::os::raw::c_char; 20usize],
}
#[test]
fn bindgen_test_layout___sbuf() {
assert_eq!(::std::mem::size_of::<__sbuf>() , 16usize , concat ! (
"Size of: " , stringify ! ( __sbuf ) ));
assert_eq! (::std::mem::align_of::<__sbuf>() , 8usize , concat ! (
"Alignment of " , stringify ! ( __sbuf ) ));
fn bindgen_test_layout__IO_FILE() {
assert_eq!(::std::mem::size_of::<_IO_FILE>() , 216usize , concat ! (
"Size of: " , stringify ! ( _IO_FILE ) ));
assert_eq! (::std::mem::align_of::<_IO_FILE>() , 8usize , concat ! (
"Alignment of " , stringify ! ( _IO_FILE ) ));
assert_eq! (unsafe {
& ( * ( 0 as * const __sbuf ) ) . _base as * const _ as
& ( * ( 0 as * const _IO_FILE ) ) . _flags as * const _ as
usize } , 0usize , concat ! (
"Alignment of field: " , stringify ! ( __sbuf ) , "::" ,
stringify ! ( _base ) ));
assert_eq! (unsafe {
& ( * ( 0 as * const __sbuf ) ) . _size as * const _ as
usize } , 8usize , concat ! (
"Alignment of field: " , stringify ! ( __sbuf ) , "::" ,
stringify ! ( _size ) ));
}
impl Clone for __sbuf {
fn clone(&self) -> Self { *self }
}
#[repr(C)]
#[derive(Debug, Copy, Clone)]
pub struct __sFILEX([u8; 0]);
#[repr(C)]
#[derive(Debug, Copy)]
pub struct __sFILE {
pub _p: *mut ::std::os::raw::c_uchar,
pub _r: ::std::os::raw::c_int,
pub _w: ::std::os::raw::c_int,
pub _flags: ::std::os::raw::c_short,
pub _file: ::std::os::raw::c_short,
pub _bf: root::__sbuf,
pub _lbfsize: ::std::os::raw::c_int,
pub _cookie: *mut ::std::os::raw::c_void,
pub _close: ::std::option::Option<unsafe extern "C" fn(arg1:
*mut ::std::os::raw::c_void)
-> ::std::os::raw::c_int>,
pub _read: ::std::option::Option<unsafe extern "C" fn(arg1:
*mut ::std::os::raw::c_void,
arg2:
*mut ::std::os::raw::c_char,
arg3:
::std::os::raw::c_int)
-> ::std::os::raw::c_int>,
pub _seek: ::std::option::Option<unsafe extern "C" fn(arg1:
*mut ::std::os::raw::c_void,
arg2:
root::fpos_t,
arg3:
::std::os::raw::c_int)
-> ::std::os::raw::c_longlong>,
pub _write: ::std::option::Option<unsafe extern "C" fn(arg1:
*mut ::std::os::raw::c_void,
arg2:
*const ::std::os::raw::c_char,
arg3:
::std::os::raw::c_int)
-> ::std::os::raw::c_int>,
pub _ub: root::__sbuf,
pub _extra: *mut root::__sFILEX,
pub _ur: ::std::os::raw::c_int,
pub _ubuf: [::std::os::raw::c_uchar; 3usize],
pub _nbuf: [::std::os::raw::c_uchar; 1usize],
pub _lb: root::__sbuf,
pub _blksize: ::std::os::raw::c_int,
pub _offset: root::fpos_t,
}
#[test]
fn bindgen_test_layout___sFILE() {
assert_eq!(::std::mem::size_of::<__sFILE>() , 152usize , concat ! (
"Size of: " , stringify ! ( __sFILE ) ));
assert_eq! (::std::mem::align_of::<__sFILE>() , 8usize , concat ! (
"Alignment of " , stringify ! ( __sFILE ) ));
assert_eq! (unsafe {
& ( * ( 0 as * const __sFILE ) ) . _p as * const _ as
usize } , 0usize , concat ! (
"Alignment of field: " , stringify ! ( __sFILE ) , "::" ,
stringify ! ( _p ) ));
assert_eq! (unsafe {
& ( * ( 0 as * const __sFILE ) ) . _r as * const _ as
usize } , 8usize , concat ! (
"Alignment of field: " , stringify ! ( __sFILE ) , "::" ,
stringify ! ( _r ) ));
assert_eq! (unsafe {
& ( * ( 0 as * const __sFILE ) ) . _w as * const _ as
usize } , 12usize , concat ! (
"Alignment of field: " , stringify ! ( __sFILE ) , "::" ,
stringify ! ( _w ) ));
assert_eq! (unsafe {
& ( * ( 0 as * const __sFILE ) ) . _flags as * const _ as
usize } , 16usize , concat ! (
"Alignment of field: " , stringify ! ( __sFILE ) , "::" ,
"Alignment of field: " , stringify ! ( _IO_FILE ) , "::" ,
stringify ! ( _flags ) ));
assert_eq! (unsafe {
& ( * ( 0 as * const __sFILE ) ) . _file as * const _ as
usize } , 18usize , concat ! (
"Alignment of field: " , stringify ! ( __sFILE ) , "::" ,
stringify ! ( _file ) ));
& ( * ( 0 as * const _IO_FILE ) ) . _IO_read_ptr as *
const _ as usize } , 8usize , concat ! (
"Alignment of field: " , stringify ! ( _IO_FILE ) , "::" ,
stringify ! ( _IO_read_ptr ) ));
assert_eq! (unsafe {
& ( * ( 0 as * const __sFILE ) ) . _bf as * const _ as
usize } , 24usize , concat ! (
"Alignment of field: " , stringify ! ( __sFILE ) , "::" ,
stringify ! ( _bf ) ));
& ( * ( 0 as * const _IO_FILE ) ) . _IO_read_end as *
const _ as usize } , 16usize , concat ! (
"Alignment of field: " , stringify ! ( _IO_FILE ) , "::" ,
stringify ! ( _IO_read_end ) ));
assert_eq! (unsafe {
& ( * ( 0 as * const __sFILE ) ) . _lbfsize as * const _
as usize } , 40usize , concat ! (
"Alignment of field: " , stringify ! ( __sFILE ) , "::" ,
stringify ! ( _lbfsize ) ));
& ( * ( 0 as * const _IO_FILE ) ) . _IO_read_base as *
const _ as usize } , 24usize , concat ! (
"Alignment of field: " , stringify ! ( _IO_FILE ) , "::" ,
stringify ! ( _IO_read_base ) ));
assert_eq! (unsafe {
& ( * ( 0 as * const __sFILE ) ) . _cookie as * const _ as
usize } , 48usize , concat ! (
"Alignment of field: " , stringify ! ( __sFILE ) , "::" ,
stringify ! ( _cookie ) ));
& ( * ( 0 as * const _IO_FILE ) ) . _IO_write_base as *
const _ as usize } , 32usize , concat ! (
"Alignment of field: " , stringify ! ( _IO_FILE ) , "::" ,
stringify ! ( _IO_write_base ) ));
assert_eq! (unsafe {
& ( * ( 0 as * const __sFILE ) ) . _close as * const _ as
usize } , 56usize , concat ! (
"Alignment of field: " , stringify ! ( __sFILE ) , "::" ,
stringify ! ( _close ) ));
& ( * ( 0 as * const _IO_FILE ) ) . _IO_write_ptr as *
const _ as usize } , 40usize , concat ! (
"Alignment of field: " , stringify ! ( _IO_FILE ) , "::" ,
stringify ! ( _IO_write_ptr ) ));
assert_eq! (unsafe {
& ( * ( 0 as * const __sFILE ) ) . _read as * const _ as
usize } , 64usize , concat ! (
"Alignment of field: " , stringify ! ( __sFILE ) , "::" ,
stringify ! ( _read ) ));
& ( * ( 0 as * const _IO_FILE ) ) . _IO_write_end as *
const _ as usize } , 48usize , concat ! (
"Alignment of field: " , stringify ! ( _IO_FILE ) , "::" ,
stringify ! ( _IO_write_end ) ));
assert_eq! (unsafe {
& ( * ( 0 as * const __sFILE ) ) . _seek as * const _ as
usize } , 72usize , concat ! (
"Alignment of field: " , stringify ! ( __sFILE ) , "::" ,
stringify ! ( _seek ) ));
& ( * ( 0 as * const _IO_FILE ) ) . _IO_buf_base as *
const _ as usize } , 56usize , concat ! (
"Alignment of field: " , stringify ! ( _IO_FILE ) , "::" ,
stringify ! ( _IO_buf_base ) ));
assert_eq! (unsafe {
& ( * ( 0 as * const __sFILE ) ) . _write as * const _ as
usize } , 80usize , concat ! (
"Alignment of field: " , stringify ! ( __sFILE ) , "::" ,
stringify ! ( _write ) ));
& ( * ( 0 as * const _IO_FILE ) ) . _IO_buf_end as * const
_ as usize } , 64usize , concat ! (
"Alignment of field: " , stringify ! ( _IO_FILE ) , "::" ,
stringify ! ( _IO_buf_end ) ));
assert_eq! (unsafe {
& ( * ( 0 as * const __sFILE ) ) . _ub as * const _ as
usize } , 88usize , concat ! (
"Alignment of field: " , stringify ! ( __sFILE ) , "::" ,
stringify ! ( _ub ) ));
& ( * ( 0 as * const _IO_FILE ) ) . _IO_save_base as *
const _ as usize } , 72usize , concat ! (
"Alignment of field: " , stringify ! ( _IO_FILE ) , "::" ,
stringify ! ( _IO_save_base ) ));
assert_eq! (unsafe {
& ( * ( 0 as * const __sFILE ) ) . _extra as * const _ as
& ( * ( 0 as * const _IO_FILE ) ) . _IO_backup_base as *
const _ as usize } , 80usize , concat ! (
"Alignment of field: " , stringify ! ( _IO_FILE ) , "::" ,
stringify ! ( _IO_backup_base ) ));
assert_eq! (unsafe {
& ( * ( 0 as * const _IO_FILE ) ) . _IO_save_end as *
const _ as usize } , 88usize , concat ! (
"Alignment of field: " , stringify ! ( _IO_FILE ) , "::" ,
stringify ! ( _IO_save_end ) ));
assert_eq! (unsafe {
& ( * ( 0 as * const _IO_FILE ) ) . _markers as * const _
as usize } , 96usize , concat ! (
"Alignment of field: " , stringify ! ( _IO_FILE ) , "::" ,
stringify ! ( _markers ) ));
assert_eq! (unsafe {
& ( * ( 0 as * const _IO_FILE ) ) . _chain as * const _ as
usize } , 104usize , concat ! (
"Alignment of field: " , stringify ! ( __sFILE ) , "::" ,
stringify ! ( _extra ) ));
"Alignment of field: " , stringify ! ( _IO_FILE ) , "::" ,
stringify ! ( _chain ) ));
assert_eq! (unsafe {
& ( * ( 0 as * const __sFILE ) ) . _ur as * const _ as
usize } , 112usize , concat ! (
"Alignment of field: " , stringify ! ( __sFILE ) , "::" ,
stringify ! ( _ur ) ));
& ( * ( 0 as * const _IO_FILE ) ) . _fileno as * const _
as usize } , 112usize , concat ! (
"Alignment of field: " , stringify ! ( _IO_FILE ) , "::" ,
stringify ! ( _fileno ) ));
assert_eq! (unsafe {
& ( * ( 0 as * const __sFILE ) ) . _ubuf as * const _ as
usize } , 116usize , concat ! (
"Alignment of field: " , stringify ! ( __sFILE ) , "::" ,
stringify ! ( _ubuf ) ));
& ( * ( 0 as * const _IO_FILE ) ) . _flags2 as * const _
as usize } , 116usize , concat ! (
"Alignment of field: " , stringify ! ( _IO_FILE ) , "::" ,
stringify ! ( _flags2 ) ));
assert_eq! (unsafe {
& ( * ( 0 as * const __sFILE ) ) . _nbuf as * const _ as
usize } , 119usize , concat ! (
"Alignment of field: " , stringify ! ( __sFILE ) , "::" ,
stringify ! ( _nbuf ) ));
& ( * ( 0 as * const _IO_FILE ) ) . _old_offset as * const
_ as usize } , 120usize , concat ! (
"Alignment of field: " , stringify ! ( _IO_FILE ) , "::" ,
stringify ! ( _old_offset ) ));
assert_eq! (unsafe {
& ( * ( 0 as * const __sFILE ) ) . _lb as * const _ as
usize } , 120usize , concat ! (
"Alignment of field: " , stringify ! ( __sFILE ) , "::" ,
stringify ! ( _lb ) ));
& ( * ( 0 as * const _IO_FILE ) ) . _cur_column as * const
_ as usize } , 128usize , concat ! (
"Alignment of field: " , stringify ! ( _IO_FILE ) , "::" ,
stringify ! ( _cur_column ) ));
assert_eq! (unsafe {
& ( * ( 0 as * const __sFILE ) ) . _blksize as * const _
as usize } , 136usize , concat ! (
"Alignment of field: " , stringify ! ( __sFILE ) , "::" ,
stringify ! ( _blksize ) ));
& ( * ( 0 as * const _IO_FILE ) ) . _vtable_offset as *
const _ as usize } , 130usize , concat ! (
"Alignment of field: " , stringify ! ( _IO_FILE ) , "::" ,
stringify ! ( _vtable_offset ) ));
assert_eq! (unsafe {
& ( * ( 0 as * const __sFILE ) ) . _offset as * const _ as
usize } , 144usize , concat ! (
"Alignment of field: " , stringify ! ( __sFILE ) , "::" ,
& ( * ( 0 as * const _IO_FILE ) ) . _shortbuf as * const _
as usize } , 131usize , concat ! (
"Alignment of field: " , stringify ! ( _IO_FILE ) , "::" ,
stringify ! ( _shortbuf ) ));
assert_eq! (unsafe {
& ( * ( 0 as * const _IO_FILE ) ) . _lock as * const _ as
usize } , 136usize , concat ! (
"Alignment of field: " , stringify ! ( _IO_FILE ) , "::" ,
stringify ! ( _lock ) ));
assert_eq! (unsafe {
& ( * ( 0 as * const _IO_FILE ) ) . _offset as * const _
as usize } , 144usize , concat ! (
"Alignment of field: " , stringify ! ( _IO_FILE ) , "::" ,
stringify ! ( _offset ) ));
assert_eq! (unsafe {
& ( * ( 0 as * const _IO_FILE ) ) . __pad1 as * const _ as
usize } , 152usize , concat ! (
"Alignment of field: " , stringify ! ( _IO_FILE ) , "::" ,
stringify ! ( __pad1 ) ));
assert_eq! (unsafe {
& ( * ( 0 as * const _IO_FILE ) ) . __pad2 as * const _ as
usize } , 160usize , concat ! (
"Alignment of field: " , stringify ! ( _IO_FILE ) , "::" ,
stringify ! ( __pad2 ) ));
assert_eq! (unsafe {
& ( * ( 0 as * const _IO_FILE ) ) . __pad3 as * const _ as
usize } , 168usize , concat ! (
"Alignment of field: " , stringify ! ( _IO_FILE ) , "::" ,
stringify ! ( __pad3 ) ));
assert_eq! (unsafe {
& ( * ( 0 as * const _IO_FILE ) ) . __pad4 as * const _ as
usize } , 176usize , concat ! (
"Alignment of field: " , stringify ! ( _IO_FILE ) , "::" ,
stringify ! ( __pad4 ) ));
assert_eq! (unsafe {
& ( * ( 0 as * const _IO_FILE ) ) . __pad5 as * const _ as
usize } , 184usize , concat ! (
"Alignment of field: " , stringify ! ( _IO_FILE ) , "::" ,
stringify ! ( __pad5 ) ));
assert_eq! (unsafe {
& ( * ( 0 as * const _IO_FILE ) ) . _mode as * const _ as
usize } , 192usize , concat ! (
"Alignment of field: " , stringify ! ( _IO_FILE ) , "::" ,
stringify ! ( _mode ) ));
assert_eq! (unsafe {
& ( * ( 0 as * const _IO_FILE ) ) . _unused2 as * const _
as usize } , 196usize , concat ! (
"Alignment of field: " , stringify ! ( _IO_FILE ) , "::" ,
stringify ! ( _unused2 ) ));
}
impl Clone for __sFILE {
impl Clone for _IO_FILE {
fn clone(&self) -> Self { *self }
}
pub type FILE = root::_IO_FILE;
pub type va_list = root::__builtin_va_list;
pub type _IO_lock_t = ::std::os::raw::c_void;
#[repr(C)]
#[derive(Debug, Copy)]
pub struct _IO_marker {
pub _next: *mut root::_IO_marker,
pub _sbuf: *mut root::_IO_FILE,
pub _pos: ::std::os::raw::c_int,
}
#[test]
fn bindgen_test_layout__IO_marker() {
assert_eq!(::std::mem::size_of::<_IO_marker>() , 24usize , concat ! (
"Size of: " , stringify ! ( _IO_marker ) ));
assert_eq! (::std::mem::align_of::<_IO_marker>() , 8usize , concat ! (
"Alignment of " , stringify ! ( _IO_marker ) ));
assert_eq! (unsafe {
& ( * ( 0 as * const _IO_marker ) ) . _next as * const _
as usize } , 0usize , concat ! (
"Alignment of field: " , stringify ! ( _IO_marker ) , "::"
, stringify ! ( _next ) ));
assert_eq! (unsafe {
& ( * ( 0 as * const _IO_marker ) ) . _sbuf as * const _
as usize } , 8usize , concat ! (
"Alignment of field: " , stringify ! ( _IO_marker ) , "::"
, stringify ! ( _sbuf ) ));
assert_eq! (unsafe {
& ( * ( 0 as * const _IO_marker ) ) . _pos as * const _ as
usize } , 16usize , concat ! (
"Alignment of field: " , stringify ! ( _IO_marker ) , "::"
, stringify ! ( _pos ) ));
}
impl Clone for _IO_marker {
fn clone(&self) -> Self { *self }
}
pub type FILE = root::__sFILE;
/**
* MozRefCountType is Mozilla's reference count type.
*
@ -15334,63 +15314,63 @@ pub mod root {
#[repr(C)]
#[derive(Debug, Copy, Clone)]
pub struct nsDOMMutationObserver([u8; 0]);
pub const NODE_HAS_LISTENERMANAGER: root::_bindgen_ty_28 =
_bindgen_ty_28::NODE_HAS_LISTENERMANAGER;
pub const NODE_HAS_PROPERTIES: root::_bindgen_ty_28 =
_bindgen_ty_28::NODE_HAS_PROPERTIES;
pub const NODE_IS_ANONYMOUS_ROOT: root::_bindgen_ty_28 =
_bindgen_ty_28::NODE_IS_ANONYMOUS_ROOT;
pub const NODE_IS_IN_NATIVE_ANONYMOUS_SUBTREE: root::_bindgen_ty_28 =
_bindgen_ty_28::NODE_IS_IN_NATIVE_ANONYMOUS_SUBTREE;
pub const NODE_IS_NATIVE_ANONYMOUS_ROOT: root::_bindgen_ty_28 =
_bindgen_ty_28::NODE_IS_NATIVE_ANONYMOUS_ROOT;
pub const NODE_FORCE_XBL_BINDINGS: root::_bindgen_ty_28 =
_bindgen_ty_28::NODE_FORCE_XBL_BINDINGS;
pub const NODE_MAY_BE_IN_BINDING_MNGR: root::_bindgen_ty_28 =
_bindgen_ty_28::NODE_MAY_BE_IN_BINDING_MNGR;
pub const NODE_IS_EDITABLE: root::_bindgen_ty_28 =
_bindgen_ty_28::NODE_IS_EDITABLE;
pub const NODE_IS_NATIVE_ANONYMOUS: root::_bindgen_ty_28 =
_bindgen_ty_28::NODE_IS_NATIVE_ANONYMOUS;
pub const NODE_IS_IN_SHADOW_TREE: root::_bindgen_ty_28 =
_bindgen_ty_28::NODE_IS_IN_SHADOW_TREE;
pub const NODE_HAS_EMPTY_SELECTOR: root::_bindgen_ty_28 =
_bindgen_ty_28::NODE_HAS_EMPTY_SELECTOR;
pub const NODE_HAS_SLOW_SELECTOR: root::_bindgen_ty_28 =
_bindgen_ty_28::NODE_HAS_SLOW_SELECTOR;
pub const NODE_HAS_EDGE_CHILD_SELECTOR: root::_bindgen_ty_28 =
_bindgen_ty_28::NODE_HAS_EDGE_CHILD_SELECTOR;
pub const NODE_HAS_SLOW_SELECTOR_LATER_SIBLINGS: root::_bindgen_ty_28 =
_bindgen_ty_28::NODE_HAS_SLOW_SELECTOR_LATER_SIBLINGS;
pub const NODE_ALL_SELECTOR_FLAGS: root::_bindgen_ty_28 =
_bindgen_ty_28::NODE_ALL_SELECTOR_FLAGS;
pub const NODE_NEEDS_FRAME: root::_bindgen_ty_28 =
_bindgen_ty_28::NODE_NEEDS_FRAME;
pub const NODE_DESCENDANTS_NEED_FRAMES: root::_bindgen_ty_28 =
_bindgen_ty_28::NODE_DESCENDANTS_NEED_FRAMES;
pub const NODE_HAS_ACCESSKEY: root::_bindgen_ty_28 =
_bindgen_ty_28::NODE_HAS_ACCESSKEY;
pub const NODE_HAS_DIRECTION_RTL: root::_bindgen_ty_28 =
_bindgen_ty_28::NODE_HAS_DIRECTION_RTL;
pub const NODE_HAS_DIRECTION_LTR: root::_bindgen_ty_28 =
_bindgen_ty_28::NODE_HAS_DIRECTION_LTR;
pub const NODE_ALL_DIRECTION_FLAGS: root::_bindgen_ty_28 =
_bindgen_ty_28::NODE_ALL_DIRECTION_FLAGS;
pub const NODE_CHROME_ONLY_ACCESS: root::_bindgen_ty_28 =
_bindgen_ty_28::NODE_CHROME_ONLY_ACCESS;
pub const NODE_IS_ROOT_OF_CHROME_ONLY_ACCESS: root::_bindgen_ty_28 =
_bindgen_ty_28::NODE_IS_ROOT_OF_CHROME_ONLY_ACCESS;
pub const NODE_SHARED_RESTYLE_BIT_1: root::_bindgen_ty_28 =
_bindgen_ty_28::NODE_SHARED_RESTYLE_BIT_1;
pub const NODE_SHARED_RESTYLE_BIT_2: root::_bindgen_ty_28 =
_bindgen_ty_28::NODE_SHARED_RESTYLE_BIT_2;
pub const NODE_HAS_DIRTY_DESCENDANTS_FOR_SERVO: root::_bindgen_ty_28 =
_bindgen_ty_28::NODE_SHARED_RESTYLE_BIT_1;
pub const NODE_TYPE_SPECIFIC_BITS_OFFSET: root::_bindgen_ty_28 =
_bindgen_ty_28::NODE_TYPE_SPECIFIC_BITS_OFFSET;
pub const NODE_HAS_LISTENERMANAGER: root::_bindgen_ty_118 =
_bindgen_ty_118::NODE_HAS_LISTENERMANAGER;
pub const NODE_HAS_PROPERTIES: root::_bindgen_ty_118 =
_bindgen_ty_118::NODE_HAS_PROPERTIES;
pub const NODE_IS_ANONYMOUS_ROOT: root::_bindgen_ty_118 =
_bindgen_ty_118::NODE_IS_ANONYMOUS_ROOT;
pub const NODE_IS_IN_NATIVE_ANONYMOUS_SUBTREE: root::_bindgen_ty_118 =
_bindgen_ty_118::NODE_IS_IN_NATIVE_ANONYMOUS_SUBTREE;
pub const NODE_IS_NATIVE_ANONYMOUS_ROOT: root::_bindgen_ty_118 =
_bindgen_ty_118::NODE_IS_NATIVE_ANONYMOUS_ROOT;
pub const NODE_FORCE_XBL_BINDINGS: root::_bindgen_ty_118 =
_bindgen_ty_118::NODE_FORCE_XBL_BINDINGS;
pub const NODE_MAY_BE_IN_BINDING_MNGR: root::_bindgen_ty_118 =
_bindgen_ty_118::NODE_MAY_BE_IN_BINDING_MNGR;
pub const NODE_IS_EDITABLE: root::_bindgen_ty_118 =
_bindgen_ty_118::NODE_IS_EDITABLE;
pub const NODE_IS_NATIVE_ANONYMOUS: root::_bindgen_ty_118 =
_bindgen_ty_118::NODE_IS_NATIVE_ANONYMOUS;
pub const NODE_IS_IN_SHADOW_TREE: root::_bindgen_ty_118 =
_bindgen_ty_118::NODE_IS_IN_SHADOW_TREE;
pub const NODE_HAS_EMPTY_SELECTOR: root::_bindgen_ty_118 =
_bindgen_ty_118::NODE_HAS_EMPTY_SELECTOR;
pub const NODE_HAS_SLOW_SELECTOR: root::_bindgen_ty_118 =
_bindgen_ty_118::NODE_HAS_SLOW_SELECTOR;
pub const NODE_HAS_EDGE_CHILD_SELECTOR: root::_bindgen_ty_118 =
_bindgen_ty_118::NODE_HAS_EDGE_CHILD_SELECTOR;
pub const NODE_HAS_SLOW_SELECTOR_LATER_SIBLINGS: root::_bindgen_ty_118 =
_bindgen_ty_118::NODE_HAS_SLOW_SELECTOR_LATER_SIBLINGS;
pub const NODE_ALL_SELECTOR_FLAGS: root::_bindgen_ty_118 =
_bindgen_ty_118::NODE_ALL_SELECTOR_FLAGS;
pub const NODE_NEEDS_FRAME: root::_bindgen_ty_118 =
_bindgen_ty_118::NODE_NEEDS_FRAME;
pub const NODE_DESCENDANTS_NEED_FRAMES: root::_bindgen_ty_118 =
_bindgen_ty_118::NODE_DESCENDANTS_NEED_FRAMES;
pub const NODE_HAS_ACCESSKEY: root::_bindgen_ty_118 =
_bindgen_ty_118::NODE_HAS_ACCESSKEY;
pub const NODE_HAS_DIRECTION_RTL: root::_bindgen_ty_118 =
_bindgen_ty_118::NODE_HAS_DIRECTION_RTL;
pub const NODE_HAS_DIRECTION_LTR: root::_bindgen_ty_118 =
_bindgen_ty_118::NODE_HAS_DIRECTION_LTR;
pub const NODE_ALL_DIRECTION_FLAGS: root::_bindgen_ty_118 =
_bindgen_ty_118::NODE_ALL_DIRECTION_FLAGS;
pub const NODE_CHROME_ONLY_ACCESS: root::_bindgen_ty_118 =
_bindgen_ty_118::NODE_CHROME_ONLY_ACCESS;
pub const NODE_IS_ROOT_OF_CHROME_ONLY_ACCESS: root::_bindgen_ty_118 =
_bindgen_ty_118::NODE_IS_ROOT_OF_CHROME_ONLY_ACCESS;
pub const NODE_SHARED_RESTYLE_BIT_1: root::_bindgen_ty_118 =
_bindgen_ty_118::NODE_SHARED_RESTYLE_BIT_1;
pub const NODE_SHARED_RESTYLE_BIT_2: root::_bindgen_ty_118 =
_bindgen_ty_118::NODE_SHARED_RESTYLE_BIT_2;
pub const NODE_HAS_DIRTY_DESCENDANTS_FOR_SERVO: root::_bindgen_ty_118 =
_bindgen_ty_118::NODE_SHARED_RESTYLE_BIT_1;
pub const NODE_TYPE_SPECIFIC_BITS_OFFSET: root::_bindgen_ty_118 =
_bindgen_ty_118::NODE_TYPE_SPECIFIC_BITS_OFFSET;
#[repr(u32)]
#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
pub enum _bindgen_ty_28 {
pub enum _bindgen_ty_118 {
NODE_HAS_LISTENERMANAGER = 4,
NODE_HAS_PROPERTIES = 8,
NODE_IS_ANONYMOUS_ROOT = 16,
@ -20169,6 +20149,21 @@ pub mod root {
eCSSTokenSerialization_Symbol_Asterisk = 23,
eCSSTokenSerialization_Other = 24,
}
/**
* An array of objects, similar to AutoTArray<T,1> but which is memmovable. It
* always has length >= 1.
*/
#[repr(C)]
#[derive(Debug)]
pub struct nsStyleAutoArray<T> {
pub mFirstElement: T,
pub mOtherElements: root::nsTArray<T>,
}
#[repr(i32)]
#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
pub enum nsStyleAutoArray_WithSingleInitialElement {
WITH_SINGLE_INITIAL_ELEMENT = 0,
}
#[repr(C)]
#[derive(Debug, Copy, Clone)]
pub struct nsCSSSelector([u8; 0]);
@ -22577,21 +22572,6 @@ pub mod root {
"Alignment of field: " , stringify ! ( nsStyleColor ) ,
"::" , stringify ! ( mColor ) ));
}
/**
* An array of objects, similar to AutoTArray<T,1> but which is memmovable. It
* always has length >= 1.
*/
#[repr(C)]
#[derive(Debug)]
pub struct nsStyleAutoArray<T> {
pub mFirstElement: T,
pub mOtherElements: root::nsTArray<T>,
}
#[repr(i32)]
#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
pub enum nsStyleAutoArray_WithSingleInitialElement {
WITH_SINGLE_INITIAL_ELEMENT = 0,
}
#[repr(C)]
#[derive(Debug)]
pub struct nsStyleImageLayers {
@ -25510,6 +25490,8 @@ pub mod root {
root::nsTArray<root::mozilla::PropertyStyleAnimationValuePair>;
pub type RawServoAnimationValueBorrowedList =
root::nsTArray<*const root::RawServoAnimationValue>;
pub type RawGeckoStyleAnimationList =
root::nsStyleAutoArray<root::mozilla::StyleAnimation>;
pub type RawGeckoNodeBorrowed = *const root::RawGeckoNode;
pub type RawGeckoNodeBorrowedOrNull = *const root::RawGeckoNode;
pub type RawGeckoElementBorrowed = *const root::RawGeckoElement;
@ -25528,6 +25510,8 @@ pub mod root {
pub type RawGeckoKeyframeListBorrowed = *const root::RawGeckoKeyframeList;
pub type RawGeckoComputedKeyframeValuesListBorrowedMut =
*mut root::RawGeckoComputedKeyframeValuesList;
pub type RawGeckoStyleAnimationListBorrowed =
*const root::RawGeckoStyleAnimationList;
#[repr(C)]
#[derive(Debug, Copy, Clone)]
pub struct ElementRuleProcessorData([u8; 0]);

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

@ -5884,7 +5884,7 @@ pub mod root {
UnstyledChildrenOnly = 1,
}
pub type CSSPseudoElementTypeBase = u8;
pub const CSSPseudoElementType_AnonBox:
pub const CSSPseudoElementType_InheritingAnonBox:
root::mozilla::CSSPseudoElementType =
CSSPseudoElementType::Count;
#[repr(u8)]
@ -5915,9 +5915,10 @@ pub mod root {
placeholder = 22,
mozColorSwatch = 23,
Count = 24,
XULTree = 25,
NotPseudo = 26,
MAX = 27,
NonInheritingAnonBox = 25,
XULTree = 26,
NotPseudo = 27,
MAX = 28,
}
pub mod widget {
#[allow(unused_imports)]
@ -7649,12 +7650,6 @@ pub mod root {
pub type pair_first_type<_T1> = _T1;
pub type pair_second_type<_T2> = _T2;
#[repr(C)]
pub struct atomic<_Tp> {
pub _base: (),
pub _phantom_0: ::std::marker::PhantomData<_Tp>,
}
pub type atomic___base = [u8; 0usize];
#[repr(C)]
#[derive(Debug, Copy)]
pub struct input_iterator_tag {
pub _address: u8,
@ -7673,62 +7668,6 @@ pub mod root {
fn clone(&self) -> Self { *self }
}
#[repr(C)]
#[derive(Debug, Copy)]
pub struct forward_iterator_tag {
pub _address: u8,
}
#[test]
fn bindgen_test_layout_forward_iterator_tag() {
assert_eq!(::std::mem::size_of::<forward_iterator_tag>() , 1usize
, concat ! (
"Size of: " , stringify ! ( forward_iterator_tag ) ));
assert_eq! (::std::mem::align_of::<forward_iterator_tag>() ,
1usize , concat ! (
"Alignment of " , stringify ! ( forward_iterator_tag )
));
}
impl Clone for forward_iterator_tag {
fn clone(&self) -> Self { *self }
}
#[repr(C)]
#[derive(Debug, Copy)]
pub struct bidirectional_iterator_tag {
pub _address: u8,
}
#[test]
fn bindgen_test_layout_bidirectional_iterator_tag() {
assert_eq!(::std::mem::size_of::<bidirectional_iterator_tag>() ,
1usize , concat ! (
"Size of: " , stringify ! ( bidirectional_iterator_tag
) ));
assert_eq! (::std::mem::align_of::<bidirectional_iterator_tag>() ,
1usize , concat ! (
"Alignment of " , stringify ! (
bidirectional_iterator_tag ) ));
}
impl Clone for bidirectional_iterator_tag {
fn clone(&self) -> Self { *self }
}
#[repr(C)]
#[derive(Debug, Copy)]
pub struct random_access_iterator_tag {
pub _address: u8,
}
#[test]
fn bindgen_test_layout_random_access_iterator_tag() {
assert_eq!(::std::mem::size_of::<random_access_iterator_tag>() ,
1usize , concat ! (
"Size of: " , stringify ! ( random_access_iterator_tag
) ));
assert_eq! (::std::mem::align_of::<random_access_iterator_tag>() ,
1usize , concat ! (
"Alignment of " , stringify ! (
random_access_iterator_tag ) ));
}
impl Clone for random_access_iterator_tag {
fn clone(&self) -> Self { *self }
}
#[repr(C)]
#[derive(Debug, Copy, Clone)]
pub struct iterator<_Category, _Tp, _Distance, _Pointer, _Reference> {
pub _address: u8,
@ -7738,22 +7677,22 @@ pub mod root {
pub _phantom_3: ::std::marker::PhantomData<_Pointer>,
pub _phantom_4: ::std::marker::PhantomData<_Reference>,
}
pub type iterator_iterator_category<_Category> = _Category;
pub type iterator_value_type<_Tp> = _Tp;
pub type iterator_difference_type<_Distance> = _Distance;
pub type iterator_pointer<_Pointer> = _Pointer;
pub type iterator_reference<_Reference> = _Reference;
pub type iterator_iterator_category<_Category> = _Category;
#[repr(C)]
#[derive(Debug, Copy, Clone)]
pub struct __bit_const_reference<_Cp> {
pub __seg_: root::std::__bit_const_reference___storage_pointer<_Cp>,
pub __mask_: root::std::__bit_const_reference___storage_type<_Cp>,
#[derive(Debug)]
pub struct atomic<_Tp> {
pub _M_i: _Tp,
}
pub type __bit_const_reference___storage_type<_Cp> = _Cp;
pub type __bit_const_reference___storage_pointer<_Cp> = _Cp;
}
pub type __darwin_va_list = root::__builtin_va_list;
pub type va_list = root::__darwin_va_list;
pub mod __gnu_cxx {
#[allow(unused_imports)]
use self::super::super::root;
}
pub type va_list = root::__builtin_va_list;
/**
* MozRefCountType is Mozilla's reference count type.
*
@ -14802,63 +14741,63 @@ pub mod root {
#[repr(C)]
#[derive(Debug, Copy, Clone)]
pub struct nsDOMMutationObserver([u8; 0]);
pub const NODE_HAS_LISTENERMANAGER: root::_bindgen_ty_28 =
_bindgen_ty_28::NODE_HAS_LISTENERMANAGER;
pub const NODE_HAS_PROPERTIES: root::_bindgen_ty_28 =
_bindgen_ty_28::NODE_HAS_PROPERTIES;
pub const NODE_IS_ANONYMOUS_ROOT: root::_bindgen_ty_28 =
_bindgen_ty_28::NODE_IS_ANONYMOUS_ROOT;
pub const NODE_IS_IN_NATIVE_ANONYMOUS_SUBTREE: root::_bindgen_ty_28 =
_bindgen_ty_28::NODE_IS_IN_NATIVE_ANONYMOUS_SUBTREE;
pub const NODE_IS_NATIVE_ANONYMOUS_ROOT: root::_bindgen_ty_28 =
_bindgen_ty_28::NODE_IS_NATIVE_ANONYMOUS_ROOT;
pub const NODE_FORCE_XBL_BINDINGS: root::_bindgen_ty_28 =
_bindgen_ty_28::NODE_FORCE_XBL_BINDINGS;
pub const NODE_MAY_BE_IN_BINDING_MNGR: root::_bindgen_ty_28 =
_bindgen_ty_28::NODE_MAY_BE_IN_BINDING_MNGR;
pub const NODE_IS_EDITABLE: root::_bindgen_ty_28 =
_bindgen_ty_28::NODE_IS_EDITABLE;
pub const NODE_IS_NATIVE_ANONYMOUS: root::_bindgen_ty_28 =
_bindgen_ty_28::NODE_IS_NATIVE_ANONYMOUS;
pub const NODE_IS_IN_SHADOW_TREE: root::_bindgen_ty_28 =
_bindgen_ty_28::NODE_IS_IN_SHADOW_TREE;
pub const NODE_HAS_EMPTY_SELECTOR: root::_bindgen_ty_28 =
_bindgen_ty_28::NODE_HAS_EMPTY_SELECTOR;
pub const NODE_HAS_SLOW_SELECTOR: root::_bindgen_ty_28 =
_bindgen_ty_28::NODE_HAS_SLOW_SELECTOR;
pub const NODE_HAS_EDGE_CHILD_SELECTOR: root::_bindgen_ty_28 =
_bindgen_ty_28::NODE_HAS_EDGE_CHILD_SELECTOR;
pub const NODE_HAS_SLOW_SELECTOR_LATER_SIBLINGS: root::_bindgen_ty_28 =
_bindgen_ty_28::NODE_HAS_SLOW_SELECTOR_LATER_SIBLINGS;
pub const NODE_ALL_SELECTOR_FLAGS: root::_bindgen_ty_28 =
_bindgen_ty_28::NODE_ALL_SELECTOR_FLAGS;
pub const NODE_NEEDS_FRAME: root::_bindgen_ty_28 =
_bindgen_ty_28::NODE_NEEDS_FRAME;
pub const NODE_DESCENDANTS_NEED_FRAMES: root::_bindgen_ty_28 =
_bindgen_ty_28::NODE_DESCENDANTS_NEED_FRAMES;
pub const NODE_HAS_ACCESSKEY: root::_bindgen_ty_28 =
_bindgen_ty_28::NODE_HAS_ACCESSKEY;
pub const NODE_HAS_DIRECTION_RTL: root::_bindgen_ty_28 =
_bindgen_ty_28::NODE_HAS_DIRECTION_RTL;
pub const NODE_HAS_DIRECTION_LTR: root::_bindgen_ty_28 =
_bindgen_ty_28::NODE_HAS_DIRECTION_LTR;
pub const NODE_ALL_DIRECTION_FLAGS: root::_bindgen_ty_28 =
_bindgen_ty_28::NODE_ALL_DIRECTION_FLAGS;
pub const NODE_CHROME_ONLY_ACCESS: root::_bindgen_ty_28 =
_bindgen_ty_28::NODE_CHROME_ONLY_ACCESS;
pub const NODE_IS_ROOT_OF_CHROME_ONLY_ACCESS: root::_bindgen_ty_28 =
_bindgen_ty_28::NODE_IS_ROOT_OF_CHROME_ONLY_ACCESS;
pub const NODE_SHARED_RESTYLE_BIT_1: root::_bindgen_ty_28 =
_bindgen_ty_28::NODE_SHARED_RESTYLE_BIT_1;
pub const NODE_SHARED_RESTYLE_BIT_2: root::_bindgen_ty_28 =
_bindgen_ty_28::NODE_SHARED_RESTYLE_BIT_2;
pub const NODE_HAS_DIRTY_DESCENDANTS_FOR_SERVO: root::_bindgen_ty_28 =
_bindgen_ty_28::NODE_SHARED_RESTYLE_BIT_1;
pub const NODE_TYPE_SPECIFIC_BITS_OFFSET: root::_bindgen_ty_28 =
_bindgen_ty_28::NODE_TYPE_SPECIFIC_BITS_OFFSET;
pub const NODE_HAS_LISTENERMANAGER: root::_bindgen_ty_105 =
_bindgen_ty_105::NODE_HAS_LISTENERMANAGER;
pub const NODE_HAS_PROPERTIES: root::_bindgen_ty_105 =
_bindgen_ty_105::NODE_HAS_PROPERTIES;
pub const NODE_IS_ANONYMOUS_ROOT: root::_bindgen_ty_105 =
_bindgen_ty_105::NODE_IS_ANONYMOUS_ROOT;
pub const NODE_IS_IN_NATIVE_ANONYMOUS_SUBTREE: root::_bindgen_ty_105 =
_bindgen_ty_105::NODE_IS_IN_NATIVE_ANONYMOUS_SUBTREE;
pub const NODE_IS_NATIVE_ANONYMOUS_ROOT: root::_bindgen_ty_105 =
_bindgen_ty_105::NODE_IS_NATIVE_ANONYMOUS_ROOT;
pub const NODE_FORCE_XBL_BINDINGS: root::_bindgen_ty_105 =
_bindgen_ty_105::NODE_FORCE_XBL_BINDINGS;
pub const NODE_MAY_BE_IN_BINDING_MNGR: root::_bindgen_ty_105 =
_bindgen_ty_105::NODE_MAY_BE_IN_BINDING_MNGR;
pub const NODE_IS_EDITABLE: root::_bindgen_ty_105 =
_bindgen_ty_105::NODE_IS_EDITABLE;
pub const NODE_IS_NATIVE_ANONYMOUS: root::_bindgen_ty_105 =
_bindgen_ty_105::NODE_IS_NATIVE_ANONYMOUS;
pub const NODE_IS_IN_SHADOW_TREE: root::_bindgen_ty_105 =
_bindgen_ty_105::NODE_IS_IN_SHADOW_TREE;
pub const NODE_HAS_EMPTY_SELECTOR: root::_bindgen_ty_105 =
_bindgen_ty_105::NODE_HAS_EMPTY_SELECTOR;
pub const NODE_HAS_SLOW_SELECTOR: root::_bindgen_ty_105 =
_bindgen_ty_105::NODE_HAS_SLOW_SELECTOR;
pub const NODE_HAS_EDGE_CHILD_SELECTOR: root::_bindgen_ty_105 =
_bindgen_ty_105::NODE_HAS_EDGE_CHILD_SELECTOR;
pub const NODE_HAS_SLOW_SELECTOR_LATER_SIBLINGS: root::_bindgen_ty_105 =
_bindgen_ty_105::NODE_HAS_SLOW_SELECTOR_LATER_SIBLINGS;
pub const NODE_ALL_SELECTOR_FLAGS: root::_bindgen_ty_105 =
_bindgen_ty_105::NODE_ALL_SELECTOR_FLAGS;
pub const NODE_NEEDS_FRAME: root::_bindgen_ty_105 =
_bindgen_ty_105::NODE_NEEDS_FRAME;
pub const NODE_DESCENDANTS_NEED_FRAMES: root::_bindgen_ty_105 =
_bindgen_ty_105::NODE_DESCENDANTS_NEED_FRAMES;
pub const NODE_HAS_ACCESSKEY: root::_bindgen_ty_105 =
_bindgen_ty_105::NODE_HAS_ACCESSKEY;
pub const NODE_HAS_DIRECTION_RTL: root::_bindgen_ty_105 =
_bindgen_ty_105::NODE_HAS_DIRECTION_RTL;
pub const NODE_HAS_DIRECTION_LTR: root::_bindgen_ty_105 =
_bindgen_ty_105::NODE_HAS_DIRECTION_LTR;
pub const NODE_ALL_DIRECTION_FLAGS: root::_bindgen_ty_105 =
_bindgen_ty_105::NODE_ALL_DIRECTION_FLAGS;
pub const NODE_CHROME_ONLY_ACCESS: root::_bindgen_ty_105 =
_bindgen_ty_105::NODE_CHROME_ONLY_ACCESS;
pub const NODE_IS_ROOT_OF_CHROME_ONLY_ACCESS: root::_bindgen_ty_105 =
_bindgen_ty_105::NODE_IS_ROOT_OF_CHROME_ONLY_ACCESS;
pub const NODE_SHARED_RESTYLE_BIT_1: root::_bindgen_ty_105 =
_bindgen_ty_105::NODE_SHARED_RESTYLE_BIT_1;
pub const NODE_SHARED_RESTYLE_BIT_2: root::_bindgen_ty_105 =
_bindgen_ty_105::NODE_SHARED_RESTYLE_BIT_2;
pub const NODE_HAS_DIRTY_DESCENDANTS_FOR_SERVO: root::_bindgen_ty_105 =
_bindgen_ty_105::NODE_SHARED_RESTYLE_BIT_1;
pub const NODE_TYPE_SPECIFIC_BITS_OFFSET: root::_bindgen_ty_105 =
_bindgen_ty_105::NODE_TYPE_SPECIFIC_BITS_OFFSET;
#[repr(u32)]
#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
pub enum _bindgen_ty_28 {
pub enum _bindgen_ty_105 {
NODE_HAS_LISTENERMANAGER = 4,
NODE_HAS_PROPERTIES = 8,
NODE_IS_ANONYMOUS_ROOT = 16,
@ -19569,6 +19508,21 @@ pub mod root {
eCSSTokenSerialization_Symbol_Asterisk = 23,
eCSSTokenSerialization_Other = 24,
}
/**
* An array of objects, similar to AutoTArray<T,1> but which is memmovable. It
* always has length >= 1.
*/
#[repr(C)]
#[derive(Debug)]
pub struct nsStyleAutoArray<T> {
pub mFirstElement: T,
pub mOtherElements: root::nsTArray<T>,
}
#[repr(i32)]
#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
pub enum nsStyleAutoArray_WithSingleInitialElement {
WITH_SINGLE_INITIAL_ELEMENT = 0,
}
#[repr(C)]
#[derive(Debug, Copy, Clone)]
pub struct nsCSSSelector([u8; 0]);
@ -21976,21 +21930,6 @@ pub mod root {
"Alignment of field: " , stringify ! ( nsStyleColor ) ,
"::" , stringify ! ( mColor ) ));
}
/**
* An array of objects, similar to AutoTArray<T,1> but which is memmovable. It
* always has length >= 1.
*/
#[repr(C)]
#[derive(Debug)]
pub struct nsStyleAutoArray<T> {
pub mFirstElement: T,
pub mOtherElements: root::nsTArray<T>,
}
#[repr(i32)]
#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
pub enum nsStyleAutoArray_WithSingleInitialElement {
WITH_SINGLE_INITIAL_ELEMENT = 0,
}
#[repr(C)]
#[derive(Debug)]
pub struct nsStyleImageLayers {
@ -24909,6 +24848,8 @@ pub mod root {
root::nsTArray<root::mozilla::PropertyStyleAnimationValuePair>;
pub type RawServoAnimationValueBorrowedList =
root::nsTArray<*const root::RawServoAnimationValue>;
pub type RawGeckoStyleAnimationList =
root::nsStyleAutoArray<root::mozilla::StyleAnimation>;
pub type RawGeckoNodeBorrowed = *const root::RawGeckoNode;
pub type RawGeckoNodeBorrowedOrNull = *const root::RawGeckoNode;
pub type RawGeckoElementBorrowed = *const root::RawGeckoElement;
@ -24927,6 +24868,8 @@ pub mod root {
pub type RawGeckoKeyframeListBorrowed = *const root::RawGeckoKeyframeList;
pub type RawGeckoComputedKeyframeValuesListBorrowedMut =
*mut root::RawGeckoComputedKeyframeValuesList;
pub type RawGeckoStyleAnimationListBorrowed =
*const root::RawGeckoStyleAnimationList;
#[repr(C)]
#[derive(Debug, Copy, Clone)]
pub struct ElementRuleProcessorData([u8; 0]);

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

@ -556,13 +556,12 @@ trait PrivateMatchMethods: TElement {
/// Computes values and damage for the primary or pseudo style of an element,
/// setting them on the ElementData.
fn cascade_primary_or_pseudo<'a>(&self,
context: &StyleContext<Self>,
context: &mut StyleContext<Self>,
data: &mut ElementData,
pseudo: Option<&PseudoElement>,
possibly_expired_animations: &mut Vec<PropertyAnimation>,
booleans: CascadeBooleans) {
// Collect some values.
let shared_context = context.shared;
let (mut styles, restyle) = data.styles_and_restyle_mut();
let mut primary_style = &mut styles.primary;
let pseudos = &mut styles.pseudos;
@ -575,31 +574,12 @@ trait PrivateMatchMethods: TElement {
&mut pseudo_style, &booleans);
// Handle animations.
if booleans.animate && cfg!(feature = "servo") {
if let Some(ref mut old) = old_values {
self.update_animations_for_cascade(shared_context, old,
possibly_expired_animations);
}
let new_animations_sender = &context.thread_local.new_animations_sender;
let this_opaque = self.as_node().opaque();
// Trigger any present animations if necessary.
animation::maybe_start_animations(&shared_context,
new_animations_sender,
this_opaque, &new_values);
// Trigger transitions if necessary. This will reset `new_values` back
// to its old value if it did trigger a transition.
if let Some(ref values) = old_values {
animation::start_transitions_if_applicable(
new_animations_sender,
this_opaque,
self.as_node().to_unsafe(),
&**values,
&mut new_values,
&shared_context.timer,
&possibly_expired_animations);
}
if booleans.animate {
self.process_animations(context,
&mut old_values,
&mut new_values,
pseudo,
possibly_expired_animations);
}
// Accumulate restyle damage.
@ -615,6 +595,73 @@ trait PrivateMatchMethods: TElement {
}
}
#[cfg(feature = "gecko")]
fn process_animations(&self,
context: &mut StyleContext<Self>,
old_values: &mut Option<Arc<ComputedValues>>,
new_values: &mut Arc<ComputedValues>,
pseudo: Option<&PseudoElement>,
_possibly_expired_animations: &mut Vec<PropertyAnimation>) {
let ref new_box_style = new_values.get_box();
let has_new_animation_style = new_box_style.animation_name_count() >= 1 &&
new_box_style.animation_name_at(0).0.len() != 0;
let has_animations = self.has_css_animations(pseudo);
let needs_update_animations =
old_values.as_ref().map_or(has_new_animation_style, |ref old| {
let ref old_box_style = old.get_box();
let old_display_style = old_box_style.clone_display();
let new_display_style = new_box_style.clone_display();
// FIXME: Bug 1344581: We still need to compare keyframe rules.
!old_box_style.animations_equals(&new_box_style) ||
(old_display_style == display::T::none &&
new_display_style != display::T::none &&
has_new_animation_style) ||
(old_display_style != display::T::none &&
new_display_style == display::T::none &&
has_animations)
});
if needs_update_animations {
let task = SequentialTask::update_animations(self.as_node().as_element().unwrap(),
pseudo.cloned());
context.thread_local.tasks.push(task);
}
}
#[cfg(feature = "servo")]
fn process_animations(&self,
context: &mut StyleContext<Self>,
old_values: &mut Option<Arc<ComputedValues>>,
new_values: &mut Arc<ComputedValues>,
_pseudo: Option<&PseudoElement>,
possibly_expired_animations: &mut Vec<PropertyAnimation>) {
let shared_context = context.shared;
if let Some(ref mut old) = *old_values {
self.update_animations_for_cascade(shared_context, old,
possibly_expired_animations);
}
let new_animations_sender = &context.thread_local.new_animations_sender;
let this_opaque = self.as_node().opaque();
// Trigger any present animations if necessary.
animation::maybe_start_animations(&shared_context,
new_animations_sender,
this_opaque, &new_values);
// Trigger transitions if necessary. This will reset `new_values` back
// to its old value if it did trigger a transition.
if let Some(ref values) = *old_values {
animation::start_transitions_if_applicable(
new_animations_sender,
this_opaque,
self.as_node().to_unsafe(),
&**values,
new_values,
&shared_context.timer,
&possibly_expired_animations);
}
}
/// Computes and applies non-redundant damage.
#[cfg(feature = "gecko")]
fn accumulate_damage(&self,
@ -1010,7 +1057,7 @@ pub trait MatchMethods : TElement {
/// Run the CSS cascade and compute values for the element, potentially
/// starting any new transitions or animations.
fn cascade_element(&self,
context: &StyleContext<Self>,
context: &mut StyleContext<Self>,
mut data: &mut AtomicRefMut<ElementData>,
primary_is_shareable: bool)
{

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

@ -1795,6 +1795,10 @@ fn static_assert() {
}
${impl_transition_count('property', 'Property')}
pub fn animations_equals(&self, other: &Self) -> bool {
unsafe { bindings::Gecko_StyleAnimationsEquals(&self.gecko.mAnimations, &other.gecko.mAnimations) }
}
pub fn set_animation_name(&mut self, v: longhands::animation_name::computed_value::T) {
use nsstring::nsCString;

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

@ -1431,7 +1431,7 @@ pub extern "C" fn Servo_StyleSet_FillKeyframesForName(raw_data: RawServoStyleSet
use style::gecko_bindings::structs::Keyframe;
use style::properties::LonghandIdSet;
let data = PerDocumentStyleData::from_ffi(raw_data).borrow_mut();
let data = PerDocumentStyleData::from_ffi(raw_data).borrow();
let name = unsafe { Atom::from(name.as_ref().unwrap().as_str_unchecked()) };
let style_timing_function = unsafe { timing_function.as_ref().unwrap() };
let style = ComputedValues::as_arc(&style);