TestInterfaceAsyncIterableSingleWithArgs.cpp (4409B)
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 file, 5 * You can obtain one at http://mozilla.org/MPL/2.0/. */ 6 7 #include "mozilla/dom/TestInterfaceAsyncIterableSingleWithArgs.h" 8 9 #include "ScriptSettings.h" 10 #include "js/Value.h" 11 #include "mozilla/dom/BindingUtils.h" 12 #include "mozilla/dom/IterableIterator.h" 13 #include "mozilla/dom/Promise-inl.h" 14 #include "mozilla/dom/TestInterfaceJSMaplikeSetlikeIterableBinding.h" 15 #include "nsPIDOMWindow.h" 16 17 namespace mozilla::dom { 18 19 NS_IMPL_CYCLE_COLLECTION_CLASS(TestInterfaceAsyncIterableSingleWithArgs) 20 21 NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN_INHERITED( 22 TestInterfaceAsyncIterableSingleWithArgs, TestInterfaceAsyncIterableSingle) 23 NS_IMPL_CYCLE_COLLECTION_UNLINK_END 24 25 NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INHERITED( 26 TestInterfaceAsyncIterableSingleWithArgs, TestInterfaceAsyncIterableSingle) 27 NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END 28 29 NS_IMPL_CYCLE_COLLECTION_TRACE_BEGIN_INHERITED( 30 TestInterfaceAsyncIterableSingleWithArgs, TestInterfaceAsyncIterableSingle) 31 NS_IMPL_CYCLE_COLLECTION_TRACE_JS_MEMBER_CALLBACK(mReturnLastCalledWith) 32 NS_IMPL_CYCLE_COLLECTION_TRACE_END 33 34 NS_IMPL_ADDREF_INHERITED(TestInterfaceAsyncIterableSingleWithArgs, 35 TestInterfaceAsyncIterableSingle) 36 NS_IMPL_RELEASE_INHERITED(TestInterfaceAsyncIterableSingleWithArgs, 37 TestInterfaceAsyncIterableSingle) 38 39 NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION( 40 TestInterfaceAsyncIterableSingleWithArgs) 41 NS_INTERFACE_MAP_END_INHERITING(TestInterfaceAsyncIterableSingle) 42 43 // static 44 already_AddRefed<TestInterfaceAsyncIterableSingleWithArgs> 45 TestInterfaceAsyncIterableSingleWithArgs::Constructor( 46 const GlobalObject& aGlobal, ErrorResult& aRv) { 47 nsCOMPtr<nsPIDOMWindowInner> window = 48 do_QueryInterface(aGlobal.GetAsSupports()); 49 if (!window) { 50 aRv.Throw(NS_ERROR_FAILURE); 51 return nullptr; 52 } 53 54 RefPtr<TestInterfaceAsyncIterableSingleWithArgs> r = 55 new TestInterfaceAsyncIterableSingleWithArgs(window); 56 return r.forget(); 57 } 58 59 JSObject* TestInterfaceAsyncIterableSingleWithArgs::WrapObject( 60 JSContext* aCx, JS::Handle<JSObject*> aGivenProto) { 61 return TestInterfaceAsyncIterableSingleWithArgs_Binding::Wrap(aCx, this, 62 aGivenProto); 63 } 64 65 void TestInterfaceAsyncIterableSingleWithArgs::InitAsyncIteratorData( 66 IteratorData& aData, Iterator::IteratorType aType, 67 const TestInterfaceAsyncIteratorOptions& aOptions, ErrorResult& aError) { 68 aData.mMultiplier = aOptions.mMultiplier; 69 aData.mBlockingPromises = aOptions.mBlockingPromises; 70 aData.mFailNextAfter = aOptions.mFailNextAfter; 71 aData.mThrowFromNext = aOptions.mThrowFromNext; 72 if (aOptions.mThrowFromReturn.WasPassed()) { 73 aData.mThrowFromReturn = &aOptions.mThrowFromReturn.Value(); 74 } 75 } 76 77 already_AddRefed<Promise> 78 TestInterfaceAsyncIterableSingleWithArgs::GetNextIterationResult( 79 Iterator* aIterator, ErrorResult& aRv) { 80 if (aIterator->Data().mThrowFromNext) { 81 AutoJSAPI jsapi; 82 MOZ_RELEASE_ASSERT(jsapi.Init(GetParentObject())); 83 JS_ReportErrorASCII(jsapi.cx(), "Throwing from next()."); 84 aRv.MightThrowJSException(); 85 aRv.StealExceptionFromJSContext(jsapi.cx()); 86 return nullptr; 87 } 88 89 if (aIterator->Data().mIndex == aIterator->Data().mFailNextAfter) { 90 aRv.ThrowTypeError("Failed because we of 'failNextAfter'."); 91 return nullptr; 92 } 93 return TestInterfaceAsyncIterableSingle::GetNextIterationResult( 94 aIterator, aIterator->Data(), aRv); 95 } 96 97 already_AddRefed<Promise> 98 TestInterfaceAsyncIterableSingleWithArgs::IteratorReturn( 99 JSContext* aCx, Iterator* aIterator, JS::Handle<JS::Value> aValue, 100 ErrorResult& aRv) { 101 ++mReturnCallCount; 102 103 if (RefPtr<TestThrowingCallback> throwFromReturn = 104 aIterator->Data().mThrowFromReturn) { 105 throwFromReturn->Call(aRv, nullptr, CallbackFunction::eRethrowExceptions); 106 return nullptr; 107 } 108 109 RefPtr<Promise> promise = Promise::Create(GetParentObject()->AsGlobal(), aRv); 110 if (NS_WARN_IF(aRv.Failed())) { 111 return nullptr; 112 } 113 114 mReturnLastCalledWith = aValue; 115 promise->MaybeResolve(JS::UndefinedHandleValue); 116 return promise.forget(); 117 } 118 119 } // namespace mozilla::dom