Closed Bug 1355349 Opened 7 years ago Closed 7 years ago

stylo: Additive SMIL animations

Categories

(Core :: CSS Parsing and Computation, enhancement, P1)

enhancement

Tracking

()

RESOLVED FIXED
mozilla55
Tracking Status
firefox55 --- fixed

People

(Reporter: birtles, Assigned: birtles)

References

(Blocks 1 open bug)

Details

Attachments

(10 files, 4 obsolete files)

59 bytes, text/x-review-board-request
hiro
: review+
Details
59 bytes, text/x-review-board-request
hiro
: review+
Details
59 bytes, text/x-review-board-request
hiro
: review+
Details
59 bytes, text/x-review-board-request
hiro
: review+
Details
59 bytes, text/x-review-board-request
hiro
: review+
Details
59 bytes, text/x-review-board-request
hiro
: review+
Details
59 bytes, text/x-review-board-request
hiro
: review+
Details
59 bytes, text/x-review-board-request
hiro
: review+
Details
59 bytes, text/x-review-board-request
hiro
: review+
Details
41 bytes, text/x-github-pull-request
Details | Review
      No description provided.
The idea here is we'll expose an FFI where we pass in a RawServoComputedValue and you'll get back a computed value for the same property with a suitable zero value, or None. Then we'll use this to implement the Stylo equivalent of GetZeroValueForUnit (but without the unit).

Just dropping this patch here for a while since it's not very useful until we implement additive animation (bug 1329878).
Assignee: nobody → bbirtles
Status: NEW → ASSIGNED
Priority: P3 → P1
Attachment #8856822 - Attachment is obsolete: true
I didn't quite get this to review before going away but I'm putting the patches up now in case anyone else wants to build on top of these while I'm away. This should mostly work I think (I've tested locally with a simple by-animation and it seems to do the right thing). I'm still waiting to see what try brings back however.

For my own notes when I get back:

* I need to go over the first base styles patch. I'm not entirely confident it's right.
* There are probably (hopefully) some test expectations that need to be updated.
* Other than that, it's probably mostly a matter of seeing what tests fail to pass that should pass (e.g. see the XXX comment in the "Use Servo's initial values to fill in missing SMIL animation endpoints" about whether we need to do some kind of 0 value fixup).
Attachment #8871620 - Attachment is obsolete: true
Comment on attachment 8873734 [details]
Bug 1355349 - Move calculation of pseudo type in nsComputedDOMStyle::DoGetStyleContextNoFlush;

https://reviewboard.mozilla.org/r/145134/#review149092
Attachment #8873734 - Flags: review?(hikezoe) → review+
The "Get unanimated style in nsComputedDOMStyle::DoGetStyleContextNoFlush for Servo too" patch is probably wrong.

Running the tests in dom/smil/tests I hit this failed assertion:

11182 INFO TEST-PASS | dom/smil/test/test_smilXHR.xhtml | animation of attribute shouldn't be taking effect
GECKO(11964) | [Parent 11964] WARNING: stylo: No docshell yet, assuming Gecko style system: file c:/moz/src2/dom/base/nsDocument.cpp, line 13174
GECKO(11964) | Assertion failure: IsStyledByServo(), at c:\moz\src2\obj-stylo-debug-opt\dist\include\mozilla/dom/Element.h:466
GECKO(11964) | #01: mozilla::ServoStyleSet::ResolveStyleLazily (c:\moz\src2\layout\style\servostyleset.cpp:1128)
GECKO(11964) | #02: mozilla::ServoStyleSet::ResolveTransientServoStyle (c:\moz\src2\layout\style\servostyleset.cpp:548)
GECKO(11964) | #03: mozilla::ServoStyleSet::ResolveTransientStyle (c:\moz\src2\layout\style\servostyleset.cpp:532)
GECKO(11964) | #04: nsComputedDOMStyle::DoGetStyleContextNoFlush (c:\moz\src2\layout\style\nscomputeddomstyle.cpp:671)
GECKO(11964) | #05: nsComputedDOMStyle::GetStyleContext (c:\moz\src2\layout\style\nscomputeddomstyle.cpp:425)
GECKO(11964) | #06: nsComputedDOMStyle::UpdateCurrentStyleSources (c:\moz\src2\layout\style\nscomputeddomstyle.cpp:897)
GECKO(11964) | #07: nsComputedDOMStyle::GetPropertyCSSValue (c:\moz\src2\layout\style\nscomputeddomstyle.cpp:1000)
GECKO(11964) | #08: nsComputedDOMStyle::GetPropertyValue (c:\moz\src2\layout\style\nscomputeddomstyle.cpp:380)
GECKO(11964) | #09: mozilla::dom::CSSStyleDeclarationBinding::getPropertyValue (c:\moz\src2\obj-stylo-debug-opt\dom\bindings\cssstyledeclarationbinding.cpp:165)
GECKO(11964) | #10: mozilla::dom::GenericBindingMethod (c:\moz\src2\dom\bindings\bindingutils.cpp:2954)
GECKO(11964) | #11: js::CallJSNative (c:\moz\src2\js\src\jscntxtinlines.h:293)
GECKO(11964) | #12: js::InternalCallOrConstruct (c:\moz\src2\js\src\vm\interpreter.cpp:470)
GECKO(11964) | #13: Interpret (c:\moz\src2\js\src\vm\interpreter.cpp:3028)
Comment on attachment 8871617 [details]
Bug 1355349 - Add get_zero_value to Animatable trait;

