TestInterfaceAsyncIterableDoubleUnion.cpp (3773B)
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/TestInterfaceAsyncIterableDoubleUnion.h" 8 9 #include "mozilla/dom/BindingUtils.h" 10 #include "mozilla/dom/TestInterfaceJSMaplikeSetlikeIterableBinding.h" 11 #include "mozilla/dom/UnionTypes.h" 12 #include "nsPIDOMWindow.h" 13 14 namespace mozilla::dom { 15 16 NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE(TestInterfaceAsyncIterableDoubleUnion, 17 mParent) 18 19 NS_IMPL_CYCLE_COLLECTING_ADDREF(TestInterfaceAsyncIterableDoubleUnion) 20 NS_IMPL_CYCLE_COLLECTING_RELEASE(TestInterfaceAsyncIterableDoubleUnion) 21 22 NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(TestInterfaceAsyncIterableDoubleUnion) 23 NS_WRAPPERCACHE_INTERFACE_MAP_ENTRY 24 NS_INTERFACE_MAP_ENTRY(nsISupports) 25 NS_INTERFACE_MAP_END 26 27 TestInterfaceAsyncIterableDoubleUnion::TestInterfaceAsyncIterableDoubleUnion( 28 nsPIDOMWindowInner* aParent) 29 : mParent(aParent) { 30 OwningStringOrLong a; 31 a.SetAsLong() = 1; 32 mValues.AppendElement(std::pair<nsString, OwningStringOrLong>(u"long"_ns, a)); 33 a.SetAsString() = u"a"_ns; 34 mValues.AppendElement( 35 std::pair<nsString, OwningStringOrLong>(u"string"_ns, a)); 36 } 37 38 // static 39 already_AddRefed<TestInterfaceAsyncIterableDoubleUnion> 40 TestInterfaceAsyncIterableDoubleUnion::Constructor(const GlobalObject& aGlobal, 41 ErrorResult& aRv) { 42 nsCOMPtr<nsPIDOMWindowInner> window = 43 do_QueryInterface(aGlobal.GetAsSupports()); 44 if (!window) { 45 aRv.Throw(NS_ERROR_FAILURE); 46 return nullptr; 47 } 48 49 RefPtr<TestInterfaceAsyncIterableDoubleUnion> r = 50 new TestInterfaceAsyncIterableDoubleUnion(window); 51 return r.forget(); 52 } 53 54 JSObject* TestInterfaceAsyncIterableDoubleUnion::WrapObject( 55 JSContext* aCx, JS::Handle<JSObject*> aGivenProto) { 56 return TestInterfaceAsyncIterableDoubleUnion_Binding::Wrap(aCx, this, 57 aGivenProto); 58 } 59 60 nsPIDOMWindowInner* TestInterfaceAsyncIterableDoubleUnion::GetParentObject() 61 const { 62 return mParent; 63 } 64 65 already_AddRefed<Promise> 66 TestInterfaceAsyncIterableDoubleUnion::GetNextIterationResult( 67 Iterator* aIterator, ErrorResult& aRv) { 68 RefPtr<Promise> promise = Promise::Create(mParent->AsGlobal(), aRv); 69 if (NS_WARN_IF(aRv.Failed())) { 70 return nullptr; 71 } 72 73 NS_DispatchToMainThread(NewRunnableMethod<RefPtr<Iterator>, RefPtr<Promise>>( 74 "TestInterfaceAsyncIterableDoubleUnion::GetNextIterationResult", this, 75 &TestInterfaceAsyncIterableDoubleUnion::ResolvePromise, aIterator, 76 promise)); 77 78 return promise.forget(); 79 } 80 81 void TestInterfaceAsyncIterableDoubleUnion::ResolvePromise(Iterator* aIterator, 82 Promise* aPromise) { 83 IteratorData& data = aIterator->Data(); 84 85 // Test data: 86 // [long, 1], [string, "a"] 87 uint32_t idx = data.mIndex; 88 if (idx >= mValues.Length()) { 89 iterator_utils::ResolvePromiseForFinished(aPromise); 90 } else { 91 switch (aIterator->GetIteratorType()) { 92 case IterableIteratorBase::IteratorType::Keys: 93 aPromise->MaybeResolve(mValues[idx].first); 94 break; 95 case IterableIteratorBase::IteratorType::Values: 96 aPromise->MaybeResolve(mValues[idx].second); 97 break; 98 case IterableIteratorBase::IteratorType::Entries: 99 iterator_utils::ResolvePromiseWithKeyAndValue( 100 aPromise, mValues[idx].first, mValues[idx].second); 101 break; 102 } 103 104 data.mIndex++; 105 } 106 } 107 108 } // namespace mozilla::dom