Bug 1369277 - Part 3: stylo: Animate fill and stroke; r?birtles draft
authorManish Goregaokar <manishearth@gmail.com>
Mon, 05 Jun 2017 16:50:16 -0700
changeset 589420 498f7f28f85f45389e6905cd2484f9932f73e5c5
parent 589419 81d6e101e4b98e1f85cf1283964367e112c8fe19
child 631870 06928560c772d8f05452b9cd01a9bc669f3a0c08
push id62363
push userbmo:manishearth@gmail.com
push dateTue, 06 Jun 2017 06:24:46 +0000
reviewersbirtles
bugs1369277
milestone55.0a1
Bug 1369277 - Part 3: stylo: Animate fill and stroke; r?birtles MozReview-Commit-ID: COpauBLROUp
layout/reftests/svg/smil/container/reftest.list
layout/reftests/svg/smil/event/reftest.list
layout/reftests/svg/smil/reftest.list
layout/reftests/svg/smil/repeat/reftest.list
layout/reftests/svg/smil/restart/reftest.list
layout/reftests/svg/smil/style/reftest.list
layout/reftests/svg/smil/syncbase/reftest.list
servo/components/style/properties/gecko.mako.rs
servo/components/style/properties/longhand/inherited_svg.mako.rs
--- a/layout/reftests/svg/smil/container/reftest.list
+++ b/layout/reftests/svg/smil/container/reftest.list
@@ -1,17 +1,17 @@
 # Tests related to SVG Animation (using SMIL), focusing on animation-sorting
 # to see which animation takes precedence (out of multiple animations on the
 # same attribute)
 
 random == enveloped-tree-1.xhtml enveloped-tree-1-ref.xhtml  # bug 470868
 fuzzy-if(cocoaWidget&&layersGPUAccelerated,1,3) fuzzy-if(skiaContent,1,810) == promoted-tree-1.xhtml promoted-tree-1-ref.xhtml
 random == moved-tree-1.xhtml moved-tree-1-ref.xhtml  # bug 470868
-random-if(cocoaWidget||d2d) fails-if(styloVsGecko||stylo) == deferred-anim-1.xhtml deferred-anim-1-ref.xhtml # bug 470868, bug 585484
-random-if(cocoaWidget&&layersGPUAccelerated) fails-if(styloVsGecko||stylo) == deferred-tree-1.xhtml deferred-tree-1-ref.xhtml # bug 470868
+random-if(cocoaWidget||d2d) == deferred-anim-1.xhtml deferred-anim-1-ref.xhtml # bug 470868, bug 585484
+random-if(cocoaWidget&&layersGPUAccelerated) == deferred-tree-1.xhtml deferred-tree-1-ref.xhtml # bug 470868
 random-if(cocoaWidget&&layersGPUAccelerated) fuzzy-if(skiaContent,1,530) == deferred-tree-2a.xhtml deferred-tree-2-ref.xhtml # bug 470868
 random-if(cocoaWidget&&layersGPUAccelerated) fuzzy-if(skiaContent,1,530) == deferred-tree-2b.xhtml deferred-tree-2-ref.xhtml # bug 470868
 fuzzy-if(cocoaWidget&&layersGPUAccelerated,1,16) fuzzy-if(skiaContent,1,410) == deferred-tree-3a.xhtml deferred-tree-3-ref.xhtml
 fuzzy-if(cocoaWidget&&layersGPUAccelerated,1,16) fuzzy-if(skiaContent,1,110) == deferred-tree-3b.xhtml deferred-tree-3-ref.xhtml
 fuzzy-if(cocoaWidget&&layersGPUAccelerated,1,16) fuzzy-if(skiaContent,1,110) == deferred-tree-3c.xhtml deferred-tree-3-ref.xhtml
 fuzzy-if(cocoaWidget&&layersGPUAccelerated,1,16) fuzzy-if(skiaContent,1,110) == deferred-tree-3d.xhtml deferred-tree-3-ref.xhtml
 # this will occasionally fail until we correctly clear animation effects from
 # no-longer-targeted elements
--- a/layout/reftests/svg/smil/event/reftest.list
+++ b/layout/reftests/svg/smil/event/reftest.list
@@ -1,32 +1,32 @@
 # Tests related to SVG Animation (using SMIL) that use event timing.
 
