Bug 1456394 - Drop AnimationEffectTiming(ReadOnly) interfaces; r=bz,hiro

MozReview-Commit-ID: KKqAWemDXwv
This commit is contained in:
Brian Birtles
2018-05-07 12:58:37 +09:00
parent 48b968ddce
commit 82becfc790
15 changed files with 19 additions and 440 deletions

View File

@@ -17,15 +17,12 @@ namespace dom {
NS_IMPL_CYCLE_COLLECTION_CLASS(AnimationEffect)
NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(AnimationEffect)
if (tmp->mTiming) {
tmp->mTiming->Unlink();
}
NS_IMPL_CYCLE_COLLECTION_UNLINK(mDocument, mTiming, mAnimation)
NS_IMPL_CYCLE_COLLECTION_UNLINK(mDocument, mAnimation)
NS_IMPL_CYCLE_COLLECTION_UNLINK_PRESERVED_WRAPPER
NS_IMPL_CYCLE_COLLECTION_UNLINK_END
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(AnimationEffect)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mDocument, mTiming, mAnimation)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mDocument, mAnimation)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
NS_IMPL_CYCLE_COLLECTION_TRACE_WRAPPERCACHE(AnimationEffect)
@@ -38,14 +35,6 @@ NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(AnimationEffect)
NS_INTERFACE_MAP_ENTRY(nsISupports)
NS_INTERFACE_MAP_END
AnimationEffect::AnimationEffect(
nsIDocument* aDocument, AnimationEffectTimingReadOnly* aTiming)
: mDocument(aDocument)
, mTiming(aTiming)
{
MOZ_ASSERT(aTiming);
}
// https://drafts.csswg.org/web-animations/#current
bool
AnimationEffect::IsCurrent() const
@@ -67,20 +56,15 @@ AnimationEffect::IsInEffect() const
return !computedTiming.mProgress.IsNull();
}
already_AddRefed<AnimationEffectTimingReadOnly>
AnimationEffect::Timing()
{
RefPtr<AnimationEffectTimingReadOnly> temp(mTiming);
return temp.forget();
}
void
AnimationEffect::SetSpecifiedTiming(const TimingParams& aTiming)
{
if (mTiming->AsTimingParams() == aTiming) {
if (mTiming == aTiming) {
return;
}
mTiming->SetTimingParams(aTiming);
mTiming = aTiming;
if (mAnimation) {
Maybe<nsAutoAnimationMutationBatch> mb;
if (AsKeyframeEffect() && AsKeyframeEffect()->GetTarget()) {
@@ -343,8 +327,8 @@ void
AnimationEffect::UpdateTiming(const OptionalEffectTiming& aTiming,
ErrorResult& aRv)
{
TimingParams timing = TimingParams::MergeOptionalEffectTiming(
mTiming->AsTimingParams(), aTiming, mDocument, aRv);
TimingParams timing =
TimingParams::MergeOptionalEffectTiming(mTiming, aTiming, mDocument, aRv);
if (aRv.Failed()) {
return;
}
@@ -352,15 +336,6 @@ AnimationEffect::UpdateTiming(const OptionalEffectTiming& aTiming,
SetSpecifiedTiming(timing);
}
AnimationEffect::~AnimationEffect()
{
// mTiming is cycle collected, so we have to do null check first even though
// mTiming shouldn't be null during the lifetime of KeyframeEffect.
if (mTiming) {
mTiming->Unlink();
}
}
Nullable<TimeDuration>
AnimationEffect::GetLocalTime() const
{

View File

@@ -8,7 +8,6 @@
#define mozilla_dom_AnimationEffect_h
#include "mozilla/ComputedTiming.h"
#include "mozilla/dom/AnimationEffectTimingReadOnly.h"
#include "mozilla/dom/BindingDeclarations.h"
#include "mozilla/dom/Nullable.h"
#include "mozilla/Maybe.h"
@@ -25,7 +24,6 @@ struct ElementPropertyTransition;
namespace dom {
class Animation;
class AnimationEffectTimingReadOnly;
class KeyframeEffect;
struct ComputedEffectTiming;
@@ -36,8 +34,11 @@ public:
NS_DECL_CYCLE_COLLECTING_ISUPPORTS
NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS(AnimationEffect)
AnimationEffect(nsIDocument* aDocument,
AnimationEffectTimingReadOnly* aTiming);
AnimationEffect(nsIDocument* aDocument, const TimingParams& aTiming)
: mDocument(aDocument)
, mTiming(aTiming)
{
}
virtual KeyframeEffect* AsKeyframeEffect() { return nullptr; }
@@ -61,11 +62,7 @@ public:
void GetComputedTimingAsDict(ComputedEffectTiming& aRetVal) const;
void UpdateTiming(const OptionalEffectTiming& aTiming, ErrorResult& aRv);
already_AddRefed<AnimationEffectTimingReadOnly> Timing();
const TimingParams& SpecifiedTiming() const
{
return mTiming->AsTimingParams();
}
const TimingParams& SpecifiedTiming() const { return mTiming; }
void SetSpecifiedTiming(const TimingParams& aTiming);
// This function takes as input the timing parameters of an animation and
@@ -98,14 +95,14 @@ public:
virtual bool AffectsGeometry() const = 0;
protected:
virtual ~AnimationEffect();
virtual ~AnimationEffect() = default;
Nullable<TimeDuration> GetLocalTime() const;
protected:
RefPtr<nsIDocument> mDocument;
RefPtr<AnimationEffectTimingReadOnly> mTiming;
RefPtr<Animation> mAnimation;
TimingParams mTiming;
};
} // namespace dom

View File

@@ -1,152 +0,0 @@
/* -*- 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/dom/AnimationEffectTiming.h"
#include "mozilla/dom/AnimatableBinding.h"
#include "mozilla/dom/AnimationEffectTimingBinding.h"
#include "mozilla/dom/KeyframeEffect.h"
#include "mozilla/TimingParams.h"
#include "nsAString.h"
namespace mozilla {
namespace dom {
JSObject*
AnimationEffectTiming::WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto)
{
return AnimationEffectTimingBinding::Wrap(aCx, this, aGivenProto);
}
static inline void
PostSpecifiedTimingUpdated(KeyframeEffect* aEffect)
{
if (aEffect) {
aEffect->NotifySpecifiedTimingUpdated();
}
}
void
AnimationEffectTiming::SetDelay(double aDelay)
{
TimeDuration delay = TimeDuration::FromMilliseconds(aDelay);
if (mTiming.Delay() == delay) {
return;
}
mTiming.SetDelay(delay);
PostSpecifiedTimingUpdated(mEffect);
}
void
AnimationEffectTiming::SetEndDelay(double aEndDelay)
{
TimeDuration endDelay = TimeDuration::FromMilliseconds(aEndDelay);
if (mTiming.EndDelay() == endDelay) {
return;
}
mTiming.SetEndDelay(endDelay);
PostSpecifiedTimingUpdated(mEffect);
}
void
AnimationEffectTiming::SetFill(const FillMode& aFill)
{
if (mTiming.Fill() == aFill) {
return;
}
mTiming.SetFill(aFill);
PostSpecifiedTimingUpdated(mEffect);
}
void
AnimationEffectTiming::SetIterationStart(double aIterationStart,
ErrorResult& aRv)
{
if (mTiming.IterationStart() == aIterationStart) {
return;
}
TimingParams::ValidateIterationStart(aIterationStart, aRv);
if (aRv.Failed()) {
return;
}
mTiming.SetIterationStart(aIterationStart);
PostSpecifiedTimingUpdated(mEffect);
}
void
AnimationEffectTiming::SetIterations(double aIterations, ErrorResult& aRv)
{
if (mTiming.Iterations() == aIterations) {
return;
}
TimingParams::ValidateIterations(aIterations, aRv);
if (aRv.Failed()) {
return;
}
mTiming.SetIterations(aIterations);
PostSpecifiedTimingUpdated(mEffect);
}
void
AnimationEffectTiming::SetDuration(const UnrestrictedDoubleOrString& aDuration,
ErrorResult& aRv)
{
Maybe<StickyTimeDuration> newDuration =
TimingParams::ParseDuration(aDuration, aRv);
if (aRv.Failed()) {
return;
}
if (mTiming.Duration() == newDuration) {
return;
}
mTiming.SetDuration(Move(newDuration));
PostSpecifiedTimingUpdated(mEffect);
}
void
AnimationEffectTiming::SetDirection(const PlaybackDirection& aDirection)
{
if (mTiming.Direction() == aDirection) {
return;
}
mTiming.SetDirection(aDirection);
PostSpecifiedTimingUpdated(mEffect);
}
void
AnimationEffectTiming::SetEasing(const nsAString& aEasing, ErrorResult& aRv)
{
Maybe<ComputedTimingFunction> newFunction =
TimingParams::ParseEasing(aEasing, mDocument, aRv);
if (aRv.Failed()) {
return;
}
if (mTiming.TimingFunction() == newFunction) {
return;
}
mTiming.SetTimingFunction(Move(newFunction));
PostSpecifiedTimingUpdated(mEffect);
}
} // namespace dom
} // namespace mozilla

View File

@@ -1,49 +0,0 @@
/* -*- 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/. */
#ifndef mozilla_dom_AnimationEffectTiming_h
#define mozilla_dom_AnimationEffectTiming_h
#include "mozilla/dom/AnimationEffectTimingReadOnly.h"
#include "mozilla/Attributes.h" // For MOZ_NON_OWNING_REF
#include "nsStringFwd.h"
namespace mozilla {
namespace dom {
class KeyframeEffect;
class AnimationEffectTiming : public AnimationEffectTimingReadOnly
{
public:
AnimationEffectTiming(nsIDocument* aDocument,
const TimingParams& aTiming,
KeyframeEffect* aEffect)
: AnimationEffectTimingReadOnly(aDocument, aTiming)
, mEffect(aEffect) { }
JSObject* WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) override;
void Unlink() override { mEffect = nullptr; }
void SetDelay(double aDelay);
void SetEndDelay(double aEndDelay);
void SetFill(const FillMode& aFill);
void SetIterationStart(double aIterationStart, ErrorResult& aRv);
void SetIterations(double aIterations, ErrorResult& aRv);
void SetDuration(const UnrestrictedDoubleOrString& aDuration,
ErrorResult& aRv);
void SetDirection(const PlaybackDirection& aDirection);
void SetEasing(const nsAString& aEasing, ErrorResult& aRv);
private:
KeyframeEffect* MOZ_NON_OWNING_REF mEffect;
};
} // namespace dom
} // namespace mozilla
#endif // mozilla_dom_AnimationEffectTiming_h

View File

@@ -1,51 +0,0 @@
/* -*- 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/dom/AnimationEffectTimingReadOnly.h"
#include "mozilla/AnimationUtils.h"
#include "mozilla/dom/AnimatableBinding.h"
#include "mozilla/dom/AnimationEffectTimingReadOnlyBinding.h"
#include "mozilla/dom/CSSPseudoElement.h"
#include "mozilla/dom/KeyframeEffectBinding.h"
namespace mozilla {
namespace dom {
NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE(AnimationEffectTimingReadOnly, mDocument)
NS_IMPL_CYCLE_COLLECTION_ROOT_NATIVE(AnimationEffectTimingReadOnly, AddRef)
NS_IMPL_CYCLE_COLLECTION_UNROOT_NATIVE(AnimationEffectTimingReadOnly, Release)
JSObject*
AnimationEffectTimingReadOnly::WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto)
{
return AnimationEffectTimingReadOnlyBinding::Wrap(aCx, this, aGivenProto);
}
void
AnimationEffectTimingReadOnly::GetDuration(
OwningUnrestrictedDoubleOrString& aRetVal) const
{
if (mTiming.Duration()) {
aRetVal.SetAsUnrestrictedDouble() = mTiming.Duration()->ToMilliseconds();
} else {
aRetVal.SetAsString().AssignLiteral("auto");
}
}
void
AnimationEffectTimingReadOnly::GetEasing(nsString& aRetVal) const
{
if (mTiming.TimingFunction()) {
mTiming.TimingFunction()->AppendToString(aRetVal);
} else {
aRetVal.AssignLiteral("linear");
}
}
} // namespace dom
} // namespace mozilla

View File

@@ -1,63 +0,0 @@
/* -*- 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/. */
#ifndef mozilla_dom_AnimationEffectTimingReadOnly_h
#define mozilla_dom_AnimationEffectTimingReadOnly_h
#include "js/TypeDecls.h"
#include "mozilla/Attributes.h"
#include "mozilla/ErrorResult.h"
#include "mozilla/TimingParams.h"
#include "mozilla/dom/BindingDeclarations.h"
#include "mozilla/dom/UnionTypes.h"
#include "nsCycleCollectionParticipant.h"
#include "nsWrapperCache.h"
namespace mozilla {
namespace dom {
class AnimationEffectTimingReadOnly : public nsWrapperCache
{
public:
AnimationEffectTimingReadOnly() = default;
AnimationEffectTimingReadOnly(nsIDocument* aDocument,
const TimingParams& aTiming)
: mDocument(aDocument)
, mTiming(aTiming) { }
NS_INLINE_DECL_CYCLE_COLLECTING_NATIVE_REFCOUNTING(AnimationEffectTimingReadOnly)
NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_NATIVE_CLASS(AnimationEffectTimingReadOnly)
protected:
virtual ~AnimationEffectTimingReadOnly() = default;
public:
nsISupports* GetParentObject() const { return mDocument; }
JSObject* WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) override;
double Delay() const { return mTiming.Delay().ToMilliseconds(); }
double EndDelay() const { return mTiming.EndDelay().ToMilliseconds(); }
FillMode Fill() const { return mTiming.Fill(); }
double IterationStart() const { return mTiming.IterationStart(); }
double Iterations() const { return mTiming.Iterations(); }
void GetDuration(OwningUnrestrictedDoubleOrString& aRetVal) const;
PlaybackDirection Direction() const { return mTiming.Direction(); }
void GetEasing(nsString& aRetVal) const;
const TimingParams& AsTimingParams() const { return mTiming; }
void SetTimingParams(const TimingParams& aTiming) { mTiming = aTiming; }
virtual void Unlink() { }
protected:
RefPtr<nsIDocument> mDocument;
TimingParams mTiming;
};
} // namespace dom
} // namespace mozilla
#endif // mozilla_dom_AnimationEffectTimingReadOnly_h

View File

@@ -73,17 +73,6 @@ KeyframeEffect::KeyframeEffect(
const Maybe<OwningAnimationTarget>& aTarget,
const TimingParams& aTiming,
const KeyframeEffectParams& aOptions)
: KeyframeEffect(aDocument, aTarget,
new AnimationEffectTiming(aDocument, aTiming, this),
aOptions)
{
}
KeyframeEffect::KeyframeEffect(
nsIDocument* aDocument,
const Maybe<OwningAnimationTarget>& aTarget,
AnimationEffectTimingReadOnly* aTiming,
const KeyframeEffectParams& aOptions)
: AnimationEffect(aDocument, aTiming)
, mTarget(aTarget)
, mEffectOptions(aOptions)
@@ -704,7 +693,7 @@ KeyframeEffect::ConstructKeyframeEffect(const GlobalObject& aGlobal,
// Create a new KeyframeEffect object with aSource's target,
// iteration composite operation, composite operation, and spacing mode.
// The constructor creates a new AnimationEffectTiming object by
// The constructor creates a new AnimationEffect object by
// aSource's TimingParams.
// Note: we don't need to re-throw exceptions since the value specified on
// aSource's timing object can be assumed valid.

View File

@@ -300,11 +300,6 @@ public:
uint64_t aCurrentIterationOnLastCompose);
protected:
KeyframeEffect(nsIDocument* aDocument,
const Maybe<OwningAnimationTarget>& aTarget,
AnimationEffectTimingReadOnly* aTiming,
const KeyframeEffectParams& aOptions);
~KeyframeEffect() override = default;
static Maybe<OwningAnimationTarget>

View File

@@ -13,8 +13,6 @@ MOCHITEST_CHROME_MANIFESTS += ['test/chrome.ini']
EXPORTS.mozilla.dom += [
'Animation.h',
'AnimationEffect.h',
'AnimationEffectTiming.h',
'AnimationEffectTimingReadOnly.h',
'AnimationTimeline.h',
'CSSPseudoElement.h',
'DocumentTimeline.h',
@@ -43,8 +41,6 @@ EXPORTS.mozilla += [
UNIFIED_SOURCES += [
'Animation.cpp',
'AnimationEffect.cpp',
'AnimationEffectTiming.cpp',
'AnimationEffectTimingReadOnly.cpp',
'AnimationEventDispatcher.cpp',
'AnimationPerformanceWarning.cpp',
'AnimationTimeline.cpp',

View File

@@ -350,8 +350,8 @@ promise_test(t => {
setupTransition(t, 'margin-left 100s 100s');
return watcher.wait_for('transitionrun').then(evt => {
// We can't set the end delay via generated effect timing.
// Because CSS-Transition use the AnimationEffectTimingReadOnly.
// We can't set the end delay via generated effect timing
// because mutating CSS transitions is not specced yet.
transition.effect = new KeyframeEffect(div,
{ marginleft: [ '0px', '100px' ]},
{ duration: 100 * MS_PER_SEC,

View File

@@ -126,10 +126,6 @@ var interfaceNamesInGlobalScope =
{name: "Animation", insecureContext: true},
// IMPORTANT: Do not change this list without review from a DOM peer!
{name: "AnimationEffect", insecureContext: true, release: false},
// IMPORTANT: Do not change this list without review from a DOM peer!
{name: "AnimationEffectTiming", insecureContext: true, release: false},
// IMPORTANT: Do not change this list without review from a DOM peer!
{name: "AnimationEffectTimingReadOnly", insecureContext: true, release: false},
// IMPORTANT: Do not change this list without review from a DOM peer!
{name: "AnimationEvent", insecureContext: true},
// IMPORTANT: Do not change this list without review from a DOM peer!

View File

@@ -57,8 +57,6 @@ dictionary ComputedEffectTiming : EffectTiming {
[Func="nsDocument::IsWebAnimationsEnabled"]
interface AnimationEffect {
[Cached, Constant]
readonly attribute AnimationEffectTimingReadOnly timing;
EffectTiming getTiming();
[BinaryName="getComputedTimingAsDict"]
ComputedEffectTiming getComputedTiming();

View File

@@ -1,27 +0,0 @@
/* -*- Mode: IDL; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* 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/.
*
* The origin of this IDL file is
* https://drafts.csswg.org/web-animations/#animationeffecttiming
*
* Copyright © 2015 W3C® (MIT, ERCIM, Keio), All Rights Reserved. W3C
* liability, trademark and document use rules apply.
*/
[Func="nsDocument::IsWebAnimationsEnabled"]
interface AnimationEffectTiming : AnimationEffectTimingReadOnly {
inherit attribute double delay;
inherit attribute double endDelay;
inherit attribute FillMode fill;
[SetterThrows]
inherit attribute double iterationStart;
[SetterThrows]
inherit attribute unrestricted double iterations;
[SetterThrows]
inherit attribute (unrestricted double or DOMString) duration;
inherit attribute PlaybackDirection direction;
[SetterThrows]
inherit attribute DOMString easing;
};

View File

@@ -1,23 +0,0 @@
/* -*- Mode: IDL; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* 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/.
*
* The origin of this IDL file is
* https://drafts.csswg.org/web-animations/#animationeffecttimingreadonly
*
* Copyright © 2015 W3C® (MIT, ERCIM, Keio), All Rights Reserved. W3C
* liability, trademark and document use rules apply.
*/
[Func="nsDocument::IsWebAnimationsEnabled"]
interface AnimationEffectTimingReadOnly {
readonly attribute double delay;
readonly attribute double endDelay;
readonly attribute FillMode fill;
readonly attribute double iterationStart;
readonly attribute unrestricted double iterations;
readonly attribute (unrestricted double or DOMString) duration;
readonly attribute PlaybackDirection direction;
readonly attribute DOMString easing;
};

View File

@@ -365,8 +365,6 @@ WEBIDL_FILES = [
'Animatable.webidl',
'Animation.webidl',
'AnimationEffect.webidl',
'AnimationEffectTiming.webidl',
'AnimationEffectTimingReadOnly.webidl',
'AnimationEvent.webidl',
'AnimationTimeline.webidl',
'AnonymousContent.webidl',