2009-01-15 04:38:07 +00:00
|
|
|
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
2012-05-21 11:12:37 +00: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-01-15 04:38:07 +00:00
|
|
|
|
|
|
|
#ifndef NS_SMILTIMEDELEMENT_H_
|
|
|
|
#define NS_SMILTIMEDELEMENT_H_
|
|
|
|
|
|
|
|
#include "nsSMILInterval.h"
|
|
|
|
#include "nsSMILInstanceTime.h"
|
2010-01-12 20:00:49 +00:00
|
|
|
#include "nsSMILMilestone.h"
|
2009-01-15 04:38:07 +00:00
|
|
|
#include "nsSMILTimeValueSpec.h"
|
|
|
|
#include "nsSMILRepeatCount.h"
|
|
|
|
#include "nsSMILTypes.h"
|
|
|
|
#include "nsTArray.h"
|
2010-01-12 20:00:49 +00:00
|
|
|
#include "nsTHashtable.h"
|
|
|
|
#include "nsHashKeys.h"
|
2009-01-15 04:38:07 +00:00
|
|
|
#include "nsAutoPtr.h"
|
|
|
|
#include "nsAttrValue.h"
|
|
|
|
|
|
|
|
class nsSMILAnimationFunction;
|
|
|
|
class nsSMILTimeContainer;
|
|
|
|
class nsSMILTimeValue;
|
|
|
|
class nsIAtom;
|
|
|
|
|
2013-03-19 03:18:45 +00:00
|
|
|
namespace mozilla {
|
|
|
|
namespace dom {
|
|
|
|
class SVGAnimationElement;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2009-01-15 04:38:07 +00:00
|
|
|
//----------------------------------------------------------------------
|
|
|
|
// nsSMILTimedElement
|
|
|
|
|
|
|
|
class nsSMILTimedElement
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
nsSMILTimedElement();
|
2010-03-01 19:31:50 +00:00
|
|
|
~nsSMILTimedElement();
|
2009-01-15 04:38:07 +00:00
|
|
|
|
2010-08-18 10:20:24 +00:00
|
|
|
typedef mozilla::dom::Element Element;
|
|
|
|
|
2010-01-12 20:00:49 +00:00
|
|
|
/*
|
|
|
|
* Sets the owning animation element which this class uses to convert between
|
|
|
|
* container times and to register timebase elements.
|
|
|
|
*/
|
2013-03-19 03:18:45 +00:00
|
|
|
void SetAnimationElement(mozilla::dom::SVGAnimationElement* aElement);
|
2010-01-12 20:00:49 +00:00
|
|
|
|
|
|
|
/*
|
|
|
|
* Returns the time container with which this timed element is associated or
|
2012-07-30 14:20:58 +00:00
|
|
|
* nullptr if it is not associated with a time container.
|
2010-01-12 20:00:49 +00:00
|
|
|
*/
|
|
|
|
nsSMILTimeContainer* GetTimeContainer();
|
|
|
|
|
2010-08-18 10:20:24 +00:00
|
|
|
/*
|
|
|
|
* Returns the element targeted by the animation element. Needed for
|
|
|
|
* registering event listeners against the appropriate element.
|
|
|
|
*/
|
2013-03-19 03:18:45 +00:00
|
|
|
mozilla::dom::Element* GetTargetElement();
|
2010-08-18 10:20:24 +00:00
|
|
|
|
2009-07-15 18:33:31 +00:00
|
|
|
/**
|
2009-01-15 04:38:07 +00:00
|
|
|
* Methods for supporting the nsIDOMElementTimeControl interface.
|
|
|
|
*/
|
|
|
|
|
|
|
|
/*
|
2010-01-12 20:00:49 +00:00
|
|
|
* Adds a new begin instance time at the current container time plus or minus
|
|
|
|
* the specified offset.
|
2009-01-15 04:38:07 +00:00
|
|
|
*
|
|
|
|
* @param aOffsetSeconds A real number specifying the number of seconds to add
|
|
|
|
* to the current container time.
|
|
|
|
* @return NS_OK if the operation succeeeded, or an error code otherwise.
|
|
|
|
*/
|
2010-01-12 20:00:49 +00:00
|
|
|
nsresult BeginElementAt(double aOffsetSeconds);
|
2009-01-15 04:38:07 +00:00
|
|
|
|
|
|
|
/*
|
2010-01-12 20:00:49 +00:00
|
|
|
* Adds a new end instance time at the current container time plus or minus
|
|
|
|
* the specified offset.
|
2009-01-15 04:38:07 +00:00
|
|
|
*
|
|
|
|
* @param aOffsetSeconds A real number specifying the number of seconds to add
|
|
|
|
* to the current container time.
|
|
|
|
* @return NS_OK if the operation succeeeded, or an error code otherwise.
|
|
|
|
*/
|
2010-01-12 20:00:49 +00:00
|
|
|
nsresult EndElementAt(double aOffsetSeconds);
|
2009-01-15 04:38:07 +00:00
|
|
|
|
2009-07-15 18:33:31 +00:00
|
|
|
/**
|
2009-01-19 09:10:53 +00:00
|
|
|
* Methods for supporting the nsSVGAnimationElement interface.
|
|
|
|
*/
|
|
|
|
|
|
|
|
/**
|
2009-10-12 23:14:08 +00:00
|
|
|
* According to SVG 1.1 SE this returns
|
2009-01-19 09:10:53 +00:00
|
|
|
*
|
2009-10-12 23:14:08 +00:00
|
|
|
* the begin time, in seconds, for this animation element's current
|
|
|
|
* interval, if it exists, regardless of whether the interval has begun yet.
|
2009-01-19 09:10:53 +00:00
|
|
|
*
|
2009-10-12 23:14:08 +00:00
|
|
|
* @return the start time as defined above in milliseconds or an unresolved
|
|
|
|
* time if there is no current interval.
|
2009-01-19 09:10:53 +00:00
|
|
|
*/
|
|
|
|
nsSMILTimeValue GetStartTime() const;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Returns the simple duration of this element.
|
|
|
|
*
|
|
|
|
* @return the simple duration in milliseconds or INDEFINITE.
|
|
|
|
*/
|
|
|
|
nsSMILTimeValue GetSimpleDuration() const
|
|
|
|
{
|
|
|
|
return mSimpleDur;
|
|
|
|
}
|
|
|
|
|
2012-05-17 09:56:57 +00:00
|
|
|
/**
|
|
|
|
* Methods for supporting hyperlinking
|
|
|
|
*/
|
|
|
|
|
2009-07-15 18:33:31 +00:00
|
|
|
/**
|
2009-01-19 09:10:53 +00:00
|
|
|
* Internal SMIL methods
|
|
|
|
*/
|
|
|
|
|
2012-05-17 09:56:57 +00:00
|
|
|
/**
|
|
|
|
* Returns the time to seek the document to when this element is targetted by
|
|
|
|
* a hyperlink.
|
|
|
|
*
|
|
|
|
* The behavior is defined here:
|
|
|
|
* http://www.w3.org/TR/smil-animation/#HyperlinkSemantics
|
|
|
|
*
|
|
|
|
* It is very similar to GetStartTime() with the exception that when the
|
|
|
|
* element is not active, the begin time of the *first* interval is returned.
|
|
|
|
*
|
|
|
|
* @return the time to seek the documen to in milliseconds or an unresolved
|
|
|
|
* time if there is no resolved interval.
|
|
|
|
*/
|
|
|
|
nsSMILTimeValue GetHyperlinkTime() const;
|
|
|
|
|
2009-01-15 04:38:07 +00:00
|
|
|
/**
|
|
|
|
* Adds an instance time object this element's list of instance times.
|
|
|
|
* These instance times are used when creating intervals.
|
|
|
|
*
|
|
|
|
* This method is typically called by an nsSMILTimeValueSpec.
|
|
|
|
*
|
2010-01-12 20:00:49 +00:00
|
|
|
* @param aInstanceTime The time to add, expressed in container time.
|
2011-10-17 14:59:28 +00:00
|
|
|
* @param aIsBegin true if the time to be added represents a begin
|
|
|
|
* time or false if it represents an end time.
|
2009-01-15 04:38:07 +00:00
|
|
|
*/
|
2011-09-29 06:19:26 +00:00
|
|
|
void AddInstanceTime(nsSMILInstanceTime* aInstanceTime, bool aIsBegin);
|
2010-01-12 20:00:49 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Requests this element update the given instance time.
|
|
|
|
*
|
|
|
|
* This method is typically called by a child nsSMILTimeValueSpec.
|
|
|
|
*
|
|
|
|
* @param aInstanceTime The instance time to update.
|
|
|
|
* @param aUpdatedTime The time to update aInstanceTime with.
|
|
|
|
* @param aDependentTime The instance time upon which aInstanceTime should be
|
|
|
|
* based.
|
2011-10-17 14:59:28 +00:00
|
|
|
* @param aIsBegin true if the time to be updated represents a begin
|
|
|
|
* instance time or false if it represents an end
|
2010-01-12 20:00:49 +00:00
|
|
|
* instance time.
|
|
|
|
*/
|
|
|
|
void UpdateInstanceTime(nsSMILInstanceTime* aInstanceTime,
|
|
|
|
nsSMILTimeValue& aUpdatedTime,
|
2011-09-29 06:19:26 +00:00
|
|
|
bool aIsBegin);
|
2010-01-12 20:00:49 +00:00
|
|
|
|
|
|
|
/**
|
2010-05-21 00:18:29 +00:00
|
|
|
* Removes an instance time object from this element's list of instance times.
|
2010-01-12 20:00:49 +00:00
|
|
|
*
|
|
|
|
* This method is typically called by a child nsSMILTimeValueSpec.
|
|
|
|
*
|
|
|
|
* @param aInstanceTime The instance time to remove.
|
2011-10-17 14:59:28 +00:00
|
|
|
* @param aIsBegin true if the time to be removed represents a begin
|
|
|
|
* time or false if it represents an end time.
|
2010-01-12 20:00:49 +00:00
|
|
|
*/
|
2011-09-29 06:19:26 +00:00
|
|
|
void RemoveInstanceTime(nsSMILInstanceTime* aInstanceTime, bool aIsBegin);
|
2009-01-15 04:38:07 +00:00
|
|
|
|
2010-03-01 19:31:50 +00:00
|
|
|
/**
|
|
|
|
* Removes all the instance times associated with the given
|
|
|
|
* nsSMILTimeValueSpec object. Used when an ID assignment changes and hence
|
|
|
|
* all the previously associated instance times become invalid.
|
|
|
|
*
|
|
|
|
* @param aSpec The nsSMILTimeValueSpec object whose created
|
|
|
|
* nsSMILInstanceTime's should be removed.
|
2011-10-17 14:59:28 +00:00
|
|
|
* @param aIsBegin true if the times to be removed represent begin
|
|
|
|
* times or false if they are end times.
|
2010-03-01 19:31:50 +00:00
|
|
|
*/
|
|
|
|
void RemoveInstanceTimesForCreator(const nsSMILTimeValueSpec* aSpec,
|
2011-09-29 06:19:26 +00:00
|
|
|
bool aIsBegin);
|
2010-03-01 19:31:50 +00:00
|
|
|
|
2009-01-15 04:38:07 +00:00
|
|
|
/**
|
|
|
|
* Sets the object that will be called by this timed element each time it is
|
|
|
|
* sampled.
|
|
|
|
*
|
|
|
|
* In Schmitz's model it is possible to associate several time clients with
|
|
|
|
* a timed element but for now we only allow one.
|
|
|
|
*
|
|
|
|
* @param aClient The time client to associate. Any previous time client
|
|
|
|
* will be disassociated and no longer sampled. Setting this
|
2012-07-30 14:20:58 +00:00
|
|
|
* to nullptr will simply disassociate the previous client, if
|
2009-01-15 04:38:07 +00:00
|
|
|
* any.
|
|
|
|
*/
|
|
|
|
void SetTimeClient(nsSMILAnimationFunction* aClient);
|
|
|
|
|
|
|
|
/**
|
2010-01-12 20:00:49 +00:00
|
|
|
* Samples the object at the given container time. Timing intervals are
|
|
|
|
* updated and if this element is active at the given time the associated time
|
|
|
|
* client will be sampled with the appropriate simple time.
|
2009-01-15 04:38:07 +00:00
|
|
|
*
|
2010-01-12 20:00:49 +00:00
|
|
|
* @param aContainerTime The container time at which to sample.
|
2009-01-15 04:38:07 +00:00
|
|
|
*/
|
2010-01-12 20:00:49 +00:00
|
|
|
void SampleAt(nsSMILTime aContainerTime);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Performs a special sample for the end of an interval. Such a sample should
|
|
|
|
* only advance the timed element (and any dependent elements) to the waiting
|
|
|
|
* or postactive state. It should not cause a transition to the active state.
|
|
|
|
* Transition to the active state is only performed on a regular SampleAt.
|
|
|
|
*
|
|
|
|
* This allows all interval ends at a given time to be processed first and
|
|
|
|
* hence the new interval can be established based on full information of the
|
|
|
|
* available instance times.
|
|
|
|
*
|
|
|
|
* @param aContainerTime The container time at which to sample.
|
|
|
|
*/
|
|
|
|
void SampleEndAt(nsSMILTime aContainerTime);
|
2009-01-15 04:38:07 +00:00
|
|
|
|
|
|
|
/**
|
2010-01-12 20:00:49 +00:00
|
|
|
* Informs the timed element that its time container has changed time
|
|
|
|
* relative to document time. The timed element therefore needs to update its
|
|
|
|
* dependent elements (which may belong to a different time container) so they
|
|
|
|
* can re-resolve their times.
|
2009-01-15 04:38:07 +00:00
|
|
|
*/
|
2010-01-12 20:00:49 +00:00
|
|
|
void HandleContainerTimeChange();
|
2009-01-15 04:38:07 +00:00
|
|
|
|
2010-07-03 05:52:51 +00:00
|
|
|
/**
|
|
|
|
* Resets this timed element's accumulated times and intervals back to start
|
|
|
|
* up state.
|
|
|
|
*
|
|
|
|
* This is used for backwards seeking where rather than accumulating
|
|
|
|
* historical timing state and winding it back, we reset the element and seek
|
|
|
|
* forwards.
|
|
|
|
*/
|
|
|
|
void Rewind();
|
|
|
|
|
2009-01-15 04:38:07 +00:00
|
|
|
/**
|
|
|
|
* Attempts to set an attribute on this timed element.
|
|
|
|
*
|
|
|
|
* @param aAttribute The name of the attribute to set. The namespace of this
|
|
|
|
* attribute is not specified as it is checked by the host
|
|
|
|
* element. Only attributes in the namespace defined for
|
|
|
|
* SMIL attributes in the host language are passed to the
|
|
|
|
* timed element.
|
|
|
|
* @param aValue The attribute value.
|
|
|
|
* @param aResult The nsAttrValue object that may be used for storing the
|
|
|
|
* parsed result.
|
2010-08-18 10:20:24 +00:00
|
|
|
* @param aContextNode The element to use for context when resolving
|
2011-11-24 03:02:43 +00:00
|
|
|
* references to other elements.
|
2009-01-15 04:38:07 +00:00
|
|
|
* @param[out] aParseResult The result of parsing the attribute. Will be set
|
|
|
|
* to NS_OK if parsing is successful.
|
|
|
|
*
|
2011-10-17 14:59:28 +00:00
|
|
|
* @return true if the given attribute is a timing attribute, false
|
2009-01-15 04:38:07 +00:00
|
|
|
* otherwise.
|
|
|
|
*/
|
2011-09-29 06:19:26 +00:00
|
|
|
bool SetAttr(nsIAtom* aAttribute, const nsAString& aValue,
|
2010-08-18 10:20:24 +00:00
|
|
|
nsAttrValue& aResult, Element* aContextNode,
|
2012-07-30 14:20:58 +00:00
|
|
|
nsresult* aParseResult = nullptr);
|
2009-01-15 04:38:07 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Attempts to unset an attribute on this timed element.
|
|
|
|
*
|
|
|
|
* @param aAttribute The name of the attribute to set. As with SetAttr the
|
|
|
|
* namespace of the attribute is not specified (see
|
|
|
|
* SetAttr).
|
|
|
|
*
|
2011-10-17 14:59:28 +00:00
|
|
|
* @return true if the given attribute is a timing attribute, false
|
2009-01-15 04:38:07 +00:00
|
|
|
* otherwise.
|
|
|
|
*/
|
2011-09-29 06:19:26 +00:00
|
|
|
bool UnsetAttr(nsIAtom* aAttribute);
|
2009-01-15 04:38:07 +00:00
|
|
|
|
2010-01-12 20:00:49 +00:00
|
|
|
/**
|
2010-01-12 20:00:49 +00:00
|
|
|
* Adds a syncbase dependency to the list of dependents that will be notified
|
|
|
|
* when this timed element creates, deletes, or updates its current interval.
|
|
|
|
*
|
|
|
|
* @param aDependent The nsSMILTimeValueSpec object to notify. A raw pointer
|
|
|
|
* to this object will be stored. Therefore it is necessary
|
|
|
|
* for the object to be explicitly unregistered (with
|
|
|
|
* RemoveDependent) when it is destroyed.
|
2010-01-12 20:00:49 +00:00
|
|
|
*/
|
2010-01-12 20:00:49 +00:00
|
|
|
void AddDependent(nsSMILTimeValueSpec& aDependent);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Removes a syncbase dependency from the list of dependents that are notified
|
|
|
|
* when the current interval is modified.
|
|
|
|
*
|
|
|
|
* @param aDependent The nsSMILTimeValueSpec object to unregister.
|
|
|
|
*/
|
2010-01-12 20:00:49 +00:00
|
|
|
void RemoveDependent(nsSMILTimeValueSpec& aDependent);
|
2010-01-12 20:00:49 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Determines if this timed element is dependent on the given timed element's
|
|
|
|
* begin time for the interval currently in effect. Whilst the element is in
|
|
|
|
* the active state this is the current interval and in the postactive or
|
|
|
|
* waiting state this is the previous interval if one exists. In all other
|
|
|
|
* cases the element is not considered a time dependent of any other element.
|
|
|
|
*
|
|
|
|
* @param aOther The potential syncbase element.
|
2011-10-17 14:59:28 +00:00
|
|
|
* @return true if this timed element's begin time for the currently
|
|
|
|
* effective interval is directly or indirectly derived from aOther, false
|
2010-01-12 20:00:49 +00:00
|
|
|
* otherwise.
|
|
|
|
*/
|
2011-09-29 06:19:26 +00:00
|
|
|
bool IsTimeDependent(const nsSMILTimedElement& aOther) const;
|
2010-01-12 20:00:49 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Called when the timed element has been bound to the document so that
|
|
|
|
* references from this timed element to other elements can be resolved.
|
|
|
|
*
|
|
|
|
* @param aContextNode The node which provides the necessary context for
|
|
|
|
* resolving references. This is typically the element in
|
|
|
|
* the host language that owns this timed element. Should
|
|
|
|
* not be null.
|
|
|
|
*/
|
|
|
|
void BindToTree(nsIContent* aContextNode);
|
|
|
|
|
2010-08-18 10:20:24 +00:00
|
|
|
/**
|
|
|
|
* Called when the target of the animation has changed so that event
|
|
|
|
* registrations can be updated.
|
|
|
|
*/
|
|
|
|
void HandleTargetElementChange(mozilla::dom::Element* aNewTarget);
|
|
|
|
|
2010-01-12 20:00:49 +00:00
|
|
|
/**
|
|
|
|
* Called when the timed element has been removed from a document so that
|
|
|
|
* references to other elements can be broken.
|
|
|
|
*/
|
|
|
|
void DissolveReferences() { Unlink(); }
|
|
|
|
|
|
|
|
// Cycle collection
|
|
|
|
void Traverse(nsCycleCollectionTraversalCallback* aCallback);
|
|
|
|
void Unlink();
|
2010-01-12 20:00:49 +00:00
|
|
|
|
2011-09-29 06:19:26 +00:00
|
|
|
typedef bool (*RemovalTestFunction)(nsSMILInstanceTime* aInstance);
|
2010-08-18 10:20:24 +00:00
|
|
|
|
2009-01-15 04:38:07 +00:00
|
|
|
protected:
|
2010-01-12 20:00:49 +00:00
|
|
|
// Typedefs
|
|
|
|
typedef nsTArray<nsAutoPtr<nsSMILTimeValueSpec> > TimeValueSpecList;
|
|
|
|
typedef nsTArray<nsRefPtr<nsSMILInstanceTime> > InstanceTimeList;
|
2010-03-01 19:31:50 +00:00
|
|
|
typedef nsTArray<nsAutoPtr<nsSMILInterval> > IntervalList;
|
2010-01-12 20:00:49 +00:00
|
|
|
typedef nsPtrHashKey<nsSMILTimeValueSpec> TimeValueSpecPtrKey;
|
|
|
|
typedef nsTHashtable<TimeValueSpecPtrKey> TimeValueSpecHashSet;
|
2010-01-12 20:00:49 +00:00
|
|
|
|
|
|
|
// Helper classes
|
|
|
|
class InstanceTimeComparator {
|
|
|
|
public:
|
2011-09-29 06:19:26 +00:00
|
|
|
bool Equals(const nsSMILInstanceTime* aElem1,
|
2010-01-12 20:00:49 +00:00
|
|
|
const nsSMILInstanceTime* aElem2) const;
|
2011-09-29 06:19:26 +00:00
|
|
|
bool LessThan(const nsSMILInstanceTime* aElem1,
|
2010-01-12 20:00:49 +00:00
|
|
|
const nsSMILInstanceTime* aElem2) const;
|
|
|
|
};
|
|
|
|
|
2010-01-12 20:00:49 +00:00
|
|
|
struct NotifyTimeDependentsParams {
|
2012-01-31 00:54:10 +00:00
|
|
|
nsSMILTimedElement* mTimedElement;
|
2010-01-12 20:00:49 +00:00
|
|
|
nsSMILTimeContainer* mTimeContainer;
|
|
|
|
};
|
|
|
|
|
2010-07-03 05:52:50 +00:00
|
|
|
// Templated helper functions
|
|
|
|
template <class TestFunctor>
|
|
|
|
void RemoveInstanceTimes(InstanceTimeList& aArray, TestFunctor& aTest);
|
|
|
|
|
2009-01-15 04:38:07 +00:00
|
|
|
//
|
|
|
|
// Implementation helpers
|
|
|
|
//
|
|
|
|
|
2010-01-12 20:00:49 +00:00
|
|
|
nsresult SetBeginSpec(const nsAString& aBeginSpec,
|
2010-08-18 10:20:24 +00:00
|
|
|
Element* aContextNode,
|
2010-08-18 10:20:24 +00:00
|
|
|
RemovalTestFunction aRemove);
|
2010-01-12 20:00:49 +00:00
|
|
|
nsresult SetEndSpec(const nsAString& aEndSpec,
|
2010-08-18 10:20:24 +00:00
|
|
|
Element* aContextNode,
|
2010-08-18 10:20:24 +00:00
|
|
|
RemovalTestFunction aRemove);
|
2009-01-15 04:38:07 +00:00
|
|
|
nsresult SetSimpleDuration(const nsAString& aDurSpec);
|
|
|
|
nsresult SetMin(const nsAString& aMinSpec);
|
|
|
|
nsresult SetMax(const nsAString& aMaxSpec);
|
|
|
|
nsresult SetRestart(const nsAString& aRestartSpec);
|
|
|
|
nsresult SetRepeatCount(const nsAString& aRepeatCountSpec);
|
|
|
|
nsresult SetRepeatDur(const nsAString& aRepeatDurSpec);
|
|
|
|
nsresult SetFillMode(const nsAString& aFillModeSpec);
|
|
|
|
|
2010-08-18 10:20:24 +00:00
|
|
|
void UnsetBeginSpec(RemovalTestFunction aRemove);
|
|
|
|
void UnsetEndSpec(RemovalTestFunction aRemove);
|
2009-01-15 04:38:07 +00:00
|
|
|
void UnsetSimpleDuration();
|
|
|
|
void UnsetMin();
|
|
|
|
void UnsetMax();
|
|
|
|
void UnsetRestart();
|
|
|
|
void UnsetRepeatCount();
|
|
|
|
void UnsetRepeatDur();
|
|
|
|
void UnsetFillMode();
|
|
|
|
|
2010-01-12 20:00:49 +00:00
|
|
|
nsresult SetBeginOrEndSpec(const nsAString& aSpec,
|
2010-08-18 10:20:24 +00:00
|
|
|
Element* aContextNode,
|
2011-09-29 06:19:26 +00:00
|
|
|
bool aIsBegin,
|
2010-08-18 10:20:24 +00:00
|
|
|
RemovalTestFunction aRemove);
|
|
|
|
void ClearSpecs(TimeValueSpecList& aSpecs,
|
|
|
|
InstanceTimeList& aInstances,
|
|
|
|
RemovalTestFunction aRemove);
|
2011-07-25 17:45:49 +00:00
|
|
|
void ClearIntervals();
|
2011-09-29 06:19:26 +00:00
|
|
|
void DoSampleAt(nsSMILTime aContainerTime, bool aEndOnly);
|
2009-01-15 04:38:07 +00:00
|
|
|
|
2010-07-03 05:52:50 +00:00
|
|
|
/**
|
|
|
|
* Helper function to check for an early end and, if necessary, update the
|
|
|
|
* current interval accordingly.
|
|
|
|
*
|
|
|
|
* See SMIL 3.0, section 5.4.5, Element life cycle, "Active Time - Playing an
|
|
|
|
* interval" for a description of ending early.
|
|
|
|
*
|
|
|
|
* @param aSampleTime The current sample time. Early ends should only be
|
|
|
|
* applied at the last possible moment (i.e. if they are at
|
|
|
|
* or before the current sample time) and only if the
|
|
|
|
* current interval is not already ending.
|
2011-10-17 14:59:28 +00:00
|
|
|
* @return true if the end time of the current interval was updated,
|
|
|
|
* false otherwise.
|
2010-07-03 05:52:50 +00:00
|
|
|
*/
|
2011-09-29 06:19:26 +00:00
|
|
|
bool ApplyEarlyEnd(const nsSMILTimeValue& aSampleTime);
|
2010-07-03 05:52:50 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Clears certain state in response to the element restarting.
|
|
|
|
*
|
|
|
|
* This state is described in SMIL 3.0, section 5.4.3, Resetting element state
|
|
|
|
*/
|
|
|
|
void Reset();
|
|
|
|
|
2010-07-03 05:52:51 +00:00
|
|
|
/**
|
|
|
|
* Completes a seek operation by sending appropriate events and, in the case
|
|
|
|
* of a backwards seek, updating the state of timing information that was
|
|
|
|
* previously considered historical.
|
|
|
|
*/
|
|
|
|
void DoPostSeek();
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Unmarks instance times that were previously preserved because they were
|
|
|
|
* considered important historical milestones but are no longer such because
|
|
|
|
* a backwards seek has been performed.
|
|
|
|
*/
|
|
|
|
void UnpreserveInstanceTimes(InstanceTimeList& aList);
|
|
|
|
|
2010-07-03 05:52:50 +00:00
|
|
|
/**
|
|
|
|
* Helper function to iterate through this element's accumulated timing
|
|
|
|
* information (specifically old nsSMILIntervals and nsSMILTimeInstanceTimes)
|
|
|
|
* and discard items that are no longer needed or exceed some threshold of
|
|
|
|
* accumulated state.
|
|
|
|
*/
|
|
|
|
void FilterHistory();
|
|
|
|
|
|
|
|
// Helper functions for FilterHistory to clear old nsSMILIntervals and
|
|
|
|
// nsSMILInstanceTimes respectively.
|
|
|
|
void FilterIntervals();
|
|
|
|
void FilterInstanceTimes(InstanceTimeList& aList);
|
|
|
|
|
2009-01-15 04:38:07 +00:00
|
|
|
/**
|
2010-01-12 20:00:49 +00:00
|
|
|
* Calculates the next acceptable interval for this element after the
|
|
|
|
* specified interval, or, if no previous interval is specified, it will be
|
|
|
|
* the first interval with an end time after t=0.
|
2009-01-15 04:38:07 +00:00
|
|
|
*
|
|
|
|
* @see SMILANIM 3.6.8
|
2010-01-12 20:00:49 +00:00
|
|
|
*
|
|
|
|
* @param aPrevInterval The previous interval used. If supplied, the first
|
|
|
|
* interval that begins after aPrevInterval will be
|
2012-07-30 14:20:58 +00:00
|
|
|
* returned. May be nullptr.
|
2011-06-22 01:12:35 +00:00
|
|
|
* @param aReplacedInterval The interval that is being updated (if any). This
|
|
|
|
* used to ensure we don't return interval endpoints
|
2012-07-30 14:20:58 +00:00
|
|
|
* that are dependent on themselves. May be nullptr.
|
2010-01-12 20:00:49 +00:00
|
|
|
* @param aFixedBeginTime The time to use for the start of the interval. This
|
|
|
|
* is used when only the endpoint of the interval
|
|
|
|
* should be updated such as when the animation is in
|
2012-07-30 14:20:58 +00:00
|
|
|
* the ACTIVE state. May be nullptr.
|
2010-01-12 20:00:49 +00:00
|
|
|
* @param[out] aResult The next interval. Will be unchanged if no suitable
|
2011-10-17 14:59:28 +00:00
|
|
|
* interval was found (in which case false will be
|
2011-03-27 23:10:33 +00:00
|
|
|
* returned).
|
2011-10-17 14:59:28 +00:00
|
|
|
* @return true if a suitable interval was found, false otherwise.
|
2009-01-15 04:38:07 +00:00
|
|
|
*/
|
2011-09-29 06:19:26 +00:00
|
|
|
bool GetNextInterval(const nsSMILInterval* aPrevInterval,
|
2011-06-22 01:12:35 +00:00
|
|
|
const nsSMILInterval* aReplacedInterval,
|
2010-01-12 20:00:49 +00:00
|
|
|
const nsSMILInstanceTime* aFixedBeginTime,
|
2010-03-01 19:31:52 +00:00
|
|
|
nsSMILInterval& aResult) const;
|
2010-01-12 20:00:49 +00:00
|
|
|
nsSMILInstanceTime* GetNextGreater(const InstanceTimeList& aList,
|
|
|
|
const nsSMILTimeValue& aBase,
|
2012-08-22 15:56:38 +00:00
|
|
|
int32_t& aPosition) const;
|
2010-01-12 20:00:49 +00:00
|
|
|
nsSMILInstanceTime* GetNextGreaterOrEqual(const InstanceTimeList& aList,
|
|
|
|
const nsSMILTimeValue& aBase,
|
2012-08-22 15:56:38 +00:00
|
|
|
int32_t& aPosition) const;
|
2009-01-15 04:38:07 +00:00
|
|
|
nsSMILTimeValue CalcActiveEnd(const nsSMILTimeValue& aBegin,
|
2010-01-12 20:00:49 +00:00
|
|
|
const nsSMILTimeValue& aEnd) const;
|
|
|
|
nsSMILTimeValue GetRepeatDuration() const;
|
|
|
|
nsSMILTimeValue ApplyMinAndMax(const nsSMILTimeValue& aDuration) const;
|
2009-01-15 04:38:07 +00:00
|
|
|
nsSMILTime ActiveTimeToSimpleTime(nsSMILTime aActiveTime,
|
2012-08-22 15:56:38 +00:00
|
|
|
uint32_t& aRepeatIteration);
|
2010-01-12 20:00:49 +00:00
|
|
|
nsSMILInstanceTime* CheckForEarlyEnd(
|
2010-01-12 20:00:49 +00:00
|
|
|
const nsSMILTimeValue& aContainerTime) const;
|
2011-09-29 06:19:26 +00:00
|
|
|
void UpdateCurrentInterval(bool aForceChangeNotice = false);
|
2009-01-15 04:38:07 +00:00
|
|
|
void SampleSimpleTime(nsSMILTime aActiveTime);
|
|
|
|
void SampleFillValue();
|
2011-07-25 17:46:08 +00:00
|
|
|
nsresult AddInstanceTimeFromCurrentTime(nsSMILTime aCurrentTime,
|
2011-09-29 06:19:26 +00:00
|
|
|
double aOffsetSeconds, bool aIsBegin);
|
2010-01-12 20:00:49 +00:00
|
|
|
void RegisterMilestone();
|
2011-09-29 06:19:26 +00:00
|
|
|
bool GetNextMilestone(nsSMILMilestone& aNextMilestone) const;
|
2009-01-15 04:38:07 +00:00
|
|
|
|
2011-06-15 00:16:57 +00:00
|
|
|
// Notification methods. Note that these notifications can result in nested
|
|
|
|
// calls to this same object. Therefore,
|
|
|
|
// (i) we should not perform notification until this object is in
|
|
|
|
// a consistent state to receive callbacks, and
|
|
|
|
// (ii) after calling these methods we must assume that the state of the
|
|
|
|
// element may have changed.
|
2010-01-12 20:00:49 +00:00
|
|
|
void NotifyNewInterval();
|
2011-06-15 00:16:57 +00:00
|
|
|
void NotifyChangedInterval(nsSMILInterval* aInterval,
|
2011-09-29 06:19:26 +00:00
|
|
|
bool aBeginObjectChanged,
|
|
|
|
bool aEndObjectChanged);
|
2011-06-15 00:16:57 +00:00
|
|
|
|
2012-08-22 15:56:38 +00:00
|
|
|
void FireTimeEventAsync(uint32_t aMsg, int32_t aDetail);
|
2010-01-12 20:00:49 +00:00
|
|
|
const nsSMILInstanceTime* GetEffectiveBeginInstance() const;
|
2010-03-01 19:31:50 +00:00
|
|
|
const nsSMILInterval* GetPreviousInterval() const;
|
2011-09-29 06:19:26 +00:00
|
|
|
bool HasPlayed() const { return !mOldIntervals.IsEmpty(); }
|
2013-12-13 04:41:52 +00:00
|
|
|
bool HasClientInFillRange() const;
|
2011-09-29 06:19:26 +00:00
|
|
|
bool EndHasEventConditions() const;
|
2011-11-14 03:58:30 +00:00
|
|
|
bool AreEndTimesDependentOn(
|
|
|
|
const nsSMILInstanceTime* aBase) const;
|
2009-01-15 04:38:07 +00:00
|
|
|
|
2010-10-13 00:20:12 +00:00
|
|
|
// Reset the current interval by first passing ownership to a temporary
|
|
|
|
// variable so that if Unlink() results in us receiving a callback,
|
2012-07-30 14:20:58 +00:00
|
|
|
// mCurrentInterval will be nullptr and we will be in a consistent state.
|
2010-10-13 00:20:12 +00:00
|
|
|
void ResetCurrentInterval()
|
|
|
|
{
|
|
|
|
if (mCurrentInterval) {
|
|
|
|
// Transfer ownership to temp var. (This sets mCurrentInterval to null.)
|
|
|
|
nsAutoPtr<nsSMILInterval> interval(mCurrentInterval);
|
|
|
|
interval->Unlink();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2010-01-12 20:00:49 +00:00
|
|
|
// Hashtable callback methods
|
2012-10-08 16:15:12 +00:00
|
|
|
static PLDHashOperator NotifyNewIntervalCallback(
|
2010-01-12 20:00:49 +00:00
|
|
|
TimeValueSpecPtrKey* aKey, void* aData);
|
|
|
|
|
2009-01-15 04:38:07 +00:00
|
|
|
//
|
|
|
|
// Members
|
|
|
|
//
|
2013-03-19 03:18:45 +00:00
|
|
|
mozilla::dom::SVGAnimationElement* mAnimationElement; // [weak] won't outlive
|
|
|
|
// owner
|
2010-01-12 20:00:49 +00:00
|
|
|
TimeValueSpecList mBeginSpecs; // [strong]
|
|
|
|
TimeValueSpecList mEndSpecs; // [strong]
|
2009-01-15 04:38:07 +00:00
|
|
|
|
|
|
|
nsSMILTimeValue mSimpleDur;
|
|
|
|
|
|
|
|
nsSMILRepeatCount mRepeatCount;
|
|
|
|
nsSMILTimeValue mRepeatDur;
|
|
|
|
|
|
|
|
nsSMILTimeValue mMin;
|
|
|
|
nsSMILTimeValue mMax;
|
|
|
|
|
|
|
|
enum nsSMILFillMode
|
|
|
|
{
|
|
|
|
FILL_REMOVE,
|
|
|
|
FILL_FREEZE
|
|
|
|
};
|
|
|
|
nsSMILFillMode mFillMode;
|
|
|
|
static nsAttrValue::EnumTable sFillModeTable[];
|
|
|
|
|
|
|
|
enum nsSMILRestartMode
|
|
|
|
{
|
|
|
|
RESTART_ALWAYS,
|
|
|
|
RESTART_WHENNOTACTIVE,
|
|
|
|
RESTART_NEVER
|
|
|
|
};
|
|
|
|
nsSMILRestartMode mRestartMode;
|
|
|
|
static nsAttrValue::EnumTable sRestartModeTable[];
|
|
|
|
|
2010-01-12 20:00:49 +00:00
|
|
|
InstanceTimeList mBeginInstances;
|
|
|
|
InstanceTimeList mEndInstances;
|
2012-08-22 15:56:38 +00:00
|
|
|
uint32_t mInstanceSerialIndex;
|
2009-01-15 04:38:07 +00:00
|
|
|
|
|
|
|
nsSMILAnimationFunction* mClient;
|
2010-03-01 19:31:50 +00:00
|
|
|
nsAutoPtr<nsSMILInterval> mCurrentInterval;
|
|
|
|
IntervalList mOldIntervals;
|
2012-08-22 15:56:38 +00:00
|
|
|
uint32_t mCurrentRepeatIteration;
|
2010-01-12 20:00:49 +00:00
|
|
|
nsSMILMilestone mPrevRegisteredMilestone;
|
|
|
|
static const nsSMILMilestone sMaxMilestone;
|
2012-08-22 15:56:38 +00:00
|
|
|
static const uint8_t sMaxNumIntervals;
|
|
|
|
static const uint8_t sMaxNumInstanceTimes;
|
2009-01-15 04:38:07 +00:00
|
|
|
|
2010-05-21 00:18:29 +00:00
|
|
|
// Set of dependent time value specs to be notified when establishing a new
|
|
|
|
// current interval. Change notifications and delete notifications are handled
|
|
|
|
// by the interval.
|
2010-01-12 20:00:49 +00:00
|
|
|
//
|
|
|
|
// [weak] The nsSMILTimeValueSpec objects register themselves and unregister
|
|
|
|
// on destruction. Likewise, we notify them when we are destroyed.
|
2010-01-12 20:00:49 +00:00
|
|
|
TimeValueSpecHashSet mTimeDependents;
|
2010-01-12 20:00:49 +00:00
|
|
|
|
2009-01-15 04:38:07 +00:00
|
|
|
/**
|
|
|
|
* The state of the element in its life-cycle. These states are based on the
|
|
|
|
* element life-cycle described in SMILANIM 3.6.8
|
|
|
|
*/
|
|
|
|
enum nsSMILElementState
|
|
|
|
{
|
|
|
|
STATE_STARTUP,
|
|
|
|
STATE_WAITING,
|
|
|
|
STATE_ACTIVE,
|
|
|
|
STATE_POSTACTIVE
|
|
|
|
};
|
|
|
|
nsSMILElementState mElementState;
|
2010-07-03 05:52:51 +00:00
|
|
|
|
|
|
|
enum nsSMILSeekState
|
|
|
|
{
|
|
|
|
SEEK_NOT_SEEKING,
|
|
|
|
SEEK_FORWARD_FROM_ACTIVE,
|
|
|
|
SEEK_FORWARD_FROM_INACTIVE,
|
|
|
|
SEEK_BACKWARD_FROM_ACTIVE,
|
|
|
|
SEEK_BACKWARD_FROM_INACTIVE
|
|
|
|
};
|
|
|
|
nsSMILSeekState mSeekState;
|
2011-07-02 03:37:10 +00:00
|
|
|
|
|
|
|
// Used to batch updates to the timing model
|
|
|
|
class AutoIntervalUpdateBatcher;
|
2011-09-29 06:19:26 +00:00
|
|
|
bool mDeferIntervalUpdates;
|
2012-02-01 23:58:58 +00:00
|
|
|
bool mDoDeferredUpdate; // Set if an update to the current interval was
|
|
|
|
// requested while mDeferIntervalUpdates was set
|
2011-07-02 03:37:47 +00:00
|
|
|
|
2013-12-13 04:41:56 +00:00
|
|
|
// Stack-based helper class to call UpdateCurrentInterval when it is destroyed
|
|
|
|
class AutoIntervalUpdater;
|
|
|
|
|
2011-07-02 03:37:47 +00:00
|
|
|
// Recursion depth checking
|
2012-08-22 15:56:38 +00:00
|
|
|
uint8_t mDeleteCount;
|
|
|
|
uint8_t mUpdateIntervalRecursionDepth;
|
|
|
|
static const uint8_t sMaxUpdateIntervalRecursionDepth;
|
2009-01-15 04:38:07 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
#endif // NS_SMILTIMEDELEMENT_H_
|