ReadableStreamDefaultReader.h (4036B)
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_ReadableStreamDefaultReader_h 8 #define mozilla_dom_ReadableStreamDefaultReader_h 9 10 #include "js/TypeDecls.h" 11 #include "mozilla/Attributes.h" 12 #include "mozilla/ErrorResult.h" 13 #include "mozilla/LinkedList.h" 14 #include "mozilla/dom/BindingDeclarations.h" 15 #include "mozilla/dom/ReadRequest.h" 16 #include "mozilla/dom/ReadableStreamGenericReader.h" 17 #include "nsCycleCollectionParticipant.h" 18 #include "nsISupports.h" 19 #include "nsWrapperCache.h" 20 21 namespace mozilla::dom { 22 23 class Promise; 24 class ReadableStream; 25 26 // https://streams.spec.whatwg.org/#default-reader-read 27 struct Read_ReadRequest : public ReadRequest { 28 public: 29 NS_DECL_ISUPPORTS_INHERITED 30 NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(Read_ReadRequest, ReadRequest) 31 32 RefPtr<Promise> mPromise; 33 34 explicit Read_ReadRequest(Promise* aPromise) : mPromise(aPromise) {} 35 36 void ChunkSteps(JSContext* aCx, JS::Handle<JS::Value> aChunk, 37 ErrorResult& aRv) override; 38 39 void CloseSteps(JSContext* aCx, ErrorResult& aRv) override; 40 41 void ErrorSteps(JSContext* aCx, JS::Handle<JS::Value> e, 42 ErrorResult& aRv) override; 43 44 protected: 45 ~Read_ReadRequest() override = default; 46 }; 47 48 class ReadableStreamDefaultReader final : public ReadableStreamGenericReader, 49 public nsWrapperCache 50 51 { 52 public: 53 NS_DECL_ISUPPORTS_INHERITED 54 NS_DECL_CYCLE_COLLECTION_WRAPPERCACHE_CLASS_INHERITED( 55 ReadableStreamDefaultReader, ReadableStreamGenericReader) 56 57 public: 58 explicit ReadableStreamDefaultReader(nsISupports* aGlobal); 59 60 protected: 61 ~ReadableStreamDefaultReader() override; 62 63 public: 64 bool IsDefault() override { return true; } 65 bool IsBYOB() override { return false; } 66 ReadableStreamDefaultReader* AsDefault() override { return this; } 67 ReadableStreamBYOBReader* AsBYOB() override { 68 MOZ_CRASH(); 69 return nullptr; 70 } 71 72 // Public functions to implement other specs 73 // https://streams.spec.whatwg.org/#other-specs-rs-create 74 75 // The following algorithms can be used on arbitrary ReadableStream instances, 76 // including ones that are created by web developers. They can all fail in 77 // various operation-specific ways, and these failures should be handled by 78 // the calling specification. 79 80 // https://streams.spec.whatwg.org/#readablestreamdefaultreader-read-a-chunk 81 MOZ_CAN_RUN_SCRIPT void ReadChunk(JSContext* aCx, ReadRequest& aRequest, 82 ErrorResult& aRv); 83 84 // IDL layer functions 85 86 JSObject* WrapObject(JSContext* aCx, 87 JS::Handle<JSObject*> aGivenProto) override; 88 89 // IDL methods 90 91 static already_AddRefed<ReadableStreamDefaultReader> Constructor( 92 const GlobalObject& aGlobal, ReadableStream& stream, ErrorResult& aRv); 93 94 MOZ_CAN_RUN_SCRIPT already_AddRefed<Promise> Read(ErrorResult& aRv); 95 96 void ReleaseLock(ErrorResult& aRv); 97 98 LinkedList<RefPtr<ReadRequest>>& ReadRequests() { return mReadRequests; } 99 100 private: 101 LinkedList<RefPtr<ReadRequest>> mReadRequests = {}; 102 }; 103 104 namespace streams_abstract { 105 106 void SetUpReadableStreamDefaultReader(ReadableStreamDefaultReader* aReader, 107 ReadableStream* aStream, 108 ErrorResult& aRv); 109 110 void ReadableStreamDefaultReaderErrorReadRequests( 111 JSContext* aCx, ReadableStreamDefaultReader* aReader, 112 JS::Handle<JS::Value> aError, ErrorResult& aRv); 113 114 void ReadableStreamDefaultReaderRelease(JSContext* aCx, 115 ReadableStreamDefaultReader* aReader, 116 ErrorResult& aRv); 117 118 } // namespace streams_abstract 119 120 } // namespace mozilla::dom 121 122 #endif // mozilla_dom_ReadableStreamDefaultReader_h