Bug 1246320 part 4 - Pass a document to TimingParams
MozReview-Commit-ID: 9Sh8eWHdDD6
--- a/dom/animation/KeyframeEffect.cpp
+++ b/dom/animation/KeyframeEffect.cpp
@@ -656,18 +656,24 @@ template <class KeyframeEffectType, clas
/* static */ already_AddRefed<KeyframeEffectType>
KeyframeEffectReadOnly::ConstructKeyframeEffect(
const GlobalObject& aGlobal,
const Nullable<ElementOrCSSPseudoElement>& aTarget,
JS::Handle<JSObject*> aFrames,
const OptionsType& aOptions,
ErrorResult& aRv)
{
+ nsIDocument* doc = AnimationUtils::GetCurrentRealmDocument(aGlobal.Context());
+ if (!doc) {
+ aRv.Throw(NS_ERROR_FAILURE);
+ return nullptr;
+ }
+
TimingParams timingParams =
- TimingParams::FromOptionsUnion(aOptions, aTarget, aRv);
+ TimingParams::FromOptionsUnion(aOptions, doc, aRv);
if (aRv.Failed()) {
return nullptr;
}
return ConstructKeyframeEffect<KeyframeEffectType>(
aGlobal, aTarget, aFrames, timingParams, aRv);
}
--- a/dom/animation/TimingParams.cpp
+++ b/dom/animation/TimingParams.cpp
@@ -1,16 +1,18 @@
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
/* 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/. */
#include "mozilla/TimingParams.h"
+#include "nsIDocument.h"
+
namespace mozilla {
template <class OptionsType>
static const dom::AnimationEffectTimingProperties&
GetTimingProperties(const OptionsType& aOptions);
template <>
/* static */ const dom::AnimationEffectTimingProperties&
@@ -27,82 +29,67 @@ GetTimingProperties(
const dom::UnrestrictedDoubleOrKeyframeAnimationOptions& aOptions)
{
MOZ_ASSERT(aOptions.IsKeyframeAnimationOptions());
return aOptions.GetAsKeyframeAnimationOptions();
}
template <class OptionsType>
static TimingParams
-TimingParamsFromOptionsUnion(
- const OptionsType& aOptions,
- const Nullable<dom::ElementOrCSSPseudoElement>& aTarget,
- ErrorResult& aRv)
+TimingParamsFromOptionsUnion(const OptionsType& aOptions,
+ nsIDocument* aDocument,
+ ErrorResult& aRv)
{
TimingParams result;
if (aOptions.IsUnrestrictedDouble()) {
double durationInMs = aOptions.GetAsUnrestrictedDouble();
if (durationInMs >= 0) {
result.mDuration.emplace(
StickyTimeDuration::FromMilliseconds(durationInMs));
} else {
aRv.Throw(NS_ERROR_DOM_TYPE_ERR);
}
} else {
- // If aTarget is a pseudo element, we pass its parent element because
- // TimingParams only needs its owner doc to parse easing and both pseudo
- // element and its parent element should have the same owner doc.
- // Bug 1246320: Avoid passing the element for parsing the timing function
- RefPtr<dom::Element> targetElement;
- if (!aTarget.IsNull()) {
- const dom::ElementOrCSSPseudoElement& target = aTarget.Value();
- MOZ_ASSERT(target.IsElement() || target.IsCSSPseudoElement(),
- "Uninitialized target");
- if (target.IsElement()) {
- targetElement = &target.GetAsElement();
- } else {
- targetElement = target.GetAsCSSPseudoElement().ParentElement();
- }
- }
const dom::AnimationEffectTimingProperties& timing =
GetTimingProperties(aOptions);
+
Maybe<StickyTimeDuration> duration =
TimingParams::ParseDuration(timing.mDuration, aRv);
if (aRv.Failed()) {
return result;
}
+
result.mDuration = duration;
result.mDelay = TimeDuration::FromMilliseconds(timing.mDelay);
result.mEndDelay = TimeDuration::FromMilliseconds(timing.mEndDelay);
result.mIterations = timing.mIterations;
result.mIterationStart = timing.mIterationStart;
result.mDirection = timing.mDirection;
result.mFill = timing.mFill;
- result.mFunction =
- AnimationUtils::ParseEasing(timing.mEasing, targetElement->OwnerDoc());
+ result.mFunction = AnimationUtils::ParseEasing(timing.mEasing, aDocument);
}
return result;
}
/* static */ TimingParams
TimingParams::FromOptionsUnion(
const dom::UnrestrictedDoubleOrKeyframeEffectOptions& aOptions,
- const Nullable<dom::ElementOrCSSPseudoElement>& aTarget,
+ nsIDocument* aDocument,
ErrorResult& aRv)
{
- return TimingParamsFromOptionsUnion(aOptions, aTarget, aRv);
+ return TimingParamsFromOptionsUnion(aOptions, aDocument, aRv);
}
/* static */ TimingParams
TimingParams::FromOptionsUnion(
const dom::UnrestrictedDoubleOrKeyframeAnimationOptions& aOptions,
- const Nullable<dom::ElementOrCSSPseudoElement>& aTarget,
+ nsIDocument* aDocument,
ErrorResult& aRv)
{
- return TimingParamsFromOptionsUnion(aOptions, aTarget, aRv);
+ return TimingParamsFromOptionsUnion(aOptions, aDocument, aRv);
}
bool
TimingParams::operator==(const TimingParams& aOther) const
{
return mDuration == aOther.mDuration &&
mDelay == aOther.mDelay &&
mIterations == aOther.mIterations &&
--- a/dom/animation/TimingParams.h
+++ b/dom/animation/TimingParams.h
@@ -12,41 +12,38 @@
#include "mozilla/ComputedTimingFunction.h"
#include "mozilla/Maybe.h"
#include "mozilla/TimeStamp.h" // for TimeDuration
// X11 has a #define for None
#ifdef None
#undef None
#endif
-#include "mozilla/dom/AnimationEffectReadOnlyBinding.h" // for FillMode
- // and PlaybackDirection
+#include "mozilla/dom/AnimationEffectReadOnlyBinding.h" // for FillMode
+ // and PlaybackDirection
+
+class nsIDocument;
namespace mozilla {
namespace dom {
-struct AnimationEffectTimingProperties;
-class Element;
class UnrestrictedDoubleOrKeyframeEffectOptions;
class UnrestrictedDoubleOrKeyframeAnimationOptions;
-class ElementOrCSSPseudoElement;
}
struct TimingParams
{
TimingParams() = default;
static TimingParams FromOptionsUnion(
const dom::UnrestrictedDoubleOrKeyframeEffectOptions& aOptions,
- const Nullable<dom::ElementOrCSSPseudoElement>& aTarget,
- ErrorResult& aRv);
+ nsIDocument* aDocument, ErrorResult& aRv);
static TimingParams FromOptionsUnion(
const dom::UnrestrictedDoubleOrKeyframeAnimationOptions& aOptions,
- const Nullable<dom::ElementOrCSSPseudoElement>& aTarget,
- ErrorResult& aRv);
+ nsIDocument* aDocument, ErrorResult& aRv);
// Range-checks and validates an UnrestrictedDoubleOrString or
// OwningUnrestrictedDoubleOrString object and converts to a
// StickyTimeDuration value or Nothing() if aDuration is "auto".
// Caller must check aRv.Failed().
template <class DoubleOrString>
static Maybe<StickyTimeDuration> ParseDuration(DoubleOrString& aDuration,
ErrorResult& aRv) {
--- a/dom/base/Element.cpp
+++ b/dom/base/Element.cpp
@@ -3349,17 +3349,18 @@ Element::Animate(const Nullable<ElementO
js::GetObjectCompartment(ownerGlobal->GetGlobalJSObject())) {
ac.emplace(aContext, ownerGlobal->GetGlobalJSObject());
if (!JS_WrapObject(aContext, &frames)) {
return nullptr;
}
}
TimingParams timingParams =
- TimingParams::FromOptionsUnion(aOptions, aTarget, aError);
+ TimingParams::FromOptionsUnion(aOptions, referenceElement->OwnerDoc(),
+ aError);
if (aError.Failed()) {
return nullptr;
}
RefPtr<KeyframeEffect> effect =
KeyframeEffect::Constructor(global, aTarget, frames, timingParams, aError);
if (aError.Failed()) {
return nullptr;