WebTaskController.cpp (2788B)
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 #include "WebTaskController.h" 9 10 #include "TaskSignal.h" 11 #include "mozilla/dom/TaskPriorityChangeEvent.h" 12 13 namespace mozilla::dom { 14 15 WebTaskController::WebTaskController(nsIGlobalObject* aGlobal, 16 TaskPriority aPriority) 17 : AbortController(aGlobal) { 18 MOZ_ASSERT(!mSignal); 19 mSignal = TaskSignal::Create(aGlobal, aPriority); 20 } 21 22 void WebTaskController::SignalPriorityChange(TaskSignal* aTaskSignal, 23 TaskPriority aPriority, 24 ErrorResult& aRv) { 25 RefPtr<TaskSignal> taskSignal = aTaskSignal; 26 27 MOZ_ASSERT(taskSignal); 28 if (taskSignal->PriorityChanging()) { 29 aRv.ThrowNotAllowedError("Signal's priority changing is true"); 30 return; 31 } 32 33 if (taskSignal->Priority() == aPriority) { 34 return; 35 } 36 37 taskSignal->SetPriorityChanging(true); 38 39 TaskPriority previousPriority = taskSignal->Priority(); 40 taskSignal->SetPriority(aPriority); 41 42 taskSignal->RunPriorityChangeAlgorithms(); 43 44 TaskPriorityChangeEventInit init; 45 init.mPreviousPriority = previousPriority; 46 RefPtr<TaskPriorityChangeEvent> event = TaskPriorityChangeEvent::Constructor( 47 taskSignal, u"prioritychange"_ns, init); 48 49 event->SetTrusted(true); 50 51 taskSignal->DispatchEvent(*event); 52 53 for (const RefPtr<TaskSignal>& dependentSignal : 54 taskSignal->DependentTaskSignals().Clone()) { 55 SignalPriorityChange(dependentSignal, aPriority, aRv); 56 } 57 58 taskSignal->SetPriorityChanging(false); 59 } 60 61 void WebTaskController::SetPriority(TaskPriority aPriority, ErrorResult& aRv) { 62 MOZ_ASSERT(mSignal->IsTaskSignal()); 63 // mSignal for WebTaskController should always be a TaskSignal. 64 SignalPriorityChange(static_cast<TaskSignal*>(mSignal.get()), aPriority, aRv); 65 } 66 67 already_AddRefed<WebTaskController> WebTaskController::Constructor( 68 const GlobalObject& aGlobal, const TaskControllerInit& aInit, 69 ErrorResult& aRv) { 70 nsCOMPtr<nsIGlobalObject> global = do_QueryInterface(aGlobal.GetAsSupports()); 71 if (!global) { 72 aRv.Throw(NS_ERROR_FAILURE); 73 return nullptr; 74 } 75 RefPtr<WebTaskController> webTaskController = 76 new WebTaskController(global, aInit.mPriority); 77 return webTaskController.forget(); 78 } 79 80 JSObject* WebTaskController::WrapObject(JSContext* aCx, 81 JS::Handle<JSObject*> aGivenProto) { 82 return TaskController_Binding::Wrap(aCx, this, aGivenProto); 83 } 84 } // namespace mozilla::dom