diff --git a/dom/abort/AbortController.cpp b/dom/abort/AbortController.cpp index 9bd8202559bc..5799f5fa9a20 100644 --- a/dom/abort/AbortController.cpp +++ b/dom/abort/AbortController.cpp @@ -55,7 +55,8 @@ nsIGlobalObject* AbortController::GetParentObject() const { return mGlobal; } AbortSignal* AbortController::Signal() { if (!mSignal) { JS::Rooted reason(RootingCx(), mReason); - mSignal = new AbortSignal(mGlobal, mAborted, reason); + mSignal = AbortSignal::Create( + mGlobal, mAborted ? SignalAborted::Yes : SignalAborted::No, reason); } return mSignal; diff --git a/dom/abort/AbortFollower.h b/dom/abort/AbortFollower.h index 4967cac9f10c..815c819e2653 100644 --- a/dom/abort/AbortFollower.h +++ b/dom/abort/AbortFollower.h @@ -14,6 +14,8 @@ namespace mozilla::dom { +enum class SignalAborted { No, Yes }; + class AbortSignal; class AbortSignalImpl; @@ -54,7 +56,8 @@ class AbortFollower : public nsISupports { */ class AbortSignalImpl : public nsISupports, public SupportsWeakPtr { public: - explicit AbortSignalImpl(bool aAborted, JS::Handle aReason); + explicit AbortSignalImpl(SignalAborted aAborted, + JS::Handle aReason); bool Aborted() const; @@ -99,7 +102,7 @@ class AbortSignalImpl : public nsISupports, public SupportsWeakPtr { // abort algorithms) empty this and make all contained followers |Unfollow()|. nsTObserverArray> mFollowers; - bool mAborted; + SignalAborted mAborted; }; } // namespace mozilla::dom diff --git a/dom/abort/AbortSignal.cpp b/dom/abort/AbortSignal.cpp index b0e62b8392d9..68c26cba55e0 100644 --- a/dom/abort/AbortSignal.cpp +++ b/dom/abort/AbortSignal.cpp @@ -23,16 +23,17 @@ namespace mozilla::dom { // AbortSignalImpl // ---------------------------------------------------------------------------- -AbortSignalImpl::AbortSignalImpl(bool aAborted, JS::Handle aReason) +AbortSignalImpl::AbortSignalImpl(SignalAborted aAborted, + JS::Handle aReason) : mReason(aReason), mAborted(aAborted) { - MOZ_ASSERT_IF(!mReason.isUndefined(), mAborted); + MOZ_ASSERT_IF(!mReason.isUndefined(), Aborted()); } -bool AbortSignalImpl::Aborted() const { return mAborted; } +bool AbortSignalImpl::Aborted() const { return mAborted == SignalAborted::Yes; } void AbortSignalImpl::GetReason(JSContext* aCx, JS::MutableHandle aReason) { - if (!mAborted) { + if (!Aborted()) { return; } MaybeAssignAbortError(aCx); @@ -44,7 +45,7 @@ JS::Value AbortSignalImpl::RawReason() const { return mReason.get(); } // https://dom.spec.whatwg.org/#abortsignal-signal-abort void AbortSignalImpl::SignalAbort(JS::Handle aReason) { // Step 1: If signal is aborted, then return. - if (mAborted) { + if (Aborted()) { return; } @@ -84,7 +85,7 @@ void AbortSignalImpl::RunAbortSteps() { } void AbortSignalImpl::SetAborted(JS::Handle aReason) { - mAborted = true; + mAborted = SignalAborted::Yes; mReason = aReason; } @@ -99,7 +100,7 @@ void AbortSignalImpl::Unlink(AbortSignalImpl* aSignal) { } void AbortSignalImpl::MaybeAssignAbortError(JSContext* aCx) { - MOZ_ASSERT(mAborted); + MOZ_ASSERT(Aborted()); if (!mReason.isUndefined()) { return; } @@ -151,13 +152,31 @@ NS_IMPL_CYCLE_COLLECTION_TRACE_END NS_IMPL_ADDREF_INHERITED(AbortSignal, DOMEventTargetHelper) NS_IMPL_RELEASE_INHERITED(AbortSignal, DOMEventTargetHelper) -AbortSignal::AbortSignal(nsIGlobalObject* aGlobalObject, bool aAborted, +already_AddRefed AbortSignal::Create( + nsIGlobalObject* aGlobalObject, SignalAborted aAborted, + JS::Handle aReason) { + RefPtr signal = + new AbortSignal(aGlobalObject, aAborted, aReason); + signal->Init(); + return signal.forget(); +} + +void AbortSignal::Init() { + // Init is use to separate this HoldJSObjects call to avoid calling + // it in the constructor. + // + // We can't call HoldJSObjects in the constructor because it'll + // addref `this` before the vtable is set up properly, so the parent + // type gets stored in the CC participant table. This is problematic + // for classes that inherit AbortSignal. + mozilla::HoldJSObjects(this); +} + +AbortSignal::AbortSignal(nsIGlobalObject* aGlobalObject, SignalAborted aAborted, JS::Handle aReason) : DOMEventTargetHelper(aGlobalObject), AbortSignalImpl(aAborted, aReason), - mDependent(false) { - mozilla::HoldJSObjects(this); -} + mDependent(false) {} JSObject* AbortSignal::WrapObject(JSContext* aCx, JS::Handle aGivenProto) { @@ -168,7 +187,8 @@ already_AddRefed AbortSignal::Abort( GlobalObject& aGlobal, JS::Handle aReason) { nsCOMPtr global = do_QueryInterface(aGlobal.GetAsSupports()); - RefPtr abortSignal = new AbortSignal(global, true, aReason); + RefPtr abortSignal = + AbortSignal::Create(global, SignalAborted::Yes, aReason); return abortSignal.forget(); } @@ -256,7 +276,7 @@ already_AddRefed AbortSignal::Timeout(GlobalObject& aGlobal, // Step 1. Let signal be a new AbortSignal object. RefPtr signal = - new AbortSignal(global, false, JS::UndefinedHandleValue); + AbortSignal::Create(global, SignalAborted::No, JS::UndefinedHandleValue); // Step 3. Run steps after a timeout given global, "AbortSignal-timeout", // milliseconds, and the following step: ... @@ -283,17 +303,20 @@ already_AddRefed AbortSignal::Any( GlobalObject& aGlobal, const Sequence>& aSignals) { nsCOMPtr global = do_QueryInterface(aGlobal.GetAsSupports()); - mozilla::Span span{aSignals.Elements(), aSignals.Length()}; - return Any(global, span); + return Any(global, aSignals, [](nsIGlobalObject* aGlobal) { + return AbortSignal::Create(aGlobal, SignalAborted::No, + JS::UndefinedHandleValue); + }); } already_AddRefed AbortSignal::Any( nsIGlobalObject* aGlobal, - const Span>& aSignals) { + const Span>& aSignals, + FunctionRef(nsIGlobalObject* aGlobal)> + aCreateResultSignal) { // Step 1. Let resultSignal be a new object implementing AbortSignal using // realm - RefPtr resultSignal = - new AbortSignal(aGlobal, false, JS::UndefinedHandleValue); + RefPtr resultSignal = aCreateResultSignal(aGlobal); if (!aSignals.IsEmpty()) { // (Prepare for step 2 which uses the reason of this. Cannot use @@ -441,7 +464,7 @@ AbortFollower::~AbortFollower() { Unfollow(); } // https://dom.spec.whatwg.org/#abortsignal-add void AbortFollower::Follow(AbortSignalImpl* aSignal) { // Step 1. - if (aSignal->mAborted) { + if (aSignal->Aborted()) { return; } diff --git a/dom/abort/AbortSignal.h b/dom/abort/AbortSignal.h index fef80b9dd2b3..270abb278fea 100644 --- a/dom/abort/AbortSignal.h +++ b/dom/abort/AbortSignal.h @@ -31,11 +31,12 @@ class AbortSignal : public DOMEventTargetHelper, public AbortSignalImpl { NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS_INHERITED(AbortSignal, DOMEventTargetHelper) - AbortSignal(nsIGlobalObject* aGlobalObject, bool aAborted, - JS::Handle aReason); + static already_AddRefed Create(nsIGlobalObject* aGlobalObject, + SignalAborted aAborted, + JS::Handle aReason); - JSObject* WrapObject(JSContext* aCx, - JS::Handle aGivenProto) override; + virtual JSObject* WrapObject(JSContext* aCx, + JS::Handle aGivenProto) override; IMPL_EVENT_HANDLER(abort); @@ -51,7 +52,9 @@ class AbortSignal : public DOMEventTargetHelper, public AbortSignalImpl { const Sequence>& aSignals); static already_AddRefed Any( nsIGlobalObject* aGlobal, - const Span>& aSignals); + const Span>& aSignals, + FunctionRef(nsIGlobalObject* aGlobal)> + aCreateResultSignal); void ThrowIfAborted(JSContext* aCx, ErrorResult& aRv); @@ -60,7 +63,12 @@ class AbortSignal : public DOMEventTargetHelper, public AbortSignalImpl { bool Dependent() const; protected: - ~AbortSignal(); + AbortSignal(nsIGlobalObject* aGlobalObject, SignalAborted aAborted, + JS::Handle aReason); + + void Init(); + + virtual ~AbortSignal(); void MakeDependentOn(AbortSignal* aSignal); diff --git a/dom/base/IdleRequest.cpp b/dom/base/IdleRequest.cpp index 21410ca86de2..fa64e95c2460 100644 --- a/dom/base/IdleRequest.cpp +++ b/dom/base/IdleRequest.cpp @@ -63,7 +63,7 @@ void IdleRequest::IdleRun(nsPIDOMWindowInner* aWindow, // Set state’s priority source to the result of creating a fixed priority // unabortable task signal given "background" and realm. newState->SetPrioritySource( - new TaskSignal(aWindow->AsGlobal(), TaskPriority::Background)); + TaskSignal::Create(aWindow->AsGlobal(), TaskPriority::Background)); // Set event loop’s current scheduling state to state. innerWindow->SetWebTaskSchedulingState(newState); callback->Call(*deadline, "requestIdleCallback handler"); diff --git a/dom/fetch/Fetch.cpp b/dom/fetch/Fetch.cpp index 0bd219694282..2a29279a6d74 100644 --- a/dom/fetch/Fetch.cpp +++ b/dom/fetch/Fetch.cpp @@ -90,7 +90,7 @@ class AbortSignalMainThread final : public AbortSignalImpl { NS_DECL_CYCLE_COLLECTING_ISUPPORTS NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS(AbortSignalMainThread) - explicit AbortSignalMainThread(bool aAborted) + explicit AbortSignalMainThread(SignalAborted aAborted) : AbortSignalImpl(aAborted, JS::UndefinedHandleValue) { mozilla::HoldJSObjects(this); } @@ -147,7 +147,7 @@ class AbortSignalProxy final : public AbortFollower { // thread, to create it in already-aborted state if necessary. It does *not* // reflect the instantaneous is-aborted status of the worker thread's // AbortSignal. - const bool mAborted; + const SignalAborted mAborted; public: NS_DECL_THREADSAFE_ISUPPORTS @@ -155,7 +155,8 @@ class AbortSignalProxy final : public AbortFollower { AbortSignalProxy(AbortSignalImpl* aSignalImpl, nsIEventTarget* aMainThreadEventTarget) : mMainThreadEventTarget(aMainThreadEventTarget), - mAborted(aSignalImpl->Aborted()) { + mAborted(aSignalImpl->Aborted() ? SignalAborted::Yes + : SignalAborted::No) { MOZ_ASSERT(!NS_IsMainThread()); MOZ_ASSERT(mMainThreadEventTarget); Follow(aSignalImpl); diff --git a/dom/fetch/Request.cpp b/dom/fetch/Request.cpp index 6bc97e3df3e4..d2bf86027cec 100644 --- a/dom/fetch/Request.cpp +++ b/dom/fetch/Request.cpp @@ -63,7 +63,10 @@ Request::Request(nsIGlobalObject* aOwner, SafeRefPtr aRequest, // If we don't have a signal as argument, we will create it when required by // content, otherwise the Request's signal must follow what has been passed. AutoTArray, 1> array{OwningNonNull(*aSignal)}; - mSignal = AbortSignal::Any(aOwner, mozilla::Span{array}); + mSignal = AbortSignal::Any(aOwner, array, [](nsIGlobalObject* aGlobal) { + return AbortSignal::Create(aGlobal, SignalAborted::No, + JS::UndefinedHandleValue); + }); } } @@ -507,7 +510,8 @@ Headers* Request::Headers_() { AbortSignal* Request::GetOrCreateSignal() { if (!mSignal) { - mSignal = new AbortSignal(mOwner, false, JS::UndefinedHandleValue); + mSignal = AbortSignal::Create(mOwner, SignalAborted::No, + JS::UndefinedHandleValue); } return mSignal; diff --git a/dom/streams/WritableStreamDefaultController.cpp b/dom/streams/WritableStreamDefaultController.cpp index c1ee4bd8ea26..9ef965cf8840 100644 --- a/dom/streams/WritableStreamDefaultController.cpp +++ b/dom/streams/WritableStreamDefaultController.cpp @@ -149,8 +149,10 @@ void SetUpWritableStreamDefaultController( ResetQueue(aController); // Step 6. Set controller.[[signal]] to a new AbortSignal. - RefPtr signal = new AbortSignal(aController->GetParentObject(), - false, JS::UndefinedHandleValue); + RefPtr signal = + AbortSignal::Create(aController->GetParentObject(), SignalAborted::No, + JS::UndefinedHandleValue); + aController->SetSignal(signal); // Step 7. Set controller.[[started]] to false. diff --git a/dom/webidl/WebTaskScheduling.webidl b/dom/webidl/WebTaskScheduling.webidl index 3d95f0aaf31f..8ec99c88ce2c 100644 --- a/dom/webidl/WebTaskScheduling.webidl +++ b/dom/webidl/WebTaskScheduling.webidl @@ -8,8 +8,14 @@ enum TaskPriority { "background" }; +dictionary TaskSignalAnyInit { + (TaskPriority or TaskSignal) priority = "user-visible"; +}; + [Exposed=(Window, Worker), Pref="dom.enable_web_task_scheduling"] interface TaskSignal : AbortSignal { + [NewObject] static TaskSignal _any(sequence signals, optional TaskSignalAnyInit init = {}); + readonly attribute TaskPriority priority; attribute EventHandler onprioritychange; diff --git a/dom/webscheduling/TaskSignal.cpp b/dom/webscheduling/TaskSignal.cpp index 0b7e67702d32..087a1b3f2df5 100644 --- a/dom/webscheduling/TaskSignal.cpp +++ b/dom/webscheduling/TaskSignal.cpp @@ -10,6 +10,16 @@ namespace mozilla::dom { +NS_IMPL_CYCLE_COLLECTION_INHERITED(TaskSignal, AbortSignal, + mDependentTaskSignals) + +NS_IMPL_ISUPPORTS_CYCLE_COLLECTION_INHERITED_0(TaskSignal, AbortSignal) + +already_AddRefed TaskSignal::Create(nsIGlobalObject* aGlobalObject, + TaskPriority aPriority) { + return do_AddRef(new TaskSignal(aGlobalObject, aPriority)); +} + void TaskSignal::RunPriorityChangeAlgorithms() { for (const WeakPtr& scheduler : mSchedulers) { if (scheduler) { @@ -20,4 +30,62 @@ void TaskSignal::RunPriorityChangeAlgorithms() { void TaskSignal::SetWebTaskScheduler(WebTaskScheduler* aScheduler) { mSchedulers.AppendElement(aScheduler); } + +// https://wicg.github.io/scheduling-apis/#create-a-dependent-task-signal +/* static */ +already_AddRefed TaskSignal::Any( + GlobalObject& aGlobal, const Sequence>& aSignals, + const TaskSignalAnyInit& aInit) { + nsCOMPtr global = do_QueryInterface(aGlobal.GetAsSupports()); + // 1. Let resultSignal be the result of creating a dependent signal from + // signals using the TaskSignal interface and realm. + RefPtr abortSignal = + AbortSignal::Any(global, aSignals, [](nsIGlobalObject* aGlobal) { + // Use User_visible as a temporary priority for now, it'll alwasy be set + // again later. + RefPtr signal = + new TaskSignal(aGlobal, TaskPriority::User_visible); + return signal.forget(); + }); + + if (!abortSignal) { + return nullptr; + } + + RefPtr resultSignal = static_cast(abortSignal.get()); + + // 2. Set resultSignal’s dependent to true. + resultSignal->mDependent = true; + + // 3. If init["priority"] is a TaskPriority, then: + if (aInit.mPriority.IsTaskPriority()) { + // 3.1 Set resultSignal’s priority to init["priority"]. + resultSignal->SetPriority(aInit.mPriority.GetAsTaskPriority()); + return resultSignal.forget(); + } + + // 4. Otherwise: + // 4.1. Let sourceSignal be init["priority"]. + OwningNonNull sourceSignal = aInit.mPriority.GetAsTaskSignal(); + + // 4.2. Set resultSignal’s priority to sourceSignal’s priority. + resultSignal->SetPriority(sourceSignal->Priority()); + + // 4.3 If sourceSignal does not have fixed priority, then: + if (!sourceSignal->HasFixedPriority()) { + // 4.3.1 If sourceSignal’s dependent is true, then set sourceSignal to + // sourceSignal’s source signal + if (sourceSignal->mDependent) { + sourceSignal = sourceSignal->mSourceTaskSignal; + } + // 4.3.2. Assert: sourceSignal is not dependent. + MOZ_ASSERT(!sourceSignal->mDependent); + // 4.3.3. Set resultSignal’s source signal to a weak reference to + // sourceSignal. + resultSignal->mSourceTaskSignal = sourceSignal; + // 4.3.4. Append resultSignal to sourceSignal’s dependent signals. + sourceSignal->mDependentTaskSignals.AppendElement(resultSignal); + } + return resultSignal.forget(); +} } // namespace mozilla::dom diff --git a/dom/webscheduling/TaskSignal.h b/dom/webscheduling/TaskSignal.h index 5fe9dfc10dc3..f4f4717d0764 100644 --- a/dom/webscheduling/TaskSignal.h +++ b/dom/webscheduling/TaskSignal.h @@ -13,15 +13,21 @@ #include "mozilla/dom/WebTaskSchedulingBinding.h" namespace mozilla::dom { -class TaskSignal : public AbortSignal { +class TaskSignal final : public AbortSignal { public: - TaskSignal(nsIGlobalObject* aGlobal, TaskPriority aPriority) - : AbortSignal(aGlobal, false, JS::UndefinedHandleValue), - mPriority(aPriority), - mPriorityChanging(false) {} + NS_DECL_ISUPPORTS_INHERITED + NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(TaskSignal, AbortSignal) IMPL_EVENT_HANDLER(prioritychange); + static already_AddRefed Create(nsIGlobalObject* aGlobalObject, + TaskPriority aPriority); + + static already_AddRefed Any( + GlobalObject& aGlobal, + const Sequence>& aSignals, + const TaskSignalAnyInit& aInit); + TaskPriority Priority() const { return mPriority; } JSObject* WrapObject(JSContext* aCx, @@ -43,13 +49,34 @@ class TaskSignal : public AbortSignal { void SetWebTaskScheduler(WebTaskScheduler* aScheduler); + // https://wicg.github.io/scheduling-apis/#tasksignal-has-fixed-priority + bool HasFixedPriority() const { return mDependent && !mSourceTaskSignal; } + + nsTArray>& DependentTaskSignals() { + return mDependentTaskSignals; + } + private: + TaskSignal(nsIGlobalObject* aGlobal, TaskPriority aPriority) + : AbortSignal(aGlobal, SignalAborted::No, JS::UndefinedHandleValue), + mPriority(aPriority), + mPriorityChanging(false) { + AbortSignal::Init(); + } + TaskPriority mPriority; + // https://wicg.github.io/scheduling-apis/#tasksignal-priority-changing bool mPriorityChanging; nsTArray> mSchedulers; + // https://wicg.github.io/scheduling-apis/#tasksignal-source-signal + WeakPtr mSourceTaskSignal; + + // https://wicg.github.io/scheduling-apis/#tasksignal-dependent-signals + nsTArray> mDependentTaskSignals; + ~TaskSignal() = default; }; } // namespace mozilla::dom diff --git a/dom/webscheduling/WebTaskController.cpp b/dom/webscheduling/WebTaskController.cpp index f9d27aaa0d41..eec387f74491 100644 --- a/dom/webscheduling/WebTaskController.cpp +++ b/dom/webscheduling/WebTaskController.cpp @@ -16,12 +16,14 @@ WebTaskController::WebTaskController(nsIGlobalObject* aGlobal, TaskPriority aPriority) : AbortController(aGlobal) { MOZ_ASSERT(!mSignal); - mSignal = new TaskSignal(aGlobal, aPriority); + mSignal = TaskSignal::Create(aGlobal, aPriority); } -void WebTaskController::SetPriority(TaskPriority aPriority, ErrorResult& aRv) { - // https://wicg.github.io/scheduling-apis/#tasksignal-signal-priority-change - RefPtr taskSignal = static_cast(mSignal.get()); +void WebTaskController::SignalPriorityChange(TaskSignal* aTaskSignal, + TaskPriority aPriority, + ErrorResult& aRv) { + RefPtr taskSignal = aTaskSignal; + MOZ_ASSERT(taskSignal); if (taskSignal->PriorityChanging()) { aRv.ThrowNotAllowedError("Signal's priority changing is true"); @@ -47,9 +49,21 @@ void WebTaskController::SetPriority(TaskPriority aPriority, ErrorResult& aRv) { event->SetTrusted(true); taskSignal->DispatchEvent(*event); + + for (const RefPtr& dependentSignal : + taskSignal->DependentTaskSignals().Clone()) { + SignalPriorityChange(dependentSignal, aPriority, aRv); + } + taskSignal->SetPriorityChanging(false); } +void WebTaskController::SetPriority(TaskPriority aPriority, ErrorResult& aRv) { + MOZ_ASSERT(mSignal->IsTaskSignal()); + // mSignal for WebTaskController should always be a TaskSignal. + SignalPriorityChange(static_cast(mSignal.get()), aPriority, aRv); +} + already_AddRefed WebTaskController::Constructor( const GlobalObject& aGlobal, const TaskControllerInit& aInit, ErrorResult& aRv) { diff --git a/dom/webscheduling/WebTaskController.h b/dom/webscheduling/WebTaskController.h index ade3526531f7..93d5171f6e15 100644 --- a/dom/webscheduling/WebTaskController.h +++ b/dom/webscheduling/WebTaskController.h @@ -28,6 +28,10 @@ class WebTaskController : public AbortController { void SetPriority(TaskPriority aPriority, ErrorResult& aRv); private: + // https://wicg.github.io/scheduling-apis/#tasksignal-signal-priority-change + void SignalPriorityChange(TaskSignal* aTaskSignal, TaskPriority aPriority, + ErrorResult& aRv); + ~WebTaskController() = default; }; } // namespace mozilla::dom diff --git a/dom/webscheduling/WebTaskScheduler.cpp b/dom/webscheduling/WebTaskScheduler.cpp index 70bd8ad22864..6a08c725bbb4 100644 --- a/dom/webscheduling/WebTaskScheduler.cpp +++ b/dom/webscheduling/WebTaskScheduler.cpp @@ -322,11 +322,12 @@ already_AddRefed WebTaskScheduler::PostTask( // result of creating a fixed priority unabortable task signal given // options["priority"] newState->SetPrioritySource( - new TaskSignal(GetParentObject(), taskPriority.Value())); + TaskSignal::Create(GetParentObject(), taskPriority.Value())); } else if (signalValue && signalValue->IsTaskSignal()) { // 7. Otherwise if signal is not null and implements the TaskSignal // interface, then set state’s priority source to signal. - newState->SetPrioritySource(static_cast(signalValue)); + newState->SetPrioritySource( + do_AddRef(static_cast(signalValue))); } if (!newState->GetPrioritySource()) { @@ -334,7 +335,7 @@ already_AddRefed WebTaskScheduler::PostTask( // source to the result of creating a fixed priority unabortable task // signal given "user-visible". newState->SetPrioritySource( - new TaskSignal(GetParentObject(), TaskPriority::User_visible)); + TaskSignal::Create(GetParentObject(), TaskPriority::User_visible)); } MOZ_ASSERT(newState->GetPrioritySource()); @@ -420,7 +421,7 @@ already_AddRefed WebTaskScheduler::YieldImpl() { // 6. If prioritySource is null, then set prioritySource to the result of // creating a fixed priority unabortable task signal given "user-visible". prioritySource = - new TaskSignal(GetParentObject(), TaskPriority::User_visible); + TaskSignal::Create(GetParentObject(), TaskPriority::User_visible); } // 7. Let handle be the result of creating a task handle given result and diff --git a/dom/webscheduling/WebTaskScheduler.h b/dom/webscheduling/WebTaskScheduler.h index cb92fd0ce0b6..fec2b6da7673 100644 --- a/dom/webscheduling/WebTaskScheduler.h +++ b/dom/webscheduling/WebTaskScheduler.h @@ -45,9 +45,9 @@ class WebTaskSchedulingState { AbortSignal* GetAbortSource() { return mAbortSource; } TaskSignal* GetPrioritySource() { return mPrioritySource; } - void SetPrioritySource(TaskSignal* aPrioritySource) { - MOZ_ASSERT(aPrioritySource->IsTaskSignal()); + void SetPrioritySource(already_AddRefed aPrioritySource) { mPrioritySource = aPrioritySource; + MOZ_ASSERT(mPrioritySource->IsTaskSignal()); } private: diff --git a/testing/web-platform/meta/scheduler/task-signal-any-post-task-run-order.tentative.any.js.ini b/testing/web-platform/meta/scheduler/task-signal-any-post-task-run-order.tentative.any.js.ini deleted file mode 100644 index 61391a0d720d..000000000000 --- a/testing/web-platform/meta/scheduler/task-signal-any-post-task-run-order.tentative.any.js.ini +++ /dev/null @@ -1,66 +0,0 @@ -[task-signal-any-post-task-run-order.tentative.any.serviceworker.html] - expected: - if debug and (os == "win") and (processor == "x86_64"): [OK, ERROR, CRASH] - if debug and (os == "win") and (processor == "x86"): [OK, ERROR] - if debug and (os == "mac"): [ERROR, OK] - if debug and (os == "linux"): [OK, ERROR, CRASH] - if not debug and (os == "android"): [OK, ERROR] - [scheduler.postTask() tasks run in priority order with a fixed priority composite signal] - expected: FAIL - - [scheduler.postTask() tasks run in priority order with a dynamic priority composite signal] - expected: FAIL - - [scheduler.postTask() tasks run in priority order with a composite signal whose source has fixed priority] - expected: FAIL - - -[task-signal-any-post-task-run-order.tentative.any.html] - expected: - if debug and (os == "win") and (processor == "x86_64"): [CRASH, OK, ERROR] - if debug and (os == "linux") and not fission: [CRASH, OK, ERROR] - if not debug and (os == "linux") and fission: OK - if not debug and (os == "linux") and not fission: CRASH - if debug and (os == "android"): CRASH - if not debug and (os == "win"): OK - if not debug and (os == "mac"): [OK, CRASH] - if not debug and (os == "android"): [OK, CRASH] - [OK, ERROR] - [scheduler.postTask() tasks run in priority order with a fixed priority composite signal] - expected: FAIL - - [scheduler.postTask() tasks run in priority order with a dynamic priority composite signal] - expected: FAIL - - [scheduler.postTask() tasks run in priority order with a composite signal whose source has fixed priority] - expected: FAIL - - -[task-signal-any-post-task-run-order.tentative.any.worker.html] - expected: - if debug and (os == "android"): OK - if not debug: OK - [OK, ERROR] - [scheduler.postTask() tasks run in priority order with a fixed priority composite signal] - expected: FAIL - - [scheduler.postTask() tasks run in priority order with a dynamic priority composite signal] - expected: FAIL - - [scheduler.postTask() tasks run in priority order with a composite signal whose source has fixed priority] - expected: FAIL - - -[task-signal-any-post-task-run-order.tentative.any.sharedworker.html] - expected: - if debug and (os == "android"): OK - if not debug: OK - [OK, ERROR] - [scheduler.postTask() tasks run in priority order with a fixed priority composite signal] - expected: FAIL - - [scheduler.postTask() tasks run in priority order with a dynamic priority composite signal] - expected: FAIL - - [scheduler.postTask() tasks run in priority order with a composite signal whose source has fixed priority] - expected: FAIL diff --git a/testing/web-platform/meta/scheduler/task-signal-any-priority.tentative.any.js.ini b/testing/web-platform/meta/scheduler/task-signal-any-priority.tentative.any.js.ini deleted file mode 100644 index a7ee9a23cbdb..000000000000 --- a/testing/web-platform/meta/scheduler/task-signal-any-priority.tentative.any.js.ini +++ /dev/null @@ -1,131 +0,0 @@ -[task-signal-any-priority.tentative.any.html] - [TaskSignal.any() returns a user-visible TaskSignal when no priority is specified] - expected: FAIL - - [TaskSignal.any() returns a signal with the correct priority when intialized with a string] - expected: FAIL - - [TaskSignal.any() returns a signal with the correct priority when intialized with a TaskSignal] - expected: FAIL - - [TaskSignal.any() returns a signal with dynamic priority] - expected: FAIL - - [Priority change events fire for composite signals] - expected: FAIL - - [Priority change events fire for composite signals with intermediate sources] - expected: FAIL - - [Priority change propagates to multiple dependent signals in the right order] - expected: FAIL - - [TaskSignal.any() propagates abort and priority] - expected: FAIL - - [TaskSignal.any() propagates priority after returning an aborted signal] - expected: FAIL - - [TaskSignal.any() does not fire prioritychange for dependents added during prioritychange] - expected: FAIL - - -[task-signal-any-priority.tentative.any.sharedworker.html] - expected: - if (os == "linux") and debug: [OK, ERROR] - if (os == "android") and not debug: [OK, CRASH] - [TaskSignal.any() returns a user-visible TaskSignal when no priority is specified] - expected: FAIL - - [TaskSignal.any() returns a signal with the correct priority when intialized with a string] - expected: FAIL - - [TaskSignal.any() returns a signal with the correct priority when intialized with a TaskSignal] - expected: FAIL - - [TaskSignal.any() returns a signal with dynamic priority] - expected: FAIL - - [Priority change events fire for composite signals] - expected: FAIL - - [Priority change events fire for composite signals with intermediate sources] - expected: FAIL - - [Priority change propagates to multiple dependent signals in the right order] - expected: FAIL - - [TaskSignal.any() propagates abort and priority] - expected: FAIL - - [TaskSignal.any() propagates priority after returning an aborted signal] - expected: FAIL - - [TaskSignal.any() does not fire prioritychange for dependents added during prioritychange] - expected: FAIL - - -[task-signal-any-priority.tentative.any.worker.html] - [TaskSignal.any() returns a user-visible TaskSignal when no priority is specified] - expected: FAIL - - [TaskSignal.any() returns a signal with the correct priority when intialized with a string] - expected: FAIL - - [TaskSignal.any() returns a signal with the correct priority when intialized with a TaskSignal] - expected: FAIL - - [TaskSignal.any() returns a signal with dynamic priority] - expected: FAIL - - [Priority change events fire for composite signals] - expected: FAIL - - [Priority change events fire for composite signals with intermediate sources] - expected: FAIL - - [Priority change propagates to multiple dependent signals in the right order] - expected: FAIL - - [TaskSignal.any() propagates abort and priority] - expected: FAIL - - [TaskSignal.any() propagates priority after returning an aborted signal] - expected: FAIL - - [TaskSignal.any() does not fire prioritychange for dependents added during prioritychange] - expected: FAIL - - -[task-signal-any-priority.tentative.any.serviceworker.html] - expected: - if (os == "android") and not debug: [OK, ERROR] - [TaskSignal.any() returns a user-visible TaskSignal when no priority is specified] - expected: FAIL - - [TaskSignal.any() returns a signal with the correct priority when intialized with a string] - expected: FAIL - - [TaskSignal.any() returns a signal with the correct priority when intialized with a TaskSignal] - expected: FAIL - - [TaskSignal.any() returns a signal with dynamic priority] - expected: FAIL - - [Priority change events fire for composite signals] - expected: FAIL - - [Priority change events fire for composite signals with intermediate sources] - expected: FAIL - - [Priority change propagates to multiple dependent signals in the right order] - expected: FAIL - - [TaskSignal.any() propagates abort and priority] - expected: FAIL - - [TaskSignal.any() propagates priority after returning an aborted signal] - expected: FAIL - - [TaskSignal.any() does not fire prioritychange for dependents added during prioritychange] - expected: FAIL