123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178 |
- /* -*- Mode: C++; tab-width: 2; 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 "MessagePortParent.h"
- #include "MessagePortService.h"
- #include "SharedMessagePortMessage.h"
- #include "mozilla/Unused.h"
- namespace mozilla {
- namespace dom {
- MessagePortParent::MessagePortParent(const nsID& aUUID)
- : mService(MessagePortService::GetOrCreate())
- , mUUID(aUUID)
- , mEntangled(false)
- , mCanSendData(true)
- {
- MOZ_ASSERT(mService);
- }
- MessagePortParent::~MessagePortParent()
- {
- MOZ_ASSERT(!mService);
- MOZ_ASSERT(!mEntangled);
- }
- bool
- MessagePortParent::Entangle(const nsID& aDestinationUUID,
- const uint32_t& aSequenceID)
- {
- if (!mService) {
- NS_WARNING("Entangle is called after a shutdown!");
- return false;
- }
- MOZ_ASSERT(!mEntangled);
- return mService->RequestEntangling(this, aDestinationUUID, aSequenceID);
- }
- bool
- MessagePortParent::RecvPostMessages(nsTArray<MessagePortMessage>&& aMessages)
- {
- // This converts the object in a data struct where we have BlobImpls.
- FallibleTArray<RefPtr<SharedMessagePortMessage>> messages;
- if (NS_WARN_IF(
- !SharedMessagePortMessage::FromMessagesToSharedParent(aMessages,
- messages))) {
- return false;
- }
- if (!mEntangled) {
- return false;
- }
- if (!mService) {
- NS_WARNING("Entangle is called after a shutdown!");
- return false;
- }
- if (messages.IsEmpty()) {
- return false;
- }
- return mService->PostMessages(this, messages);
- }
- bool
- MessagePortParent::RecvDisentangle(nsTArray<MessagePortMessage>&& aMessages)
- {
- // This converts the object in a data struct where we have BlobImpls.
- FallibleTArray<RefPtr<SharedMessagePortMessage>> messages;
- if (NS_WARN_IF(
- !SharedMessagePortMessage::FromMessagesToSharedParent(aMessages,
- messages))) {
- return false;
- }
- if (!mEntangled) {
- return false;
- }
- if (!mService) {
- NS_WARNING("Entangle is called after a shutdown!");
- return false;
- }
- if (!mService->DisentanglePort(this, messages)) {
- return false;
- }
- CloseAndDelete();
- return true;
- }
- bool
- MessagePortParent::RecvStopSendingData()
- {
- if (!mEntangled) {
- return true;
- }
- mCanSendData = false;
- Unused << SendStopSendingDataConfirmed();
- return true;
- }
- bool
- MessagePortParent::RecvClose()
- {
- if (mService) {
- MOZ_ASSERT(mEntangled);
- if (!mService->ClosePort(this)) {
- return false;
- }
- Close();
- }
- MOZ_ASSERT(!mEntangled);
- Unused << Send__delete__(this);
- return true;
- }
- void
- MessagePortParent::ActorDestroy(ActorDestroyReason aWhy)
- {
- if (mService && mEntangled) {
- // When the last parent is deleted, this service is freed but this cannot
- // be done when the hashtables are written by CloseAll.
- RefPtr<MessagePortService> kungFuDeathGrip = mService;
- kungFuDeathGrip->ParentDestroy(this);
- }
- }
- bool
- MessagePortParent::Entangled(const nsTArray<MessagePortMessage>& aMessages)
- {
- MOZ_ASSERT(!mEntangled);
- mEntangled = true;
- return SendEntangled(aMessages);
- }
- void
- MessagePortParent::CloseAndDelete()
- {
- Close();
- Unused << Send__delete__(this);
- }
- void
- MessagePortParent::Close()
- {
- mService = nullptr;
- mEntangled = false;
- }
- /* static */ bool
- MessagePortParent::ForceClose(const nsID& aUUID,
- const nsID& aDestinationUUID,
- const uint32_t& aSequenceID)
- {
- MessagePortService* service = MessagePortService::Get();
- if (!service) {
- NS_WARNING("The service must exist if we want to close an existing MessagePort.");
- return false;
- }
- return service->ForceClose(aUUID, aDestinationUUID, aSequenceID);
- }
- } // namespace dom
- } // namespace mozilla
|