123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159 |
- /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
- /* 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 "nsIContentChild.h"
- #include "mozilla/dom/ContentChild.h"
- #include "mozilla/dom/DOMTypes.h"
- #include "mozilla/dom/File.h"
- #include "mozilla/dom/PermissionMessageUtils.h"
- #include "mozilla/dom/TabChild.h"
- #include "mozilla/dom/ipc/BlobChild.h"
- #include "mozilla/dom/ipc/StructuredCloneData.h"
- #include "mozilla/ipc/FileDescriptorSetChild.h"
- #include "mozilla/ipc/InputStreamUtils.h"
- #include "mozilla/ipc/SendStream.h"
- #include "nsPrintfCString.h"
- #include "xpcpublic.h"
- using namespace mozilla::ipc;
- using namespace mozilla::jsipc;
- namespace mozilla {
- namespace dom {
- PJavaScriptChild*
- nsIContentChild::AllocPJavaScriptChild()
- {
- return NewJavaScriptChild();
- }
- bool
- nsIContentChild::DeallocPJavaScriptChild(PJavaScriptChild* aChild)
- {
- ReleaseJavaScriptChild(aChild);
- return true;
- }
- PBrowserChild*
- nsIContentChild::AllocPBrowserChild(const TabId& aTabId,
- const IPCTabContext& aContext,
- const uint32_t& aChromeFlags,
- const ContentParentId& aCpID,
- const bool& aIsForApp,
- const bool& aIsForBrowser)
- {
- // We'll happily accept any kind of IPCTabContext here; we don't need to
- // check that it's of a certain type for security purposes, because we
- // believe whatever the parent process tells us.
- MaybeInvalidTabContext tc(aContext);
- if (!tc.IsValid()) {
- NS_ERROR(nsPrintfCString("Received an invalid TabContext from "
- "the parent process. (%s) Crashing...",
- tc.GetInvalidReason()).get());
- MOZ_CRASH("Invalid TabContext received from the parent process.");
- }
- RefPtr<TabChild> child =
- TabChild::Create(this, aTabId, tc.GetTabContext(), aChromeFlags);
- // The ref here is released in DeallocPBrowserChild.
- return child.forget().take();
- }
- bool
- nsIContentChild::DeallocPBrowserChild(PBrowserChild* aIframe)
- {
- TabChild* child = static_cast<TabChild*>(aIframe);
- NS_RELEASE(child);
- return true;
- }
- PBlobChild*
- nsIContentChild::AllocPBlobChild(const BlobConstructorParams& aParams)
- {
- return BlobChild::Create(this, aParams);
- }
- bool
- nsIContentChild::DeallocPBlobChild(PBlobChild* aActor)
- {
- BlobChild::Destroy(aActor);
- return true;
- }
- BlobChild*
- nsIContentChild::GetOrCreateActorForBlob(Blob* aBlob)
- {
- MOZ_ASSERT(NS_IsMainThread());
- MOZ_ASSERT(aBlob);
- RefPtr<BlobImpl> blobImpl = aBlob->Impl();
- MOZ_ASSERT(blobImpl);
- return GetOrCreateActorForBlobImpl(blobImpl);
- }
- BlobChild*
- nsIContentChild::GetOrCreateActorForBlobImpl(BlobImpl* aImpl)
- {
- MOZ_ASSERT(NS_IsMainThread());
- MOZ_ASSERT(aImpl);
- BlobChild* actor = BlobChild::GetOrCreate(this, aImpl);
- NS_ENSURE_TRUE(actor, nullptr);
- return actor;
- }
- PSendStreamChild*
- nsIContentChild::AllocPSendStreamChild()
- {
- MOZ_CRASH("PSendStreamChild actors should be manually constructed!");
- }
- bool
- nsIContentChild::DeallocPSendStreamChild(PSendStreamChild* aActor)
- {
- delete aActor;
- return true;
- }
- PFileDescriptorSetChild*
- nsIContentChild::AllocPFileDescriptorSetChild(const FileDescriptor& aFD)
- {
- return new FileDescriptorSetChild(aFD);
- }
- bool
- nsIContentChild::DeallocPFileDescriptorSetChild(PFileDescriptorSetChild* aActor)
- {
- delete static_cast<FileDescriptorSetChild*>(aActor);
- return true;
- }
- bool
- nsIContentChild::RecvAsyncMessage(const nsString& aMsg,
- InfallibleTArray<CpowEntry>&& aCpows,
- const IPC::Principal& aPrincipal,
- const ClonedMessageData& aData)
- {
- RefPtr<nsFrameMessageManager> cpm = nsFrameMessageManager::GetChildProcessManager();
- if (cpm) {
- ipc::StructuredCloneData data;
- ipc::UnpackClonedMessageDataForChild(aData, data);
- CrossProcessCpowHolder cpows(this, aCpows);
- cpm->ReceiveMessage(static_cast<nsIContentFrameMessageManager*>(cpm.get()), nullptr,
- aMsg, false, &data, &cpows, aPrincipal, nullptr);
- }
- return true;
- }
- } // namespace dom
- } // namespace mozilla
|