123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221 |
- /* -*- 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 "mozilla/dom/ContentBridgeParent.h"
- #include "mozilla/dom/TabParent.h"
- #include "mozilla/jsipc/CrossProcessObjectWrappers.h"
- #include "nsXULAppAPI.h"
- #include "nsIObserverService.h"
- #include "base/task.h"
- using namespace mozilla::ipc;
- using namespace mozilla::jsipc;
- namespace mozilla {
- namespace dom {
- NS_IMPL_ISUPPORTS(ContentBridgeParent,
- nsIContentParent,
- nsIObserver)
- ContentBridgeParent::ContentBridgeParent(Transport* aTransport)
- : mTransport(aTransport)
- {}
- ContentBridgeParent::~ContentBridgeParent()
- {
- }
- void
- ContentBridgeParent::ActorDestroy(ActorDestroyReason aWhy)
- {
- nsCOMPtr<nsIObserverService> os = mozilla::services::GetObserverService();
- if (os) {
- os->RemoveObserver(this, "content-child-shutdown");
- }
- MessageLoop::current()->PostTask(NewRunnableMethod(this, &ContentBridgeParent::DeferredDestroy));
- }
- /*static*/ ContentBridgeParent*
- ContentBridgeParent::Create(Transport* aTransport, ProcessId aOtherPid)
- {
- RefPtr<ContentBridgeParent> bridge =
- new ContentBridgeParent(aTransport);
- bridge->mSelfRef = bridge;
- DebugOnly<bool> ok = bridge->Open(aTransport, aOtherPid,
- XRE_GetIOMessageLoop());
- MOZ_ASSERT(ok);
- nsCOMPtr<nsIObserverService> os = mozilla::services::GetObserverService();
- if (os) {
- os->AddObserver(bridge, "content-child-shutdown", false);
- }
- // Initialize the message manager (and load delayed scripts) now that we
- // have established communications with the child.
- bridge->mMessageManager->InitWithCallback(bridge);
- return bridge.get();
- }
- void
- ContentBridgeParent::DeferredDestroy()
- {
- mSelfRef = nullptr;
- // |this| was just destroyed, hands off
- }
- bool
- ContentBridgeParent::RecvSyncMessage(const nsString& aMsg,
- const ClonedMessageData& aData,
- InfallibleTArray<jsipc::CpowEntry>&& aCpows,
- const IPC::Principal& aPrincipal,
- nsTArray<StructuredCloneData>* aRetvals)
- {
- return nsIContentParent::RecvSyncMessage(aMsg, aData, Move(aCpows),
- aPrincipal, aRetvals);
- }
- bool
- ContentBridgeParent::RecvAsyncMessage(const nsString& aMsg,
- InfallibleTArray<jsipc::CpowEntry>&& aCpows,
- const IPC::Principal& aPrincipal,
- const ClonedMessageData& aData)
- {
- return nsIContentParent::RecvAsyncMessage(aMsg, Move(aCpows),
- aPrincipal, aData);
- }
- PBlobParent*
- ContentBridgeParent::SendPBlobConstructor(PBlobParent* actor,
- const BlobConstructorParams& params)
- {
- return PContentBridgeParent::SendPBlobConstructor(actor, params);
- }
- PBrowserParent*
- ContentBridgeParent::SendPBrowserConstructor(PBrowserParent* aActor,
- const TabId& aTabId,
- const IPCTabContext& aContext,
- const uint32_t& aChromeFlags,
- const ContentParentId& aCpID,
- const bool& aIsForApp,
- const bool& aIsForBrowser)
- {
- return PContentBridgeParent::SendPBrowserConstructor(aActor,
- aTabId,
- aContext,
- aChromeFlags,
- aCpID,
- aIsForApp,
- aIsForBrowser);
- }
- PBlobParent*
- ContentBridgeParent::AllocPBlobParent(const BlobConstructorParams& aParams)
- {
- return nsIContentParent::AllocPBlobParent(aParams);
- }
- bool
- ContentBridgeParent::DeallocPBlobParent(PBlobParent* aActor)
- {
- return nsIContentParent::DeallocPBlobParent(aActor);
- }
- mozilla::jsipc::PJavaScriptParent *
- ContentBridgeParent::AllocPJavaScriptParent()
- {
- return nsIContentParent::AllocPJavaScriptParent();
- }
- bool
- ContentBridgeParent::DeallocPJavaScriptParent(PJavaScriptParent *parent)
- {
- return nsIContentParent::DeallocPJavaScriptParent(parent);
- }
- PBrowserParent*
- ContentBridgeParent::AllocPBrowserParent(const TabId& aTabId,
- const IPCTabContext &aContext,
- const uint32_t& aChromeFlags,
- const ContentParentId& aCpID,
- const bool& aIsForApp,
- const bool& aIsForBrowser)
- {
- return nsIContentParent::AllocPBrowserParent(aTabId,
- aContext,
- aChromeFlags,
- aCpID,
- aIsForApp,
- aIsForBrowser);
- }
- bool
- ContentBridgeParent::DeallocPBrowserParent(PBrowserParent* aParent)
- {
- return nsIContentParent::DeallocPBrowserParent(aParent);
- }
- void
- ContentBridgeParent::NotifyTabDestroyed()
- {
- int32_t numLiveTabs = ManagedPBrowserParent().Count();
- if (numLiveTabs == 1) {
- MessageLoop::current()->PostTask(NewRunnableMethod(this, &ContentBridgeParent::Close));
- }
- }
- // This implementation is identical to ContentParent::GetCPOWManager but we can't
- // move it to nsIContentParent because it calls ManagedPJavaScriptParent() which
- // only exists in PContentParent and PContentBridgeParent.
- jsipc::CPOWManager*
- ContentBridgeParent::GetCPOWManager()
- {
- if (PJavaScriptParent* p = LoneManagedOrNullAsserts(ManagedPJavaScriptParent())) {
- return CPOWManagerFor(p);
- }
- return nullptr;
- }
- NS_IMETHODIMP
- ContentBridgeParent::Observe(nsISupports* aSubject,
- const char* aTopic,
- const char16_t* aData)
- {
- if (!strcmp(aTopic, "content-child-shutdown")) {
- Close();
- }
- return NS_OK;
- }
- PFileDescriptorSetParent*
- ContentBridgeParent::AllocPFileDescriptorSetParent(const FileDescriptor& aFD)
- {
- return nsIContentParent::AllocPFileDescriptorSetParent(aFD);
- }
- bool
- ContentBridgeParent::DeallocPFileDescriptorSetParent(PFileDescriptorSetParent* aActor)
- {
- return nsIContentParent::DeallocPFileDescriptorSetParent(aActor);
- }
- PSendStreamParent*
- ContentBridgeParent::AllocPSendStreamParent()
- {
- return nsIContentParent::AllocPSendStreamParent();
- }
- bool
- ContentBridgeParent::DeallocPSendStreamParent(PSendStreamParent* aActor)
- {
- return nsIContentParent::DeallocPSendStreamParent(aActor);
- }
- } // namespace dom
- } // namespace mozilla
|