1/*
2 * Copyright (C) 2008 Apple Inc. All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
6 * are met:
7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 *
13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24 */
25
26#pragma once
27
28#include "QualifiedName.h"
29#include "SMILTime.h"
30#include "Timer.h"
31#include <wtf/HashMap.h>
32#include <wtf/RefCounted.h>
33#include <wtf/text/StringHash.h>
34#include <wtf/text/WTFString.h>
35
36namespace WebCore {
37
38class SVGElement;
39class SVGSMILElement;
40class SVGSVGElement;
41
42class SMILTimeContainer final : public RefCounted<SMILTimeContainer> {
43public:
44 static Ref<SMILTimeContainer> create(SVGSVGElement& owner) { return adoptRef(*new SMILTimeContainer(owner)); }
45 ~SMILTimeContainer();
46
47 void schedule(SVGSMILElement*, SVGElement*, const QualifiedName&);
48 void unschedule(SVGSMILElement*, SVGElement*, const QualifiedName&);
49 void notifyIntervalsChanged();
50
51 WEBCORE_EXPORT Seconds animationFrameDelay() const;
52
53 SMILTime elapsed() const;
54
55 bool isActive() const;
56 bool isPaused() const;
57 bool isStarted() const;
58
59 void begin();
60 void pause();
61 void resume();
62 void setElapsed(SMILTime);
63
64 void setDocumentOrderIndexesDirty() { m_documentOrderIndexesDirty = true; }
65
66private:
67 SMILTimeContainer(SVGSVGElement& owner);
68
69 void timerFired();
70 void startTimer(SMILTime elapsed, SMILTime fireTime, SMILTime minimumDelay = 0);
71 void updateAnimations(SMILTime elapsed, bool seekToTime = false);
72
73 void updateDocumentOrderIndexes();
74 void sortByPriority(Vector<SVGSMILElement*>& smilElements, SMILTime elapsed);
75
76 MonotonicTime m_beginTime;
77 MonotonicTime m_pauseTime;
78 Seconds m_accumulatedActiveTime { 0_s };
79 MonotonicTime m_resumeTime;
80 Seconds m_presetStartTime { 0_s };
81
82 bool m_documentOrderIndexesDirty { false };
83
84 Timer m_timer;
85
86 typedef std::pair<SVGElement*, QualifiedName> ElementAttributePair;
87 typedef Vector<SVGSMILElement*> AnimationsVector;
88 typedef HashMap<ElementAttributePair, std::unique_ptr<AnimationsVector>> GroupedAnimationsMap;
89 GroupedAnimationsMap m_scheduledAnimations;
90
91 SVGSVGElement& m_ownerSVGElement;
92
93#ifndef NDEBUG
94 bool m_preventScheduledAnimationsChanges { false };
95#endif
96};
97
98} // namespace WebCore
99