Backed out changeset f7e0ffc1debd (bug 879475) for B2G reftest crashes

This commit is contained in:
Ed Morley 2014-06-09 11:28:40 +01:00
Родитель 6a8a945c35
Коммит 0c7bfa6f11
15 изменённых файлов: 231 добавлений и 491 удалений

Просмотреть файл

@ -2301,7 +2301,7 @@ nsFrameLoader::DoSendAsyncMessage(JSContext* aCx,
TabParent* tabParent = mRemoteBrowser; TabParent* tabParent = mRemoteBrowser;
if (tabParent) { if (tabParent) {
ClonedMessageData data; ClonedMessageData data;
nsIContentParent* cp = tabParent->Manager(); ContentParent* cp = tabParent->Manager();
if (!BuildClonedMessageDataForParent(cp, aData, data)) { if (!BuildClonedMessageDataForParent(cp, aData, data)) {
return false; return false;
} }

Просмотреть файл

@ -445,7 +445,7 @@ private:
// The ContentParent associated with mRemoteBrowser. This was added as a // The ContentParent associated with mRemoteBrowser. This was added as a
// strong ref in bug 545237, and we're not sure if we can get rid of it. // strong ref in bug 545237, and we're not sure if we can get rid of it.
nsRefPtr<mozilla::dom::nsIContentParent> mContentParent; nsRefPtr<mozilla::dom::ContentParent> mContentParent;
RenderFrameParent* mCurrentRemoteFrame; RenderFrameParent* mCurrentRemoteFrame;
TabParent* mRemoteBrowser; TabParent* mRemoteBrowser;
uint64_t mChildID; uint64_t mChildID;

Просмотреть файл

@ -9,6 +9,7 @@
#include "AppProcessChecker.h" #include "AppProcessChecker.h"
#include "ContentChild.h" #include "ContentChild.h"
#include "ContentParent.h"
#include "nsContentUtils.h" #include "nsContentUtils.h"
#include "nsCxPusher.h" #include "nsCxPusher.h"
#include "nsError.h" #include "nsError.h"
@ -30,8 +31,6 @@
#include "nsIDOMFile.h" #include "nsIDOMFile.h"
#include "xpcpublic.h" #include "xpcpublic.h"
#include "mozilla/Preferences.h" #include "mozilla/Preferences.h"
#include "mozilla/dom/nsIContentParent.h"
#include "mozilla/dom/PermissionMessageUtils.h"
#include "mozilla/dom/StructuredCloneUtils.h" #include "mozilla/dom/StructuredCloneUtils.h"
#include "mozilla/dom/PBlobChild.h" #include "mozilla/dom/PBlobChild.h"
#include "mozilla/dom/PBlobParent.h" #include "mozilla/dom/PBlobParent.h"
@ -39,7 +38,6 @@
#include "JavaScriptParent.h" #include "JavaScriptParent.h"
#include "mozilla/dom/DOMStringList.h" #include "mozilla/dom/DOMStringList.h"
#include "nsPrintfCString.h" #include "nsPrintfCString.h"
#include "nsXULAppAPI.h"
#include <algorithm> #include <algorithm>
#ifdef ANDROID #ifdef ANDROID
@ -146,7 +144,7 @@ struct BlobTraits<Parent>
{ {
typedef mozilla::dom::BlobParent BlobType; typedef mozilla::dom::BlobParent BlobType;
typedef mozilla::dom::PBlobParent ProtocolType; typedef mozilla::dom::PBlobParent ProtocolType;
typedef mozilla::dom::nsIContentParent ConcreteContentManagerType; typedef mozilla::dom::ContentParent ConcreteContentManagerType;
}; };
template <> template <>
@ -221,7 +219,7 @@ BuildClonedMessageData(typename BlobTraits<Flavor>::ConcreteContentManagerType*
} }
bool bool
MessageManagerCallback::BuildClonedMessageDataForParent(nsIContentParent* aParent, MessageManagerCallback::BuildClonedMessageDataForParent(ContentParent* aParent,
const StructuredCloneData& aData, const StructuredCloneData& aData,
ClonedMessageData& aClonedData) ClonedMessageData& aClonedData)
{ {
@ -1882,7 +1880,7 @@ NS_NewParentProcessMessageManager(nsIMessageBroadcaster** aResult)
nsFrameMessageManager* nsFrameMessageManager*
nsFrameMessageManager::NewProcessMessageManager(mozilla::dom::nsIContentParent* aProcess) nsFrameMessageManager::NewProcessMessageManager(mozilla::dom::ContentParent* aProcess)
{ {
if (!nsFrameMessageManager::sParentProcessManager) { if (!nsFrameMessageManager::sParentProcessManager) {
nsCOMPtr<nsIMessageBroadcaster> dummy = nsCOMPtr<nsIMessageBroadcaster> dummy =

Просмотреть файл

@ -32,7 +32,7 @@
namespace mozilla { namespace mozilla {
namespace dom { namespace dom {
class nsIContentParent; class ContentParent;
class ContentChild; class ContentChild;
class ClonedMessageData; class ClonedMessageData;
class MessageManagerReporter; class MessageManagerReporter;
@ -99,7 +99,7 @@ public:
} }
protected: protected:
bool BuildClonedMessageDataForParent(nsIContentParent* aParent, bool BuildClonedMessageDataForParent(ContentParent* aParent,
const StructuredCloneData& aData, const StructuredCloneData& aData,
ClonedMessageData& aClonedData); ClonedMessageData& aClonedData);
bool BuildClonedMessageDataForChild(ContentChild* aChild, bool BuildClonedMessageDataForChild(ContentChild* aChild,
@ -217,7 +217,7 @@ public:
NS_DECL_NSIPROCESSCHECKER NS_DECL_NSIPROCESSCHECKER
static nsFrameMessageManager* static nsFrameMessageManager*
NewProcessMessageManager(mozilla::dom::nsIContentParent* aProcess); NewProcessMessageManager(mozilla::dom::ContentParent* aProcess);
nsresult ReceiveMessage(nsISupports* aTarget, const nsAString& aMessage, nsresult ReceiveMessage(nsISupports* aTarget, const nsAString& aMessage,
bool aIsSync, const StructuredCloneData* aCloneData, bool aIsSync, const StructuredCloneData* aCloneData,

Просмотреть файл

@ -312,14 +312,12 @@ nsContentPermissionRequestProxy::Allow(JS::HandleValue aChoices)
if (mPermissionRequests[i].type().EqualsLiteral("audio-capture")) { if (mPermissionRequests[i].type().EqualsLiteral("audio-capture")) {
GonkPermissionService::GetInstance()->addGrantInfo( GonkPermissionService::GetInstance()->addGrantInfo(
"android.permission.RECORD_AUDIO", "android.permission.RECORD_AUDIO",
static_cast<TabParent*>( static_cast<TabParent*>(mParent->Manager())->Manager()->Pid());
mParent->Manager())->Manager()->AsContentParent()->Pid());
} }
if (mPermissionRequests[i].type().EqualsLiteral("video-capture")) { if (mPermissionRequests[i].type().EqualsLiteral("video-capture")) {
GonkPermissionService::GetInstance()->addGrantInfo( GonkPermissionService::GetInstance()->addGrantInfo(
"android.permission.CAMERA", "android.permission.CAMERA",
static_cast<TabParent*>( static_cast<TabParent*>(mParent->Manager())->Manager()->Pid());
mParent->Manager())->Manager()->AsContentParent()->Pid());
} }
} }
#endif #endif

Просмотреть файл

@ -12,7 +12,6 @@
#include "mozilla/DebugOnly.h" #include "mozilla/DebugOnly.h"
#include "mozilla/Monitor.h" #include "mozilla/Monitor.h"
#include "mozilla/unused.h" #include "mozilla/unused.h"
#include "mozilla/dom/nsIContentParent.h"
#include "mozilla/dom/PBlobStreamChild.h" #include "mozilla/dom/PBlobStreamChild.h"
#include "mozilla/dom/PBlobStreamParent.h" #include "mozilla/dom/PBlobStreamParent.h"
#include "mozilla/dom/PFileDescriptorSetParent.h" #include "mozilla/dom/PFileDescriptorSetParent.h"
@ -1764,7 +1763,7 @@ RemoteBlob::GetPBlob()
* BlobParent * BlobParent
******************************************************************************/ ******************************************************************************/
BlobParent::BlobParent(nsIContentParent* aManager, nsIDOMBlob* aBlob) BlobParent::BlobParent(ContentParent* aManager, nsIDOMBlob* aBlob)
: mBlob(aBlob) : mBlob(aBlob)
, mRemoteBlob(nullptr) , mRemoteBlob(nullptr)
, mStrongManager(aManager) , mStrongManager(aManager)
@ -1781,7 +1780,7 @@ BlobParent::BlobParent(nsIContentParent* aManager, nsIDOMBlob* aBlob)
mBlobIsFile = !!file; mBlobIsFile = !!file;
} }
BlobParent::BlobParent(nsIContentParent* aManager, BlobParent::BlobParent(ContentParent* aManager,
const ParentBlobConstructorParams& aParams) const ParentBlobConstructorParams& aParams)
: mBlob(nullptr) : mBlob(nullptr)
, mRemoteBlob(nullptr) , mRemoteBlob(nullptr)
@ -1814,7 +1813,7 @@ BlobParent::~BlobParent()
} }
BlobParent* BlobParent*
BlobParent::Create(nsIContentParent* aManager, BlobParent::Create(ContentParent* aManager,
const ParentBlobConstructorParams& aParams) const ParentBlobConstructorParams& aParams)
{ {
MOZ_ASSERT(NS_IsMainThread()); MOZ_ASSERT(NS_IsMainThread());
@ -1921,12 +1920,6 @@ BlobParent::SetMysteryBlobInfo(const nsString& aContentType, uint64_t aLength)
return SendResolveMystery(params); return SendResolveMystery(params);
} }
nsIContentParent*
BlobParent::Manager()
{
return mStrongManager;
}
already_AddRefed<BlobParent::RemoteBlob> already_AddRefed<BlobParent::RemoteBlob>
BlobParent::CreateRemoteBlob(const ParentBlobConstructorParams& aParams) BlobParent::CreateRemoteBlob(const ParentBlobConstructorParams& aParams)
{ {

Просмотреть файл

@ -19,7 +19,7 @@ namespace mozilla {
namespace dom { namespace dom {
class ContentChild; class ContentChild;
class nsIContentParent; class ContentParent;
class PBlobStreamChild; class PBlobStreamChild;
class PBlobStreamParent; class PBlobStreamParent;
@ -103,7 +103,7 @@ private:
class BlobParent MOZ_FINAL class BlobParent MOZ_FINAL
: public PBlobParent : public PBlobParent
{ {
friend class nsIContentParent; friend class ContentParent;
class OpenStreamRunnable; class OpenStreamRunnable;
friend class OpenStreamRunnable; friend class OpenStreamRunnable;
@ -113,7 +113,7 @@ class BlobParent MOZ_FINAL
nsIDOMBlob* mBlob; nsIDOMBlob* mBlob;
RemoteBlob* mRemoteBlob; RemoteBlob* mRemoteBlob;
nsRefPtr<nsIContentParent> mStrongManager; nsRefPtr<ContentParent> mStrongManager;
// nsIInputStreams backed by files must ensure that the files are actually // nsIInputStreams backed by files must ensure that the files are actually
// opened and closed on a background thread before we can send their file // opened and closed on a background thread before we can send their file
@ -130,7 +130,7 @@ class BlobParent MOZ_FINAL
public: public:
// This create function is called on the sending side. // This create function is called on the sending side.
static BlobParent* static BlobParent*
Create(nsIContentParent* aManager, nsIDOMBlob* aBlob) Create(ContentParent* aManager, nsIDOMBlob* aBlob)
{ {
return new BlobParent(aManager, aBlob); return new BlobParent(aManager, aBlob);
} }
@ -150,21 +150,19 @@ public:
bool bool
SetMysteryBlobInfo(const nsString& aContentType, uint64_t aLength); SetMysteryBlobInfo(const nsString& aContentType, uint64_t aLength);
nsIContentParent* Manager();
private: private:
// This constructor is called on the sending side. // This constructor is called on the sending side.
BlobParent(nsIContentParent* aManager, nsIDOMBlob* aBlob); BlobParent(ContentParent* aManager, nsIDOMBlob* aBlob);
// This constructor is called on the receiving side. // This constructor is called on the receiving side.
BlobParent(nsIContentParent* aManager, BlobParent(ContentParent* aManager,
const ParentBlobConstructorParams& aParams); const ParentBlobConstructorParams& aParams);
~BlobParent(); ~BlobParent();
// This create function is called on the receiving side by ContentParent. // This create function is called on the receiving side by ContentParent.
static BlobParent* static BlobParent*
Create(nsIContentParent* aManager, const ParentBlobConstructorParams& aParams); Create(ContentParent* aManager, const ParentBlobConstructorParams& aParams);
static already_AddRefed<RemoteBlob> static already_AddRefed<RemoteBlob>
CreateRemoteBlob(const ParentBlobConstructorParams& aParams); CreateRemoteBlob(const ParentBlobConstructorParams& aParams);

Просмотреть файл

@ -480,8 +480,7 @@ ContentParentsMemoryReporter::CollectReports(nsIMemoryReporterCallback* cb,
nsPrintfCString path("queued-ipc-messages/content-parent" nsPrintfCString path("queued-ipc-messages/content-parent"
"(%s, pid=%d, %s, 0x%p, refcnt=%d)", "(%s, pid=%d, %s, 0x%p, refcnt=%d)",
NS_ConvertUTF16toUTF8(friendlyName).get(), NS_ConvertUTF16toUTF8(friendlyName).get(),
cp->Pid(), channelStr, cp->Pid(), channelStr, cp, refcnt);
static_cast<nsIContentParent*>(cp), refcnt);
NS_NAMED_LITERAL_CSTRING(desc, NS_NAMED_LITERAL_CSTRING(desc,
"The number of unset IPC messages held in this ContentParent's " "The number of unset IPC messages held in this ContentParent's "
@ -1523,8 +1522,7 @@ ContentParent::ContentParent(mozIApplication* aApp,
bool aIsForPreallocated, bool aIsForPreallocated,
ProcessPriority aInitialPriority /* = PROCESS_PRIORITY_FOREGROUND */, ProcessPriority aInitialPriority /* = PROCESS_PRIORITY_FOREGROUND */,
bool aIsNuwaProcess /* = false */) bool aIsNuwaProcess /* = false */)
: nsIContentParent() : mIsForBrowser(aIsForBrowser)
, mIsForBrowser(aIsForBrowser)
, mIsNuwaProcess(aIsNuwaProcess) , mIsNuwaProcess(aIsNuwaProcess)
{ {
InitializeMembers(); // Perform common initialization. InitializeMembers(); // Perform common initialization.
@ -1735,6 +1733,8 @@ ContentParent::InitInternal(ProcessPriority aInitialPriority,
chromeRegistry->SendRegisteredChrome(this); chromeRegistry->SendRegisteredChrome(this);
} }
mMessageManager = nsFrameMessageManager::NewProcessMessageManager(this);
if (gAppData) { if (gAppData) {
nsCString version(gAppData->version); nsCString version(gAppData->version);
nsCString buildID(gAppData->buildID); nsCString buildID(gAppData->buildID);
@ -2193,7 +2193,6 @@ NS_IMPL_CYCLE_COLLECTING_ADDREF(ContentParent)
NS_IMPL_CYCLE_COLLECTING_RELEASE(ContentParent) NS_IMPL_CYCLE_COLLECTING_RELEASE(ContentParent)
NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(ContentParent) NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(ContentParent)
NS_INTERFACE_MAP_ENTRY(nsIContentParent)
NS_INTERFACE_MAP_ENTRY(nsIObserver) NS_INTERFACE_MAP_ENTRY(nsIObserver)
NS_INTERFACE_MAP_ENTRY(nsIDOMGeoPositionCallback) NS_INTERFACE_MAP_ENTRY(nsIDOMGeoPositionCallback)
NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIObserver) NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIObserver)
@ -2398,13 +2397,27 @@ mozilla::jsipc::PJavaScriptParent *
ContentParent::AllocPJavaScriptParent() ContentParent::AllocPJavaScriptParent()
{ {
MOZ_ASSERT(!ManagedPJavaScriptParent().Length()); MOZ_ASSERT(!ManagedPJavaScriptParent().Length());
return nsIContentParent::AllocPJavaScriptParent();
nsCOMPtr<nsIJSRuntimeService> svc = do_GetService("@mozilla.org/js/xpc/RuntimeService;1");
NS_ENSURE_TRUE(svc, nullptr);
JSRuntime *rt;
svc->GetRuntime(&rt);
NS_ENSURE_TRUE(svc, nullptr);
mozilla::jsipc::JavaScriptParent *parent = new mozilla::jsipc::JavaScriptParent(rt);
if (!parent->init()) {
delete parent;
return nullptr;
}
return parent;
} }
bool bool
ContentParent::DeallocPJavaScriptParent(PJavaScriptParent *parent) ContentParent::DeallocPJavaScriptParent(PJavaScriptParent *parent)
{ {
return nsIContentParent::DeallocPJavaScriptParent(parent); static_cast<mozilla::jsipc::JavaScriptParent *>(parent)->decref();
return true;
} }
PBrowserParent* PBrowserParent*
@ -2414,17 +2427,55 @@ ContentParent::AllocPBrowserParent(const IPCTabContext& aContext,
const bool& aIsForApp, const bool& aIsForApp,
const bool& aIsForBrowser) const bool& aIsForBrowser)
{ {
return nsIContentParent::AllocPBrowserParent(aContext, unused << aChromeFlags;
aChromeFlags,
aId, const IPCTabAppBrowserContext& appBrowser = aContext.appBrowserContext();
aIsForApp,
aIsForBrowser); // We don't trust the IPCTabContext we receive from the child, so we'll bail
// if we receive an IPCTabContext that's not a PopupIPCTabContext.
// (PopupIPCTabContext lets the child process prove that it has access to
// the app it's trying to open.)
if (appBrowser.type() != IPCTabAppBrowserContext::TPopupIPCTabContext) {
NS_ERROR("Unexpected IPCTabContext type. Aborting AllocPBrowserParent.");
return nullptr;
}
const PopupIPCTabContext& popupContext = appBrowser.get_PopupIPCTabContext();
TabParent* opener = static_cast<TabParent*>(popupContext.openerParent());
if (!opener) {
NS_ERROR("Got null opener from child; aborting AllocPBrowserParent.");
return nullptr;
}
// Popup windows of isBrowser frames must be isBrowser if the parent
// isBrowser. Allocating a !isBrowser frame with same app ID would allow
// the content to access data it's not supposed to.
if (!popupContext.isBrowserElement() && opener->IsBrowserElement()) {
NS_ERROR("Child trying to escalate privileges! Aborting AllocPBrowserParent.");
return nullptr;
}
MaybeInvalidTabContext tc(aContext);
if (!tc.IsValid()) {
NS_ERROR(nsPrintfCString("Child passed us an invalid TabContext. (%s) "
"Aborting AllocPBrowserParent.",
tc.GetInvalidReason()).get());
return nullptr;
}
TabParent* parent = new TabParent(this, tc.GetTabContext(), aChromeFlags);
// We release this ref in DeallocPBrowserParent()
NS_ADDREF(parent);
return parent;
} }
bool bool
ContentParent::DeallocPBrowserParent(PBrowserParent* frame) ContentParent::DeallocPBrowserParent(PBrowserParent* frame)
{ {
return nsIContentParent::DeallocPBrowserParent(frame); TabParent* parent = static_cast<TabParent*>(frame);
NS_RELEASE(parent);
return true;
} }
PDeviceStorageRequestParent* PDeviceStorageRequestParent*
@ -2467,7 +2518,7 @@ ContentParent::DeallocPFileSystemRequestParent(PFileSystemRequestParent* doomed)
PBlobParent* PBlobParent*
ContentParent::AllocPBlobParent(const BlobConstructorParams& aParams) ContentParent::AllocPBlobParent(const BlobConstructorParams& aParams)
{ {
return nsIContentParent::AllocPBlobParent(aParams); return BlobParent::Create(this, aParams);
} }
bool bool
@ -2477,6 +2528,81 @@ ContentParent::DeallocPBlobParent(PBlobParent* aActor)
return true; return true;
} }
BlobParent*
ContentParent::GetOrCreateActorForBlob(nsIDOMBlob* aBlob)
{
MOZ_ASSERT(NS_IsMainThread());
MOZ_ASSERT(aBlob);
// If the blob represents a remote blob for this ContentParent then we can
// simply pass its actor back here.
if (nsCOMPtr<nsIRemoteBlob> remoteBlob = do_QueryInterface(aBlob)) {
if (BlobParent* actor = static_cast<BlobParent*>(
static_cast<PBlobParent*>(remoteBlob->GetPBlob()))) {
if (static_cast<ContentParent*>(actor->Manager()) == this) {
return actor;
}
}
}
// All blobs shared between processes must be immutable.
nsCOMPtr<nsIMutable> mutableBlob = do_QueryInterface(aBlob);
if (!mutableBlob || NS_FAILED(mutableBlob->SetMutable(false))) {
NS_WARNING("Failed to make blob immutable!");
return nullptr;
}
// XXX This is only safe so long as all blob implementations in our tree
// inherit nsDOMFileBase. If that ever changes then this will need to grow
// a real interface or something.
const auto* blob = static_cast<nsDOMFileBase*>(aBlob);
ChildBlobConstructorParams params;
if (blob->IsSizeUnknown() || blob->IsDateUnknown()) {
// We don't want to call GetSize or GetLastModifiedDate
// yet since that may stat a file on the main thread
// here. Instead we'll learn the size lazily from the
// other process.
params = MysteryBlobConstructorParams();
}
else {
nsString contentType;
nsresult rv = aBlob->GetType(contentType);
NS_ENSURE_SUCCESS(rv, nullptr);
uint64_t length;
rv = aBlob->GetSize(&length);
NS_ENSURE_SUCCESS(rv, nullptr);
nsCOMPtr<nsIDOMFile> file = do_QueryInterface(aBlob);
if (file) {
FileBlobConstructorParams fileParams;
rv = file->GetMozLastModifiedDate(&fileParams.modDate());
NS_ENSURE_SUCCESS(rv, nullptr);
rv = file->GetName(fileParams.name());
NS_ENSURE_SUCCESS(rv, nullptr);
fileParams.contentType() = contentType;
fileParams.length() = length;
params = fileParams;
} else {
NormalBlobConstructorParams blobParams;
blobParams.contentType() = contentType;
blobParams.length() = length;
params = blobParams;
}
}
BlobParent* actor = BlobParent::Create(this, aBlob);
NS_ENSURE_TRUE(actor, nullptr);
return SendPBlobConstructor(actor, params) ? actor : nullptr;
}
void void
ContentParent::KillHard() ContentParent::KillHard()
{ {
@ -3054,8 +3180,21 @@ ContentParent::RecvSyncMessage(const nsString& aMsg,
const IPC::Principal& aPrincipal, const IPC::Principal& aPrincipal,
InfallibleTArray<nsString>* aRetvals) InfallibleTArray<nsString>* aRetvals)
{ {
return nsIContentParent::RecvSyncMessage(aMsg, aData, aCpows, aPrincipal, nsIPrincipal* principal = aPrincipal;
aRetvals); if (!Preferences::GetBool("dom.testing.ignore_ipc_principal", false) &&
principal && !AssertAppPrincipal(this, principal)) {
return false;
}
nsRefPtr<nsFrameMessageManager> ppm = mMessageManager;
if (ppm) {
StructuredCloneData cloneData = ipc::UnpackClonedMessageDataForParent(aData);
CpowIdHolder cpows(GetCPOWManager(), aCpows);
ppm->ReceiveMessage(static_cast<nsIContentFrameMessageManager*>(ppm.get()),
aMsg, true, &cloneData, &cpows, aPrincipal, aRetvals);
}
return true;
} }
bool bool
@ -3065,8 +3204,20 @@ ContentParent::AnswerRpcMessage(const nsString& aMsg,
const IPC::Principal& aPrincipal, const IPC::Principal& aPrincipal,
InfallibleTArray<nsString>* aRetvals) InfallibleTArray<nsString>* aRetvals)
{ {
return nsIContentParent::AnswerRpcMessage(aMsg, aData, aCpows, aPrincipal, nsIPrincipal* principal = aPrincipal;
aRetvals); if (!Preferences::GetBool("dom.testing.ignore_ipc_principal", false) &&
principal && !AssertAppPrincipal(this, principal)) {
return false;
}
nsRefPtr<nsFrameMessageManager> ppm = mMessageManager;
if (ppm) {
StructuredCloneData cloneData = ipc::UnpackClonedMessageDataForParent(aData);
CpowIdHolder cpows(GetCPOWManager(), aCpows);
ppm->ReceiveMessage(static_cast<nsIContentFrameMessageManager*>(ppm.get()),
aMsg, true, &cloneData, &cpows, aPrincipal, aRetvals);
}
return true;
} }
bool bool
@ -3075,7 +3226,20 @@ ContentParent::RecvAsyncMessage(const nsString& aMsg,
const InfallibleTArray<CpowEntry>& aCpows, const InfallibleTArray<CpowEntry>& aCpows,
const IPC::Principal& aPrincipal) const IPC::Principal& aPrincipal)
{ {
return nsIContentParent::RecvAsyncMessage(aMsg, aData, aCpows, aPrincipal); nsIPrincipal* principal = aPrincipal;
if (!Preferences::GetBool("dom.testing.ignore_ipc_principal", false) &&
principal && !AssertAppPrincipal(this, principal)) {
return false;
}
nsRefPtr<nsFrameMessageManager> ppm = mMessageManager;
if (ppm) {
StructuredCloneData cloneData = ipc::UnpackClonedMessageDataForParent(aData);
CpowIdHolder cpows(GetCPOWManager(), aCpows);
ppm->ReceiveMessage(static_cast<nsIContentFrameMessageManager*>(ppm.get()),
aMsg, false, &cloneData, &cpows, aPrincipal, nullptr);
}
return true;
} }
bool bool
@ -3283,13 +3447,6 @@ ContentParent::CheckAppHasStatus(unsigned short aStatus)
return AssertAppHasStatus(this, aStatus); return AssertAppHasStatus(this, aStatus);
} }
PBlobParent*
ContentParent::SendPBlobConstructor(PBlobParent* aActor,
const BlobConstructorParams& aParams)
{
return PContentParent::SendPBlobConstructor(aActor, aParams);
}
bool bool
ContentParent::RecvSystemMessageHandled() ContentParent::RecvSystemMessageHandled()
{ {

Просмотреть файл

@ -8,7 +8,6 @@
#define mozilla_dom_ContentParent_h #define mozilla_dom_ContentParent_h
#include "mozilla/dom/PContentParent.h" #include "mozilla/dom/PContentParent.h"
#include "mozilla/dom/nsIContentParent.h"
#include "mozilla/ipc/GeckoChildProcessHost.h" #include "mozilla/ipc/GeckoChildProcessHost.h"
#include "mozilla/dom/ipc/Blob.h" #include "mozilla/dom/ipc/Blob.h"
#include "mozilla/Attributes.h" #include "mozilla/Attributes.h"
@ -64,9 +63,9 @@ class TabContext;
class PFileDescriptorSetParent; class PFileDescriptorSetParent;
class ContentParent : public PContentParent class ContentParent : public PContentParent
, public nsIContentParent
, public nsIObserver , public nsIObserver
, public nsIDOMGeoPositionCallback , public nsIDOMGeoPositionCallback
, public mozilla::dom::ipc::MessageManagerCallback
, public mozilla::LinkedListElement<ContentParent> , public mozilla::LinkedListElement<ContentParent>
{ {
typedef mozilla::ipc::GeckoChildProcessHost GeckoChildProcessHost; typedef mozilla::ipc::GeckoChildProcessHost GeckoChildProcessHost;
@ -76,7 +75,6 @@ class ContentParent : public PContentParent
typedef mozilla::dom::ClonedMessageData ClonedMessageData; typedef mozilla::dom::ClonedMessageData ClonedMessageData;
public: public:
virtual bool IsContentParent() MOZ_OVERRIDE { return true; }
/** /**
* Start up the content-process machinery. This might include * Start up the content-process machinery. This might include
* scheduling pre-launch tasks. * scheduling pre-launch tasks.
@ -176,6 +174,8 @@ public:
return mSendDataStoreInfos; return mSendDataStoreInfos;
} }
BlobParent* GetOrCreateActorForBlob(nsIDOMBlob* aBlob);
/** /**
* Kill our subprocess and make sure it dies. Should only be used * Kill our subprocess and make sure it dies. Should only be used
* in emergency situations since it bypasses the normal shutdown * in emergency situations since it bypasses the normal shutdown
@ -183,7 +183,7 @@ public:
*/ */
void KillHard(); void KillHard();
uint64_t ChildID() MOZ_OVERRIDE { return mChildID; } uint64_t ChildID() { return mChildID; }
const nsString& AppManifestURL() const { return mAppManifestURL; } const nsString& AppManifestURL() const { return mAppManifestURL; }
bool IsPreallocated(); bool IsPreallocated();
@ -241,10 +241,6 @@ public:
nsICycleCollectorLogSink* aSink, nsICycleCollectorLogSink* aSink,
nsIDumpGCAndCCLogsCallback* aCallback); nsIDumpGCAndCCLogsCallback* aCallback);
virtual PBlobParent* SendPBlobConstructor(
PBlobParent* aActor,
const BlobConstructorParams& aParams) MOZ_OVERRIDE;
protected: protected:
void OnChannelConnected(int32_t pid) MOZ_OVERRIDE; void OnChannelConnected(int32_t pid) MOZ_OVERRIDE;
virtual void ActorDestroy(ActorDestroyReason why) MOZ_OVERRIDE; virtual void ActorDestroy(ActorDestroyReason why) MOZ_OVERRIDE;
@ -608,6 +604,8 @@ private:
*/ */
nsString mAppName; nsString mAppName;
nsRefPtr<nsFrameMessageManager> mMessageManager;
// After we initiate shutdown, we also start a timer to ensure // After we initiate shutdown, we also start a timer to ensure
// that even content processes that are 100% blocked (say from // that even content processes that are 100% blocked (say from
// SIGSTOP), are still killed eventually. This task enforces that // SIGSTOP), are still killed eventually. This task enforces that

Просмотреть файл

@ -502,9 +502,9 @@ ProcessPriorityManagerImpl::ObserveContentParentCreated(
{ {
// Do nothing; it's sufficient to get the PPPM. But assign to nsRefPtr so we // Do nothing; it's sufficient to get the PPPM. But assign to nsRefPtr so we
// don't leak the already_AddRefed object. // don't leak the already_AddRefed object.
nsCOMPtr<nsIContentParent> cp = do_QueryInterface(aContentParent); nsCOMPtr<nsIObserver> cp = do_QueryInterface(aContentParent);
nsRefPtr<ParticularProcessPriorityManager> pppm = nsRefPtr<ParticularProcessPriorityManager> pppm =
GetParticularProcessPriorityManager(cp->AsContentParent()); GetParticularProcessPriorityManager(static_cast<ContentParent*>(cp.get()));
} }
static PLDHashOperator static PLDHashOperator
@ -816,7 +816,6 @@ ParticularProcessPriorityManager::OnRemoteBrowserFrameShown(nsISupports* aSubjec
fl->GetTabParent(getter_AddRefs(tp)); fl->GetTabParent(getter_AddRefs(tp));
NS_ENSURE_TRUE_VOID(tp); NS_ENSURE_TRUE_VOID(tp);
MOZ_ASSERT(XRE_GetProcessType() == GeckoProcessType_Default);
if (static_cast<TabParent*>(tp.get())->Manager() != mContentParent) { if (static_cast<TabParent*>(tp.get())->Manager() != mContentParent) {
return; return;
} }
@ -830,7 +829,6 @@ ParticularProcessPriorityManager::OnTabParentDestroyed(nsISupports* aSubject)
nsCOMPtr<nsITabParent> tp = do_QueryInterface(aSubject); nsCOMPtr<nsITabParent> tp = do_QueryInterface(aSubject);
NS_ENSURE_TRUE_VOID(tp); NS_ENSURE_TRUE_VOID(tp);
MOZ_ASSERT(XRE_GetProcessType() == GeckoProcessType_Default);
if (static_cast<TabParent*>(tp.get())->Manager() != mContentParent) { if (static_cast<TabParent*>(tp.get())->Manager() != mContentParent) {
return; return;
} }
@ -850,7 +848,6 @@ ParticularProcessPriorityManager::OnFrameloaderVisibleChanged(nsISupports* aSubj
return; return;
} }
MOZ_ASSERT(XRE_GetProcessType() == GeckoProcessType_Default);
if (static_cast<TabParent*>(tp.get())->Manager() != mContentParent) { if (static_cast<TabParent*>(tp.get())->Manager() != mContentParent) {
return; return;
} }

Просмотреть файл

@ -206,7 +206,7 @@ NS_IMPL_ISUPPORTS(TabParent,
nsISecureBrowserUI, nsISecureBrowserUI,
nsISupportsWeakReference) nsISupportsWeakReference)
TabParent::TabParent(nsIContentParent* aManager, const TabContext& aContext, uint32_t aChromeFlags) TabParent::TabParent(ContentParent* aManager, const TabContext& aContext, uint32_t aChromeFlags)
: TabContext(aContext) : TabContext(aContext)
, mFrameElement(nullptr) , mFrameElement(nullptr)
, mIMESelectionAnchor(0) , mIMESelectionAnchor(0)
@ -230,7 +230,6 @@ TabParent::TabParent(nsIContentParent* aManager, const TabContext& aContext, uin
, mAppPackageFileDescriptorSent(false) , mAppPackageFileDescriptorSent(false)
, mChromeFlags(aChromeFlags) , mChromeFlags(aChromeFlags)
{ {
MOZ_ASSERT(aManager);
} }
TabParent::~TabParent() TabParent::~TabParent()
@ -300,18 +299,14 @@ TabParent::Destroy()
} }
mIsDestroyed = true; mIsDestroyed = true;
if (XRE_GetProcessType() == GeckoProcessType_Default) { Manager()->NotifyTabDestroying(this);
Manager()->AsContentParent()->NotifyTabDestroying(this);
}
mMarkedDestroying = true; mMarkedDestroying = true;
} }
bool bool
TabParent::Recv__delete__() TabParent::Recv__delete__()
{ {
if (XRE_GetProcessType() == GeckoProcessType_Default) { Manager()->NotifyTabDestroyed(this, mMarkedDestroying);
Manager()->AsContentParent()->NotifyTabDestroyed(this, mMarkedDestroying);
}
return true; return true;
} }
@ -977,16 +972,15 @@ TabParent::RecvSyncMessage(const nsString& aMessage,
const IPC::Principal& aPrincipal, const IPC::Principal& aPrincipal,
InfallibleTArray<nsString>* aJSONRetVal) InfallibleTArray<nsString>* aJSONRetVal)
{ {
// FIXME Permission check for TabParent in Content process
nsIPrincipal* principal = aPrincipal; nsIPrincipal* principal = aPrincipal;
ContentParent* parent = Manager()->AsContentParent(); ContentParent* parent = static_cast<ContentParent*>(Manager());
if (!Preferences::GetBool("dom.testing.ignore_ipc_principal", false) && if (!Preferences::GetBool("dom.testing.ignore_ipc_principal", false) &&
parent && principal && !AssertAppPrincipal(parent, principal)) { principal && !AssertAppPrincipal(parent, principal)) {
return false; return false;
} }
StructuredCloneData cloneData = ipc::UnpackClonedMessageDataForParent(aData); StructuredCloneData cloneData = ipc::UnpackClonedMessageDataForParent(aData);
CpowIdHolder cpows(Manager()->GetCPOWManager(), aCpows); CpowIdHolder cpows(parent->GetCPOWManager(), aCpows);
return ReceiveMessage(aMessage, true, &cloneData, &cpows, aPrincipal, aJSONRetVal); return ReceiveMessage(aMessage, true, &cloneData, &cpows, aPrincipal, aJSONRetVal);
} }
@ -997,16 +991,15 @@ TabParent::AnswerRpcMessage(const nsString& aMessage,
const IPC::Principal& aPrincipal, const IPC::Principal& aPrincipal,
InfallibleTArray<nsString>* aJSONRetVal) InfallibleTArray<nsString>* aJSONRetVal)
{ {
// FIXME Permission check for TabParent in Content process
nsIPrincipal* principal = aPrincipal; nsIPrincipal* principal = aPrincipal;
ContentParent* parent = Manager()->AsContentParent(); ContentParent* parent = static_cast<ContentParent*>(Manager());
if (!Preferences::GetBool("dom.testing.ignore_ipc_principal", false) && if (!Preferences::GetBool("dom.testing.ignore_ipc_principal", false) &&
parent && principal && !AssertAppPrincipal(parent, principal)) { principal && !AssertAppPrincipal(parent, principal)) {
return false; return false;
} }
StructuredCloneData cloneData = ipc::UnpackClonedMessageDataForParent(aData); StructuredCloneData cloneData = ipc::UnpackClonedMessageDataForParent(aData);
CpowIdHolder cpows(Manager()->GetCPOWManager(), aCpows); CpowIdHolder cpows(parent->GetCPOWManager(), aCpows);
return ReceiveMessage(aMessage, true, &cloneData, &cpows, aPrincipal, aJSONRetVal); return ReceiveMessage(aMessage, true, &cloneData, &cpows, aPrincipal, aJSONRetVal);
} }
@ -1016,16 +1009,15 @@ TabParent::RecvAsyncMessage(const nsString& aMessage,
const InfallibleTArray<CpowEntry>& aCpows, const InfallibleTArray<CpowEntry>& aCpows,
const IPC::Principal& aPrincipal) const IPC::Principal& aPrincipal)
{ {
// FIXME Permission check for TabParent in Content process
nsIPrincipal* principal = aPrincipal; nsIPrincipal* principal = aPrincipal;
ContentParent* parent = Manager()->AsContentParent(); ContentParent* parent = static_cast<ContentParent*>(Manager());
if (!Preferences::GetBool("dom.testing.ignore_ipc_principal", false) && if (!Preferences::GetBool("dom.testing.ignore_ipc_principal", false) &&
parent && principal && !AssertAppPrincipal(parent, principal)) { principal && !AssertAppPrincipal(parent, principal)) {
return false; return false;
} }
StructuredCloneData cloneData = ipc::UnpackClonedMessageDataForParent(aData); StructuredCloneData cloneData = ipc::UnpackClonedMessageDataForParent(aData);
CpowIdHolder cpows(Manager()->GetCPOWManager(), aCpows); CpowIdHolder cpows(parent->GetCPOWManager(), aCpows);
return ReceiveMessage(aMessage, false, &cloneData, &cpows, aPrincipal, nullptr); return ReceiveMessage(aMessage, false, &cloneData, &cpows, aPrincipal, nullptr);
} }
@ -1710,11 +1702,11 @@ TabParent::RecvPIndexedDBConstructor(PIndexedDBParent* aActor,
return true; return true;
} }
NS_ASSERTION(Manager(), "Null manager?!"); ContentParent* contentParent = Manager();
NS_ASSERTION(contentParent, "Null manager?!");
nsRefPtr<IDBFactory> factory; nsRefPtr<IDBFactory> factory;
rv = IDBFactory::Create(window, aGroup, aASCIIOrigin, rv = IDBFactory::Create(window, aGroup, aASCIIOrigin, contentParent,
Manager()->AsContentParent(),
getter_AddRefs(factory)); getter_AddRefs(factory));
NS_ENSURE_SUCCESS(rv, false); NS_ENSURE_SUCCESS(rv, false);

Просмотреть файл

@ -43,7 +43,7 @@ class RenderFrameParent;
namespace dom { namespace dom {
class ClonedMessageData; class ClonedMessageData;
class nsIContentParent; class ContentParent;
class Element; class Element;
struct StructuredCloneData; struct StructuredCloneData;
@ -61,7 +61,7 @@ public:
// nsITabParent // nsITabParent
NS_DECL_NSITABPARENT NS_DECL_NSITABPARENT
TabParent(nsIContentParent* aManager, const TabContext& aContext, uint32_t aChromeFlags); TabParent(ContentParent* aManager, const TabContext& aContext, uint32_t aChromeFlags);
virtual ~TabParent(); virtual ~TabParent();
Element* GetOwnerElement() const { return mFrameElement; } Element* GetOwnerElement() const { return mFrameElement; }
void SetOwnerElement(Element* aElement); void SetOwnerElement(Element* aElement);
@ -291,7 +291,7 @@ public:
static TabParent* GetFrom(nsFrameLoader* aFrameLoader); static TabParent* GetFrom(nsFrameLoader* aFrameLoader);
static TabParent* GetFrom(nsIContent* aContent); static TabParent* GetFrom(nsIContent* aContent);
nsIContentParent* Manager() { return mManager; } ContentParent* Manager() { return mManager; }
/** /**
* Let managees query if Destroy() is already called so they don't send out * Let managees query if Destroy() is already called so they don't send out
@ -368,7 +368,7 @@ private:
already_AddRefed<nsFrameLoader> GetFrameLoader() const; already_AddRefed<nsFrameLoader> GetFrameLoader() const;
already_AddRefed<nsIWidget> GetWidget() const; already_AddRefed<nsIWidget> GetWidget() const;
layout::RenderFrameParent* GetRenderFrame(); layout::RenderFrameParent* GetRenderFrame();
nsRefPtr<nsIContentParent> mManager; nsRefPtr<ContentParent> mManager;
void TryCacheDPIAndScale(); void TryCacheDPIAndScale();
CSSPoint AdjustTapToChildWidget(const CSSPoint& aPoint); CSSPoint AdjustTapToChildWidget(const CSSPoint& aPoint);

Просмотреть файл

@ -25,7 +25,6 @@ EXPORTS.mozilla.dom += [
'FileDescriptorSetChild.h', 'FileDescriptorSetChild.h',
'FileDescriptorSetParent.h', 'FileDescriptorSetParent.h',
'FilePickerParent.h', 'FilePickerParent.h',
'nsIContentParent.h',
'PermissionMessageUtils.h', 'PermissionMessageUtils.h',
'StructuredCloneUtils.h', 'StructuredCloneUtils.h',
'TabChild.h', 'TabChild.h',
@ -49,7 +48,6 @@ UNIFIED_SOURCES += [
'FileDescriptorSetChild.cpp', 'FileDescriptorSetChild.cpp',
'FileDescriptorSetParent.cpp', 'FileDescriptorSetParent.cpp',
'FilePickerParent.cpp', 'FilePickerParent.cpp',
'nsIContentParent.cpp',
'PermissionMessageUtils.cpp', 'PermissionMessageUtils.cpp',
'PreallocatedProcessManager.cpp', 'PreallocatedProcessManager.cpp',
'ProcessPriorityManager.cpp', 'ProcessPriorityManager.cpp',

Просмотреть файл

@ -1,294 +0,0 @@
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=2 et sw=2 tw=80: */
/* 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/. */
#include "nsIContentParent.h"
#include "mozilla/AppProcessChecker.h"
#include "mozilla/Preferences.h"
#include "mozilla/dom/ContentParent.h"
#include "mozilla/dom/PTabContext.h"
#include "mozilla/dom/PermissionMessageUtils.h"
#include "mozilla/dom/StructuredCloneUtils.h"
#include "mozilla/dom/TabParent.h"
#include "mozilla/dom/ipc/nsIRemoteBlob.h"
#include "mozilla/unused.h"
#include "JavaScriptParent.h"
#include "nsDOMFile.h"
#include "nsFrameMessageManager.h"
#include "nsIJSRuntimeService.h"
#include "nsPrintfCString.h"
using namespace mozilla::jsipc;
namespace mozilla {
namespace dom {
nsIContentParent::nsIContentParent()
{
mMessageManager = nsFrameMessageManager::NewProcessMessageManager(this);
}
ContentParent*
nsIContentParent::AsContentParent()
{
MOZ_ASSERT(IsContentParent());
return static_cast<ContentParent*>(this);
}
PJavaScriptParent*
nsIContentParent::AllocPJavaScriptParent()
{
nsCOMPtr<nsIJSRuntimeService> svc =
do_GetService("@mozilla.org/js/xpc/RuntimeService;1");
NS_ENSURE_TRUE(svc, nullptr);
JSRuntime *rt;
svc->GetRuntime(&rt);
NS_ENSURE_TRUE(svc, nullptr);
nsAutoPtr<JavaScriptParent> parent(new JavaScriptParent(rt));
if (!parent->init()) {
return nullptr;
}
return parent.forget();
}
bool
nsIContentParent::DeallocPJavaScriptParent(PJavaScriptParent* aParent)
{
static_cast<JavaScriptParent*>(aParent)->decref();
return true;
}
PBrowserParent*
nsIContentParent::AllocPBrowserParent(const IPCTabContext& aContext,
const uint32_t& aChromeFlags,
const uint64_t& aId,
const bool& aIsForApp,
const bool& aIsForBrowser)
{
unused << aChromeFlags;
unused << aId;
unused << aIsForApp;
unused << aIsForBrowser;
const IPCTabAppBrowserContext& appBrowser = aContext.appBrowserContext();
// We don't trust the IPCTabContext we receive from the child, so we'll bail
// if we receive an IPCTabContext that's not a PopupIPCTabContext.
// (PopupIPCTabContext lets the child process prove that it has access to
// the app it's trying to open.)
if (appBrowser.type() != IPCTabAppBrowserContext::TPopupIPCTabContext) {
NS_ERROR("Unexpected IPCTabContext type. Aborting AllocPBrowserParent.");
return nullptr;
}
const PopupIPCTabContext& popupContext = appBrowser.get_PopupIPCTabContext();
TabParent* opener = static_cast<TabParent*>(popupContext.openerParent());
if (!opener) {
NS_ERROR("Got null opener from child; aborting AllocPBrowserParent.");
return nullptr;
}
// Popup windows of isBrowser frames must be isBrowser if the parent
// isBrowser. Allocating a !isBrowser frame with same app ID would allow
// the content to access data it's not supposed to.
if (!popupContext.isBrowserElement() && opener->IsBrowserElement()) {
NS_ERROR("Child trying to escalate privileges! Aborting AllocPBrowserParent.");
return nullptr;
}
MaybeInvalidTabContext tc(aContext);
if (!tc.IsValid()) {
NS_ERROR(nsPrintfCString("Child passed us an invalid TabContext. (%s) "
"Aborting AllocPBrowserParent.",
tc.GetInvalidReason()).get());
return nullptr;
}
TabParent* parent = new TabParent(this, tc.GetTabContext(), aChromeFlags);
// We release this ref in DeallocPBrowserParent()
NS_ADDREF(parent);
return parent;
}
bool
nsIContentParent::DeallocPBrowserParent(PBrowserParent* aFrame)
{
TabParent* parent = static_cast<TabParent*>(aFrame);
NS_RELEASE(parent);
return true;
}
PBlobParent*
nsIContentParent::AllocPBlobParent(const BlobConstructorParams& aParams)
{
return BlobParent::Create(this, aParams);
}
bool
nsIContentParent::DeallocPBlobParent(PBlobParent* aActor)
{
delete aActor;
return true;
}
BlobParent*
nsIContentParent::GetOrCreateActorForBlob(nsIDOMBlob* aBlob)
{
MOZ_ASSERT(NS_IsMainThread());
MOZ_ASSERT(aBlob);
// If the blob represents a remote blob for this ContentParent then we can
// simply pass its actor back here.
if (nsCOMPtr<nsIRemoteBlob> remoteBlob = do_QueryInterface(aBlob)) {
if (BlobParent* actor = static_cast<BlobParent*>(
static_cast<PBlobParent*>(remoteBlob->GetPBlob()))) {
MOZ_ASSERT(actor);
if (actor->Manager() == this) {
return actor;
}
}
}
// All blobs shared between processes must be immutable.
nsCOMPtr<nsIMutable> mutableBlob = do_QueryInterface(aBlob);
if (!mutableBlob || NS_FAILED(mutableBlob->SetMutable(false))) {
NS_WARNING("Failed to make blob immutable!");
return nullptr;
}
// XXX This is only safe so long as all blob implementations in our tree
// inherit nsDOMFileBase. If that ever changes then this will need to grow
// a real interface or something.
const auto* blob = static_cast<nsDOMFileBase*>(aBlob);
ChildBlobConstructorParams params;
if (blob->IsSizeUnknown() || blob->IsDateUnknown()) {
// We don't want to call GetSize or GetLastModifiedDate
// yet since that may stat a file on the main thread
// here. Instead we'll learn the size lazily from the
// other process.
params = MysteryBlobConstructorParams();
}
else {
nsString contentType;
nsresult rv = aBlob->GetType(contentType);
NS_ENSURE_SUCCESS(rv, nullptr);
uint64_t length;
rv = aBlob->GetSize(&length);
NS_ENSURE_SUCCESS(rv, nullptr);
nsCOMPtr<nsIDOMFile> file = do_QueryInterface(aBlob);
if (file) {
FileBlobConstructorParams fileParams;
rv = file->GetMozLastModifiedDate(&fileParams.modDate());
NS_ENSURE_SUCCESS(rv, nullptr);
rv = file->GetName(fileParams.name());
NS_ENSURE_SUCCESS(rv, nullptr);
fileParams.contentType() = contentType;
fileParams.length() = length;
params = fileParams;
} else {
NormalBlobConstructorParams blobParams;
blobParams.contentType() = contentType;
blobParams.length() = length;
params = blobParams;
}
}
BlobParent* actor = BlobParent::Create(this, aBlob);
NS_ENSURE_TRUE(actor, nullptr);
return SendPBlobConstructor(actor, params) ? actor : nullptr;
}
bool
nsIContentParent::RecvSyncMessage(const nsString& aMsg,
const ClonedMessageData& aData,
const InfallibleTArray<CpowEntry>& aCpows,
const IPC::Principal& aPrincipal,
InfallibleTArray<nsString>* aRetvals)
{
// FIXME Permission check in Content process
nsIPrincipal* principal = aPrincipal;
ContentParent* parent = AsContentParent();
if (!Preferences::GetBool("dom.testing.ignore_ipc_principal", false) &&
parent && principal && !AssertAppPrincipal(parent, principal)) {
return false;
}
nsRefPtr<nsFrameMessageManager> ppm = mMessageManager;
if (ppm) {
StructuredCloneData cloneData = ipc::UnpackClonedMessageDataForParent(aData);
CpowIdHolder cpows(GetCPOWManager(), aCpows);
ppm->ReceiveMessage(static_cast<nsIContentFrameMessageManager*>(ppm.get()),
aMsg, true, &cloneData, &cpows, aPrincipal, aRetvals);
}
return true;
}
bool
nsIContentParent::AnswerRpcMessage(const nsString& aMsg,
const ClonedMessageData& aData,
const InfallibleTArray<CpowEntry>& aCpows,
const IPC::Principal& aPrincipal,
InfallibleTArray<nsString>* aRetvals)
{
// FIXME Permission check in Content process
nsIPrincipal* principal = aPrincipal;
ContentParent* parent = AsContentParent();
if (!Preferences::GetBool("dom.testing.ignore_ipc_principal", false) &&
parent && principal && !AssertAppPrincipal(parent, principal)) {
return false;
}
nsRefPtr<nsFrameMessageManager> ppm = mMessageManager;
if (ppm) {
StructuredCloneData cloneData = ipc::UnpackClonedMessageDataForParent(aData);
CpowIdHolder cpows(GetCPOWManager(), aCpows);
ppm->ReceiveMessage(static_cast<nsIContentFrameMessageManager*>(ppm.get()),
aMsg, true, &cloneData, &cpows, aPrincipal, aRetvals);
}
return true;
}
bool
nsIContentParent::RecvAsyncMessage(const nsString& aMsg,
const ClonedMessageData& aData,
const InfallibleTArray<CpowEntry>& aCpows,
const IPC::Principal& aPrincipal)
{
// FIXME Permission check in Content process
nsIPrincipal* principal = aPrincipal;
ContentParent* parent = AsContentParent();
if (!Preferences::GetBool("dom.testing.ignore_ipc_principal", false) &&
parent && principal && !AssertAppPrincipal(parent, principal)) {
return false;
}
nsRefPtr<nsFrameMessageManager> ppm = mMessageManager;
if (ppm) {
StructuredCloneData cloneData = ipc::UnpackClonedMessageDataForParent(aData);
CpowIdHolder cpows(GetCPOWManager(), aCpows);
ppm->ReceiveMessage(static_cast<nsIContentFrameMessageManager*>(ppm.get()),
aMsg, false, &cloneData, &cpows, aPrincipal, nullptr);
}
return true;
}
} // namespace dom
} // namespace mozilla

Просмотреть файл

@ -1,95 +0,0 @@
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=2 et sw=2 tw=80: */
/* 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_nsIContentParent_h
#define mozilla_dom_nsIContentParent_h
#include "mozilla/dom/ipc/Blob.h"
#include "nsFrameMessageManager.h"
#include "nsISupports.h"
#define NS_ICONTENTPARENT_IID \
{ 0xeeec9ebf, 0x8ecf, 0x4e38, \
{ 0x81, 0xda, 0xb7, 0x34, 0x13, 0x7e, 0xac, 0xf3 } }
class nsFrameMessageManager;
namespace IPC {
class Principal;
} // namespace IPC
namespace mozilla {
namespace jsipc {
class PJavaScriptParent;
class JavaScriptParent;
class CpowEntry;
} // namespace jsipc
namespace dom {
struct IPCTabContext;
class ContentParent;
class nsIContentParent : public nsISupports
, public mozilla::dom::ipc::MessageManagerCallback
{
public:
NS_DECLARE_STATIC_IID_ACCESSOR(NS_ICONTENTPARENT_IID)
nsIContentParent();
BlobParent* GetOrCreateActorForBlob(nsIDOMBlob* aBlob);
virtual uint64_t ChildID() = 0;
virtual PBlobParent* SendPBlobConstructor(
PBlobParent* actor,
const BlobConstructorParams& params) NS_WARN_UNUSED_RESULT = 0;
virtual jsipc::JavaScriptParent *GetCPOWManager() = 0;
virtual bool IsContentParent() { return false; }
ContentParent* AsContentParent();
protected: // IPDL methods
virtual mozilla::jsipc::PJavaScriptParent* AllocPJavaScriptParent();
virtual bool DeallocPJavaScriptParent(mozilla::jsipc::PJavaScriptParent*);
virtual PBrowserParent* AllocPBrowserParent(const IPCTabContext& aContext,
const uint32_t& aChromeFlags,
const uint64_t& aId,
const bool& aIsForApp,
const bool& aIsForBrowser);
virtual bool DeallocPBrowserParent(PBrowserParent* frame);
virtual PBlobParent* AllocPBlobParent(const BlobConstructorParams& aParams);
virtual bool DeallocPBlobParent(PBlobParent*);
virtual bool RecvSyncMessage(const nsString& aMsg,
const ClonedMessageData& aData,
const InfallibleTArray<jsipc::CpowEntry>& aCpows,
const IPC::Principal& aPrincipal,
InfallibleTArray<nsString>* aRetvals);
virtual bool AnswerRpcMessage(const nsString& aMsg,
const ClonedMessageData& aData,
const InfallibleTArray<jsipc::CpowEntry>& aCpows,
const IPC::Principal& aPrincipal,
InfallibleTArray<nsString>* aRetvals);
virtual bool RecvAsyncMessage(const nsString& aMsg,
const ClonedMessageData& aData,
const InfallibleTArray<jsipc::CpowEntry>& aCpows,
const IPC::Principal& aPrincipal);
protected: // members
nsRefPtr<nsFrameMessageManager> mMessageManager;
};
NS_DEFINE_STATIC_IID_ACCESSOR(nsIContentParent, NS_ICONTENTPARENT_IID)
} // namespace dom
} // namespace mozilla
#endif /* mozilla_dom_nsIContentParent_h */