Loading dom/cache/CacheStreamControlChild.cpp +19 −0 Original line number Diff line number Diff line Loading @@ -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) { Loading dom/cache/CacheStreamControlChild.h +3 −0 Original line number Diff line number Diff line Loading @@ -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; Loading dom/cache/CacheStreamControlParent.cpp +45 −0 Original line number Diff line number Diff line Loading @@ -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) { Loading @@ -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) { Loading dom/cache/CacheStreamControlParent.h +9 −0 Original line number Diff line number Diff line Loading @@ -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" Loading @@ -23,6 +24,7 @@ class StreamList; class CacheStreamControlParent final : public PCacheStreamControlParent , public StreamControl , Manager::Listener { public: CacheStreamControlParent(); Loading @@ -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; Loading @@ -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); Loading dom/cache/Manager.cpp +3 −3 Original line number Diff line number Diff line Loading @@ -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) Loading @@ -1482,7 +1482,7 @@ public: } private: OpenStreamResolver mResolver; InputStreamResolver mResolver; const nsID mBodyId; nsCOMPtr<nsIInputStream> mBodyStream; }; Loading Loading @@ -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 Loading
dom/cache/CacheStreamControlChild.cpp +19 −0 Original line number Diff line number Diff line Loading @@ -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) { Loading
dom/cache/CacheStreamControlChild.h +3 −0 Original line number Diff line number Diff line Loading @@ -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; Loading
dom/cache/CacheStreamControlParent.cpp +45 −0 Original line number Diff line number Diff line Loading @@ -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) { Loading @@ -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) { Loading
dom/cache/CacheStreamControlParent.h +9 −0 Original line number Diff line number Diff line Loading @@ -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" Loading @@ -23,6 +24,7 @@ class StreamList; class CacheStreamControlParent final : public PCacheStreamControlParent , public StreamControl , Manager::Listener { public: CacheStreamControlParent(); Loading @@ -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; Loading @@ -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); Loading
dom/cache/Manager.cpp +3 −3 Original line number Diff line number Diff line Loading @@ -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) Loading @@ -1482,7 +1482,7 @@ public: } private: OpenStreamResolver mResolver; InputStreamResolver mResolver; const nsID mBodyId; nsCOMPtr<nsIInputStream> mBodyStream; }; Loading Loading @@ -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