diff --git a/ports/geckolib/Cargo.lock b/ports/geckolib/Cargo.lock index 51d8938dc20..6441e0322f6 100644 --- a/ports/geckolib/Cargo.lock +++ b/ports/geckolib/Cargo.lock @@ -6,6 +6,7 @@ dependencies = [ "cssparser 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)", "env_logger 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", "euclid 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)", + "gecko_bindings 0.0.1", "heapsize 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", "heapsize_plugin 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -223,6 +224,13 @@ name = "gcc" version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "gecko_bindings" +version = "0.0.1" +dependencies = [ + "heapsize 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "getopts" version = "0.2.14" diff --git a/ports/geckolib/Cargo.toml b/ports/geckolib/Cargo.toml index 7ef5872c248..d7d0fe816b6 100644 --- a/ports/geckolib/Cargo.toml +++ b/ports/geckolib/Cargo.toml @@ -14,6 +14,7 @@ crate-type = ["staticlib"] app_units = "0.2.3" cssparser = "0.5.4" euclid = "0.6.4" +gecko_bindings = {version = "0.0.1", path = "gecko_bindings"} heapsize = "0.3.0" heapsize_plugin = "0.1.2" lazy_static = "0.2" diff --git a/ports/geckolib/data.rs b/ports/geckolib/data.rs index 733d5e4f83f..34d184239c1 100644 --- a/ports/geckolib/data.rs +++ b/ports/geckolib/data.rs @@ -2,9 +2,9 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -use bindings::RawServoStyleSet; use euclid::Size2D; use euclid::size::TypedSize2D; +use gecko_bindings::bindings::RawServoStyleSet; use num_cpus; use selector_impl::{Stylist, Stylesheet, SharedStyleContext}; use std::cmp; diff --git a/ports/geckolib/gecko_bindings/Cargo.toml b/ports/geckolib/gecko_bindings/Cargo.toml new file mode 100644 index 00000000000..fab9a1e9bd5 --- /dev/null +++ b/ports/geckolib/gecko_bindings/Cargo.toml @@ -0,0 +1,12 @@ +[package] +name = "gecko_bindings" +version = "0.0.1" +authors = ["The Servo Project Developers"] +publish = false + +[lib] +name = "gecko_bindings" +path = "lib.rs" + +[dependencies] +heapsize = "0.3.0" diff --git a/ports/geckolib/bindings.rs b/ports/geckolib/gecko_bindings/bindings.rs similarity index 76% rename from ports/geckolib/bindings.rs rename to ports/geckolib/gecko_bindings/bindings.rs index 846944920e8..8dfc191f147 100644 --- a/ports/geckolib/bindings.rs +++ b/ports/geckolib/gecko_bindings/bindings.rs @@ -1,30 +1,103 @@ /* automatically generated by rust-bindgen */ -use gecko_style_structs::SheetParsingMode; -use gecko_style_structs::nsStyleFont; -use gecko_style_structs::nsStyleColor; -use gecko_style_structs::nsStyleList; -use gecko_style_structs::nsStyleText; -use gecko_style_structs::nsStyleVisibility; -use gecko_style_structs::nsStyleUserInterface; -use gecko_style_structs::nsStyleTableBorder; -use gecko_style_structs::nsStyleSVG; -use gecko_style_structs::nsStyleVariables; -use gecko_style_structs::nsStyleBackground; -use gecko_style_structs::nsStylePosition; -use gecko_style_structs::nsStyleTextReset; -use gecko_style_structs::nsStyleDisplay; -use gecko_style_structs::nsStyleContent; -use gecko_style_structs::nsStyleUIReset; -use gecko_style_structs::nsStyleTable; -use gecko_style_structs::nsStyleMargin; -use gecko_style_structs::nsStylePadding; -use gecko_style_structs::nsStyleBorder; -use gecko_style_structs::nsStyleOutline; -use gecko_style_structs::nsStyleXUL; -use gecko_style_structs::nsStyleSVGReset; -use gecko_style_structs::nsStyleColumn; -use gecko_style_structs::nsStyleEffects; +use structs::nsStyleFont; +use structs::nsStyleColor; +use structs::nsStyleList; +use structs::nsStyleText; +use structs::nsStyleVisibility; +use structs::nsStyleUserInterface; +use structs::nsStyleTableBorder; +use structs::nsStyleSVG; +use structs::nsStyleVariables; +use structs::nsStyleBackground; +use structs::nsStylePosition; +use structs::nsStyleTextReset; +use structs::nsStyleDisplay; +use structs::nsStyleContent; +use structs::nsStyleUIReset; +use structs::nsStyleTable; +use structs::nsStyleMargin; +use structs::nsStylePadding; +use structs::nsStyleBorder; +use structs::nsStyleOutline; +use structs::nsStyleXUL; +use structs::nsStyleSVGReset; +use structs::nsStyleColumn; +use structs::nsStyleEffects; +use structs::SheetParsingMode; +use heapsize::HeapSizeOf; +unsafe impl Send for nsStyleFont {} +unsafe impl Sync for nsStyleFont {} +impl HeapSizeOf for nsStyleFont { fn heap_size_of_children(&self) -> usize { 0 } } +unsafe impl Send for nsStyleColor {} +unsafe impl Sync for nsStyleColor {} +impl HeapSizeOf for nsStyleColor { fn heap_size_of_children(&self) -> usize { 0 } } +unsafe impl Send for nsStyleList {} +unsafe impl Sync for nsStyleList {} +impl HeapSizeOf for nsStyleList { fn heap_size_of_children(&self) -> usize { 0 } } +unsafe impl Send for nsStyleText {} +unsafe impl Sync for nsStyleText {} +impl HeapSizeOf for nsStyleText { fn heap_size_of_children(&self) -> usize { 0 } } +unsafe impl Send for nsStyleVisibility {} +unsafe impl Sync for nsStyleVisibility {} +impl HeapSizeOf for nsStyleVisibility { fn heap_size_of_children(&self) -> usize { 0 } } +unsafe impl Send for nsStyleUserInterface {} +unsafe impl Sync for nsStyleUserInterface {} +impl HeapSizeOf for nsStyleUserInterface { fn heap_size_of_children(&self) -> usize { 0 } } +unsafe impl Send for nsStyleTableBorder {} +unsafe impl Sync for nsStyleTableBorder {} +impl HeapSizeOf for nsStyleTableBorder { fn heap_size_of_children(&self) -> usize { 0 } } +unsafe impl Send for nsStyleSVG {} +unsafe impl Sync for nsStyleSVG {} +impl HeapSizeOf for nsStyleSVG { fn heap_size_of_children(&self) -> usize { 0 } } +unsafe impl Send for nsStyleVariables {} +unsafe impl Sync for nsStyleVariables {} +impl HeapSizeOf for nsStyleVariables { fn heap_size_of_children(&self) -> usize { 0 } } +unsafe impl Send for nsStyleBackground {} +unsafe impl Sync for nsStyleBackground {} +impl HeapSizeOf for nsStyleBackground { fn heap_size_of_children(&self) -> usize { 0 } } +unsafe impl Send for nsStylePosition {} +unsafe impl Sync for nsStylePosition {} +impl HeapSizeOf for nsStylePosition { fn heap_size_of_children(&self) -> usize { 0 } } +unsafe impl Send for nsStyleTextReset {} +unsafe impl Sync for nsStyleTextReset {} +impl HeapSizeOf for nsStyleTextReset { fn heap_size_of_children(&self) -> usize { 0 } } +unsafe impl Send for nsStyleDisplay {} +unsafe impl Sync for nsStyleDisplay {} +impl HeapSizeOf for nsStyleDisplay { fn heap_size_of_children(&self) -> usize { 0 } } +unsafe impl Send for nsStyleContent {} +unsafe impl Sync for nsStyleContent {} +impl HeapSizeOf for nsStyleContent { fn heap_size_of_children(&self) -> usize { 0 } } +unsafe impl Send for nsStyleUIReset {} +unsafe impl Sync for nsStyleUIReset {} +impl HeapSizeOf for nsStyleUIReset { fn heap_size_of_children(&self) -> usize { 0 } } +unsafe impl Send for nsStyleTable {} +unsafe impl Sync for nsStyleTable {} +impl HeapSizeOf for nsStyleTable { fn heap_size_of_children(&self) -> usize { 0 } } +unsafe impl Send for nsStyleMargin {} +unsafe impl Sync for nsStyleMargin {} +impl HeapSizeOf for nsStyleMargin { fn heap_size_of_children(&self) -> usize { 0 } } +unsafe impl Send for nsStylePadding {} +unsafe impl Sync for nsStylePadding {} +impl HeapSizeOf for nsStylePadding { fn heap_size_of_children(&self) -> usize { 0 } } +unsafe impl Send for nsStyleBorder {} +unsafe impl Sync for nsStyleBorder {} +impl HeapSizeOf for nsStyleBorder { fn heap_size_of_children(&self) -> usize { 0 } } +unsafe impl Send for nsStyleOutline {} +unsafe impl Sync for nsStyleOutline {} +impl HeapSizeOf for nsStyleOutline { fn heap_size_of_children(&self) -> usize { 0 } } +unsafe impl Send for nsStyleXUL {} +unsafe impl Sync for nsStyleXUL {} +impl HeapSizeOf for nsStyleXUL { fn heap_size_of_children(&self) -> usize { 0 } } +unsafe impl Send for nsStyleSVGReset {} +unsafe impl Sync for nsStyleSVGReset {} +impl HeapSizeOf for nsStyleSVGReset { fn heap_size_of_children(&self) -> usize { 0 } } +unsafe impl Send for nsStyleColumn {} +unsafe impl Sync for nsStyleColumn {} +impl HeapSizeOf for nsStyleColumn { fn heap_size_of_children(&self) -> usize { 0 } } +unsafe impl Send for nsStyleEffects {} +unsafe impl Sync for nsStyleEffects {} +impl HeapSizeOf for nsStyleEffects { fn heap_size_of_children(&self) -> usize { 0 } } pub enum nsIAtom { } pub enum nsINode { } diff --git a/ports/geckolib/gecko_bindings/lib.rs b/ports/geckolib/gecko_bindings/lib.rs new file mode 100644 index 00000000000..b6d684b5891 --- /dev/null +++ b/ports/geckolib/gecko_bindings/lib.rs @@ -0,0 +1,10 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +extern crate heapsize; + +#[allow(dead_code, non_camel_case_types)] +pub mod bindings; +#[allow(dead_code, non_camel_case_types, non_snake_case, non_upper_case_globals)] +pub mod structs; diff --git a/ports/geckolib/gecko_style_structs.rs b/ports/geckolib/gecko_bindings/structs.rs similarity index 100% rename from ports/geckolib/gecko_style_structs.rs rename to ports/geckolib/gecko_bindings/structs.rs diff --git a/ports/geckolib/tools/.gitignore b/ports/geckolib/gecko_bindings/tools/.gitignore similarity index 100% rename from ports/geckolib/tools/.gitignore rename to ports/geckolib/gecko_bindings/tools/.gitignore diff --git a/ports/geckolib/tools/README.md b/ports/geckolib/gecko_bindings/tools/README.md similarity index 93% rename from ports/geckolib/tools/README.md rename to ports/geckolib/gecko_bindings/tools/README.md index 667944fbeed..dbd9ae4526d 100644 --- a/ports/geckolib/tools/README.md +++ b/ports/geckolib/gecko_bindings/tools/README.md @@ -23,4 +23,4 @@ build (which are in `ports/geckolib/bindings.rs`). ## `regen_style_structs.sh` This will generate the bindings for Gecko's style structs. Current bindings are -actually in `ports/geckolib/gecko_style_structs.rs`. +actually in `ports/geckolib/structs.rs`. diff --git a/ports/geckolib/tools/regen_bindings.sh b/ports/geckolib/gecko_bindings/tools/regen_bindings.sh similarity index 71% rename from ports/geckolib/tools/regen_bindings.sh rename to ports/geckolib/gecko_bindings/tools/regen_bindings.sh index cff58117d91..cce6f21ddfb 100755 --- a/ports/geckolib/tools/regen_bindings.sh +++ b/ports/geckolib/gecko_bindings/tools/regen_bindings.sh @@ -28,9 +28,14 @@ else LIBCLANG_PATH=`brew --prefix llvm38`/lib/llvm-3.8/lib; fi -# Prevent bindgen from generating opaque types for common gecko types +# Prevent bindgen from generating opaque types for common gecko types. export MAP_GECKO_TYPES="" -for STRUCT in SheetParsingMode nsStyleFont nsStyleColor nsStyleList nsStyleText \ + +# Extra code we want to generate. +export EXTRA_CODE="-raw-line 'use heapsize::HeapSizeOf;' " + +# Style structs. +for STRUCT in nsStyleFont nsStyleColor nsStyleList nsStyleText \ nsStyleVisibility nsStyleUserInterface nsStyleTableBorder \ nsStyleSVG nsStyleVariables nsStyleBackground nsStylePosition \ nsStyleTextReset nsStyleDisplay nsStyleContent nsStyleUIReset \ @@ -38,9 +43,21 @@ for STRUCT in SheetParsingMode nsStyleFont nsStyleColor nsStyleList nsStyleText nsStyleOutline nsStyleXUL nsStyleSVGReset nsStyleColumn nsStyleEffects do MAP_GECKO_TYPES=$MAP_GECKO_TYPES"-blacklist-type $STRUCT " - MAP_GECKO_TYPES=$MAP_GECKO_TYPES"-raw-line 'use gecko_style_structs::$STRUCT;' " + MAP_GECKO_TYPES=$MAP_GECKO_TYPES"-raw-line 'use structs::$STRUCT;' " + EXTRA_CODE=$EXTRA_CODE"-raw-line 'unsafe impl Send for $STRUCT {}' " + EXTRA_CODE=$EXTRA_CODE"-raw-line 'unsafe impl Sync for $STRUCT {}' " + EXTRA_CODE=$EXTRA_CODE"-raw-line 'impl HeapSizeOf for $STRUCT { fn heap_size_of_children(&self) -> usize { 0 } }' " done +# Other mapped types. +for TYPE in SheetParsingMode +do + MAP_GECKO_TYPES=$MAP_GECKO_TYPES"-blacklist-type $TYPE " + MAP_GECKO_TYPES=$MAP_GECKO_TYPES"-raw-line 'use structs::$TYPE;' " +done + + + # Check for the include directory. export DIST_INCLUDE="$1/dist/include" if [ ! -d "$DIST_INCLUDE" ]; then @@ -61,4 +78,5 @@ eval ./rust-bindgen/target/debug/bindgen \ "$DIST_INCLUDE/mozilla/ServoBindings.h" \ -match "ServoBindings.h" \ -match "nsStyleStructList.h" \ - $MAP_GECKO_TYPES + $MAP_GECKO_TYPES \ + $EXTRA_CODE diff --git a/ports/geckolib/tools/regen_style_structs.sh b/ports/geckolib/gecko_bindings/tools/regen_style_structs.sh similarity index 98% rename from ports/geckolib/tools/regen_style_structs.sh rename to ports/geckolib/gecko_bindings/tools/regen_style_structs.sh index d8944445df2..900822a5ca7 100755 --- a/ports/geckolib/tools/regen_style_structs.sh +++ b/ports/geckolib/gecko_bindings/tools/regen_style_structs.sh @@ -39,7 +39,7 @@ fi export RUST_BACKTRACE=1 ./rust-bindgen/target/debug/bindgen \ - -o ../gecko_style_structs.rs \ + -o ../structs.rs \ -x c++ -std=gnu++0x \ -allow-unknown-types \ "-I$DIST_INCLUDE" "-I$DIST_INCLUDE/nspr" \ @@ -123,7 +123,7 @@ if [ $? -ne 0 ]; then else echo -e "\e[34minfo:\e[0m bindgen exited successfully, running tests" TESTS_FILE=$(mktemp) - rustc ../gecko_style_structs.rs --test -o $TESTS_FILE + rustc ../structs.rs --test -o $TESTS_FILE $TESTS_FILE rm $TESTS_FILE fi diff --git a/ports/geckolib/tools/setup_bindgen.sh b/ports/geckolib/gecko_bindings/tools/setup_bindgen.sh similarity index 100% rename from ports/geckolib/tools/setup_bindgen.sh rename to ports/geckolib/gecko_bindings/tools/setup_bindgen.sh diff --git a/ports/geckolib/glue.rs b/ports/geckolib/glue.rs index f1ab19f1233..0755b893b16 100644 --- a/ports/geckolib/glue.rs +++ b/ports/geckolib/glue.rs @@ -5,13 +5,13 @@ #![allow(unsafe_code)] use app_units::Au; -use bindings::{RawGeckoDocument, RawGeckoElement, RawGeckoNode}; -use bindings::{RawServoStyleSet, RawServoStyleSheet, ServoComputedValues, ServoNodeData}; -use bindings::{nsIAtom}; use data::PerDocumentStyleData; use env_logger; use euclid::Size2D; -use gecko_style_structs::SheetParsingMode; +use gecko_bindings::bindings::{RawGeckoDocument, RawGeckoElement, RawGeckoNode}; +use gecko_bindings::bindings::{RawServoStyleSet, RawServoStyleSheet, ServoComputedValues, ServoNodeData}; +use gecko_bindings::bindings::{nsIAtom}; +use gecko_bindings::structs::SheetParsingMode; use properties::GeckoComputedValues; use selector_impl::{GeckoSelectorImpl, PseudoElement, SharedStyleContext, Stylesheet}; use std::marker::PhantomData; @@ -35,7 +35,7 @@ use wrapper::{GeckoDocument, GeckoElement, GeckoNode, NonOpaqueStyleData}; // TODO: This is ugly and should go away once we get an atom back-end. pub fn pseudo_element_from_atom(pseudo: *mut nsIAtom, in_ua_stylesheet: bool) -> Result { - use bindings::Gecko_GetAtomAsUTF16; + use gecko_bindings::bindings::Gecko_GetAtomAsUTF16; use selectors::parser::{ParserContext, SelectorImpl}; let pseudo_string = unsafe { @@ -258,7 +258,6 @@ pub extern "C" fn Servo_ReleaseStyleSheet(sheet: *mut RawServoStyleSheet) -> () #[no_mangle] pub extern "C" fn Servo_GetComputedValues(node: *mut RawGeckoNode) -> *mut ServoComputedValues { - use selectors::Element; let node = unsafe { GeckoNode::from_raw(node) }; let arc_cv = match node.borrow_data().map_or(None, |data| data.style.clone()) { Some(style) => style, diff --git a/ports/geckolib/lib.rs b/ports/geckolib/lib.rs index 7d31b0c3fb3..918f9fa11a2 100644 --- a/ports/geckolib/lib.rs +++ b/ports/geckolib/lib.rs @@ -4,7 +4,6 @@ #![feature(as_unsafe_cell)] #![feature(box_syntax)] -#![feature(ptr_as_ref)] #![feature(custom_attribute)] #![feature(custom_derive)] #![feature(plugin)] @@ -17,6 +16,7 @@ extern crate app_units; extern crate cssparser; extern crate env_logger; extern crate euclid; +extern crate gecko_bindings; extern crate heapsize; #[macro_use] extern crate lazy_static; @@ -32,11 +32,7 @@ extern crate style; extern crate url; extern crate util; -#[allow(dead_code, non_camel_case_types)] -mod bindings; mod data; -#[allow(dead_code, non_camel_case_types, non_snake_case, non_upper_case_globals)] -mod gecko_style_structs; #[allow(non_snake_case)] pub mod glue; mod selector_impl; diff --git a/ports/geckolib/properties.mako.rs b/ports/geckolib/properties.mako.rs index 0b92d506d0b..d78f53a50cf 100644 --- a/ports/geckolib/properties.mako.rs +++ b/ports/geckolib/properties.mako.rs @@ -11,13 +11,13 @@ use app_units::Au; % for style_struct in data.style_structs: -use gecko_style_structs::${style_struct.gecko_ffi_name}; -use bindings::Gecko_Construct_${style_struct.gecko_ffi_name}; -use bindings::Gecko_CopyConstruct_${style_struct.gecko_ffi_name}; -use bindings::Gecko_Destroy_${style_struct.gecko_ffi_name}; +use gecko_bindings::structs::${style_struct.gecko_ffi_name}; +use gecko_bindings::bindings::Gecko_Construct_${style_struct.gecko_ffi_name}; +use gecko_bindings::bindings::Gecko_CopyConstruct_${style_struct.gecko_ffi_name}; +use gecko_bindings::bindings::Gecko_Destroy_${style_struct.gecko_ffi_name}; % endfor -use bindings::{Gecko_CopyListStyleTypeFrom, Gecko_SetListStyleType}; -use gecko_style_structs; +use gecko_bindings::bindings::{Gecko_CopyListStyleTypeFrom, Gecko_SetListStyleType}; +use gecko_bindings::structs; use glue::ArcHelpers; use heapsize::HeapSizeOf; use std::fmt::{self, Debug}; @@ -29,7 +29,6 @@ use style::properties::{CascadePropertyFn, ServoComputedValues, ComputedValues}; use style::properties::longhands; use style::properties::make_cascade_vec; use style::properties::style_struct_traits::*; -use gecko_style_structs::{nsStyleUnion, nsStyleUnit}; use values::{ToGeckoStyleCoord, convert_rgba_to_nscolor, convert_nscolor_to_rgba}; use values::round_border_to_device_pixels; @@ -130,7 +129,7 @@ impl ComputedValues for GeckoComputedValues { } <%def name="declare_style_struct(style_struct)"> -#[derive(Clone, HeapSizeOf, Debug)] +#[derive(HeapSizeOf)] pub struct ${style_struct.gecko_struct_name} { gecko: ${style_struct.gecko_ffi_name}, } @@ -154,12 +153,12 @@ def is_border_style_masked(ffi_name): def get_gecko_property(ffi_name): if is_border_style_masked(ffi_name): - return "(self.gecko.%s & (gecko_style_structs::BORDER_STYLE_MASK as u8))" % ffi_name + return "(self.gecko.%s & (structs::BORDER_STYLE_MASK as u8))" % ffi_name return "self.gecko.%s" % ffi_name def set_gecko_property(ffi_name, expr): if is_border_style_masked(ffi_name): - return "self.gecko.%s &= !(gecko_style_structs::BORDER_STYLE_MASK as u8);" % ffi_name + \ + return "self.gecko.%s &= !(structs::BORDER_STYLE_MASK as u8);" % ffi_name + \ "self.gecko.%s |= %s as u8;" % (ffi_name, expr) elif ffi_name == "__LIST_STYLE_TYPE__": return "unsafe { Gecko_SetListStyleType(&mut self.gecko, %s as u32); }" % expr @@ -168,12 +167,11 @@ def set_gecko_property(ffi_name, expr): <%def name="impl_keyword_setter(ident, gecko_ffi_name, keyword)"> fn set_${ident}(&mut self, v: longhands::${ident}::computed_value::T) { - use gecko_style_structs as gss; use style::properties::longhands::${ident}::computed_value::T as Keyword; // FIXME(bholley): Align binary representations and ditch |match| for cast + static_asserts let result = match v { % for value in keyword.values_for('gecko'): - Keyword::${to_rust_ident(value)} => gss::${keyword.gecko_constant(value)} as u8, + Keyword::${to_rust_ident(value)} => structs::${keyword.gecko_constant(value)} as u8, % endfor }; ${set_gecko_property(gecko_ffi_name, "result")} @@ -182,12 +180,11 @@ def set_gecko_property(ffi_name, expr): <%def name="impl_keyword_clone(ident, gecko_ffi_name, keyword)"> fn clone_${ident}(&self) -> longhands::${ident}::computed_value::T { - use gecko_style_structs as gss; use style::properties::longhands::${ident}::computed_value::T as Keyword; // FIXME(bholley): Align binary representations and ditch |match| for cast + static_asserts match ${get_gecko_property(gecko_ffi_name)} as u32 { % for value in keyword.values_for('gecko'): - gss::${keyword.gecko_constant(value)} => Keyword::${to_rust_ident(value)}, + structs::${keyword.gecko_constant(value)} => Keyword::${to_rust_ident(value)}, % endfor x => panic!("Found unexpected value in style struct for ${ident} property: {}", x), } @@ -196,13 +193,13 @@ def set_gecko_property(ffi_name, expr): <%def name="clear_color_flags(color_flags_ffi_name)"> % if color_flags_ffi_name: - self.gecko.${color_flags_ffi_name} &= !(gecko_style_structs::BORDER_COLOR_SPECIAL as u8); + self.gecko.${color_flags_ffi_name} &= !(structs::BORDER_COLOR_SPECIAL as u8); % endif <%def name="set_current_color_flag(color_flags_ffi_name)"> % if color_flags_ffi_name: - self.gecko.${color_flags_ffi_name} |= gecko_style_structs::BORDER_COLOR_FOREGROUND as u8; + self.gecko.${color_flags_ffi_name} |= structs::BORDER_COLOR_FOREGROUND as u8; % else: // FIXME(heycam): This is a Gecko property that doesn't store currentColor // as a computed value. These are currently handled by converting @@ -216,7 +213,7 @@ def set_gecko_property(ffi_name, expr): <%def name="get_current_color_flag_from(field)"> - (${field} & (gecko_style_structs::BORDER_COLOR_FOREGROUND as u8)) != 0 + (${field} & (structs::BORDER_COLOR_FOREGROUND as u8)) != 0 <%def name="impl_color_setter(ident, gecko_ffi_name, color_flags_ffi_name=None)"> @@ -288,7 +285,7 @@ def set_gecko_property(ffi_name, expr): &mut self.gecko.${union_ffi_name}); } fn copy_${ident}_from(&mut self, other: &Self) { - use gecko_style_structs::nsStyleUnit::eStyleUnit_Calc; + use gecko_bindings::structs::nsStyleUnit::eStyleUnit_Calc; debug_assert!(self.gecko.${unit_ffi_name} != eStyleUnit_Calc, "stylo: Can't yet handle refcounted Calc"); self.gecko.${unit_ffi_name} = other.gecko.${unit_ffi_name}; @@ -308,7 +305,7 @@ def set_gecko_property(ffi_name, expr): &mut self.gecko.${y_union_ffi_name}); } fn copy_${ident}_from(&mut self, other: &Self) { - use gecko_style_structs::nsStyleUnit::eStyleUnit_Calc; + use gecko_bindings::structs::nsStyleUnit::eStyleUnit_Calc; debug_assert!(self.gecko.${x_unit_ffi_name} != eStyleUnit_Calc && self.gecko.${y_unit_ffi_name} != eStyleUnit_Calc, "stylo: Can't yet handle refcounted Calc"); @@ -340,31 +337,30 @@ impl Drop for ${style_struct.gecko_struct_name} { } } } -impl Clone for ${style_struct.gecko_ffi_name} { +impl Clone for ${style_struct.gecko_struct_name} { fn clone(&self) -> Self { unsafe { let mut result: Self = zeroed(); - Gecko_CopyConstruct_${style_struct.gecko_ffi_name}(&mut result, self); + Gecko_CopyConstruct_${style_struct.gecko_ffi_name}(&mut result.gecko, &self.gecko); result } } } -unsafe impl Send for ${style_struct.gecko_ffi_name} {} -unsafe impl Sync for ${style_struct.gecko_ffi_name} {} -impl HeapSizeOf for ${style_struct.gecko_ffi_name} { - // Not entirely accurate, but good enough for now. - fn heap_size_of_children(&self) -> usize { 0 } -} // FIXME(bholley): Make bindgen generate Debug for all types. %if style_struct.gecko_ffi_name in "nsStyleBorder nsStyleDisplay nsStyleList nsStyleBackground "\ "nsStyleFont nsStyleSVGReset".split(): -impl Debug for ${style_struct.gecko_ffi_name} { +impl Debug for ${style_struct.gecko_struct_name} { // FIXME(bholley): Generate this. fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { write!(f, "GECKO STYLE STRUCT") } } +%else: +impl Debug for ${style_struct.gecko_struct_name} { + // FIXME(bholley): Generate this. + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { self.gecko.fmt(f) } +} %endif @@ -476,14 +472,15 @@ CORNERS = [Corner("TOP_LEFT", 0), Corner("TOP_RIGHT", 1), Corner("BOTTOM_RIGHT", #[allow(dead_code)] fn static_assert() { unsafe { - % for side in SIDES: - transmute::<_, [u32; ${side.index}]>([1; gecko_style_structs::Side::eSide${side.name} as usize]); - % endfor - % for corner in CORNERS: - transmute::<_, [u32; ${corner.x_index}]>([1; gecko_style_structs::${corner.x_name} as usize]); - transmute::<_, [u32; ${corner.y_index}]>([1; gecko_style_structs::${corner.y_name} as usize]); - % endfor + % for corner in CORNERS: + transmute::<_, [u32; ${corner.x_index}]>([1; structs::${corner.x_name} as usize]); + transmute::<_, [u32; ${corner.y_index}]>([1; structs::${corner.y_name} as usize]); + % endfor } + // Note: using the above technique with an enum hits a rust bug when |structs| is in a different crate. + % for side in SIDES: + { const DETAIL: u32 = [0][(structs::Side::eSide${side.name} as usize != ${side.index}) as usize]; let _ = DETAIL; } + % endfor } <% border_style_keyword = Keyword("border-style", @@ -629,24 +626,22 @@ fn static_assert() { // We could generalize this if we run into other newtype keywords. <% overflow_x = data.longhands_by_name["overflow-x"] %> fn set_overflow_y(&mut self, v: longhands::overflow_y::computed_value::T) { - use gecko_style_structs as gss; use style::properties::longhands::overflow_x::computed_value::T as BaseType; // FIXME(bholley): Align binary representations and ditch |match| for cast + static_asserts self.gecko.mOverflowY = match v.0 { % for value in overflow_x.keyword.values_for('gecko'): - BaseType::${to_rust_ident(value)} => gss::${overflow_x.keyword.gecko_constant(value)} as u8, + BaseType::${to_rust_ident(value)} => structs::${overflow_x.keyword.gecko_constant(value)} as u8, % endfor }; } <%call expr="impl_simple_copy('overflow_y', 'mOverflowY')"> fn clone_overflow_y(&self) -> longhands::overflow_y::computed_value::T { - use gecko_style_structs as gss; use style::properties::longhands::overflow_x::computed_value::T as BaseType; use style::properties::longhands::overflow_y::computed_value::T as NewType; // FIXME(bholley): Align binary representations and ditch |match| for cast + static_asserts match self.gecko.mOverflowY as u32 { % for value in overflow_x.keyword.values_for('gecko'): - gss::${overflow_x.keyword.gecko_constant(value)} => NewType(BaseType::${to_rust_ident(value)}), + structs::${overflow_x.keyword.gecko_constant(value)} => NewType(BaseType::${to_rust_ident(value)}), % endfor x => panic!("Found unexpected value in style struct for overflow_y property: {}", x), } @@ -680,16 +675,13 @@ fn static_assert() { color_flags_ffi_name="mTextDecorationStyle") %> fn has_underline(&self) -> bool { - use gecko_style_structs as gss; - (self.gecko.mTextDecorationStyle & (gss::NS_STYLE_TEXT_DECORATION_LINE_UNDERLINE as u8)) != 0 + (self.gecko.mTextDecorationStyle & (structs::NS_STYLE_TEXT_DECORATION_LINE_UNDERLINE as u8)) != 0 } fn has_overline(&self) -> bool { - use gecko_style_structs as gss; - (self.gecko.mTextDecorationStyle & (gss::NS_STYLE_TEXT_DECORATION_LINE_OVERLINE as u8)) != 0 + (self.gecko.mTextDecorationStyle & (structs::NS_STYLE_TEXT_DECORATION_LINE_OVERLINE as u8)) != 0 } fn has_line_through(&self) -> bool { - use gecko_style_structs as gss; - (self.gecko.mTextDecorationStyle & (gss::NS_STYLE_TEXT_DECORATION_LINE_LINE_THROUGH as u8)) != 0 + (self.gecko.mTextDecorationStyle & (structs::NS_STYLE_TEXT_DECORATION_LINE_LINE_THROUGH as u8)) != 0 } diff --git a/ports/geckolib/values.rs b/ports/geckolib/values.rs index 03dd8ffeb58..069fb9bc9b6 100644 --- a/ports/geckolib/values.rs +++ b/ports/geckolib/values.rs @@ -4,7 +4,7 @@ use app_units::Au; use cssparser::RGBA; -use gecko_style_structs::{nsStyleUnion, nsStyleUnit}; +use gecko_bindings::structs::{nsStyleUnion, nsStyleUnit}; use std::cmp::max; use style::values::computed::{LengthOrPercentage, LengthOrPercentageOrAuto, LengthOrPercentageOrNone}; diff --git a/ports/geckolib/wrapper.rs b/ports/geckolib/wrapper.rs index 91a391fc23c..003d6cd3046 100644 --- a/ports/geckolib/wrapper.rs +++ b/ports/geckolib/wrapper.rs @@ -4,20 +4,20 @@ #![allow(unsafe_code)] -use bindings::{Gecko_ChildrenCount}; -use bindings::{Gecko_ElementState, Gecko_GetAttrAsUTF8, Gecko_GetDocumentElement}; -use bindings::{Gecko_GetFirstChild, Gecko_GetFirstChildElement}; -use bindings::{Gecko_GetLastChild, Gecko_GetLastChildElement}; -use bindings::{Gecko_GetNextSibling, Gecko_GetNextSiblingElement}; -use bindings::{Gecko_GetNodeData}; -use bindings::{Gecko_GetParentElement, Gecko_GetParentNode}; -use bindings::{Gecko_GetPrevSibling, Gecko_GetPrevSiblingElement}; -use bindings::{Gecko_IsHTMLElementInHTMLDocument, Gecko_IsLink, Gecko_IsRootElement, Gecko_IsTextNode}; -use bindings::{Gecko_IsUnvisitedLink, Gecko_IsVisitedLink}; +use gecko_bindings::bindings::{Gecko_ChildrenCount}; +use gecko_bindings::bindings::{Gecko_ElementState, Gecko_GetAttrAsUTF8, Gecko_GetDocumentElement}; +use gecko_bindings::bindings::{Gecko_GetFirstChild, Gecko_GetFirstChildElement}; +use gecko_bindings::bindings::{Gecko_GetLastChild, Gecko_GetLastChildElement}; +use gecko_bindings::bindings::{Gecko_GetNextSibling, Gecko_GetNextSiblingElement}; +use gecko_bindings::bindings::{Gecko_GetNodeData}; +use gecko_bindings::bindings::{Gecko_GetParentElement, Gecko_GetParentNode}; +use gecko_bindings::bindings::{Gecko_GetPrevSibling, Gecko_GetPrevSiblingElement}; +use gecko_bindings::bindings::{Gecko_IsHTMLElementInHTMLDocument, Gecko_IsLink, Gecko_IsRootElement, Gecko_IsTextNode}; +use gecko_bindings::bindings::{Gecko_IsUnvisitedLink, Gecko_IsVisitedLink}; #[allow(unused_imports)] // Used in commented-out code. -use bindings::{Gecko_LocalName, Gecko_Namespace, Gecko_NodeIsElement, Gecko_SetNodeData}; -use bindings::{RawGeckoDocument, RawGeckoElement, RawGeckoNode}; -use bindings::{ServoNodeData}; +use gecko_bindings::bindings::{Gecko_LocalName, Gecko_Namespace, Gecko_NodeIsElement, Gecko_SetNodeData}; +use gecko_bindings::bindings::{RawGeckoDocument, RawGeckoElement, RawGeckoNode}; +use gecko_bindings::bindings::{ServoNodeData}; use libc::uintptr_t; use properties::GeckoComputedValues; use selector_impl::{GeckoSelectorImpl, NonTSPseudoClass, PrivateStyleData}; diff --git a/python/tidy/servo_tidy/tidy.py b/python/tidy/servo_tidy/tidy.py index eb3aa579b66..2a80cc68dfd 100644 --- a/python/tidy/servo_tidy/tidy.py +++ b/python/tidy/servo_tidy/tidy.py @@ -34,8 +34,8 @@ file_patterns_to_ignore = [ ignored_files = [ # Generated and upstream code combined with our own. Could use cleanup os.path.join(".", "ports", "gonk", "src", "native_window_glue.cpp"), - os.path.join(".", "ports", "geckolib", "bindings.rs"), - os.path.join(".", "ports", "geckolib", "gecko_style_structs.rs"), + os.path.join(".", "ports", "geckolib", "gecko_bindings", "bindings.rs"), + os.path.join(".", "ports", "geckolib", "gecko_bindings", "structs.rs"), os.path.join(".", "resources", "hsts_preload.json"), os.path.join(".", "tests", "wpt", "metadata", "MANIFEST.json"), os.path.join(".", "tests", "wpt", "metadata-css", "MANIFEST.json"), @@ -64,7 +64,7 @@ ignored_dirs = [ os.path.join(".", "target"), os.path.join(".", "ports", "cef"), # Tooling, generated locally from external repos. - os.path.join(".", "ports", "geckolib", "tools"), + os.path.join(".", "ports", "geckolib", "gecko_bindings", "tools"), # Hidden directories os.path.join(".", "."), ]