AbortController.cpp (2520B)
1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 2 /* vim: set ts=8 sts=2 et sw=2 tw=80: */ 3 /* This Source Code Form is subject to the terms of the Mozilla Public 4 * License, v. 2.0. If a copy of the MPL was not distributed with this 5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 6 7 #include "AbortController.h" 8 9 #include "AbortSignal.h" 10 #include "js/Value.h" 11 #include "mozilla/HoldDropJSObjects.h" 12 #include "mozilla/dom/AbortControllerBinding.h" 13 #include "mozilla/dom/BindingUtils.h" 14 #include "mozilla/dom/DOMException.h" 15 #include "mozilla/dom/WorkerPrivate.h" 16 17 namespace mozilla::dom { 18 19 NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE_WITH_JS_MEMBERS(AbortController, 20 (mGlobal, mSignal), 21 (mReason)) 22 23 NS_IMPL_CYCLE_COLLECTING_ADDREF(AbortController) 24 NS_IMPL_CYCLE_COLLECTING_RELEASE(AbortController) 25 26 NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(AbortController) 27 NS_WRAPPERCACHE_INTERFACE_MAP_ENTRY 28 NS_INTERFACE_MAP_ENTRY(nsISupports) 29 NS_INTERFACE_MAP_END 30 31 /* static */ 32 already_AddRefed<AbortController> AbortController::Constructor( 33 const GlobalObject& aGlobal, ErrorResult& aRv) { 34 nsCOMPtr<nsIGlobalObject> global = do_QueryInterface(aGlobal.GetAsSupports()); 35 if (!global) { 36 aRv.Throw(NS_ERROR_FAILURE); 37 return nullptr; 38 } 39 40 RefPtr<AbortController> abortController = new AbortController(global); 41 return abortController.forget(); 42 } 43 44 AbortController::AbortController(nsIGlobalObject* aGlobal) 45 : mGlobal(aGlobal), mAborted(false), mReason(JS::UndefinedHandleValue) { 46 mozilla::HoldJSObjects(this); 47 } 48 49 JSObject* AbortController::WrapObject(JSContext* aCx, 50 JS::Handle<JSObject*> aGivenProto) { 51 return AbortController_Binding::Wrap(aCx, this, aGivenProto); 52 } 53 54 nsIGlobalObject* AbortController::GetParentObject() const { return mGlobal; } 55 56 AbortSignal* AbortController::Signal() { 57 if (!mSignal) { 58 JS::Rooted<JS::Value> reason(RootingCx(), mReason); 59 mSignal = AbortSignal::Create( 60 mGlobal, mAborted ? SignalAborted::Yes : SignalAborted::No, reason); 61 } 62 63 return mSignal; 64 } 65 66 void AbortController::Abort(JSContext* aCx, JS::Handle<JS::Value> aReason) { 67 if (mAborted) { 68 return; 69 } 70 71 mAborted = true; 72 73 if (mSignal) { 74 mSignal->SignalAbort(aReason); 75 } else { 76 mReason = aReason; 77 } 78 } 79 80 AbortController::~AbortController() { mozilla::DropJSObjects(this); } 81 82 } // namespace mozilla::dom