TaskSignal.h (2662B)
1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 2 /* vim:expandtab:shiftwidth=2:tabstop=2: 3 */ 4 /* This Source Code Form is subject to the terms of the Mozilla Public 5 * License, v. 2.0. If a copy of the MPL was not distributed with this 6 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 7 8 #ifndef mozilla_dom_TaskSignal_h 9 #define mozilla_dom_TaskSignal_h 10 11 #include "mozilla/DOMEventTargetHelper.h" 12 #include "mozilla/dom/AbortSignal.h" 13 #include "mozilla/dom/WebTaskSchedulingBinding.h" 14 15 namespace mozilla::dom { 16 class TaskSignal final : public AbortSignal { 17 public: 18 NS_DECL_ISUPPORTS_INHERITED 19 NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(TaskSignal, AbortSignal) 20 21 IMPL_EVENT_HANDLER(prioritychange); 22 23 static already_AddRefed<TaskSignal> Create(nsIGlobalObject* aGlobalObject, 24 TaskPriority aPriority); 25 26 static already_AddRefed<TaskSignal> Any( 27 GlobalObject& aGlobal, 28 const Sequence<OwningNonNull<AbortSignal>>& aSignals, 29 const TaskSignalAnyInit& aInit); 30 31 TaskPriority Priority() const { return mPriority; } 32 33 JSObject* WrapObject(JSContext* aCx, 34 JS::Handle<JSObject*> aGivenProto) override { 35 return TaskSignal_Binding::Wrap(aCx, this, aGivenProto); 36 } 37 38 void SetPriority(TaskPriority aPriority) { mPriority = aPriority; } 39 40 bool IsTaskSignal() const override { return true; } 41 42 bool PriorityChanging() const { return mPriorityChanging; } 43 44 void SetPriorityChanging(bool aPriorityChanging) { 45 mPriorityChanging = aPriorityChanging; 46 } 47 48 void RunPriorityChangeAlgorithms(); 49 50 void SetWebTaskScheduler(WebTaskScheduler* aScheduler); 51 52 // https://wicg.github.io/scheduling-apis/#tasksignal-has-fixed-priority 53 bool HasFixedPriority() const { return mDependent && !mSourceTaskSignal; } 54 55 nsTArray<RefPtr<TaskSignal>>& DependentTaskSignals() { 56 return mDependentTaskSignals; 57 } 58 59 private: 60 TaskSignal(nsIGlobalObject* aGlobal, TaskPriority aPriority) 61 : AbortSignal(aGlobal, SignalAborted::No, JS::UndefinedHandleValue), 62 mPriority(aPriority), 63 mPriorityChanging(false) { 64 AbortSignal::Init(); 65 } 66 67 TaskPriority mPriority; 68 69 // https://wicg.github.io/scheduling-apis/#tasksignal-priority-changing 70 bool mPriorityChanging; 71 72 nsTArray<WeakPtr<WebTaskScheduler>> mSchedulers; 73 74 // https://wicg.github.io/scheduling-apis/#tasksignal-source-signal 75 WeakPtr<TaskSignal> mSourceTaskSignal; 76 77 // https://wicg.github.io/scheduling-apis/#tasksignal-dependent-signals 78 nsTArray<RefPtr<TaskSignal>> mDependentTaskSignals; 79 80 ~TaskSignal() = default; 81 }; 82 } // namespace mozilla::dom 83 #endif