diff -r 000000000000 -r 6474c204b198 dom/ipc/Blob.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/dom/ipc/Blob.h Wed Dec 31 06:09:35 2014 +0100 @@ -0,0 +1,196 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef mozilla_dom_ipc_Blob_h +#define mozilla_dom_ipc_Blob_h + +#include "mozilla/Attributes.h" +#include "mozilla/dom/PBlobChild.h" +#include "mozilla/dom/PBlobParent.h" +#include "nsAutoPtr.h" +#include "nsTArray.h" + +class nsIDOMBlob; +class nsString; +template class nsRevocableEventPtr; + +namespace mozilla { +namespace dom { + +class ContentChild; +class ContentParent; +class PBlobStreamChild; +class PBlobStreamParent; + +class BlobChild MOZ_FINAL + : public PBlobChild +{ + friend class ContentChild; + + class RemoteBlob; + friend class RemoteBlob; + + nsIDOMBlob* mBlob; + RemoteBlob* mRemoteBlob; + nsRefPtr mStrongManager; + + bool mOwnsBlob; + bool mBlobIsFile; + +public: + // This create function is called on the sending side. + static BlobChild* + Create(ContentChild* aManager, nsIDOMBlob* aBlob) + { + return new BlobChild(aManager, aBlob); + } + + // Get the blob associated with this actor. This may always be called on the + // sending side. It may also be called on the receiving side unless this is a + // "mystery" blob that has not yet received a SetMysteryBlobInfo() call. + already_AddRefed + GetBlob(); + + // Use this for files. + bool + SetMysteryBlobInfo(const nsString& aName, + const nsString& aContentType, + uint64_t aLength, + uint64_t aLastModifiedDate); + + // Use this for non-file blobs. + bool + SetMysteryBlobInfo(const nsString& aContentType, uint64_t aLength); + +private: + // This constructor is called on the sending side. + BlobChild(ContentChild* aManager, nsIDOMBlob* aBlob); + + // This constructor is called on the receiving side. + BlobChild(ContentChild* aManager, const ChildBlobConstructorParams& aParams); + + // Only destroyed by ContentChild. + ~BlobChild(); + + // This create function is called on the receiving side by ContentChild. + static BlobChild* + Create(ContentChild* aManager, const ChildBlobConstructorParams& aParams); + + static already_AddRefed + CreateRemoteBlob(const ChildBlobConstructorParams& aParams); + + void + NoteDyingRemoteBlob(); + + // These methods are only called by the IPDL message machinery. + virtual void + ActorDestroy(ActorDestroyReason aWhy) MOZ_OVERRIDE; + + virtual bool + RecvResolveMystery(const ResolveMysteryParams& aParams) MOZ_OVERRIDE; + + virtual PBlobStreamChild* + AllocPBlobStreamChild() MOZ_OVERRIDE; + + virtual bool + RecvPBlobStreamConstructor(PBlobStreamChild* aActor) MOZ_OVERRIDE; + + virtual bool + DeallocPBlobStreamChild(PBlobStreamChild* aActor) MOZ_OVERRIDE; +}; + +class BlobParent MOZ_FINAL + : public PBlobParent +{ + friend class ContentParent; + + class OpenStreamRunnable; + friend class OpenStreamRunnable; + + class RemoteBlob; + friend class RemoteBlob; + + nsIDOMBlob* mBlob; + RemoteBlob* mRemoteBlob; + nsRefPtr mStrongManager; + + // nsIInputStreams backed by files must ensure that the files are actually + // opened and closed on a background thread before we can send their file + // handles across to the child. The child process could crash during this + // process so we need to make sure we cancel the intended response in such a + // case. We do that by holding an array of nsRevocableEventPtr. If the child + // crashes then this actor will be destroyed and the nsRevocableEventPtr + // destructor will cancel any stream events that are currently in flight. + nsTArray> mOpenStreamRunnables; + + bool mOwnsBlob; + bool mBlobIsFile; + +public: + // This create function is called on the sending side. + static BlobParent* + Create(ContentParent* aManager, nsIDOMBlob* aBlob) + { + return new BlobParent(aManager, aBlob); + } + + // Get the blob associated with this actor. This may always be called on the + // sending side. It may also be called on the receiving side unless this is a + // "mystery" blob that has not yet received a SetMysteryBlobInfo() call. + already_AddRefed + GetBlob(); + + // Use this for files. + bool + SetMysteryBlobInfo(const nsString& aName, const nsString& aContentType, + uint64_t aLength, uint64_t aLastModifiedDate); + + // Use this for non-file blobs. + bool + SetMysteryBlobInfo(const nsString& aContentType, uint64_t aLength); + +private: + // This constructor is called on the sending side. + BlobParent(ContentParent* aManager, nsIDOMBlob* aBlob); + + // This constructor is called on the receiving side. + BlobParent(ContentParent* aManager, + const ParentBlobConstructorParams& aParams); + + ~BlobParent(); + + // This create function is called on the receiving side by ContentParent. + static BlobParent* + Create(ContentParent* aManager, const ParentBlobConstructorParams& aParams); + + static already_AddRefed + CreateRemoteBlob(const ParentBlobConstructorParams& aParams); + + void + NoteDyingRemoteBlob(); + + void + NoteRunnableCompleted(OpenStreamRunnable* aRunnable); + + // These methods are only called by the IPDL message machinery. + virtual void + ActorDestroy(ActorDestroyReason aWhy) MOZ_OVERRIDE; + + virtual PBlobStreamParent* + AllocPBlobStreamParent() MOZ_OVERRIDE; + + virtual bool + RecvPBlobStreamConstructor(PBlobStreamParent* aActor) MOZ_OVERRIDE; + + virtual bool + DeallocPBlobStreamParent(PBlobStreamParent* aActor) MOZ_OVERRIDE; + + virtual bool + RecvResolveMystery(const ResolveMysteryParams& aParams) MOZ_OVERRIDE; +}; + +} // namespace dom +} // namespace mozilla + +#endif // mozilla_dom_ipc_Blob_h