mirror of
https://repo.dactyloidae.xyz/Dactyloidae/UXP.git
synced 2026-09-06 15:58:39 +09:00
Merge remote-tracking branch 'origin/tracking' into custom
This commit is contained in:
commit
35ff27f838
8 changed files with 87 additions and 43 deletions
|
|
@ -167,6 +167,9 @@ const nsIID kDEBUGWorkerEventTargetIID = {
|
|||
|
||||
#endif
|
||||
|
||||
// The number of nested timeouts before we start clamping. HTML says 5.
|
||||
const uint32_t kClampTimeoutNestingLevel = 5u;
|
||||
|
||||
template <class T>
|
||||
class AutoPtrComparator
|
||||
{
|
||||
|
|
@ -1956,7 +1959,11 @@ NS_IMPL_QUERY_INTERFACE(WorkerLoadInfo::InterfaceRequestor, nsIInterfaceRequesto
|
|||
struct WorkerPrivate::TimeoutInfo
|
||||
{
|
||||
TimeoutInfo()
|
||||
: mId(0), mIsInterval(false), mCanceled(false)
|
||||
: mId(0)
|
||||
, mNestingLevel(0)
|
||||
, mIsInterval(false)
|
||||
, mCanceled(false)
|
||||
, mOnChromeWorker(false)
|
||||
{
|
||||
MOZ_COUNT_CTOR(mozilla::dom::workers::WorkerPrivate::TimeoutInfo);
|
||||
}
|
||||
|
|
@ -1976,12 +1983,33 @@ struct WorkerPrivate::TimeoutInfo
|
|||
return mTargetTime < aOther.mTargetTime;
|
||||
}
|
||||
|
||||
void AccumulateNestingLevel(const uint32_t& aBaseLevel) {
|
||||
if (aBaseLevel < kClampTimeoutNestingLevel) {
|
||||
mNestingLevel = aBaseLevel + 1;
|
||||
return;
|
||||
}
|
||||
mNestingLevel = kClampTimeoutNestingLevel;
|
||||
}
|
||||
|
||||
void CalculateTargetTime() {
|
||||
auto target = mInterval;
|
||||
// Clamp timeout for workers, except chrome workers
|
||||
if (mNestingLevel >= kClampTimeoutNestingLevel && !mOnChromeWorker) {
|
||||
target = TimeDuration::Max(
|
||||
mInterval,
|
||||
TimeDuration::FromMilliseconds(Preferences::GetInt("dom.min_timeout_value")));
|
||||
}
|
||||
mTargetTime = TimeStamp::Now() + target;
|
||||
}
|
||||
|
||||
nsCOMPtr<nsIScriptTimeoutHandler> mHandler;
|
||||
mozilla::TimeStamp mTargetTime;
|
||||
mozilla::TimeDuration mInterval;
|
||||
int32_t mId;
|
||||
uint32_t mNestingLevel;
|
||||
bool mIsInterval;
|
||||
bool mCanceled;
|
||||
bool mOnChromeWorker;
|
||||
};
|
||||
|
||||
class WorkerJSContextStats final : public JS::RuntimeStats
|
||||
|
|
@ -4130,6 +4158,7 @@ WorkerPrivate::WorkerPrivate(WorkerPrivate* aParent,
|
|||
, mMainThreadEventTarget(do_GetMainThread())
|
||||
, mErrorHandlerRecursionCount(0)
|
||||
, mNextTimeoutId(1)
|
||||
, mCurrentTimerNestingLevel(0)
|
||||
, mStatus(Pending)
|
||||
, mFrozen(false)
|
||||
, mTimerRunning(false)
|
||||
|
|
@ -6074,8 +6103,10 @@ WorkerPrivate::SetTimeout(JSContext* aCx,
|
|||
}
|
||||
|
||||
nsAutoPtr<TimeoutInfo> newInfo(new TimeoutInfo());
|
||||
newInfo->mOnChromeWorker = mIsChromeWorker;
|
||||
newInfo->mIsInterval = aIsInterval;
|
||||
newInfo->mId = timerId;
|
||||
newInfo->AccumulateNestingLevel(this->mCurrentTimerNestingLevel);
|
||||
|
||||
if (MOZ_UNLIKELY(timerId == INT32_MAX)) {
|
||||
NS_WARNING("Timeout ids overflowed!");
|
||||
|
|
@ -6188,14 +6219,21 @@ WorkerPrivate::RunExpiredTimeouts(JSContext* aCx)
|
|||
// Guard against recursion.
|
||||
mRunningExpiredTimeouts = true;
|
||||
|
||||
MOZ_DIAGNOSTIC_ASSERT(data->mCurrentTimerNestingLevel == 0);
|
||||
|
||||
// Run expired timeouts.
|
||||
for (uint32_t index = 0; index < expiredTimeouts.Length(); index++) {
|
||||
TimeoutInfo*& info = expiredTimeouts[index];
|
||||
AutoRestore<uint32_t> nestingLevel(this->mCurrentTimerNestingLevel);
|
||||
|
||||
if (info->mCanceled) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// Set current timer nesting level to current running timer handler's
|
||||
// nesting level
|
||||
this->mCurrentTimerNestingLevel = info->mNestingLevel;
|
||||
|
||||
LOG(TimeoutsLog(), ("Worker %p executing timeout with original delay %f ms.\n",
|
||||
this, info->mInterval.ToMilliseconds()));
|
||||
|
||||
|
|
@ -6273,8 +6311,10 @@ WorkerPrivate::RunExpiredTimeouts(JSContext* aCx)
|
|||
info->mCanceled) {
|
||||
if (info->mIsInterval && !info->mCanceled) {
|
||||
// Reschedule intervals.
|
||||
info->mTargetTime = info->mTargetTime + info->mInterval;
|
||||
// Don't resort the list here, we'll do that at the end.
|
||||
// Reschedule a timeout and, if needed, increase the nesting level.
|
||||
info->AccumulateNestingLevel(info->mNestingLevel);
|
||||
info->CalculateTargetTime();
|
||||
// Don't re-sort the list here, we'll do that at the end.
|
||||
++index;
|
||||
}
|
||||
else {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue