gecko/dom/ipc/Blob.h
"Kan-Ru Chen (陳侃如)" 54d6af82e8 Bug 879475 - Part 002. Add an nsIContentChild api r=jlebar
Based on original patch by David Zbarsky <dzbarsky@gmail.com>
2014-06-11 13:44:06 +08:00

201 lines
5.6 KiB
C++

/* 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> class nsRevocableEventPtr;
namespace mozilla {
namespace dom {
class nsIContentChild;
class nsIContentParent;
class PBlobStreamChild;
class PBlobStreamParent;
class BlobChild MOZ_FINAL
: public PBlobChild
{
friend class nsIContentChild;
class RemoteBlob;
friend class RemoteBlob;
nsIDOMBlob* mBlob;
RemoteBlob* mRemoteBlob;
nsRefPtr<nsIContentChild> mStrongManager;
bool mOwnsBlob;
bool mBlobIsFile;
public:
// This create function is called on the sending side.
static BlobChild*
Create(nsIContentChild* 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<nsIDOMBlob>
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);
nsIContentChild* Manager();
private:
// This constructor is called on the sending side.
BlobChild(nsIContentChild* aManager, nsIDOMBlob* aBlob);
// This constructor is called on the receiving side.
BlobChild(nsIContentChild* aManager, const ChildBlobConstructorParams& aParams);
// Only destroyed by ContentChild.
~BlobChild();
// This create function is called on the receiving side by ContentChild.
static BlobChild*
Create(nsIContentChild* aManager, const ChildBlobConstructorParams& aParams);
static already_AddRefed<RemoteBlob>
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 nsIContentParent;
class OpenStreamRunnable;
friend class OpenStreamRunnable;
class RemoteBlob;
friend class RemoteBlob;
nsIDOMBlob* mBlob;
RemoteBlob* mRemoteBlob;
nsRefPtr<nsIContentParent> 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<nsRevocableEventPtr<OpenStreamRunnable>> mOpenStreamRunnables;
bool mOwnsBlob;
bool mBlobIsFile;
public:
// This create function is called on the sending side.
static BlobParent*
Create(nsIContentParent* 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<nsIDOMBlob>
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);
nsIContentParent* Manager();
private:
// This constructor is called on the sending side.
BlobParent(nsIContentParent* aManager, nsIDOMBlob* aBlob);
// This constructor is called on the receiving side.
BlobParent(nsIContentParent* aManager,
const ParentBlobConstructorParams& aParams);
~BlobParent();
// This create function is called on the receiving side by ContentParent.
static BlobParent*
Create(nsIContentParent* aManager, const ParentBlobConstructorParams& aParams);
static already_AddRefed<RemoteBlob>
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