diff options
-rw-r--r-- | ports/geckolib/build.rs | 3 | ||||
-rw-r--r-- | ports/geckolib/properties.mako.rs | 55 |
2 files changed, 54 insertions, 4 deletions
diff --git a/ports/geckolib/build.rs b/ports/geckolib/build.rs index 59cbdec434a..b9f1a4d3676 100644 --- a/ports/geckolib/build.rs +++ b/ports/geckolib/build.rs @@ -62,7 +62,8 @@ try: style_template.render(PRODUCT='gecko') geckolib_template = Template(filename=os.environ['GECKOLIB_TEMPLATE'], input_encoding='utf8') - output = geckolib_template.render(STYLE_STRUCTS = style_template.module.STYLE_STRUCTS) + output = geckolib_template.render(STYLE_STRUCTS = style_template.module.STYLE_STRUCTS, + to_rust_ident = style_template.module.to_rust_ident) print(output.encode('utf8')) except: sys.stderr.write(exceptions.text_error_template().render().encode('utf8')) diff --git a/ports/geckolib/properties.mako.rs b/ports/geckolib/properties.mako.rs index 9beada1cc43..3a5cc57b052 100644 --- a/ports/geckolib/properties.mako.rs +++ b/ports/geckolib/properties.mako.rs @@ -13,6 +13,7 @@ use bindings::Gecko_CopyConstruct_${style_struct.gecko_ffi_name}; use bindings::Gecko_Destroy_${style_struct.gecko_ffi_name}; % endif % endfor +use gecko_style_structs; use heapsize::HeapSizeOf; use std::fmt::{self, Debug}; use std::mem::zeroed; @@ -165,6 +166,37 @@ impl Debug for ${style_struct.gecko_ffi_name} { </%def> <%def name="raw_impl_trait(style_struct, skip_longhands=None, skip_additionals=None)"> +<% + longhands = [x for x in style_struct.longhands + if not (skip_longhands and x.name in skip_longhands)] + + # + # Make a list of types we can't auto-generate. + # + force_stub = []; + # These are currently being shuffled to a different style struct on the gecko side. + force_stub += ["backface-visibility", "transform-box", "transform-style"] + # These live in nsStyleImageLayers in gecko. Need to figure out what to do about that. + force_stub += ["background-repeat", "background-attachment", "background-clip", "background-origin"]; + # These live in an nsFont member in Gecko. Should be straightforward to do manually. + force_stub += ["font-kerning", "font-stretch", "font-style", "font-variant"] + # These have unusual representations in gecko. + force_stub += ["list-style-type", "text-overflow"] + # Enum class instead of NS_STYLE_... + force_stub += ["box-sizing"] + # Inconsistent constant naming in gecko + force_stub += ["unicode-bidi"] + # Need to figure out why servo has sideways-left computed value and gecko doesn't + force_stub += ["text-orientation"] + # Automatic mapping generates NS_STYLE_TEXT_DECORATION_STYLE__MOZ_NONE instead of + # NS_STYLE_TEXT_DECORATION_STYLE__NONE + force_stub += ["text-decoration-style"] + # These are booleans. + force_stub += ["page-break-after", "page-break-before"] + + keyword_longhands = [x for x in longhands if x.keyword and not x.name in force_stub] + stub_longhands = [x for x in longhands if x not in keyword_longhands] +%> impl ${style_struct.trait_name} for ${style_struct.gecko_struct_name} { /* * Manually-Implemented Methods. @@ -174,9 +206,26 @@ impl ${style_struct.trait_name} for ${style_struct.gecko_struct_name} { /* * Auto-Generated Methods. */ - <% longhands = [x for x in style_struct.longhands - if not (skip_longhands and x.name in skip_longhands)] %> - % for longhand in longhands: + % for longhand in keyword_longhands: + fn set_${longhand.ident}(&mut self, v: longhands::${longhand.ident}::computed_value::T) { + use gecko_style_structs as gss; + use style::properties::longhands::${longhand.ident}::computed_value::T as Keyword; + // FIXME(bholley): Align binary representations and ditch |match| for cast + static_asserts + self.gecko.${longhand.gecko_ffi_name} = match v { + % for value in longhand.keyword.values_for('gecko'): + Keyword::${to_rust_ident(value)} => gss::${longhand.keyword.gecko_constant(value)} as u8, + % endfor + }; + } + fn copy_${longhand.ident}_from(&mut self, other: &Self) { + self.gecko.${longhand.gecko_ffi_name} = other.gecko.${longhand.gecko_ffi_name}; + } + % endfor + + /* + * Stubs. + */ + % for longhand in stub_longhands: fn set_${longhand.ident}(&mut self, _: longhands::${longhand.ident}::computed_value::T) { unimplemented!() } |