2009-10-07 20:22:42 -07:00
|
|
|
/* vim: set shiftwidth=2 tabstop=8 autoindent cindent expandtab: */
|
2012-05-21 04:12:37 -07:00
|
|
|
/* 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/. */
|
2009-10-07 20:22:42 -07:00
|
|
|
|
|
|
|
/* Code to start and animate CSS transitions. */
|
|
|
|
|
|
|
|
#ifndef nsTransitionManager_h_
|
|
|
|
#define nsTransitionManager_h_
|
|
|
|
|
2012-09-14 09:10:08 -07:00
|
|
|
#include "mozilla/Attributes.h"
|
2013-06-23 05:03:39 -07:00
|
|
|
#include "mozilla/MemoryReporting.h"
|
2011-04-11 23:18:43 -07:00
|
|
|
#include "AnimationCommon.h"
|
2009-12-10 23:37:40 -08:00
|
|
|
#include "nsCSSPseudoElements.h"
|
2009-10-07 20:22:42 -07:00
|
|
|
|
|
|
|
class nsStyleContext;
|
|
|
|
class nsPresContext;
|
|
|
|
class nsCSSPropertySet;
|
2012-11-14 11:09:01 -08:00
|
|
|
struct ElementDependentRuleProcessorData;
|
2012-07-31 10:28:21 -07:00
|
|
|
|
2014-06-26 16:57:12 -07:00
|
|
|
namespace mozilla {
|
|
|
|
struct StyleTransition;
|
|
|
|
}
|
|
|
|
|
2012-07-31 10:28:21 -07:00
|
|
|
/*****************************************************************************
|
|
|
|
* Per-Element data *
|
|
|
|
*****************************************************************************/
|
|
|
|
|
2014-06-26 16:57:12 -07:00
|
|
|
namespace mozilla {
|
|
|
|
|
2014-05-14 16:38:37 -07:00
|
|
|
struct ElementPropertyTransition : public mozilla::ElementAnimation
|
2012-07-31 10:28:21 -07:00
|
|
|
{
|
2014-07-15 17:02:30 -07:00
|
|
|
explicit ElementPropertyTransition(mozilla::dom::AnimationTimeline* aTimeline)
|
|
|
|
: mozilla::ElementAnimation(aTimeline) { }
|
|
|
|
|
2014-05-14 16:38:37 -07:00
|
|
|
virtual ElementPropertyTransition* AsTransition() { return this; }
|
|
|
|
virtual const ElementPropertyTransition* AsTransition() const { return this; }
|
|
|
|
|
2012-07-31 10:28:21 -07:00
|
|
|
// This is the start value to be used for a check for whether a
|
2014-04-02 22:57:27 -07:00
|
|
|
// transition is being reversed. Normally the same as
|
|
|
|
// mProperties[0].mSegments[0].mFromValue, except when this transition
|
|
|
|
// started as the reversal of another in-progress transition.
|
|
|
|
// Needed so we can handle two reverses in a row.
|
2014-06-23 23:29:54 -07:00
|
|
|
mozilla::StyleAnimationValue mStartForReversingTest;
|
2012-07-31 10:28:21 -07:00
|
|
|
// Likewise, the portion (in value space) of the "full" reversed
|
|
|
|
// transition that we're actually covering. For example, if a :hover
|
|
|
|
// effect has a transition that moves the element 10px to the right
|
|
|
|
// (by changing 'left' from 0px to 10px), and the mouse moves in to
|
|
|
|
// the element (starting the transition) but then moves out after the
|
|
|
|
// transition has advanced 4px, the second transition (from 10px/4px
|
|
|
|
// to 0px) will have mReversePortion of 0.4. (If the mouse then moves
|
|
|
|
// in again when the transition is back to 2px, the mReversePortion
|
|
|
|
// for the third transition (from 0px/2px to 10px) will be 0.8.
|
|
|
|
double mReversePortion;
|
2012-07-31 10:28:22 -07:00
|
|
|
|
2012-07-31 10:28:21 -07:00
|
|
|
// Compute the portion of the *value* space that we should be through
|
2014-07-15 17:02:32 -07:00
|
|
|
// at the current time. (The input to the transition timing function
|
2012-07-31 10:28:21 -07:00
|
|
|
// has time units, the output has value units.)
|
2014-07-15 17:02:32 -07:00
|
|
|
double CurrentValuePortion() const;
|
2012-07-31 10:28:21 -07:00
|
|
|
};
|
2012-07-31 10:28:22 -07:00
|
|
|
|
2014-06-26 16:57:12 -07:00
|
|
|
} // namespace mozilla
|
|
|
|
|
2013-06-25 01:58:46 -07:00
|
|
|
class nsTransitionManager MOZ_FINAL
|
|
|
|
: public mozilla::css::CommonAnimationManager
|
2011-04-11 23:18:43 -07:00
|
|
|
{
|
2009-10-07 20:22:42 -07:00
|
|
|
public:
|
2011-04-11 23:18:43 -07:00
|
|
|
nsTransitionManager(nsPresContext *aPresContext)
|
|
|
|
: mozilla::css::CommonAnimationManager(aPresContext)
|
|
|
|
{
|
|
|
|
}
|
2009-12-23 11:10:31 -08:00
|
|
|
|
2014-06-26 16:57:12 -07:00
|
|
|
typedef mozilla::ElementAnimationCollection ElementAnimationCollection;
|
|
|
|
|
|
|
|
static ElementAnimationCollection*
|
2014-06-19 20:39:26 -07:00
|
|
|
GetTransitions(nsIContent* aContent) {
|
2014-06-26 16:57:12 -07:00
|
|
|
return static_cast<ElementAnimationCollection*>
|
2012-07-31 10:28:22 -07:00
|
|
|
(aContent->GetProperty(nsGkAtoms::transitionsProperty));
|
|
|
|
}
|
|
|
|
|
2012-12-11 13:12:43 -08:00
|
|
|
// Returns true if aContent or any of its ancestors has a transition.
|
|
|
|
static bool ContentOrAncestorHasTransition(nsIContent* aContent) {
|
|
|
|
do {
|
|
|
|
if (GetTransitions(aContent)) {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
} while ((aContent = aContent->GetParent()));
|
|
|
|
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2014-06-26 16:57:12 -07:00
|
|
|
static ElementAnimationCollection*
|
2014-06-19 20:39:25 -07:00
|
|
|
GetAnimationsForCompositor(nsIContent* aContent, nsCSSProperty aProperty)
|
2012-07-31 10:28:22 -07:00
|
|
|
{
|
2014-06-19 20:39:25 -07:00
|
|
|
return mozilla::css::CommonAnimationManager::GetAnimationsForCompositor(
|
|
|
|
aContent, nsGkAtoms::transitionsProperty, aProperty);
|
2012-07-31 10:28:22 -07:00
|
|
|
}
|
|
|
|
|
2009-10-07 20:22:42 -07:00
|
|
|
/**
|
2012-07-31 10:28:22 -07:00
|
|
|
* StyleContextChanged
|
2009-10-07 20:22:42 -07:00
|
|
|
*
|
|
|
|
* To be called from nsFrameManager::ReResolveStyleContext when the
|
2010-06-30 18:54:29 -07:00
|
|
|
* style of an element has changed, to initiate transitions from
|
|
|
|
* that style change. For style contexts with :before and :after
|
|
|
|
* pseudos, aElement is expected to be the generated before/after
|
|
|
|
* element.
|
2009-10-07 20:22:42 -07:00
|
|
|
*
|
|
|
|
* It may return a "cover rule" (see CoverTransitionStartStyleRule) to
|
|
|
|
* cover up some of the changes for the duration of the restyling of
|
|
|
|
* descendants. If it does, this function will take care of causing
|
|
|
|
* the necessary restyle afterwards, but the caller must restyle the
|
|
|
|
* element *again* with the original sequence of rules plus the
|
|
|
|
* returned cover rule as the most specific rule.
|
|
|
|
*/
|
|
|
|
already_AddRefed<nsIStyleRule>
|
2010-05-14 10:04:51 -07:00
|
|
|
StyleContextChanged(mozilla::dom::Element *aElement,
|
2009-10-07 20:22:42 -07:00
|
|
|
nsStyleContext *aOldStyleContext,
|
|
|
|
nsStyleContext *aNewStyleContext);
|
|
|
|
|
2011-04-11 23:18:43 -07:00
|
|
|
// nsIStyleRuleProcessor (parts)
|
2012-09-14 09:10:08 -07:00
|
|
|
virtual void RulesMatching(ElementRuleProcessorData* aData) MOZ_OVERRIDE;
|
|
|
|
virtual void RulesMatching(PseudoElementRuleProcessorData* aData) MOZ_OVERRIDE;
|
|
|
|
virtual void RulesMatching(AnonBoxRuleProcessorData* aData) MOZ_OVERRIDE;
|
2009-12-10 23:37:40 -08:00
|
|
|
#ifdef MOZ_XUL
|
2012-09-14 09:10:08 -07:00
|
|
|
virtual void RulesMatching(XULTreeRuleProcessorData* aData) MOZ_OVERRIDE;
|
2009-12-10 23:37:40 -08:00
|
|
|
#endif
|
2013-06-23 05:03:39 -07:00
|
|
|
virtual size_t SizeOfExcludingThis(mozilla::MallocSizeOf aMallocSizeOf) const
|
2013-03-23 19:14:43 -07:00
|
|
|
MOZ_MUST_OVERRIDE MOZ_OVERRIDE;
|
2013-06-23 05:03:39 -07:00
|
|
|
virtual size_t SizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf) const
|
2013-03-23 19:14:43 -07:00
|
|
|
MOZ_MUST_OVERRIDE MOZ_OVERRIDE;
|
2009-10-07 20:22:42 -07:00
|
|
|
|
|
|
|
// nsARefreshObserver
|
2012-09-14 09:10:08 -07:00
|
|
|
virtual void WillRefresh(mozilla::TimeStamp aTime) MOZ_OVERRIDE;
|
2009-10-07 20:22:42 -07:00
|
|
|
|
2012-12-11 13:12:43 -08:00
|
|
|
void FlushTransitions(FlushFlags aFlags);
|
|
|
|
|
2012-12-22 20:52:13 -08:00
|
|
|
// Performs a 'mini-flush' to make styles from throttled transitions
|
|
|
|
// up-to-date prior to processing an unrelated style change, so that
|
|
|
|
// any transitions triggered by that style change produce correct
|
|
|
|
// results.
|
|
|
|
//
|
|
|
|
// In more detail: when we're able to run animations on the
|
|
|
|
// compositor, we sometimes "throttle" these animations by skipping
|
|
|
|
// updating style data on the main thread. However, whenever we
|
|
|
|
// process a normal (non-animation) style change, any changes in
|
|
|
|
// computed style on elements that have transition-* properties set
|
|
|
|
// may need to trigger new transitions; this process requires knowing
|
|
|
|
// both the old and new values of the property. To do this correctly,
|
|
|
|
// we need to have an up-to-date *old* value of the property on the
|
|
|
|
// primary frame. So the purpose of the mini-flush is to update the
|
|
|
|
// style for all throttled transitions and animations to the current
|
|
|
|
// animation state without making any other updates, so that when we
|
|
|
|
// process the queued style updates we'll have correct old data to
|
|
|
|
// compare against. When we do this, we don't bother touching frames
|
2012-12-11 13:12:43 -08:00
|
|
|
// other than primary frames.
|
|
|
|
void UpdateAllThrottledStyles();
|
|
|
|
|
2014-06-26 16:57:12 -07:00
|
|
|
ElementAnimationCollection* GetElementTransitions(
|
2014-06-19 20:39:26 -07:00
|
|
|
mozilla::dom::Element *aElement,
|
|
|
|
nsCSSPseudoElements::Type aPseudoType,
|
|
|
|
bool aCreateIfNeeded);
|
2013-10-22 05:14:41 -07:00
|
|
|
|
2013-06-25 01:58:46 -07:00
|
|
|
protected:
|
2014-06-26 16:57:13 -07:00
|
|
|
virtual void ElementCollectionRemoved() MOZ_OVERRIDE;
|
2014-06-26 16:57:12 -07:00
|
|
|
virtual void
|
2014-06-26 16:57:13 -07:00
|
|
|
AddElementCollection(ElementAnimationCollection* aCollection) MOZ_OVERRIDE;
|
2013-06-25 01:58:46 -07:00
|
|
|
|
2009-10-07 20:22:42 -07:00
|
|
|
private:
|
2014-06-26 16:57:12 -07:00
|
|
|
void
|
|
|
|
ConsiderStartingTransition(nsCSSProperty aProperty,
|
|
|
|
const mozilla::StyleTransition& aTransition,
|
|
|
|
mozilla::dom::Element* aElement,
|
|
|
|
ElementAnimationCollection*& aElementTransitions,
|
|
|
|
nsStyleContext* aOldStyleContext,
|
|
|
|
nsStyleContext* aNewStyleContext,
|
|
|
|
bool* aStartedAny,
|
|
|
|
nsCSSPropertySet* aWhichStarted);
|
2012-11-14 11:09:01 -08:00
|
|
|
void WalkTransitionRule(ElementDependentRuleProcessorData* aData,
|
2010-07-18 14:20:40 -07:00
|
|
|
nsCSSPseudoElements::Type aPseudoType);
|
2012-12-11 13:12:43 -08:00
|
|
|
// Update the animated styles of an element and its descendants.
|
|
|
|
// If the element has a transition, it is flushed back to its primary frame.
|
|
|
|
// If the element does not have a transition, then its style is reparented.
|
|
|
|
void UpdateThrottledStylesForSubtree(nsIContent* aContent,
|
2013-01-08 20:37:29 -08:00
|
|
|
nsStyleContext* aParentStyle,
|
|
|
|
nsStyleChangeList &aChangeList);
|
2013-10-22 05:14:41 -07:00
|
|
|
void UpdateAllThrottledStylesInternal();
|
2009-10-07 20:22:42 -07:00
|
|
|
};
|
|
|
|
|
|
|
|
#endif /* !defined(nsTransitionManager_h_) */
|