Clean up DOMTimer related settings
[WebKit-https.git] / Source / WebCore / page / DOMTimer.h
1 /*
2  * Copyright (C) 2008, 2014 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
27 #ifndef DOMTimer_h
28 #define DOMTimer_h
29
30 #include "SuspendableTimer.h"
31 #include <memory>
32 #include <wtf/HashSet.h>
33 #include <wtf/RefCounted.h>
34 #include <wtf/WeakPtr.h>
35
36 namespace WebCore {
37
38     class DOMTimerFireState;
39     class Document;
40     class Element;
41     class HTMLPlugInElement;
42     class IntRect;
43     class ScheduledAction;
44
45     class DOMTimer final : public RefCounted<DOMTimer>, public SuspendableTimer {
46         WTF_MAKE_NONCOPYABLE(DOMTimer);
47         WTF_MAKE_FAST_ALLOCATED;
48     public:
49         virtual ~DOMTimer();
50
51         static double defaultMinimumInterval() { return 0.004; } // 4 milliseconds.
52         static double defaultAlignmentInterval() { return 0; }
53         static double hiddenPageAlignmentInterval() { return 1.0; } // 1 second.
54
55         // Creates a new timer owned by specified ScriptExecutionContext, starts it
56         // and returns its Id.
57         static int install(ScriptExecutionContext&, std::unique_ptr<ScheduledAction>, int timeout, bool singleShot);
58         static void removeById(ScriptExecutionContext&, int timeoutId);
59
60         // Notify that the interval may need updating (e.g. because the minimum interval
61         // setting for the context has changed).
62         void updateTimerIntervalIfNecessary();
63         void updateThrottlingStateAfterViewportChange(const IntRect& visibleRect);
64
65         static void scriptDidInteractWithPlugin(HTMLPlugInElement&);
66         static void scriptDidCauseElementRepaint(Element&, bool mayRepaintNonDescendants = false);
67
68     private:
69         DOMTimer(ScriptExecutionContext&, std::unique_ptr<ScheduledAction>, int interval, bool singleShot);
70         friend class Internals;
71
72         double intervalClampedToMinimum() const;
73
74         bool isDOMTimersThrottlingEnabled(Document&) const;
75         bool isIntervalDependentOnViewport() const { return m_throttleState == ShouldThrottle && !m_elementsCausingThrottling.isEmpty(); }
76         void registerForViewportChanges();
77         void unregisterForViewportChanges();
78
79         void updateThrottlingStateIfNecessary(const DOMTimerFireState&);
80
81         // SuspendableTimer
82         virtual void fired() override;
83         virtual void didStop() override;
84         virtual double alignedFireTime(double) const override;
85
86         // ActiveDOMObject API.
87         const char* activeDOMObjectName() const override;
88
89         enum TimerThrottleState {
90             Undetermined,
91             ShouldThrottle,
92             ShouldNotThrottle
93         };
94
95         int m_timeoutId;
96         int m_nestingLevel;
97         std::unique_ptr<ScheduledAction> m_action;
98         int m_originalInterval;
99         TimerThrottleState m_throttleState;
100         double m_currentTimerInterval;
101         bool m_shouldForwardUserGesture;
102         // Use WeakPtrs because we don't want to keep the elements alive but we
103         // still need to handle cases where the elements get destroyed after
104         // the timer has fired.
105         Vector<WeakPtr<Element>> m_elementsCausingThrottling;
106     };
107
108 } // namespace WebCore
109
110 #endif // DOMTimer_h
111