tor-browser

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

ReadableStreamTee.h (3147B)


      1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
      2 /* vim:set ts=2 sw=2 sts=2 et cindent: */
      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 #ifndef mozilla_dom_ReadableStreamTee_h
      8 #define mozilla_dom_ReadableStreamTee_h
      9 
     10 #include "mozilla/dom/ReadRequest.h"
     11 #include "mozilla/dom/ReadableStreamControllerBase.h"
     12 #include "mozilla/dom/UnderlyingSourceCallbackHelpers.h"
     13 #include "nsCycleCollectionParticipant.h"
     14 #include "nsISupportsImpl.h"
     15 
     16 namespace mozilla::dom {
     17 struct TeeState;
     18 enum class TeeBranch : bool;
     19 class ReadableStream;
     20 
     21 // Implementation of the Pull algorithm steps for ReadableStreamDefaultTee,
     22 // from
     23 // https://streams.spec.whatwg.org/#abstract-opdef-readablestreamdefaulttee
     24 // Step 12.
     25 class ReadableStreamDefaultTeeSourceAlgorithms final
     26    : public UnderlyingSourceAlgorithmsBase {
     27 public:
     28  NS_DECL_ISUPPORTS_INHERITED
     29  NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(
     30      ReadableStreamDefaultTeeSourceAlgorithms, UnderlyingSourceAlgorithmsBase)
     31 
     32  ReadableStreamDefaultTeeSourceAlgorithms(TeeState* aTeeState,
     33                                           TeeBranch aBranch)
     34      : mTeeState(aTeeState), mBranch(aBranch) {}
     35 
     36  MOZ_CAN_RUN_SCRIPT void StartCallback(
     37      JSContext* aCx, ReadableStreamControllerBase& aController,
     38      JS::MutableHandle<JS::Value> aRetVal, ErrorResult& aRv) override {
     39    aRetVal.setUndefined();
     40  }
     41 
     42  MOZ_CAN_RUN_SCRIPT already_AddRefed<Promise> PullCallback(
     43      JSContext* aCx, ReadableStreamControllerBase& aController,
     44      ErrorResult& aRv) override;
     45 
     46  MOZ_CAN_RUN_SCRIPT already_AddRefed<Promise> CancelCallback(
     47      JSContext* aCx, const Optional<JS::Handle<JS::Value>>& aReason,
     48      ErrorResult& aRv) override;
     49 
     50 protected:
     51  ~ReadableStreamDefaultTeeSourceAlgorithms() override = default;
     52 
     53 private:
     54  // Virtually const, but is cycle collected
     55  MOZ_KNOWN_LIVE RefPtr<TeeState> mTeeState;
     56  TeeBranch mBranch;
     57 };
     58 
     59 // https://streams.spec.whatwg.org/#abstract-opdef-readablestreamdefaulttee
     60 // Step 12.3
     61 struct ReadableStreamDefaultTeeReadRequest final : public ReadRequest {
     62  NS_DECL_ISUPPORTS_INHERITED
     63  NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(ReadableStreamDefaultTeeReadRequest,
     64                                           ReadRequest)
     65 
     66  RefPtr<TeeState> mTeeState;
     67 
     68  explicit ReadableStreamDefaultTeeReadRequest(TeeState* aTeeState)
     69      : mTeeState(aTeeState) {}
     70 
     71  void ChunkSteps(JSContext* aCx, JS::Handle<JS::Value> aChunk,
     72                  ErrorResult& aRv) override;
     73 
     74  MOZ_CAN_RUN_SCRIPT void CloseSteps(JSContext* aCx, ErrorResult& aRv) override;
     75 
     76  void ErrorSteps(JSContext* aCx, JS::Handle<JS::Value> aError,
     77                  ErrorResult& aRv) override;
     78 
     79 protected:
     80  ~ReadableStreamDefaultTeeReadRequest() override = default;
     81 };
     82 
     83 namespace streams_abstract {
     84 MOZ_CAN_RUN_SCRIPT void ReadableByteStreamTee(
     85    JSContext* aCx, ReadableStream* aStream,
     86    nsTArray<RefPtr<ReadableStream>>& aResult, ErrorResult& aRv);
     87 }
     88 
     89 }  // namespace mozilla::dom
     90 #endif