/* 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 "BackgroundChildImpl.h" #include "ActorsChild.h" // IndexedDB #include "BroadcastChannelChild.h" #include "FileDescriptorSetChild.h" #include "mozilla/media/MediaChild.h" #include "mozilla/Assertions.h" #include "mozilla/dom/PBlobChild.h" #include "mozilla/dom/cache/ActorUtils.h" #include "mozilla/dom/indexedDB/PBackgroundIDBFactoryChild.h" #include "mozilla/dom/ipc/BlobChild.h" #include "mozilla/ipc/PBackgroundTestChild.h" #include "mozilla/layout/VsyncChild.h" #include "nsID.h" #include "nsTraceRefcnt.h" namespace { class TestChild final : public mozilla::ipc::PBackgroundTestChild { friend class mozilla::ipc::BackgroundChildImpl; nsCString mTestArg; explicit TestChild(const nsCString& aTestArg) : mTestArg(aTestArg) { MOZ_COUNT_CTOR(TestChild); } protected: ~TestChild() { MOZ_COUNT_DTOR(TestChild); } public: virtual bool Recv__delete__(const nsCString& aTestArg) override; }; } // anonymous namespace namespace mozilla { namespace ipc { using mozilla::dom::cache::PCacheChild; using mozilla::dom::cache::PCacheStorageChild; using mozilla::dom::cache::PCacheStreamControlChild; // ----------------------------------------------------------------------------- // BackgroundChildImpl::ThreadLocal // ----------------------------------------------------------------------------- BackgroundChildImpl:: ThreadLocal::ThreadLocal() { // May happen on any thread! MOZ_COUNT_CTOR(mozilla::ipc::BackgroundChildImpl::ThreadLocal); } BackgroundChildImpl:: ThreadLocal::~ThreadLocal() { // May happen on any thread! MOZ_COUNT_DTOR(mozilla::ipc::BackgroundChildImpl::ThreadLocal); } // ----------------------------------------------------------------------------- // BackgroundChildImpl // ----------------------------------------------------------------------------- BackgroundChildImpl::BackgroundChildImpl() { // May happen on any thread! MOZ_COUNT_CTOR(mozilla::ipc::BackgroundChildImpl); } BackgroundChildImpl::~BackgroundChildImpl() { // May happen on any thread! MOZ_COUNT_DTOR(mozilla::ipc::BackgroundChildImpl); } void BackgroundChildImpl::ProcessingError(Result aCode, const char* aReason) { // May happen on any thread! nsAutoCString abortMessage; switch (aCode) { #define HANDLE_CASE(_result) \ case _result: \ abortMessage.AssignLiteral(#_result); \ break HANDLE_CASE(MsgDropped); HANDLE_CASE(MsgNotKnown); HANDLE_CASE(MsgNotAllowed); HANDLE_CASE(MsgPayloadError); HANDLE_CASE(MsgProcessingError); HANDLE_CASE(MsgRouteError); HANDLE_CASE(MsgValueError); #undef HANDLE_CASE default: MOZ_CRASH("Unknown error code!"); } // This is just MOZ_CRASH() un-inlined so that we can pass the result code as // a string. MOZ_CRASH() only supports string literals at the moment. MOZ_ReportCrash(abortMessage.get(), __FILE__, __LINE__); MOZ_REALLY_CRASH(); } void BackgroundChildImpl::ActorDestroy(ActorDestroyReason aWhy) { // May happen on any thread! } PBackgroundTestChild* BackgroundChildImpl::AllocPBackgroundTestChild(const nsCString& aTestArg) { return new TestChild(aTestArg); } bool BackgroundChildImpl::DeallocPBackgroundTestChild(PBackgroundTestChild* aActor) { MOZ_ASSERT(aActor); delete static_cast(aActor); return true; } BackgroundChildImpl::PBackgroundIDBFactoryChild* BackgroundChildImpl::AllocPBackgroundIDBFactoryChild( const LoggingInfo& aLoggingInfo) { MOZ_CRASH("PBackgroundIDBFactoryChild actors should be manually " "constructed!"); } bool BackgroundChildImpl::DeallocPBackgroundIDBFactoryChild( PBackgroundIDBFactoryChild* aActor) { MOZ_ASSERT(aActor); delete aActor; return true; } auto BackgroundChildImpl::AllocPBlobChild(const BlobConstructorParams& aParams) -> PBlobChild* { MOZ_ASSERT(aParams.type() != BlobConstructorParams::T__None); return mozilla::dom::BlobChild::Create(this, aParams); } bool BackgroundChildImpl::DeallocPBlobChild(PBlobChild* aActor) { MOZ_ASSERT(aActor); mozilla::dom::BlobChild::Destroy(aActor); return true; } PFileDescriptorSetChild* BackgroundChildImpl::AllocPFileDescriptorSetChild( const FileDescriptor& aFileDescriptor) { return new FileDescriptorSetChild(aFileDescriptor); } bool BackgroundChildImpl::DeallocPFileDescriptorSetChild( PFileDescriptorSetChild* aActor) { MOZ_ASSERT(aActor); delete static_cast(aActor); return true; } BackgroundChildImpl::PVsyncChild* BackgroundChildImpl::AllocPVsyncChild() { nsRefPtr actor = new mozilla::layout::VsyncChild(); // There still has one ref-count after return, and it will be released in // DeallocPVsyncChild(). return actor.forget().take(); } bool BackgroundChildImpl::DeallocPVsyncChild(PVsyncChild* aActor) { MOZ_ASSERT(aActor); // This actor already has one ref-count. Please check AllocPVsyncChild(). nsRefPtr actor = dont_AddRef(static_cast(aActor)); return true; } // ----------------------------------------------------------------------------- // BroadcastChannel API // ----------------------------------------------------------------------------- dom::PBroadcastChannelChild* BackgroundChildImpl::AllocPBroadcastChannelChild(const PrincipalInfo& aPrincipalInfo, const nsString& aOrigin, const nsString& aChannel) { nsRefPtr agent = new dom::BroadcastChannelChild(aOrigin, aChannel); return agent.forget().take(); } bool BackgroundChildImpl::DeallocPBroadcastChannelChild( PBroadcastChannelChild* aActor) { nsRefPtr child = dont_AddRef(static_cast(aActor)); MOZ_ASSERT(child); return true; } // ----------------------------------------------------------------------------- // Cache API // ----------------------------------------------------------------------------- PCacheStorageChild* BackgroundChildImpl::AllocPCacheStorageChild(const Namespace& aNamespace, const PrincipalInfo& aPrincipalInfo) { MOZ_CRASH("CacheStorageChild actor must be provided to PBackground manager"); return nullptr; } bool BackgroundChildImpl::DeallocPCacheStorageChild(PCacheStorageChild* aActor) { dom::cache::DeallocPCacheStorageChild(aActor); return true; } PCacheChild* BackgroundChildImpl::AllocPCacheChild() { return dom::cache::AllocPCacheChild(); } bool BackgroundChildImpl::DeallocPCacheChild(PCacheChild* aActor) { dom::cache::DeallocPCacheChild(aActor); return true; } PCacheStreamControlChild* BackgroundChildImpl::AllocPCacheStreamControlChild() { return dom::cache::AllocPCacheStreamControlChild(); } bool BackgroundChildImpl::DeallocPCacheStreamControlChild(PCacheStreamControlChild* aActor) { dom::cache::DeallocPCacheStreamControlChild(aActor); return true; } media::PMediaChild* BackgroundChildImpl::AllocPMediaChild() { return media::CreateMediaChild(); } bool BackgroundChildImpl::DeallocPMediaChild(media::PMediaChild *aActor) { delete aActor; return true; } } // namespace ipc } // namespace mozilla bool TestChild::Recv__delete__(const nsCString& aTestArg) { MOZ_RELEASE_ASSERT(aTestArg == mTestArg, "BackgroundTest message was corrupted!"); return true; }