[WTF] Import std::optional reference implementation as WTF::Optional
[WebKit-https.git] / Source / WebCore / page / DOMTimer.h
index fc48cd9..39a0461 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2008 Apple Inc. All Rights Reserved.
+ * Copyright (C) 2008, 2014 Apple Inc. All Rights Reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
  *    notice, this list of conditions and the following disclaimer in the
  *    documentation and/or other materials provided with the distribution.
  *
- * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
  *
  */
 
-#ifndef DOMTimer_h
-#define DOMTimer_h
+#pragma once
 
 #include "SuspendableTimer.h"
-#include <wtf/OwnPtr.h>
-#include <wtf/PassOwnPtr.h>
+#include "UserGestureIndicator.h"
+#include <memory>
+#include <wtf/RefCounted.h>
 
 namespace WebCore {
 
-    class ScheduledAction;
+class DOMTimerFireState;
+class Document;
+class HTMLPlugInElement;
+class ScheduledAction;
 
-    class DOMTimer FINAL : public SuspendableTimer {
-    public:
-        virtual ~DOMTimer();
-        // Creates a new timer owned by specified ScriptExecutionContext, starts it
-        // and returns its Id.
-        static int install(ScriptExecutionContext*, PassOwnPtr<ScheduledAction>, int timeout, bool singleShot);
-        static void removeById(ScriptExecutionContext*, int timeoutId);
+class DOMTimer final : public RefCounted<DOMTimer>, public SuspendableTimer {
+    WTF_MAKE_NONCOPYABLE(DOMTimer);
+    WTF_MAKE_FAST_ALLOCATED;
+public:
+    virtual ~DOMTimer();
 
-        // ActiveDOMObject
-        virtual void contextDestroyed() OVERRIDE;
+    static std::chrono::milliseconds defaultMinimumInterval() { return 4ms; }
+    static std::chrono::milliseconds defaultAlignmentInterval() { return 0ms; }
+    static std::chrono::milliseconds hiddenPageAlignmentInterval() { return 1000ms; }
 
-        // Adjust to a change in the ScriptExecutionContext's minimum timer interval.
-        // This allows the minimum allowable interval time to be changed in response
-        // to events like moving a tab to the background.
-        void adjustMinimumTimerInterval(double oldMinimumTimerInterval);
+    // Creates a new timer owned by specified ScriptExecutionContext, starts it
+    // and returns its Id.
+    static int install(ScriptExecutionContext&, std::unique_ptr<ScheduledAction>, std::chrono::milliseconds timeout, bool singleShot);
+    static void removeById(ScriptExecutionContext&, int timeoutId);
 
-    private:
-        DOMTimer(ScriptExecutionContext*, PassOwnPtr<ScheduledAction>, int interval, bool singleShot);
-        virtual void fired() OVERRIDE;
+    // Notify that the interval may need updating (e.g. because the minimum interval
+    // setting for the context has changed).
+    void updateTimerIntervalIfNecessary();
 
-        // SuspendableTimer
-        virtual void didStop() OVERRIDE;
+    static void scriptDidInteractWithPlugin(HTMLPlugInElement&);
 
-        double intervalClampedToMinimum(int timeout, double minimumTimerInterval) const;
+private:
+    DOMTimer(ScriptExecutionContext&, std::unique_ptr<ScheduledAction>, std::chrono::milliseconds interval, bool singleShot);
+    friend class Internals;
 
-        // Retuns timer fire time rounded to the next multiple of timer alignment interval.
-        virtual double alignedFireTime(double) const OVERRIDE;
+    std::chrono::milliseconds intervalClampedToMinimum() const;
 
-        int m_timeoutId;
-        int m_nestingLevel;
-        OwnPtr<ScheduledAction> m_action;
-        int m_originalInterval;
-        bool m_shouldForwardUserGesture;
-    };
+    bool isDOMTimersThrottlingEnabled(Document&) const;
+    void updateThrottlingStateIfNecessary(const DOMTimerFireState&);
 
-} // namespace WebCore
+    // SuspendableTimer
+    void fired() override;
+    void didStop() override;
+    std::optional<std::chrono::milliseconds> alignedFireTime(std::chrono::milliseconds) const override;
+
+    // ActiveDOMObject API.
+    const char* activeDOMObjectName() const override;
 
-#endif // DOMTimer_h
+    enum TimerThrottleState {
+        Undetermined,
+        ShouldThrottle,
+        ShouldNotThrottle
+    };
+
+    int m_timeoutId;
+    int m_nestingLevel;
+    std::unique_ptr<ScheduledAction> m_action;
+    std::chrono::milliseconds m_originalInterval;
+    TimerThrottleState m_throttleState;
+    std::chrono::milliseconds m_currentTimerInterval;
+    RefPtr<UserGestureToken> m_userGestureTokenToForward;
+};
 
+} // namespace WebCore