/src/mozilla-central/dom/smil/nsSMILInstanceTime.h
Line | Count | Source (jump to first uncovered line) |
1 | | /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ |
2 | | /* vim: set ts=8 sts=2 et sw=2 tw=80: */ |
3 | | /* This Source Code Form is subject to the terms of the Mozilla Public |
4 | | * License, v. 2.0. If a copy of the MPL was not distributed with this |
5 | | * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ |
6 | | |
7 | | #ifndef NS_SMILINSTANCETIME_H_ |
8 | | #define NS_SMILINSTANCETIME_H_ |
9 | | |
10 | | #include "nsSMILTimeValue.h" |
11 | | |
12 | | class nsSMILInterval; |
13 | | class nsSMILTimeContainer; |
14 | | class nsSMILTimeValueSpec; |
15 | | |
16 | | //---------------------------------------------------------------------- |
17 | | // nsSMILInstanceTime |
18 | | // |
19 | | // An instant in document simple time that may be used in creating a new |
20 | | // interval. |
21 | | // |
22 | | // For an overview of how this class is related to other SMIL time classes see |
23 | | // the documentation in nsSMILTimeValue.h |
24 | | // |
25 | | // These objects are owned by an nsSMILTimedElement but MAY also be referenced |
26 | | // by: |
27 | | // |
28 | | // a) nsSMILIntervals that belong to the same nsSMILTimedElement and which refer |
29 | | // to the nsSMILInstanceTimes which form the interval endpoints; and/or |
30 | | // b) nsSMILIntervals that belong to other nsSMILTimedElements but which need to |
31 | | // update dependent instance times when they change or are deleted. |
32 | | // E.g. for begin='a.begin', 'a' needs to inform dependent |
33 | | // nsSMILInstanceTimes if its begin time changes. This notification is |
34 | | // performed by the nsSMILInterval. |
35 | | |
36 | | class nsSMILInstanceTime final |
37 | | { |
38 | | public: |
39 | | // Instance time source. Times generated by events, syncbase relationships, |
40 | | // and DOM calls behave differently in some circumstances such as when a timed |
41 | | // element is reset. |
42 | | enum nsSMILInstanceTimeSource { |
43 | | // No particularly significant source, e.g. offset time, 'indefinite' |
44 | | SOURCE_NONE, |
45 | | // Generated by a DOM call such as beginElement |
46 | | SOURCE_DOM, |
47 | | // Generated by a syncbase relationship |
48 | | SOURCE_SYNCBASE, |
49 | | // Generated by an event |
50 | | SOURCE_EVENT |
51 | | }; |
52 | | |
53 | | explicit nsSMILInstanceTime(const nsSMILTimeValue& aTime, |
54 | | nsSMILInstanceTimeSource aSource = SOURCE_NONE, |
55 | | nsSMILTimeValueSpec* aCreator = nullptr, |
56 | | nsSMILInterval* aBaseInterval = nullptr); |
57 | | |
58 | | void Unlink(); |
59 | | void HandleChangedInterval(const nsSMILTimeContainer* aSrcContainer, |
60 | | bool aBeginObjectChanged, |
61 | | bool aEndObjectChanged); |
62 | | void HandleDeletedInterval(); |
63 | | void HandleFilteredInterval(); |
64 | | |
65 | 0 | const nsSMILTimeValue& Time() const { return mTime; } |
66 | 0 | const nsSMILTimeValueSpec* GetCreator() const { return mCreator; } |
67 | | |
68 | 0 | bool IsDynamic() const { return !!(mFlags & kDynamic); } |
69 | 0 | bool IsFixedTime() const { return !(mFlags & kMayUpdate); } |
70 | 0 | bool FromDOM() const { return !!(mFlags & kFromDOM); } |
71 | | |
72 | | bool ShouldPreserve() const; |
73 | | void UnmarkShouldPreserve(); |
74 | | |
75 | | void AddRefFixedEndpoint(); |
76 | | void ReleaseFixedEndpoint(); |
77 | | |
78 | | void DependentUpdate(const nsSMILTimeValue& aNewTime) |
79 | 0 | { |
80 | 0 | MOZ_ASSERT(!IsFixedTime(), |
81 | 0 | "Updating an instance time that is not expected to be updated"); |
82 | 0 | mTime = aNewTime; |
83 | 0 | } |
84 | | |
85 | 0 | bool IsDependent() const { return !!mBaseInterval; } |
86 | | bool IsDependentOn(const nsSMILInstanceTime& aOther) const; |
87 | 0 | const nsSMILInterval* GetBaseInterval() const { return mBaseInterval; } |
88 | | const nsSMILInstanceTime* GetBaseTime() const; |
89 | | |
90 | | bool SameTimeAndBase(const nsSMILInstanceTime& aOther) const |
91 | 0 | { |
92 | 0 | return mTime == aOther.mTime && GetBaseTime() == aOther.GetBaseTime(); |
93 | 0 | } |
94 | | |
95 | | // Get and set a serial number which may be used by a containing class to |
96 | | // control the sort order of otherwise similar instance times. |
97 | 0 | uint32_t Serial() const { return mSerial; } |
98 | 0 | void SetSerial(uint32_t aIndex) { mSerial = aIndex; } |
99 | | |
100 | | NS_INLINE_DECL_REFCOUNTING(nsSMILInstanceTime) |
101 | | |
102 | | private: |
103 | | // Private destructor, to discourage deletion outside of Release(): |
104 | | ~nsSMILInstanceTime(); |
105 | | |
106 | | void SetBaseInterval(nsSMILInterval* aBaseInterval); |
107 | | |
108 | | nsSMILTimeValue mTime; |
109 | | |
110 | | // Internal flags used to represent the behaviour of different instance times |
111 | | enum { |
112 | | // Indicates that this instance time was generated by an event or a DOM |
113 | | // call. Such instance times require special handling when (i) the owning |
114 | | // element is reset, (ii) when they are to be added as a new end instance |
115 | | // times (as per SMIL's event sensitivity contraints), and (iii) when |
116 | | // a backwards seek is performed and the timing model is reconstructed. |
117 | | kDynamic = 1, |
118 | | |
119 | | // Indicates that this instance time is referred to by an |
120 | | // nsSMILTimeValueSpec and as such may be updated. Such instance time should |
121 | | // not be filtered out by the nsSMILTimedElement even if they appear to be |
122 | | // in the past as they may be updated to a future time. |
123 | | kMayUpdate = 2, |
124 | | |
125 | | // Indicates that this instance time was generated from the DOM as opposed |
126 | | // to an nsSMILTimeValueSpec. When a 'begin' or 'end' attribute is set or |
127 | | // reset we should clear all the instance times that have been generated by |
128 | | // that attribute (and hence an nsSMILTimeValueSpec), but not those from the |
129 | | // DOM. |
130 | | kFromDOM = 4, |
131 | | |
132 | | // Indicates that this instance time was used as the endpoint of an interval |
133 | | // that has been filtered or removed. However, since it is a dynamic time it |
134 | | // should be preserved and not filtered. |
135 | | kWasDynamicEndpoint = 8 |
136 | | }; |
137 | | uint8_t mFlags; // Combination of kDynamic, kMayUpdate, etc. |
138 | | mutable bool mVisited; // Cycle tracking |
139 | | |
140 | | // Additional reference count to determine if this instance time is currently |
141 | | // used as a fixed endpoint in any intervals. Instance times that are used in |
142 | | // this way should not be removed when the owning nsSMILTimedElement removes |
143 | | // instance times in response to a restart or in an attempt to free up memory |
144 | | // by filtering out old instance times. |
145 | | // |
146 | | // Instance times are only shared in a few cases, namely: |
147 | | // a) early ends, |
148 | | // b) zero-duration intervals, |
149 | | // c) momentarily whilst establishing new intervals and updating the current |
150 | | // interval, and |
151 | | // d) trimmed intervals |
152 | | // Hence the limited range of a uint16_t should be more than adequate. |
153 | | uint16_t mFixedEndpointRefCnt; |
154 | | |
155 | | uint32_t mSerial; // A serial number used by the containing class to |
156 | | // specify the sort order for instance times with the |
157 | | // same mTime. |
158 | | |
159 | | nsSMILTimeValueSpec* mCreator; // The nsSMILTimeValueSpec object that created |
160 | | // us. (currently only needed for syncbase |
161 | | // instance times.) |
162 | | nsSMILInterval* mBaseInterval; // Interval from which this time is derived |
163 | | // (only used for syncbase instance times) |
164 | | }; |
165 | | |
166 | | #endif // NS_SMILINSTANCETIME_H_ |