tor-browser

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

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