-fails-if(styloVsGecko||stylo) == event-begin-1.svg green-box-ref.svg
-fails-if(styloVsGecko||stylo) == event-begin-offset-1.svg green-box-ref.svg
-fails-if(styloVsGecko||stylo) == event-begin-offset-2.svg green-box-ref.svg
-fails-if(styloVsGecko||stylo) == event-begin-timeevent-1.svg green-box-ref.svg
-fails-if(styloVsGecko||stylo) == event-begin-timeevent-2.svg green-box-ref.svg
-random-if(Android) fails-if(styloVsGecko||stylo) == event-begin-timeevent-3.svg green-box-ref.svg
-fails-if(styloVsGecko||stylo) == event-begin-load-1.svg green-box-ref.svg
-fails-if(styloVsGecko||stylo) == event-bubble-1.svg green-box-ref.svg
-fails-if(styloVsGecko||stylo) == event-custom-1.svg green-box-ref.svg
+== event-begin-1.svg green-box-ref.svg
+== event-begin-offset-1.svg green-box-ref.svg
+== event-begin-offset-2.svg green-box-ref.svg
+== event-begin-timeevent-1.svg green-box-ref.svg
+== event-begin-timeevent-2.svg green-box-ref.svg
+random-if(Android) == event-begin-timeevent-3.svg green-box-ref.svg
+== event-begin-load-1.svg green-box-ref.svg
+== event-bubble-1.svg green-box-ref.svg
+== event-custom-1.svg green-box-ref.svg
 == event-end-1.svg green-box-ref.svg
-fails-if(styloVsGecko||stylo) == event-end-2.svg green-box-ref.svg
-fails-if(styloVsGecko||stylo) == event-end-open-1.svg green-box-ref.svg
-fails-if(styloVsGecko||stylo) == event-end-trimmed-1.svg green-box-ref.svg
-fails-if(styloVsGecko||stylo) == event-preventDefault-1.svg green-box-ref.svg
-fails-if(styloVsGecko||stylo) == event-seek-1.svg green-box-ref.svg
-fails-if(styloVsGecko||stylo) == event-target-default-1.svg green-box-ref.svg
-fails-if(styloVsGecko||stylo) == event-target-default-2.svg green-box-ref.svg
-fails-if(styloVsGecko||stylo) == event-target-id-change-1.svg green-box-ref.svg
+== event-end-2.svg green-box-ref.svg
+== event-end-open-1.svg green-box-ref.svg
+== event-end-trimmed-1.svg green-box-ref.svg
+== event-preventDefault-1.svg green-box-ref.svg
+== event-seek-1.svg green-box-ref.svg
+== event-target-default-1.svg green-box-ref.svg
+== event-target-default-2.svg green-box-ref.svg
+== event-target-id-change-1.svg green-box-ref.svg
 == event-target-id-change-2.svg green-box-ref.svg
 == event-target-id-change-3.svg green-box-ref.svg
-fails-if(styloVsGecko||stylo) == event-target-xlink-change-1.svg green-box-ref.svg
+== event-target-xlink-change-1.svg green-box-ref.svg
 == event-target-xlink-change-2.svg green-box-ref.svg
-fails-if(styloVsGecko||stylo) == event-target-xlink-change-3.svg green-box-ref.svg
+== event-target-xlink-change-3.svg green-box-ref.svg
 == event-target-xlink-change-4.svg green-box-ref.svg
 == event-target-surgery-1.svg green-box-ref.svg
 == event-target-surgery-2.svg green-box-ref.svg
-fails-if(styloVsGecko||stylo) == event-target-surgery-3.svg green-box-ref.svg
-fails-if(styloVsGecko||stylo) == event-target-non-svg-1.xhtml green-box-ref.xhtml
-fails-if(styloVsGecko||stylo) == accesskey-entity-1.svg green-box-ref.svg
-fails-if(styloVsGecko||stylo) == accesskey-entity-2.svg green-box-ref.svg
+== event-target-surgery-3.svg green-box-ref.svg
+== event-target-non-svg-1.xhtml green-box-ref.xhtml
+== accesskey-entity-1.svg green-box-ref.svg
+== accesskey-entity-2.svg green-box-ref.svg
--- a/layout/reftests/svg/smil/reftest.list
+++ b/layout/reftests/svg/smil/reftest.list
@@ -163,32 +163,32 @@ fails-if(styloVsGecko||stylo) == anim-cl
 
 # animate with some paint server values
 fails-if(styloVsGecko||stylo) == anim-paintserver-1.svg anim-paintserver-1-ref.svg
 
 # animate attributes on text content children
 == anim-text-attr-01.svg anim-text-attr-01-ref.svg
 
 # animate where the base value is non-interpolatable but will be replaced anyway
-fails-if(styloVsGecko||stylo) == anim-fill-overpaintserver-1.svg lime.svg
-fails-if(styloVsGecko||stylo) == anim-fill-overpaintserver-2.svg lime.svg
+== anim-fill-overpaintserver-1.svg lime.svg
+== anim-fill-overpaintserver-2.svg lime.svg
 
 # animate where we fallback from 'additive' animation to non-additive
 fails-if(styloVsGecko||stylo) == anim-additive-fallback-1.svg anim-standard-ref.svg
 
 == anim-remove-1.svg anim-standard-ref.svg
 == anim-remove-2.svg anim-standard-ref.svg
 == anim-remove-3.svg anim-standard-ref.svg
 == anim-remove-4.svg anim-standard-ref.svg
 == anim-remove-5.svg anim-standard-ref.svg
 == anim-remove-6.svg anim-standard-ref.svg
 == anim-remove-7.svg anim-standard-ref.svg
 == anim-remove-8css.svg anim-standard-ref.svg
 == anim-remove-8xml.svg anim-standard-ref.svg
