FetchStreamUtils.cpp (2533B)
1 /* This Source Code Form is subject to the terms of the Mozilla Public 2 * License, v. 2.0. If a copy of the MPL was not distributed with this 3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 4 5 #include "FetchStreamUtils.h" 6 7 #include "mozilla/NotNull.h" 8 #include "mozilla/RemoteLazyInputStreamChild.h" 9 #include "mozilla/RemoteLazyInputStreamStorage.h" 10 #include "mozilla/dom/FetchTypes.h" 11 #include "mozilla/dom/IPCBlob.h" 12 #include "mozilla/ipc/IPCStreamUtils.h" 13 #include "nsContentUtils.h" 14 #include "nsXULAppAPI.h" 15 16 namespace mozilla::dom { 17 18 namespace { 19 20 RefPtr<RemoteLazyInputStreamStorage> GetRemoteLazyInputStreamStorage() { 21 auto storageOrErr = RemoteLazyInputStreamStorage::Get(); 22 MOZ_ASSERT(storageOrErr.isOk()); 23 return storageOrErr.unwrap(); 24 } 25 26 } // namespace 27 28 NotNull<nsCOMPtr<nsIInputStream>> ToInputStream( 29 const ParentToParentStream& aStream) { 30 MOZ_ASSERT(XRE_IsParentProcess()); 31 return WrapNotNull( 32 GetRemoteLazyInputStreamStorage()->ForgetStream(aStream.uuid())); 33 } 34 35 NotNull<nsCOMPtr<nsIInputStream>> ToInputStream( 36 const ParentToChildStream& aStream) { 37 MOZ_ASSERT(XRE_IsContentProcess()); 38 nsCOMPtr<nsIInputStream> result; 39 if (aStream.type() == ParentToChildStream::TRemoteLazyInputStream) { 40 result = aStream.get_RemoteLazyInputStream(); 41 } else { 42 result = DeserializeIPCStream(aStream.get_IPCStream()); 43 } 44 return WrapNotNull(result); 45 } 46 47 ParentToParentStream ToParentToParentStream( 48 const NotNull<nsCOMPtr<nsIInputStream>>& aStream, int64_t aStreamSize) { 49 MOZ_ASSERT(XRE_IsParentProcess()); 50 51 ParentToParentStream stream; 52 stream.uuid() = nsID::GenerateUUID(); 53 GetRemoteLazyInputStreamStorage()->AddStream(aStream.get(), stream.uuid()); 54 return stream; 55 } 56 57 ParentToChildStream ToParentToChildStream( 58 const NotNull<nsCOMPtr<nsIInputStream>>& aStream, int64_t aStreamSize, 59 bool aSerializeAsLazy) { 60 MOZ_ASSERT(XRE_IsParentProcess()); 61 62 ParentToChildStream result; 63 if (aSerializeAsLazy) { 64 result = RemoteLazyInputStream::WrapStream(aStream.get()); 65 } else { 66 nsCOMPtr<nsIInputStream> stream(aStream.get()); 67 mozilla::ipc::IPCStream ipcStream; 68 (void)NS_WARN_IF( 69 !mozilla::ipc::SerializeIPCStream(stream.forget(), ipcStream, false)); 70 result = ipcStream; 71 } 72 return result; 73 } 74 75 ParentToChildStream ToParentToChildStream(const ParentToParentStream& aStream, 76 int64_t aStreamSize) { 77 return ToParentToChildStream(ToInputStream(aStream), aStreamSize); 78 } 79 80 } // namespace mozilla::dom