Commit 9ef03c87 authored by Ben Kelly's avatar Ben Kelly
Browse files

Bug 1397128 P4 Add a PCacheStreamControl message to open a stream based on its body ID. r=tt

parent b88c4699
Loading
Loading
Loading
Loading
+19 −0
Original line number Diff line number Diff line
@@ -106,6 +106,25 @@ CacheStreamControlChild::SerializeStream(CacheReadStream* aReadStreamOut,
  aStreamCleanupList.AppendElement(Move(autoStream));
}

void
CacheStreamControlChild::OpenStream(const nsID& aId, InputStreamResolver&& aResolver)
{
  NS_ASSERT_OWNINGTHREAD(CacheStreamControlChild);

  if (mDestroyStarted) {
    aResolver(nullptr);
    return;
  }

  SendOpenStream(aId)->Then(GetCurrentThreadSerialEventTarget(), __func__,
  [aResolver](const OptionalIPCStream& aOptionalStream) {
    nsCOMPtr<nsIInputStream> stream = DeserializeIPCStream(aOptionalStream);
    aResolver(Move(stream));
  }, [aResolver](PromiseRejectReason aReason) {
    aResolver(nullptr);
  });
}

void
CacheStreamControlChild::NoteClosedAfterForget(const nsID& aId)
{
+3 −0
Original line number Diff line number Diff line
@@ -40,6 +40,9 @@ public:
  SerializeStream(CacheReadStream* aReadStreamOut, nsIInputStream* aStream,
                  nsTArray<UniquePtr<mozilla::ipc::AutoIPCStream>>& aStreamCleanupList) override;

  virtual void
  OpenStream(const nsID& aId, InputStreamResolver&& aResolver) override;

private:
  virtual void
  NoteClosedAfterForget(const nsID& aId) override;
+45 −0
Original line number Diff line number Diff line
@@ -68,6 +68,25 @@ CacheStreamControlParent::SerializeStream(CacheReadStream* aReadStreamOut,
  aStreamCleanupList.AppendElement(Move(autoStream));
}

void
CacheStreamControlParent::OpenStream(const nsID& aId,
                                     InputStreamResolver&& aResolver)
{
  NS_ASSERT_OWNINGTHREAD(CacheStreamControlParent);
  MOZ_DIAGNOSTIC_ASSERT(aResolver);

  if (!mStreamList || !mStreamList->ShouldOpenStreamFor(aId)) {
    aResolver(nullptr);
    return;
  }

  // Make sure to add ourself as a Listener even thought we are using
  // a separate resolver function to signal the completion of the
  // operation.  The Manager uses the existence of the Listener to ensure
  // that its safe to complete the operation.
  mStreamList->GetManager()->ExecuteOpenStream(this, Move(aResolver), aId);
}

void
CacheStreamControlParent::NoteClosedAfterForget(const nsID& aId)
{
@@ -93,11 +112,37 @@ CacheStreamControlParent::ActorDestroy(ActorDestroyReason aReason)
  if (!mStreamList) {
    return;
  }
  mStreamList->GetManager()->RemoveListener(this);
  mStreamList->RemoveStreamControl(this);
  mStreamList->NoteClosedAll();
  mStreamList = nullptr;
}

mozilla::ipc::IPCResult
CacheStreamControlParent::RecvOpenStream(const nsID& aStreamId,
                                         OpenStreamResolver&& aResolver)
{
  NS_ASSERT_OWNINGTHREAD(CacheStreamControlParent);

  // This is safe because:
  //  1. We add ourself to the Manager as an operation Listener in OpenStream().
  //  2. We remove ourself as a Listener from the Manager in ActorDestroy().
  //  3. The Manager will not "complete" the operation if the Listener has
  //     been removed.  This means the lambda will not be invoked.
  //  4. The ActorDestroy() will also cause the child-side MozPromise for
  //     this async returning method to be rejected.  So we don't have to
  //     call the resolver in this case.
  CacheStreamControlParent* self = this;

  OpenStream(aStreamId, [self, aResolver](nsCOMPtr<nsIInputStream>&& aStream) {
      AutoIPCStream stream;
      Unused << stream.Serialize(aStream, self->Manager());
      aResolver(stream.TakeOptionalValue());
    });

  return IPC_OK();
}

mozilla::ipc::IPCResult
CacheStreamControlParent::RecvNoteClosed(const nsID& aId)
{
+9 −0
Original line number Diff line number Diff line
@@ -7,6 +7,7 @@
#ifndef mozilla_dom_cache_CacheStreamControlParent_h
#define mozilla_dom_cache_CacheStreamControlParent_h

#include "mozilla/dom/cache/Manager.h"
#include "mozilla/dom/cache/PCacheStreamControlParent.h"
#include "mozilla/dom/cache/StreamControl.h"
#include "nsTObserverArray.h"
@@ -23,6 +24,7 @@ class StreamList;

class CacheStreamControlParent final : public PCacheStreamControlParent
                                     , public StreamControl
                                     , Manager::Listener
{
public:
  CacheStreamControlParent();
@@ -41,6 +43,9 @@ public:
  SerializeStream(CacheReadStream* aReadStreamOut, nsIInputStream* aStream,
                  nsTArray<UniquePtr<mozilla::ipc::AutoIPCStream>>& aStreamCleanupList) override;

  virtual void
  OpenStream(const nsID& aId, InputStreamResolver&& aResolver) override;

private:
  virtual void
  NoteClosedAfterForget(const nsID& aId) override;
@@ -52,6 +57,10 @@ private:

  // PCacheStreamControlParent methods
  virtual void ActorDestroy(ActorDestroyReason aReason) override;

  virtual mozilla::ipc::IPCResult
  RecvOpenStream(const nsID& aStreamId, OpenStreamResolver&& aResolve) override;

  virtual mozilla::ipc::IPCResult RecvNoteClosed(const nsID& aId) override;

  void NotifyClose(const nsID& aId);
+3 −3
Original line number Diff line number Diff line
@@ -1456,7 +1456,7 @@ class Manager::OpenStreamAction final : public Manager::BaseAction
{
public:
  OpenStreamAction(Manager* aManager, ListenerId aListenerId,
                   OpenStreamResolver&& aResolver, const nsID& aBodyId)
                   InputStreamResolver&& aResolver, const nsID& aBodyId)
    : BaseAction(aManager, aListenerId)
    , mResolver(Move(aResolver))
    , mBodyId(aBodyId)
@@ -1482,7 +1482,7 @@ public:
  }

private:
  OpenStreamResolver mResolver;
  InputStreamResolver mResolver;
  const nsID mBodyId;
  nsCOMPtr<nsIInputStream> mBodyStream;
};
@@ -1856,7 +1856,7 @@ Manager::ExecuteStorageOp(Listener* aListener, Namespace aNamespace,
}

void
Manager::ExecuteOpenStream(Listener* aListener, OpenStreamResolver&& aResolver,
Manager::ExecuteOpenStream(Listener* aListener, InputStreamResolver&& aResolver,
                           const nsID& aBodyId)
{
  NS_ASSERT_OWNINGTHREAD(Manager);
Loading