-fails-if(styloVsGecko||stylo) == anim-remove-9.svg anim-standard-ref.svg
+== anim-remove-9.svg anim-standard-ref.svg
 == anim-retarget-1.svg anim-standard-ref.svg
 == anim-retarget-2.svg anim-standard-ref.svg
 == anim-retarget-3.svg anim-standard-ref.svg
 == anim-retarget-4.svg anim-standard-ref.svg
 == anim-retarget-5.svg anim-standard-ref.svg
 == anim-retarget-6.svg anim-standard-ref.svg
 == anim-retarget-7.svg anim-standard-ref.svg
 == anim-retarget-8.svg anim-standard-ref.svg
@@ -243,40 +243,40 @@ fuzzy-if(cocoaWidget&&layersGPUAccelerat
 == api-sanity-1.svg lime.svg
 
 == freeze-applied-late-1.svg anim-standard-ref.svg
 == freeze-applied-late-2.svg anim-standard-ref.svg
 == freeze-applied-late-3.svg anim-standard-ref.svg
 == freeze-applied-late-4.svg anim-standard-ref.svg
 == frozen-to-anim-1.svg lime.svg
 
-fails-if(styloVsGecko||stylo) == inactivate-with-active-unchanged-1.svg anim-standard-ref.svg
-fails-if(styloVsGecko||stylo) == inactivate-with-active-unchanged-2.svg anim-standard-ref.svg
+== inactivate-with-active-unchanged-1.svg anim-standard-ref.svg
+== inactivate-with-active-unchanged-2.svg anim-standard-ref.svg
 
-fails-if(styloVsGecko||stylo) == mapped-attr-long-url-1.svg lime.svg
-fails-if(styloVsGecko||stylo) == mapped-attr-long-url-2.svg lime.svg
+== mapped-attr-long-url-1.svg lime.svg
+== mapped-attr-long-url-2.svg lime.svg
 
 == min-1.svg lime.svg
 
-fails-if(styloVsGecko||stylo) == smil-transitions-interaction-1a.svg lime.svg
-fails-if(styloVsGecko||stylo) == smil-transitions-interaction-1b.svg lime.svg
-fails-if(styloVsGecko||stylo) == smil-transitions-interaction-2a.svg lime.svg
-fails-if(styloVsGecko||stylo) == smil-transitions-interaction-2b.svg lime.svg
+== smil-transitions-interaction-1a.svg lime.svg
+== smil-transitions-interaction-1b.svg lime.svg
+== smil-transitions-interaction-2a.svg lime.svg
+== smil-transitions-interaction-2b.svg lime.svg
 == smil-transitions-interaction-3a.svg lime.svg
 == smil-transitions-interaction-3b.svg lime.svg
 == smil-transitions-interaction-4a.svg lime.svg
 == smil-transitions-interaction-4b.svg lime.svg
 
 # Test filtering of excessive times
 == filtered-instance-time-1.svg anim-standard-ref.svg
 
 # Test animation using defs element
 fails-if(styloVsGecko||stylo) == anim-defs-gradient-property.svg lime.svg
 == anim-defs-gradient-attribute.svg lime.svg
-fails-if(styloVsGecko||stylo) == anim-defs-fill.svg lime.svg
+== anim-defs-fill.svg lime.svg
 == anim-defs-width.svg lime.svg
 
 # Test animation that changes 'display' attribute
 fails-if(styloVsGecko||stylo) == anim-display.svg lime.svg
 fails-if(styloVsGecko||stylo) == anim-display-in-g-element.svg lime.svg
 
 # Test animation that change 'display' style value to 'none'
 == anim-change-display-none-for-ancestor-elem.html lime.html
--- a/layout/reftests/svg/smil/repeat/reftest.list
+++ b/layout/reftests/svg/smil/repeat/reftest.list
@@ -1,3 +1,3 @@
 # Tests for repeat behaviour
-fails-if(styloVsGecko||stylo) == indefinite-repeat-1.svg green-box-ref.svg
+== indefinite-repeat-1.svg green-box-ref.svg
 == init-repeat-1.svg init-repeat-1-ref.svg
--- a/layout/reftests/svg/smil/restart/reftest.list
+++ b/layout/reftests/svg/smil/restart/reftest.list
@@ -1,8 +1,8 @@
 # Tests for restart behaviour
 == reset-1.svg reset-1-ref.svg
 == reset-2.svg green-box-ref.svg
-fails-if(styloVsGecko||stylo) == reset-3.svg green-box-ref.svg
+== reset-3.svg green-box-ref.svg
 == reset-4.svg green-box-ref.svg
 # reset-5.svg is no longer valid and has been removed
-fails-if(styloVsGecko||stylo) == reset-6.svg green-box-ref.svg
+== reset-6.svg green-box-ref.svg
 == reset-7.svg green-box-ref.svg
--- a/layout/reftests/svg/smil/style/reftest.list
+++ b/layout/reftests/svg/smil/style/reftest.list
@@ -17,47 +17,47 @@ fuzzy-if(skiaContent,1,550) == anim-css-
 
 # 'color' property, animating *by* a named color
 fuzzy-if(skiaContent,1,580) == anim-css-color-3-by-ident-ident.svg       anim-css-fill-3-ref.svg
 fuzzy-if(skiaContent,1,580) == anim-css-color-3-from-by-ident-ident.svg  anim-css-fill-3-ref.svg
 fuzzy-if(skiaContent,1,580) == anim-css-color-3-from-by-rgb-ident.svg    anim-css-fill-3-ref.svg
 
 # 'fill' property, from/to/by with named colors & hex values
 fuzzy-if(skiaContent,1,550) fails-if(styloVsGecko||stylo) == anim-css-fill-1-by-ident-hex.svg         anim-css-fill-1-ref.svg
-fuzzy-if(skiaContent,1,550) fails-if(styloVsGecko||stylo) == anim-css-fill-1-from-by-hex-hex.svg      anim-css-fill-1-ref.svg
-fuzzy-if(skiaContent,1,550) fails-if(styloVsGecko||stylo) == anim-css-fill-1-from-by-ident-hex.svg    anim-css-fill-1-ref.svg
-fuzzy-if(skiaContent,1,550) fails-if(styloVsGecko||stylo) == anim-css-fill-1-from-to-hex-hex.svg      anim-css-fill-1-ref.svg
-fuzzy-if(skiaContent,1,550) fails-if(styloVsGecko||stylo) == anim-css-fill-1-from-to-ident-ident.svg  anim-css-fill-1-ref.svg
-fuzzy-if(skiaContent,1,550) fails-if(styloVsGecko||stylo) == anim-css-fill-1-to-ident-hex.svg         anim-css-fill-1-ref.svg
-fuzzy-if(skiaContent,1,550) fails-if(styloVsGecko||stylo) == anim-css-fill-1-to-ident-ident.svg       anim-css-fill-1-ref.svg
+fuzzy-if(skiaContent,1,550) == anim-css-fill-1-from-by-hex-hex.svg      anim-css-fill-1-ref.svg
+fuzzy-if(skiaContent,1,550) == anim-css-fill-1-from-by-ident-hex.svg    anim-css-fill-1-ref.svg
+fuzzy-if(skiaContent,1,550) == anim-css-fill-1-from-to-hex-hex.svg      anim-css-fill-1-ref.svg
+fuzzy-if(skiaContent,1,550) == anim-css-fill-1-from-to-ident-ident.svg  anim-css-fill-1-ref.svg
+fuzzy-if(skiaContent,1,550) == anim-css-fill-1-to-ident-hex.svg         anim-css-fill-1-ref.svg
+fuzzy-if(skiaContent,1,550) == anim-css-fill-1-to-ident-ident.svg       anim-css-fill-1-ref.svg
 
 # 'fill' property, from/to/by, with 'currentColor' keyword
 fuzzy-if(skiaContent,1,550) fails-if(styloVsGecko||stylo) == anim-css-fill-1-by-ident-curcol.svg      anim-css-fill-1-ref.svg
-fuzzy-if(skiaContent,1,550) fails-if(styloVsGecko||stylo) == anim-css-fill-1-from-by-curcol-hex.svg   anim-css-fill-1-ref.svg
-fuzzy-if(skiaContent,1,550) fails-if(styloVsGecko||stylo) == anim-css-fill-1-from-by-hex-curcol.svg   anim-css-fill-1-ref.svg
-fuzzy-if(skiaContent,1,550) fails-if(styloVsGecko||stylo) == anim-css-fill-1-from-to-curcol-hex.svg   anim-css-fill-1-ref.svg
-fuzzy-if(skiaContent,1,550) fails-if(styloVsGecko||stylo) == anim-css-fill-1-from-to-hex-curcol.svg   anim-css-fill-1-ref.svg
-fuzzy-if(skiaContent,1,550) fails-if(styloVsGecko||stylo) == anim-css-fill-1-to-ident-curcol.svg      anim-css-fill-1-ref.svg
+fuzzy-if(skiaContent,1,550) == anim-css-fill-1-from-by-curcol-hex.svg   anim-css-fill-1-ref.svg
+fuzzy-if(skiaContent,1,550) == anim-css-fill-1-from-by-hex-curcol.svg   anim-css-fill-1-ref.svg
+fuzzy-if(skiaContent,1,550) == anim-css-fill-1-from-to-curcol-hex.svg   anim-css-fill-1-ref.svg
+fuzzy-if(skiaContent,1,550) == anim-css-fill-1-from-to-hex-curcol.svg   anim-css-fill-1-ref.svg
+fuzzy-if(skiaContent,1,550) == anim-css-fill-1-to-ident-curcol.svg      anim-css-fill-1-ref.svg
 
 # 'fill' property, paced calcMode
 fails-if(styloVsGecko||stylo) == anim-css-fill-2-paced-rgb.svg            anim-css-fill-2-ref.svg
 
 # 'fill' property, animating *by* a named color
 fuzzy-if(skiaContent,1,580) fails-if(styloVsGecko||stylo) == anim-css-fill-3-by-ident-ident.svg       anim-css-fill-3-ref.svg
-fuzzy-if(skiaContent,1,580) fails-if(styloVsGecko||stylo) == anim-css-fill-3-from-by-ident-ident.svg  anim-css-fill-3-ref.svg
-fuzzy-if(skiaContent,1,580) fails-if(styloVsGecko||stylo) == anim-css-fill-3-from-by-rgb-ident.svg    anim-css-fill-3-ref.svg
+fuzzy-if(skiaContent,1,580) == anim-css-fill-3-from-by-ident-ident.svg  anim-css-fill-3-ref.svg
+fuzzy-if(skiaContent,1,580) == anim-css-fill-3-from-by-rgb-ident.svg    anim-css-fill-3-ref.svg
 
 # check handling of overflowing color values
 # NOTE: The second test fails because we compute "from + by" as the animation
 # end-point, and we clamp that final color value (due to bug 515919) and use
 # the clamped value for interpolation.  That's earlier than the SVG spec wants
 # us to clamp -- we're only supposed to clamp *final presentation values*.
 # (Reference: SVG 1.1 Appendix F.4)
 fails-if(styloVsGecko||stylo) == anim-css-fill-overflow-1-by.svg       anim-css-fill-overflow-1-ref.svg
-fails == anim-css-fill-overflow-1-from-by.svg anim-css-fill-overflow-1-ref.svg
+fails-if(!stylo) == anim-css-fill-overflow-1-from-by.svg anim-css-fill-overflow-1-ref.svg
 
 # 'fill-opacity' property
 fuzzy-if(skiaContent,1,885) fails-if(styloVsGecko||stylo) == anim-css-fillopacity-1-by.svg            anim-css-fillopacity-1-ref.svg
 fuzzy-if(skiaContent,1,210) fails-if(styloVsGecko||stylo) == anim-css-fillopacity-1-from-by.svg       anim-css-fillopacity-1-ref.svg
 fails-if(styloVsGecko||stylo) == anim-css-fillopacity-1-from-to.svg       anim-css-fillopacity-1-ref.svg
 fuzzy-if(skiaContent,1,550) fails-if(styloVsGecko||stylo) == anim-css-fillopacity-1-to.svg            anim-css-fillopacity-1-ref.svg
 fails-if(styloVsGecko||stylo) == anim-css-fillopacity-2-paced.svg         anim-css-fillopacity-2-ref.svg
 fails == anim-css-fillopacity-3-clamp-big.svg     anim-css-fillopacity-3-ref.svg # bug 501188
--- a/layout/reftests/svg/smil/syncbase/reftest.list
+++ b/layout/reftests/svg/smil/syncbase/reftest.list
@@ -1,99 +1,99 @@
 # Tests related to SVG Animation (using SMIL) that use syncbase timing.
 
 # New intervals
-fails-if(styloVsGecko||stylo) == new-interval-simple-1.svg green-box-ref.svg
-fails-if(styloVsGecko||stylo) == new-interval-simple-2.svg green-box-ref.svg
-fails-if(styloVsGecko||stylo) == new-interval-negative-offset-1.svg green-box-ref.svg
-fails-if(styloVsGecko||stylo) == new-interval-negative-offset-2.svg green-box-ref.svg
-fails-if(styloVsGecko||stylo) == new-interval-negative-offset-3.svg green-box-ref.svg
-fails-if(styloVsGecko||stylo) == new-interval-negative-offset-4.svg green-box-ref.svg
-fails-if(styloVsGecko||stylo) == new-interval-negative-syncbase-1.svg green-box-ref.svg
-fails-if(styloVsGecko||stylo) == new-interval-restart-1.svg green-box-ref.svg
-fails-if(styloVsGecko||stylo) == new-interval-restart-2.svg green-box-ref.svg
-fails-if(styloVsGecko||stylo) == new-interval-restart-3.svg green-box-ref.svg
-fails-if(styloVsGecko||stylo) == new-interval-early-end-1.svg green-box-ref.svg
-fails-if(styloVsGecko||stylo) == new-interval-early-end-2.svg green-box-ref.svg
-fails-if(styloVsGecko||stylo) == new-interval-early-end-3.svg green-box-ref.svg
+== new-interval-simple-1.svg green-box-ref.svg
+== new-interval-simple-2.svg green-box-ref.svg
+== new-interval-negative-offset-1.svg green-box-ref.svg
+== new-interval-negative-offset-2.svg green-box-ref.svg
+== new-interval-negative-offset-3.svg green-box-ref.svg
+== new-interval-negative-offset-4.svg green-box-ref.svg
+== new-interval-negative-syncbase-1.svg green-box-ref.svg
+== new-interval-restart-1.svg green-box-ref.svg
+== new-interval-restart-2.svg green-box-ref.svg
+== new-interval-restart-3.svg green-box-ref.svg
+== new-interval-early-end-1.svg green-box-ref.svg
+== new-interval-early-end-2.svg green-box-ref.svg
+== new-interval-early-end-3.svg green-box-ref.svg
 == new-interval-early-end-4.svg green-box-ref.svg
-fails-if(styloVsGecko||stylo) == new-interval-early-end-5.svg green-box-ref.svg
-fails-if(styloVsGecko||stylo) == new-interval-early-end-6.svg green-box-ref.svg
+== new-interval-early-end-5.svg green-box-ref.svg
+== new-interval-early-end-6.svg green-box-ref.svg
 == new-interval-early-end-7.svg green-box-ref.svg
-fails-if(styloVsGecko||stylo) == new-interval-doubly-dependent-1.svg green-box-ref.svg
-fails-if(styloVsGecko||stylo) == new-interval-doubly-dependent-2.svg green-box-ref.svg
-fails-if(styloVsGecko||stylo) == new-interval-doubly-dependent-3.svg green-box-ref.svg
-fails-if(styloVsGecko||stylo) == new-interval-triply-dependent-1.svg green-box-ref.svg
-fails-if(styloVsGecko||stylo) == new-interval-triply-dependent-2.svg green-box-ref.svg
-fails-if(styloVsGecko||stylo) == new-interval-end-negative-1.svg green-box-ref.svg
-fails-if(styloVsGecko||stylo) == new-interval-end-negative-2.svg green-box-ref.svg
-fails-if(styloVsGecko||stylo) == new-interval-end-dep-1.svg green-box-ref.svg
-fails-if(styloVsGecko||stylo) == new-interval-chain-1.svg green-box-ref.svg
-fails-if(styloVsGecko||stylo) == new-interval-chain-2.svg green-box-ref.svg
-fails-if(styloVsGecko||stylo) == new-interval-sample-order-1.svg green-box-ref.svg
-fails-if(styloVsGecko||stylo) == new-interval-freeze-begin-1.svg green-box-ref.svg
+== new-interval-doubly-dependent-1.svg green-box-ref.svg
+== new-interval-doubly-dependent-2.svg green-box-ref.svg
+== new-interval-doubly-dependent-3.svg green-box-ref.svg
+== new-interval-triply-dependent-1.svg green-box-ref.svg
+== new-interval-triply-dependent-2.svg green-box-ref.svg
+== new-interval-end-negative-1.svg green-box-ref.svg
+== new-interval-end-negative-2.svg green-box-ref.svg
+== new-interval-end-dep-1.svg green-box-ref.svg
+== new-interval-chain-1.svg green-box-ref.svg
+== new-interval-chain-2.svg green-box-ref.svg
+== new-interval-sample-order-1.svg green-box-ref.svg
+== new-interval-freeze-begin-1.svg green-box-ref.svg
 
 # Changing intervals
-fails-if(styloVsGecko||stylo) == changed-interval-simple-1.svg green-box-ref.svg
-fails-if(styloVsGecko||stylo) == changed-interval-simple-2.svg green-box-ref.svg
-fails-if(styloVsGecko||stylo) == changed-interval-simple-3.svg green-box-ref.svg
-fails-if(styloVsGecko||stylo) == changed-interval-simple-4.svg green-box-ref.svg
+== changed-interval-simple-1.svg green-box-ref.svg
+== changed-interval-simple-2.svg green-box-ref.svg
+== changed-interval-simple-3.svg green-box-ref.svg
+== changed-interval-simple-4.svg green-box-ref.svg
 == changed-interval-simple-5.svg green-box-ref.svg
-fails-if(styloVsGecko||stylo) == changed-interval-resolved-1.svg green-box-ref.svg
-fails-if(styloVsGecko||stylo) == changed-interval-resolved-2.svg green-box-ref.svg
-fails-if(styloVsGecko||stylo) == changed-interval-sort-1.svg green-box-ref.svg
-fails-if(styloVsGecko||stylo) == changed-interval-change-spec-1.svg green-box-ref.svg
-fails-if(styloVsGecko||stylo) == changed-interval-change-spec-2.svg green-box-ref.svg
-fails-if(styloVsGecko||stylo) == changed-interval-change-spec-3.svg green-box-ref.svg
+== changed-interval-resolved-1.svg green-box-ref.svg
+== changed-interval-resolved-2.svg green-box-ref.svg
+== changed-interval-sort-1.svg green-box-ref.svg
+== changed-interval-change-spec-1.svg green-box-ref.svg
+== changed-interval-change-spec-2.svg green-box-ref.svg
+== changed-interval-change-spec-3.svg green-box-ref.svg
 == changed-interval-change-spec-4.svg green-box-ref.svg
 
 # Deleted intervals
 == deleted-interval-simple-1.svg green-box-ref.svg
 == deleted-interval-simple-2.svg green-box-ref.svg
 == deleted-interval-simple-3.svg green-box-ref.svg
 == deleted-interval-simple-4.svg green-box-ref.svg
 == deleted-interval-simple-5.svg green-box-ref.svg
 
 # Trimmed intervals
-fails-if(styloVsGecko||stylo) == trimmed-interval-1.svg green-box-ref.svg
+== trimmed-interval-1.svg green-box-ref.svg
 
 # Cyclic dependencies
-fails-if(styloVsGecko||stylo) == cycle-ok-1.svg green-box-ref.svg
-fails-if(styloVsGecko||stylo) == cycle-ok-2.svg green-box-ref.svg
-fails-if(styloVsGecko||stylo) == cycle-ok-3.svg green-box-ref.svg
-fails-if(styloVsGecko||stylo) == cycle-ok-4.svg green-box-ref.svg
-fails-if(styloVsGecko||stylo) == cycle-ok-5.svg green-box-ref.svg
-fails-if(styloVsGecko||stylo) == cycle-self-ref-1.svg green-box-ref.svg
-fails-if(styloVsGecko||stylo) == cycle-self-ref-2.svg green-box-ref.svg
-fails-if(styloVsGecko||stylo) == cycle-self-ref-3.svg green-box-ref.svg
+== cycle-ok-1.svg green-box-ref.svg
+== cycle-ok-2.svg green-box-ref.svg
+== cycle-ok-3.svg green-box-ref.svg
+== cycle-ok-4.svg green-box-ref.svg
+== cycle-ok-5.svg green-box-ref.svg
+== cycle-self-ref-1.svg green-box-ref.svg
+== cycle-self-ref-2.svg green-box-ref.svg
+== cycle-self-ref-3.svg green-box-ref.svg
 == cycle-self-ref-4.svg green-box-ref.svg
-fails-if(styloVsGecko||stylo) == cycle-self-ref-5.svg green-box-ref.svg
+== cycle-self-ref-5.svg green-box-ref.svg
 == cycle-invalid-1.svg green-box-ref.svg
-fails-if(styloVsGecko||stylo) == cycle-invalid-2.svg green-box-ref.svg
-fails-if(styloVsGecko||stylo) == cycle-invalid-3.svg green-box-ref.svg
+== cycle-invalid-2.svg green-box-ref.svg
+== cycle-invalid-3.svg green-box-ref.svg
 == cycle-invalid-4.svg green-box-ref.svg
-fails-if(styloVsGecko||stylo) == cycle-change-1.svg green-box-ref.svg
-fails-if(styloVsGecko||stylo) == cycle-change-2.svg green-box-ref.svg
+== cycle-change-1.svg green-box-ref.svg
+== cycle-change-2.svg green-box-ref.svg
 == cycle-delete-1.svg green-box-ref.svg
-fails-if(styloVsGecko||stylo) == cycle-recursion-1.svg green-box-ref.svg
+== cycle-recursion-1.svg green-box-ref.svg
 == cycle-recursion-2.svg green-box-ref.svg
 
 # Animation sandwich priority
-fails-if(styloVsGecko||stylo) == sandwich-priority-1.svg green-box-ref.svg
-fails-if(styloVsGecko||stylo) == sandwich-priority-2.svg green-box-ref.svg
-fails-if(styloVsGecko||stylo) == sandwich-priority-3.svg green-box-ref.svg
-fails-if(styloVsGecko||stylo) == sandwich-priority-4.svg green-box-ref.svg
-fails-if(styloVsGecko||stylo) == sandwich-priority-5.svg green-box-ref.svg
-fails-if(styloVsGecko||stylo) == sandwich-priority-6.svg green-box-ref.svg
-fails-if(styloVsGecko||stylo) == sandwich-priority-7.svg green-box-ref.svg
-fails-if(styloVsGecko||stylo) == sandwich-priority-8.svg green-box-ref.svg
-fails-if(styloVsGecko||stylo) == sandwich-priority-9.svg green-box-ref.svg
-fails-if(styloVsGecko||stylo) == sandwich-priority-10.svg green-box-ref.svg
-fails-if(styloVsGecko||stylo) == sandwich-priority-11.svg green-box-ref.svg
-fails-if(styloVsGecko||stylo) == sandwich-priority-12.svg green-box-ref.svg
+== sandwich-priority-1.svg green-box-ref.svg
+== sandwich-priority-2.svg green-box-ref.svg
+== sandwich-priority-3.svg green-box-ref.svg
+== sandwich-priority-4.svg green-box-ref.svg
+== sandwich-priority-5.svg green-box-ref.svg
+== sandwich-priority-6.svg green-box-ref.svg
+== sandwich-priority-7.svg green-box-ref.svg
+== sandwich-priority-8.svg green-box-ref.svg
+== sandwich-priority-9.svg green-box-ref.svg
+== sandwich-priority-10.svg green-box-ref.svg
+== sandwich-priority-11.svg green-box-ref.svg
+== sandwich-priority-12.svg green-box-ref.svg
 
 # Cross-time container dependencies
-fails-if(styloVsGecko||stylo) == cross-container-1.xhtml green-box-ref.xhtml
+== cross-container-1.xhtml green-box-ref.xhtml
 == cross-container-2.xhtml green-box-ref.xhtml
-fails-if(styloVsGecko||stylo) == cross-container-3.xhtml green-box-ref.xhtml
+== cross-container-3.xhtml green-box-ref.xhtml
 
 # Filtering
-fails-if(styloVsGecko||stylo) == filtered-interval-1.svg green-box-ref.svg
+== filtered-interval-1.svg green-box-ref.svg
--- a/servo/components/style/properties/gecko.mako.rs
+++ b/servo/components/style/properties/gecko.mako.rs
@@ -456,16 +456,45 @@ fn color_to_nscolor_zero_currentcolor(co
     pub fn copy_${ident}_from(&mut self, other: &Self) {
         unsafe {
             bindings::Gecko_nsStyleSVGPaint_CopyFrom(
                 &mut ${get_gecko_property(gecko_ffi_name)},
                 & ${get_gecko_property(gecko_ffi_name, "other")}
             );
         }
     }
+
+    #[allow(non_snake_case)]
+    pub fn clone_${ident}(&self) -> longhands::${ident}::computed_value::T {
+        use values::generics::{SVGPaint, SVGPaintKind};
+        use self::structs::nsStyleSVGPaintType;
+        use self::structs::nsStyleSVGFallbackType;
+        let ref paint = ${get_gecko_property(gecko_ffi_name)};
+        let fallback = if let nsStyleSVGFallbackType::eStyleSVGFallbackType_Color = paint.mFallbackType {
+            Some(Color::RGBA(convert_nscolor_to_rgba(paint.mFallbackColor)))
+        } else {
+            None
+        };
+        let kind = match paint.mType {
+            nsStyleSVGPaintType::eStyleSVGPaintType_None => SVGPaintKind::None,
+            nsStyleSVGPaintType::eStyleSVGPaintType_ContextFill => SVGPaintKind::ContextFill,
+            nsStyleSVGPaintType::eStyleSVGPaintType_ContextStroke => SVGPaintKind::ContextStroke,
+            nsStyleSVGPaintType::eStyleSVGPaintType_Server => {
+                // FIXME (bug 1353966) this should animate
+                SVGPaintKind::None
+            }
+            nsStyleSVGPaintType::eStyleSVGPaintType_Color => {
+                unsafe { SVGPaintKind::Color(Color::RGBA(convert_nscolor_to_rgba(*paint.mPaint.mColor.as_ref()))) }
+            }
+        };
+        SVGPaint {
+            kind: kind,
+            fallback: fallback,
+        }
+    }
 </%def>
 
 <%def name="impl_app_units(ident, gecko_ffi_name, need_clone, inherit_from=None, round_to_pixels=False)">
     #[allow(non_snake_case)]
     pub fn set_${ident}(&mut self, v: longhands::${ident}::computed_value::T) {
         let value = {
             % if round_to_pixels:
             let au_per_device_px = Au(self.gecko.mTwipsPerPixel);
--- a/servo/components/style/properties/longhand/inherited_svg.mako.rs
+++ b/servo/components/style/properties/longhand/inherited_svg.mako.rs
@@ -30,17 +30,17 @@
                          gecko_constant_prefix="NS_STYLE_COLOR_INTERPOLATION",
                          animation_value_type="discrete",
                          spec="https://www.w3.org/TR/SVG11/painting.html#ColorInterpolationFiltersProperty")}
 
 ${helpers.predefined_type(
     "fill", "SVGPaint",
     "::values::computed::SVGPaint::black()",
     products="gecko",
-    animation_value_type="none",
+    animation_value_type="IntermediateSVGPaint",
     boxed=True,
     spec="https://www.w3.org/TR/SVG2/painting.html#SpecifyingFillPaint")}
 
 ${helpers.predefined_type("fill-opacity", "Opacity", "1.0",
                           products="gecko", animation_value_type="none",
                           spec="https://www.w3.org/TR/SVG11/painting.html#FillOpacityProperty")}
 
 ${helpers.single_keyword("fill-rule", "nonzero evenodd",
@@ -54,17 +54,17 @@
                          products="gecko",
                          animation_value_type="discrete",
                          spec="https://www.w3.org/TR/SVG11/painting.html#ShapeRenderingProperty")}
 
 ${helpers.predefined_type(
     "stroke", "SVGPaint",
     "Default::default()",
     products="gecko",
-    animation_value_type="none",
+    animation_value_type="IntermediateSVGPaint",
     boxed=True,
     spec="https://www.w3.org/TR/SVG2/painting.html#SpecifyingStrokePaint")}
 
 ${helpers.predefined_type(
     "stroke-width", "LengthOrPercentageOrNumber",
     "Either::First(1.0)",
     "parse_non_negative",
     products="gecko",