diff options
Diffstat (limited to 'dom/broadcastchannel/BroadcastChannelParent.cpp')
-rw-r--r-- | dom/broadcastchannel/BroadcastChannelParent.cpp | 102 |
1 files changed, 102 insertions, 0 deletions
diff --git a/dom/broadcastchannel/BroadcastChannelParent.cpp b/dom/broadcastchannel/BroadcastChannelParent.cpp new file mode 100644 index 000000000..f26292e1d --- /dev/null +++ b/dom/broadcastchannel/BroadcastChannelParent.cpp @@ -0,0 +1,102 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=8 sts=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 "BroadcastChannelParent.h" +#include "BroadcastChannelService.h" +#include "mozilla/dom/File.h" +#include "mozilla/dom/ipc/BlobParent.h" +#include "mozilla/ipc/BackgroundParent.h" +#include "mozilla/Unused.h" +#include "nsIScriptSecurityManager.h" + +namespace mozilla { + +using namespace ipc; + +namespace dom { + +BroadcastChannelParent::BroadcastChannelParent(const nsAString& aOriginChannelKey) + : mService(BroadcastChannelService::GetOrCreate()) + , mOriginChannelKey(aOriginChannelKey) +{ + AssertIsOnBackgroundThread(); + mService->RegisterActor(this, mOriginChannelKey); +} + +BroadcastChannelParent::~BroadcastChannelParent() +{ + AssertIsOnBackgroundThread(); +} + +bool +BroadcastChannelParent::RecvPostMessage(const ClonedMessageData& aData) +{ + AssertIsOnBackgroundThread(); + + if (NS_WARN_IF(!mService)) { + return false; + } + + mService->PostMessage(this, aData, mOriginChannelKey); + return true; +} + +bool +BroadcastChannelParent::RecvClose() +{ + AssertIsOnBackgroundThread(); + + if (NS_WARN_IF(!mService)) { + return false; + } + + mService->UnregisterActor(this, mOriginChannelKey); + mService = nullptr; + + Unused << Send__delete__(this); + + return true; +} + +void +BroadcastChannelParent::ActorDestroy(ActorDestroyReason aWhy) +{ + AssertIsOnBackgroundThread(); + + if (mService) { + // This object is about to be released and with it, also mService will be + // released too. + mService->UnregisterActor(this, mOriginChannelKey); + } +} + +void +BroadcastChannelParent::Deliver(const ClonedMessageData& aData) +{ + AssertIsOnBackgroundThread(); + + // Duplicate the data for this parent. + ClonedMessageData newData(aData); + + // Create new BlobParent objects for this message. + for (uint32_t i = 0, len = newData.blobsParent().Length(); i < len; ++i) { + RefPtr<BlobImpl> impl = + static_cast<BlobParent*>(newData.blobsParent()[i])->GetBlobImpl(); + + PBlobParent* blobParent = + BackgroundParent::GetOrCreateActorForBlobImpl(Manager(), impl); + if (!blobParent) { + return; + } + + newData.blobsParent()[i] = blobParent; + } + + Unused << SendNotify(newData); +} + +} // namespace dom +} // namespace mozilla |