tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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