https://reviewboard.mozilla.org/r/143100/#review149096
Attachment #8871617 - Flags: review?(hikezoe) → review+
Comment on attachment 8871617 [details]
Bug 1355349 - Add get_zero_value to Animatable trait;

https://reviewboard.mozilla.org/r/143100/#review149102

::: servo/components/style/properties/helpers/animated_properties.mako.rs:1445
(Diff revision 2)
>              FontWeight::Weight900
>          })
>      }
>  
>      #[inline]
> +    fn get_zero_value(&self) -> Option<Self> { Some(FontWeight::Weight400) }

We should either change this to zero (except there is no zero value :( ) or we should make add_weighted add a difference from 400.
Comment on attachment 8873735 [details]
Bug 1355349 - Don't introduce calc() when interpolating between length and percentages if either side is zero;

https://reviewboard.mozilla.org/r/145136/#review149104
Attachment #8873735 - Flags: review?(hikezoe) → review+
(In reply to Brian Birtles (:birtles) from comment #23)
> GECKO(11964) | Assertion failure: IsStyledByServo(), at
> c:\moz\src2\obj-stylo-debug-opt\dist\include\mozilla/dom/Element.h:466
> GECKO(11964) | #01: mozilla::ServoStyleSet::ResolveStyleLazily
> (c:\moz\src2\layout\style\servostyleset.cpp:1128)

This is bizarre. Even in my local copy ResolveStyleLazily doesn't call IsStyledByServo as far as I can tell.

Something to investigate on Monday.
Comment on attachment 8871618 [details]
Bug 1355349 - Use Servo's zero values to fill in missing SMIL animation endpoints;

https://reviewboard.mozilla.org/r/143102/#review149106

::: dom/smil/nsSMILCSSValueType.cpp:110
(Diff revision 2)
> -    if (!aValue1 || !aValue2) {
> -      NS_WARNING("stylo: Missing values are not yet supported (bug 1355349)");
> -      return false;
> +      aZeroValueStorage.mServo =
> +        Servo_AnimationValues_GetZeroValue(aValue2->mServo).Consume();
> +      aValue1 = &aZeroValueStorage;

This looks funny but I don't have other ways.  Honestely I am really looking forward to the day we drop the wrapper, AnimationValue.
Attachment #8871618 - Flags: review?(hikezoe) → review+
Comment on attachment 8871619 [details]
Bug 1355349 - Add FFI for calling Servo's add and accumulate methods on animation values;

https://reviewboard.mozilla.org/r/143104/#review149108
Attachment #8871619 - Flags: review?(hikezoe) → review+
(In reply to Hiroyuki Ikezoe (:hiro) from comment #28)
> Comment on attachment 8871618 [details]
> Bug 1355349 - Use Servo's zero values to fill in missing SMIL animation
> endpoints;
> 
> https://reviewboard.mozilla.org/r/143102/#review149106
> 
> ::: dom/smil/nsSMILCSSValueType.cpp:110
> (Diff revision 2)
> > -    if (!aValue1 || !aValue2) {
> > -      NS_WARNING("stylo: Missing values are not yet supported (bug 1355349)");
> > -      return false;
> > +      aZeroValueStorage.mServo =
> > +        Servo_AnimationValues_GetZeroValue(aValue2->mServo).Consume();
> > +      aValue1 = &aZeroValueStorage;
> 
> This looks funny but I don't have other ways.  Honestely I am really looking
> forward to the day we drop the wrapper, AnimationValue.

Yeah, I thought of a few other ways but they all introduced extra copying. It's weird because in the Gecko codepath we can use statically initialized objects but in Servo we can't.
Comment on attachment 8873736 [details]
Bug 1355349 - Treat properties that can't be animated by the Servo backend as unanimatable;

https://reviewboard.mozilla.org/r/145138/#review149110
Attachment #8873736 - Flags: review?(hikezoe) → review+
Comment on attachment 8873737 [details]
Bug 1355349 - Drop 'virtual' annotation from overridden methods in nsSMILCSSValueType.h;

https://reviewboard.mozilla.org/r/145140/#review149112
Attachment #8873737 - Flags: review?(hikezoe) → review+
Comment on attachment 8873738 [details]
Bug 1355349 - Reformat a ternary operator to match coding style;

https://reviewboard.mozilla.org/r/145142/#review149114
Attachment #8873738 - Flags: review?(hikezoe) → review+
Comment on attachment 8871621 [details]
Bug 1355349 - Call Servo's add and accumulate methods for SMIL animations;

https://reviewboard.mozilla.org/r/143108/#review149120
Attachment #8871621 - Flags: review?(hikezoe) → review+
Comment on attachment 8873739 [details]
Bug 1355349 - Update stylo test expectations;

https://reviewboard.mozilla.org/r/145144/#review149122
Attachment #8873739 - Flags: review?(hikezoe) → review+
Comment on attachment 8871616 [details]
Bug 1355349 - Get unanimated style in nsComputedDOMStyle::DoGetStyleContextNoFlush for Servo too;

https://reviewboard.mozilla.org/r/143098/#review149124

I think this basically works, but sometimes returns stale base style I guess. I don't actually remember when SMIL calls this code, if it's called in PreTraversal(), there might be some cases that we have stale styles.  Maybe, a subsequent tick right after we set inline style?

Even if there is a case we have stale styles, I am OK with fixing the case when we move SMIL on the web animation architecture.
Attachment #8871616 - Flags: review?(hikezoe) → review+
(In reply to Brian Birtles (:birtles) from comment #23)
> The "Get unanimated style in nsComputedDOMStyle::DoGetStyleContextNoFlush
> for Servo too" patch is probably wrong.
> 
> Running the tests in dom/smil/tests I hit this failed assertion:
> 
> 11182 INFO TEST-PASS | dom/smil/test/test_smilXHR.xhtml | animation of
> attribute shouldn't be taking effect
> GECKO(11964) | [Parent 11964] WARNING: stylo: No docshell yet, assuming
> Gecko style system: file c:/moz/src2/dom/base/nsDocument.cpp, line 13174
> GECKO(11964) | Assertion failure: IsStyledByServo(), at
> c:\moz\src2\obj-stylo-debug-opt\dist\include\mozilla/dom/Element.h:466
> GECKO(11964) | #01: mozilla::ServoStyleSet::ResolveStyleLazily
> (c:\moz\src2\layout\style\servostyleset.cpp:1128)
> GECKO(11964) | #02: mozilla::ServoStyleSet::ResolveTransientServoStyle
> (c:\moz\src2\layout\style\servostyleset.cpp:548)
> GECKO(11964) | #03: mozilla::ServoStyleSet::ResolveTransientStyle
> (c:\moz\src2\layout\style\servostyleset.cpp:532)
> GECKO(11964) | #04: nsComputedDOMStyle::DoGetStyleContextNoFlush
> (c:\moz\src2\layout\style\nscomputeddomstyle.cpp:671)
> GECKO(11964) | #05: nsComputedDOMStyle::GetStyleContext
> (c:\moz\src2\layout\style\nscomputeddomstyle.cpp:425)
> GECKO(11964) | #06: nsComputedDOMStyle::UpdateCurrentStyleSources
> (c:\moz\src2\layout\style\nscomputeddomstyle.cpp:897)
> GECKO(11964) | #07: nsComputedDOMStyle::GetPropertyCSSValue
> (c:\moz\src2\layout\style\nscomputeddomstyle.cpp:1000)
> GECKO(11964) | #08: nsComputedDOMStyle::GetPropertyValue
> (c:\moz\src2\layout\style\nscomputeddomstyle.cpp:380)
> GECKO(11964) | #09:
> mozilla::dom::CSSStyleDeclarationBinding::getPropertyValue
> (c:\moz\src2\obj-stylo-debug-opt\dom\bindings\cssstyledeclarationbinding.cpp:
> 165)
> GECKO(11964) | #10: mozilla::dom::GenericBindingMethod
> (c:\moz\src2\dom\bindings\bindingutils.cpp:2954)
> GECKO(11964) | #11: js::CallJSNative
> (c:\moz\src2\js\src\jscntxtinlines.h:293)
> GECKO(11964) | #12: js::InternalCallOrConstruct
> (c:\moz\src2\js\src\vm\interpreter.cpp:470)
> GECKO(11964) | #13: Interpret (c:\moz\src2\js\src\vm\interpreter.cpp:3028)

It looks like this might not be related to this patch series after all. This is happening in test_smilXHR.html where we first do:

  var xhr = new XMLHttpRequest();
  xhr.open("GET", "smilXHR_helper.svg", false);
  xhr.send();
  var xdoc = xhr.responseXML

Then we pull out a circle element from the document:

  var circ = xdoc.getElementById("circ")

Then at the end we check the computed style of the circle:

  is(SMILUtil.getComputedStyleSimple(circ, "opacity"), "1",
     "animation of CSS property shouldn't be taking effect");

The trouble is, in nsComputedDOMStyle::DoGetStyleContextNoFlush we have the following check:

  if (ServoStyleSet* servoSet = styleSet->GetAsServo()) {
    StyleRuleInclusion rules = aStyleType == eDefaultOnly
                               ? StyleRuleInclusion::DefaultOnly
                               : StyleRuleInclusion::All;
    return servoSet->ResolveTransientStyle(aElement, aPseudo, type, rules);
  }

For whatever reason, styleSet->GetAsServo() returns a ServoStyleSet here (I haven't dug into exactly how we look up the styleSet there) so we go ahead and call ResolveTransientStyle.

From there we have the following call stack:

  ServoStyleSet::ResolveTransientStyle
  ServoStyleSet::ResolveTransientServoStyle
  ServoStyleSet::ResolveStyleLazily
  EffectCompositor::PreTraverse

In EffectCompositor::PreTraverse we have:

  bool flushThrottledRestyles = elementToRestyle &&
                                elementToRestyle->HasDirtyDescendantsForServo();

|elementToRestyle| here is the <circle> element but HasDirtyDescendantsForServo contains the assertion:

  MOZ_ASSERT(IsStyledByServo());

which calls:

  nsINode::IsStyledByServo() const
  {
    return OwnerDoc()->IsStyledByServo();
  }

and the OwnerDoc() here is the XHR doc, which is not styled by servo so the assertion fails.

So there's some kind of mismatch between consulting the element's owner doc to see if we're using Servo, and whatever we end up doing to get the style set for the element in DoGetStyleContextNoFlush.

I'm currently building without the patches in this bug to confirm that the assertion still fails without them. If it does, I'll file a separate bug for this issue.
(In reply to Brian Birtles (:birtles) from comment #37)
> I'm currently building without the patches in this bug to confirm that the
> assertion still fails without them. If it does, I'll file a separate bug for
> this issue.

Confirmed this test fails on a fresh checkout of m-c and filed bug 1370123 for fixing it.
Attachment #8871617 - Attachment is obsolete: true
Attachment #8873735 - Attachment is obsolete: true
Pushed by bbirtles@mozilla.com:
https://hg.mozilla.org/integration/autoland/rev/38ae6e3d3a11
Move calculation of pseudo type in nsComputedDOMStyle::DoGetStyleContextNoFlush; r=hiro
https://hg.mozilla.org/integration/autoland/rev/862c08dd715b
Get unanimated style in nsComputedDOMStyle::DoGetStyleContextNoFlush for Servo too; r=hiro
https://hg.mozilla.org/integration/autoland/rev/47db7107c874
Use Servo's zero values to fill in missing SMIL animation endpoints; r=hiro
https://hg.mozilla.org/integration/autoland/rev/ef01cc3b84b8
Add FFI for calling Servo's add and accumulate methods on animation values; r=hiro
https://hg.mozilla.org/integration/autoland/rev/992504b822d2
Treat properties that can't be animated by the Servo backend as unanimatable; r=hiro
https://hg.mozilla.org/integration/autoland/rev/297d24c38ab3
Drop 'virtual' annotation from overridden methods in nsSMILCSSValueType.h; r=hiro
https://hg.mozilla.org/integration/autoland/rev/c0ef218a7f9e
Reformat a ternary operator to match coding style; r=hiro
https://hg.mozilla.org/integration/autoland/rev/2f7ad629f8b0
Call Servo's add and accumulate methods for SMIL animations; r=hiro
https://hg.mozilla.org/integration/autoland/rev/a3c3e847db4a
Update stylo test expectations; r=hiro
You need to log in before you can comment on or make changes to this bug.

Attachment

General

Created:
Updated:
Size: