2016-08-22 15:52:19 +03:00
|
|
|
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
|
|
|
/* vim:set ts=2 sw=2 sts=2 et cindent: */
|
|
|
|
/* 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/. */
|
|
|
|
|
|
|
|
#ifndef mozilla_dom_timeout_h
|
|
|
|
#define mozilla_dom_timeout_h
|
|
|
|
|
|
|
|
#include "mozilla/LinkedList.h"
|
|
|
|
#include "mozilla/TimeStamp.h"
|
|
|
|
#include "nsCOMPtr.h"
|
|
|
|
#include "nsCycleCollectionParticipant.h"
|
|
|
|
|
|
|
|
class nsGlobalWindow;
|
2016-10-29 01:25:08 +03:00
|
|
|
class nsIEventTarget;
|
2016-08-22 15:52:19 +03:00
|
|
|
class nsIPrincipal;
|
2016-10-05 15:26:08 +03:00
|
|
|
class nsITimeoutHandler;
|
2016-08-22 15:52:19 +03:00
|
|
|
class nsITimer;
|
2016-10-24 13:04:41 +03:00
|
|
|
class nsIEventTarget;
|
2016-08-22 15:52:19 +03:00
|
|
|
|
|
|
|
namespace mozilla {
|
|
|
|
namespace dom {
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Timeout struct that holds information about each script
|
2016-10-05 15:26:08 +03:00
|
|
|
* timeout. Holds a strong reference to an nsITimeoutHandler, which
|
2016-08-22 15:52:19 +03:00
|
|
|
* abstracts the language specific cruft.
|
|
|
|
*/
|
|
|
|
class Timeout final
|
|
|
|
: public LinkedListElement<Timeout>
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
Timeout();
|
|
|
|
|
|
|
|
NS_DECL_CYCLE_COLLECTION_NATIVE_CLASS(Timeout)
|
|
|
|
NS_INLINE_DECL_CYCLE_COLLECTING_NATIVE_REFCOUNTING(Timeout)
|
|
|
|
|
2016-11-07 23:30:17 +03:00
|
|
|
// The target may be specified to use a particular event queue for the
|
|
|
|
// resulting timer runnable. A nullptr target will result in the
|
|
|
|
// default main thread being used.
|
|
|
|
nsresult InitTimer(nsIEventTarget* aTarget, uint32_t aDelay);
|
2016-08-22 15:52:19 +03:00
|
|
|
|
2016-11-08 15:54:40 +03:00
|
|
|
enum class Reason
|
|
|
|
{
|
|
|
|
eTimeoutOrInterval,
|
|
|
|
eIdleCallbackTimeout,
|
|
|
|
};
|
2016-08-22 16:07:50 +03:00
|
|
|
|
2016-08-22 15:52:19 +03:00
|
|
|
#ifdef DEBUG
|
Bug 1312514 - Part 1: Split tracking and non-tracking timeouts into two separate lists; r=bkelly
This will allow us to schedule these timers differently in the future.
This patch only performs the refactoring, and is not intended to change
any behavior. Specifically, this patch doesn't change the order in
which timeouts are fired -- they should still all be fired according to
the mWhen field.
The implementation works by splitting timeout storage per window into
two Timeouts objects, mNormalTimeouts and mTrackingTimeouts. The ForEach
helper methods are extended to deal with both of these objects, and as a
result, most of the algorithms operating on the list of timeouts work
correctly without any modification, with the notable exception of
RunTimeout.
In RunTimeout(), the order in which Timeout objects are processed does
matter, so for that case we use the OrderedTimeoutIterator class to
iterate over both linked lists simultaneously in the mWhen order. Also,
inserting the dummy timeout when running the timeouts is only necessary
for the linked list where the last expired timeout is coming from, so we
only inject the dummy timer into the corresponding list, therefore we
remember which list we picked the last expired timeout from when
looking for it.
2016-12-16 00:17:38 +03:00
|
|
|
bool HasRefCnt(uint32_t aCount) const;
|
2016-08-22 15:52:19 +03:00
|
|
|
#endif // DEBUG
|
|
|
|
|
2017-01-10 19:08:18 +03:00
|
|
|
void SetWhenOrTimeRemaining(const TimeStamp& aBaseTime,
|
|
|
|
const TimeDuration& aDelay);
|
|
|
|
|
|
|
|
void SetDummyWhen(const TimeStamp& aWhen);
|
|
|
|
|
|
|
|
// Can only be called when not frozen.
|
|
|
|
const TimeStamp& When() const;
|
|
|
|
|
|
|
|
// Can only be called when frozen.
|
|
|
|
const TimeDuration& TimeRemaining() const;
|
|
|
|
|
2016-08-22 15:52:19 +03:00
|
|
|
// Window for which this timeout fires
|
|
|
|
RefPtr<nsGlobalWindow> mWindow;
|
|
|
|
|
|
|
|
// The actual timer object
|
|
|
|
nsCOMPtr<nsITimer> mTimer;
|
|
|
|
|
|
|
|
// True if the timeout was cleared
|
|
|
|
bool mCleared;
|
|
|
|
|
|
|
|
// True if this is one of the timeouts that are currently running
|
|
|
|
bool mRunning;
|
|
|
|
|
|
|
|
// True if this is a repeating/interval timer
|
|
|
|
bool mIsInterval;
|
|
|
|
|
2016-12-22 06:34:52 +03:00
|
|
|
// True if this is a timeout coming from a tracking script
|
|
|
|
bool mIsTracking;
|
|
|
|
|
2016-11-08 15:54:40 +03:00
|
|
|
// Used to allow several reasons for setting a timeout, where each
|
|
|
|
// 'Reason' value is using a possibly overlapping set of id:s.
|
2016-08-22 16:07:50 +03:00
|
|
|
Reason mReason;
|
|
|
|
|
2016-08-22 15:52:19 +03:00
|
|
|
// Returned as value of setTimeout()
|
2016-08-22 16:07:50 +03:00
|
|
|
uint32_t mTimeoutId;
|
2016-08-22 15:52:19 +03:00
|
|
|
|
|
|
|
// Interval in milliseconds
|
|
|
|
uint32_t mInterval;
|
|
|
|
|
|
|
|
// Principal with which to execute
|
|
|
|
nsCOMPtr<nsIPrincipal> mPrincipal;
|
|
|
|
|
|
|
|
// stack depth at which timeout is firing
|
|
|
|
uint32_t mFiringDepth;
|
|
|
|
|
|
|
|
uint32_t mNestingLevel;
|
|
|
|
|
|
|
|
// The popup state at timeout creation time if not created from
|
|
|
|
// another timeout
|
|
|
|
PopupControlState mPopupState;
|
|
|
|
|
|
|
|
// The language-specific information about the callback.
|
2016-10-05 15:26:08 +03:00
|
|
|
nsCOMPtr<nsITimeoutHandler> mScriptHandler;
|
2016-08-22 15:52:19 +03:00
|
|
|
|
|
|
|
private:
|
2017-01-10 19:08:18 +03:00
|
|
|
// mWhen and mTimeRemaining can't be in a union, sadly, because they
|
|
|
|
// have constructors.
|
|
|
|
// Nominal time to run this timeout. Use only when timeouts are not
|
|
|
|
// frozen.
|
|
|
|
TimeStamp mWhen;
|
|
|
|
// Remaining time to wait. Used only when timeouts are frozen.
|
|
|
|
TimeDuration mTimeRemaining;
|
|
|
|
|
2016-08-22 15:52:19 +03:00
|
|
|
~Timeout();
|
|
|
|
};
|
|
|
|
|
|
|
|
} // namespace dom
|
|
|
|
} // namespace mozilla
|
|
|
|
|
|
|
|
#endif // mozilla_dom_timeout_h
|