summaryrefslogtreecommitdiff
path: root/dom/base/Timeout.cpp
diff options
context:
space:
mode:
authorMatt A. Tobin <mattatobin@localhost.localdomain>2018-02-02 04:16:08 -0500
committerMatt A. Tobin <mattatobin@localhost.localdomain>2018-02-02 04:16:08 -0500
commit5f8de423f190bbb79a62f804151bc24824fa32d8 (patch)
tree10027f336435511475e392454359edea8e25895d /dom/base/Timeout.cpp
parent49ee0794b5d912db1f95dce6eb52d781dc210db5 (diff)
downloaduxp-5f8de423f190bbb79a62f804151bc24824fa32d8.tar.gz
Add m-esr52 at 52.6.0
Diffstat (limited to 'dom/base/Timeout.cpp')
-rw-r--r--dom/base/Timeout.cpp111
1 files changed, 111 insertions, 0 deletions
diff --git a/dom/base/Timeout.cpp b/dom/base/Timeout.cpp
new file mode 100644
index 0000000000..35971a151e
--- /dev/null
+++ b/dom/base/Timeout.cpp
@@ -0,0 +1,111 @@
+/* -*- 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/. */
+
+#include "Timeout.h"
+
+#include "nsGlobalWindow.h"
+#include "nsITimeoutHandler.h"
+#include "nsITimer.h"
+
+namespace mozilla {
+namespace dom {
+
+Timeout::Timeout()
+ : mCleared(false),
+ mRunning(false),
+ mIsInterval(false),
+ mReason(Reason::eTimeoutOrInterval),
+ mTimeoutId(0),
+ mInterval(0),
+ mFiringDepth(0),
+ mNestingLevel(0),
+ mPopupState(openAllowed)
+{
+ MOZ_COUNT_CTOR(Timeout);
+}
+
+Timeout::~Timeout()
+{
+ if (mTimer) {
+ mTimer->Cancel();
+ mTimer = nullptr;
+ }
+
+ MOZ_COUNT_DTOR(Timeout);
+}
+
+NS_IMPL_CYCLE_COLLECTION_CLASS(Timeout)
+
+NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(Timeout)
+ NS_IMPL_CYCLE_COLLECTION_UNLINK(mWindow)
+ NS_IMPL_CYCLE_COLLECTION_UNLINK(mPrincipal)
+ NS_IMPL_CYCLE_COLLECTION_UNLINK(mScriptHandler)
+NS_IMPL_CYCLE_COLLECTION_UNLINK_END
+
+NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(Timeout)
+ NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mWindow)
+ NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mPrincipal)
+ NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mScriptHandler)
+NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
+
+NS_IMPL_CYCLE_COLLECTION_ROOT_NATIVE(Timeout, AddRef)
+NS_IMPL_CYCLE_COLLECTION_UNROOT_NATIVE(Timeout, Release)
+
+namespace {
+
+void
+TimerCallback(nsITimer*, void* aClosure)
+{
+ RefPtr<Timeout> timeout = (Timeout*)aClosure;
+ timeout->mWindow->RunTimeout(timeout);
+}
+
+void
+TimerNameCallback(nsITimer* aTimer, void* aClosure, char* aBuf, size_t aLen)
+{
+ RefPtr<Timeout> timeout = (Timeout*)aClosure;
+
+ const char* filename;
+ uint32_t lineNum, column;
+ timeout->mScriptHandler->GetLocation(&filename, &lineNum, &column);
+ snprintf(aBuf, aLen, "[content] %s:%u:%u", filename, lineNum, column);
+}
+
+} // anonymous namespace
+
+nsresult
+Timeout::InitTimer(nsIEventTarget* aTarget, uint32_t aDelay)
+{
+ // If the given target does not match the timer's current target
+ // then we need to override it before the Init. Note that GetTarget()
+ // will return the current thread after setting the target to nullptr.
+ // So we need to special case the nullptr target comparison.
+ nsCOMPtr<nsIEventTarget> currentTarget;
+ MOZ_ALWAYS_SUCCEEDS(mTimer->GetTarget(getter_AddRefs(currentTarget)));
+ if ((aTarget && currentTarget != aTarget) ||
+ (!aTarget && currentTarget != NS_GetCurrentThread())) {
+ // Always call Cancel() in case we are re-using a timer. Otherwise
+ // the subsequent SetTarget() may fail.
+ MOZ_ALWAYS_SUCCEEDS(mTimer->Cancel());
+ MOZ_ALWAYS_SUCCEEDS(mTimer->SetTarget(aTarget));
+ }
+
+ return mTimer->InitWithNameableFuncCallback(
+ TimerCallback, this, aDelay, nsITimer::TYPE_ONE_SHOT, TimerNameCallback);
+}
+
+// Return true if this timeout has a refcount of 1. This is used to check
+// that dummy_timeout doesn't leak from nsGlobalWindow::RunTimeout.
+#ifdef DEBUG
+bool
+Timeout::HasRefCntOne() const
+{
+ return mRefCnt.get() == 1;
+}
+#endif // DEBUG
+
+} // namespace dom
+} // namespace mozilla