gecko-dev/dom/base/IdleDeadline.cpp
Kris Maglione 00d7367b44 Bug 1404652: Part 1 - Add ChromeUtils.idleDispatch helper method. r=ehsan
This is similar to Services.tm.idleDispatchToMainThread, but provides an
IdleDeadline argument to its callbacks, the same way that
Window.requestIdleCallback does.

The IdleDeadline argument was necessary for my first attempt at this bug. It's
not necessary for the current version, but I suspect it will be useful in
other areas, and it also avoids some XPConnect overhead, so it's probably
worth keeping.

MozReview-Commit-ID: FtrbNkE7Vz5

--HG--
extra : rebase_source : d28973641e914c8d180f66125669aabc29ab857f
2017-09-23 22:12:32 -07:00

89 lines
2.4 KiB
C++

/* -*- 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 <algorithm>
#include "mozilla/dom/IdleDeadline.h"
#include "mozilla/dom/IdleDeadlineBinding.h"
#include "mozilla/dom/Performance.h"
#include "nsCOMPtr.h"
#include "nsCycleCollectionParticipant.h"
#include "nsDOMNavigationTiming.h"
#include "nsPIDOMWindow.h"
namespace mozilla {
namespace dom {
NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE(IdleDeadline, mWindow, mGlobal)
NS_IMPL_CYCLE_COLLECTING_ADDREF(IdleDeadline)
NS_IMPL_CYCLE_COLLECTING_RELEASE(IdleDeadline)
NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(IdleDeadline)
NS_WRAPPERCACHE_INTERFACE_MAP_ENTRY
NS_INTERFACE_MAP_ENTRY(nsISupports)
NS_INTERFACE_MAP_END
IdleDeadline::IdleDeadline(nsPIDOMWindowInner* aWindow, bool aDidTimeout,
DOMHighResTimeStamp aDeadline)
: mWindow(aWindow)
, mDidTimeout(aDidTimeout)
, mDeadline(aDeadline)
{
bool hasHadSHO;
mGlobal = aWindow->GetDoc()->GetScriptHandlingObject(hasHadSHO);
}
IdleDeadline::IdleDeadline(nsIGlobalObject* aGlobal, bool aDidTimeout,
DOMHighResTimeStamp aDeadline)
: mWindow(nullptr)
, mGlobal(aGlobal)
, mDidTimeout(aDidTimeout)
, mDeadline(aDeadline)
{
}
IdleDeadline::~IdleDeadline()
{
}
JSObject*
IdleDeadline::WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto)
{
return IdleDeadlineBinding::Wrap(aCx, this, aGivenProto);
}
DOMHighResTimeStamp
IdleDeadline::TimeRemaining()
{
if (mDidTimeout) {
return 0.0;
}
if (mWindow) {
RefPtr<Performance> performance = mWindow->GetPerformance();
if (!performance) {
// If there is no performance object the window is partially torn
// down, so we can safely say that there is no time remaining.
return 0.0;
}
return std::max(mDeadline - performance->Now(), 0.0);
}
// If there's no window, we're in a system scope, and can just use
// a high-resolution TimeStamp::Now();
auto timestamp = TimeStamp::Now() - TimeStamp::ProcessCreation();
return std::max(mDeadline - timestamp.ToMilliseconds(), 0.0);
}
bool
IdleDeadline::DidTimeout() const
{
return mDidTimeout;
}
} // namespace dom
} // namespace mozilla