tor-browser

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

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