1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* vim:expandtab:shiftwidth=2:tabstop=2:
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/. */
8 #include "WebTaskController.h"
9 #include "TaskSignal.h"
11 #include "mozilla/dom/TaskPriorityChangeEvent.h"
13 namespace mozilla::dom
{
15 WebTaskController::WebTaskController(nsIGlobalObject
* aGlobal
,
16 TaskPriority aPriority
)
17 : AbortController(aGlobal
) {
19 mSignal
= new TaskSignal(aGlobal
, aPriority
);
22 void WebTaskController::SetPriority(TaskPriority aPriority
, ErrorResult
& aRv
) {
23 // https://wicg.github.io/scheduling-apis/#tasksignal-signal-priority-change
24 RefPtr
<TaskSignal
> taskSignal
= static_cast<TaskSignal
*>(mSignal
.get());
25 MOZ_ASSERT(taskSignal
);
26 if (taskSignal
->PriorityChanging()) {
27 aRv
.ThrowNotAllowedError("Signal's priority changing is true");
31 if (taskSignal
->Priority() == aPriority
) {
35 taskSignal
->SetPriorityChanging(true);
37 TaskPriority previousPriority
= taskSignal
->Priority();
38 taskSignal
->SetPriority(aPriority
);
40 taskSignal
->RunPriorityChangeAlgorithms();
42 TaskPriorityChangeEventInit init
;
43 init
.mPreviousPriority
= previousPriority
;
44 RefPtr
<TaskPriorityChangeEvent
> event
= TaskPriorityChangeEvent::Constructor(
45 taskSignal
, u
"prioritychange"_ns
, init
);
47 event
->SetTrusted(true);
49 taskSignal
->DispatchEvent(*event
);
50 taskSignal
->SetPriorityChanging(false);
53 already_AddRefed
<WebTaskController
> WebTaskController::Constructor(
54 const GlobalObject
& aGlobal
, const TaskControllerInit
& aInit
,
56 nsCOMPtr
<nsIGlobalObject
> global
= do_QueryInterface(aGlobal
.GetAsSupports());
58 aRv
.Throw(NS_ERROR_FAILURE
);
61 RefPtr
<WebTaskController
> webTaskController
=
62 new WebTaskController(global
, aInit
.mPriority
);
63 return webTaskController
.forget();
66 JSObject
* WebTaskController::WrapObject(JSContext
* aCx
,
67 JS::Handle
<JSObject
*> aGivenProto
) {
68 return TaskController_Binding::Wrap(aCx
, this, aGivenProto
);
70 } // namespace mozilla::dom