Bug 1610020 - BroadcastChannel + wasm - part 2 - Move SharedMessagePortMessage into dom/ipc, r=smaug

Differential Revision: https://phabricator.services.mozilla.com/D60318

--HG--
rename : dom/messagechannel/SharedMessagePortMessage.cpp => dom/ipc/SharedMessageBody.cpp
rename : dom/messagechannel/SharedMessagePortMessage.h => dom/ipc/SharedMessageBody.h
extra : moz-landing-system : lando
This commit is contained in:
Andrea Marchesini 2020-01-24 07:59:36 +00:00
parent 1d307811b9
commit f5408828e0
9 changed files with 100 additions and 103 deletions

View File

@ -4,11 +4,9 @@
* 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 "SharedMessagePortMessage.h"
#include "MessagePort.h"
#include "MessagePortChild.h"
#include "MessagePortParent.h"
#include "SharedMessageBody.h"
#include "mozilla/dom/File.h"
#include "mozilla/dom/MessagePort.h"
#include "mozilla/dom/RefMessageBodyService.h"
#include "mozilla/dom/PMessagePort.h"
#include "mozilla/ipc/BackgroundChild.h"
@ -20,12 +18,12 @@ using namespace ipc;
namespace dom {
SharedMessagePortMessage::SharedMessagePortMessage() : mRefDataId({}) {}
SharedMessageBody::SharedMessageBody() : mRefDataId({}) {}
void SharedMessagePortMessage::Write(
JSContext* aCx, JS::Handle<JS::Value> aValue,
JS::Handle<JS::Value> aTransfers, nsID& aPortID,
RefMessageBodyService* aRefMessageBodyService, ErrorResult& aRv) {
void SharedMessageBody::Write(JSContext* aCx, JS::Handle<JS::Value> aValue,
JS::Handle<JS::Value> aTransfers, nsID& aPortID,
RefMessageBodyService* aRefMessageBodyService,
ErrorResult& aRv) {
MOZ_ASSERT(!mCloneData && !mRefData);
MOZ_ASSERT(aRefMessageBodyService);
@ -47,9 +45,10 @@ void SharedMessagePortMessage::Write(
mRefDataId = aRefMessageBodyService->Register(refData.forget(), aRv);
}
void SharedMessagePortMessage::Read(
JSContext* aCx, JS::MutableHandle<JS::Value> aValue,
RefMessageBodyService* aRefMessageBodyService, ErrorResult& aRv) {
void SharedMessageBody::Read(JSContext* aCx,
JS::MutableHandle<JS::Value> aValue,
RefMessageBodyService* aRefMessageBodyService,
ErrorResult& aRv) {
MOZ_ASSERT(aRefMessageBodyService);
if (mCloneData) {
@ -66,7 +65,7 @@ void SharedMessagePortMessage::Read(
mRefData->CloneData()->Read(aCx, aValue, aRv);
}
bool SharedMessagePortMessage::TakeTransferredPortsAsSequence(
bool SharedMessageBody::TakeTransferredPortsAsSequence(
Sequence<OwningNonNull<mozilla::dom::MessagePort>>& aPorts) {
if (mCloneData) {
return mCloneData->TakeTransferredPortsAsSequence(aPorts);
@ -77,24 +76,21 @@ bool SharedMessagePortMessage::TakeTransferredPortsAsSequence(
}
/* static */
void SharedMessagePortMessage::FromSharedToMessagesChild(
MessagePortChild* aActor,
const nsTArray<RefPtr<SharedMessagePortMessage>>& aData,
void SharedMessageBody::FromSharedToMessagesChild(
PBackgroundChild* aManager,
const nsTArray<RefPtr<SharedMessageBody>>& aData,
nsTArray<MessageData>& aArray) {
MOZ_ASSERT(aActor);
MOZ_ASSERT(aManager);
MOZ_ASSERT(aArray.IsEmpty());
aArray.SetCapacity(aData.Length());
PBackgroundChild* backgroundManager = aActor->Manager();
MOZ_ASSERT(backgroundManager);
for (auto& data : aData) {
MessageData* message = aArray.AppendElement();
if (data->mCloneData) {
ClonedMessageData clonedData;
data->mCloneData->BuildClonedMessageDataForBackgroundChild(
backgroundManager, clonedData);
data->mCloneData->BuildClonedMessageDataForBackgroundChild(aManager,
clonedData);
*message = clonedData;
continue;
}
@ -104,9 +100,9 @@ void SharedMessagePortMessage::FromSharedToMessagesChild(
}
/* static */
bool SharedMessagePortMessage::FromMessagesToSharedChild(
bool SharedMessageBody::FromMessagesToSharedChild(
nsTArray<MessageData>& aArray,
FallibleTArray<RefPtr<SharedMessagePortMessage>>& aData) {
FallibleTArray<RefPtr<SharedMessageBody>>& aData) {
MOZ_ASSERT(aData.IsEmpty());
if (NS_WARN_IF(!aData.SetCapacity(aArray.Length(), mozilla::fallible))) {
@ -114,7 +110,7 @@ bool SharedMessagePortMessage::FromMessagesToSharedChild(
}
for (auto& message : aArray) {
RefPtr<SharedMessagePortMessage> data = new SharedMessagePortMessage();
RefPtr<SharedMessageBody> data = new SharedMessageBody();
if (message.type() == MessageData::TClonedMessageData) {
data->mCloneData = MakeUnique<ipc::StructuredCloneData>(
@ -134,26 +130,24 @@ bool SharedMessagePortMessage::FromMessagesToSharedChild(
}
/* static */
bool SharedMessagePortMessage::FromSharedToMessagesParent(
MessagePortParent* aActor,
const nsTArray<RefPtr<SharedMessagePortMessage>>& aData,
bool SharedMessageBody::FromSharedToMessagesParent(
PBackgroundParent* aManager,
const nsTArray<RefPtr<SharedMessageBody>>& aData,
FallibleTArray<MessageData>& aArray) {
MOZ_ASSERT(aManager);
MOZ_ASSERT(aArray.IsEmpty());
if (NS_WARN_IF(!aArray.SetCapacity(aData.Length(), mozilla::fallible))) {
return false;
}
PBackgroundParent* backgroundManager = aActor->Manager();
MOZ_ASSERT(backgroundManager);
for (auto& data : aData) {
MessageData* message = aArray.AppendElement(mozilla::fallible);
if (data->mCloneData) {
ClonedMessageData clonedData;
data->mCloneData->BuildClonedMessageDataForBackgroundParent(
backgroundManager, clonedData);
data->mCloneData->BuildClonedMessageDataForBackgroundParent(aManager,
clonedData);
*message = clonedData;
continue;
}
@ -165,9 +159,9 @@ bool SharedMessagePortMessage::FromSharedToMessagesParent(
}
/* static */
bool SharedMessagePortMessage::FromMessagesToSharedParent(
bool SharedMessageBody::FromMessagesToSharedParent(
nsTArray<MessageData>& aArray,
FallibleTArray<RefPtr<SharedMessagePortMessage>>& aData) {
FallibleTArray<RefPtr<SharedMessageBody>>& aData) {
MOZ_ASSERT(aData.IsEmpty());
if (NS_WARN_IF(!aData.SetCapacity(aArray.Length(), mozilla::fallible))) {
@ -175,7 +169,7 @@ bool SharedMessagePortMessage::FromMessagesToSharedParent(
}
for (auto& message : aArray) {
RefPtr<SharedMessagePortMessage> data = new SharedMessagePortMessage();
RefPtr<SharedMessageBody> data = new SharedMessageBody();
if (message.type() == MessageData::TClonedMessageData) {
data->mCloneData = MakeUnique<ipc::StructuredCloneData>(

View File

@ -4,51 +4,54 @@
* 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/. */
#ifndef mozilla_dom_SharedMessagePortMessage_h
#define mozilla_dom_SharedMessagePortMessage_h
#ifndef mozilla_dom_SharedMessageBody_h
#define mozilla_dom_SharedMessageBody_h
#include "mozilla/dom/ipc/StructuredCloneData.h"
namespace mozilla {
namespace ipc {
class PBackgroundChild;
}
namespace dom {
class MessagePortChild;
class MessagePortMessage;
class MessagePortParent;
class MessagePort;
class RefMessageBody;
class RefMessageBodyService;
class SharedMessagePortMessage final {
class SharedMessageBody final {
public:
NS_INLINE_DECL_REFCOUNTING(SharedMessagePortMessage)
NS_INLINE_DECL_REFCOUNTING(SharedMessageBody)
SharedMessagePortMessage();
SharedMessageBody();
// Note that the populated MessageData borrows the underlying
// JSStructuredCloneData from the SharedMessagePortMessage, so the caller is
// JSStructuredCloneData from the SharedMessageBody, so the caller is
// required to ensure that the MessageData instances are destroyed prior to
// the SharedMessagePortMessage instances.
// the SharedMessageBody instances.
static void FromSharedToMessagesChild(
MessagePortChild* aActor,
const nsTArray<RefPtr<SharedMessagePortMessage>>& aData,
mozilla::ipc::PBackgroundChild* aBackgroundManager,
const nsTArray<RefPtr<SharedMessageBody>>& aData,
nsTArray<MessageData>& aArray);
static bool FromMessagesToSharedChild(
nsTArray<MessageData>& aArray,
FallibleTArray<RefPtr<SharedMessagePortMessage>>& aData);
FallibleTArray<RefPtr<SharedMessageBody>>& aData);
// Note that the populated MessageData borrows the underlying
// JSStructuredCloneData from the SharedMessagePortMessage, so the caller is
// JSStructuredCloneData from the SharedMessageBody, so the caller is
// required to ensure that the MessageData instances are destroyed prior to
// the SharedMessagePortMessage instances.
// the SharedMessageBody instances.
static bool FromSharedToMessagesParent(
MessagePortParent* aActor,
const nsTArray<RefPtr<SharedMessagePortMessage>>& aData,
mozilla::ipc::PBackgroundParent* aManager,
const nsTArray<RefPtr<SharedMessageBody>>& aData,
FallibleTArray<MessageData>& aArray);
static bool FromMessagesToSharedParent(
nsTArray<MessageData>& aArray,
FallibleTArray<RefPtr<SharedMessagePortMessage>>& aData);
FallibleTArray<RefPtr<SharedMessageBody>>& aData);
void Read(JSContext* aCx, JS::MutableHandle<JS::Value> aValue,
RefMessageBodyService* aRefMessageBodyService, ErrorResult& aRv);
@ -61,7 +64,7 @@ class SharedMessagePortMessage final {
Sequence<OwningNonNull<mozilla::dom::MessagePort>>& aPorts);
private:
~SharedMessagePortMessage() = default;
~SharedMessageBody() = default;
UniquePtr<ipc::StructuredCloneData> mCloneData;
@ -72,4 +75,4 @@ class SharedMessagePortMessage final {
} // namespace dom
} // namespace mozilla
#endif // mozilla_dom_SharedMessagePortMessage_h
#endif // mozilla_dom_SharedMessageBody_h

View File

@ -65,6 +65,7 @@ EXPORTS.mozilla.dom += [
'RemoteBrowser.h',
'RemoteWebProgress.h',
'RemoteWebProgressRequest.h',
'SharedMessageBody.h',
'TabContext.h',
'TabMessageUtils.h',
'URLClassifierChild.h',
@ -120,6 +121,7 @@ UNIFIED_SOURCES += [
'RemoteWebProgress.cpp',
'RemoteWebProgressRequest.cpp',
'SharedMap.cpp',
'SharedMessageBody.cpp',
'SharedStringMap.cpp',
'StructuredCloneData.cpp',
'TabContext.cpp',

View File

@ -22,6 +22,7 @@
#include "mozilla/dom/WorkerScope.h"
#include "mozilla/ipc/BackgroundChild.h"
#include "mozilla/dom/RefMessageBodyService.h"
#include "mozilla/dom/SharedMessageBody.h"
#include "mozilla/ipc/PBackgroundChild.h"
#include "mozilla/MessagePortTimelineMarker.h"
#include "mozilla/ScopeExit.h"
@ -31,7 +32,6 @@
#include "nsContentUtils.h"
#include "nsGlobalWindow.h"
#include "nsPresContext.h"
#include "SharedMessagePortMessage.h"
#include "nsIBFCacheEntry.h"
#include "mozilla/dom/Document.h"
@ -55,7 +55,7 @@ class PostMessageRunnable final : public CancelableRunnable {
friend class MessagePort;
public:
PostMessageRunnable(MessagePort* aPort, SharedMessagePortMessage* aData)
PostMessageRunnable(MessagePort* aPort, SharedMessageBody* aData)
: CancelableRunnable("dom::PostMessageRunnable"),
mPort(aPort),
mData(aData) {
@ -164,7 +164,7 @@ class PostMessageRunnable final : public CancelableRunnable {
~PostMessageRunnable() {}
RefPtr<MessagePort> mPort;
RefPtr<SharedMessagePortMessage> mData;
RefPtr<SharedMessageBody> mData;
};
NS_IMPL_CYCLE_COLLECTION_CLASS(MessagePort)
@ -329,7 +329,7 @@ void MessagePort::PostMessage(JSContext* aCx, JS::Handle<JS::Value> aMessage,
return;
}
RefPtr<SharedMessagePortMessage> data = new SharedMessagePortMessage();
RefPtr<SharedMessageBody> data = new SharedMessageBody();
UniquePtr<AbstractTimelineMarker> start;
UniquePtr<AbstractTimelineMarker> end;
@ -387,14 +387,15 @@ void MessagePort::PostMessage(JSContext* aCx, JS::Handle<JS::Value> aMessage,
MOZ_ASSERT(mActor);
MOZ_ASSERT(mMessagesForTheOtherPort.IsEmpty());
AutoTArray<RefPtr<SharedMessagePortMessage>, 1> array;
AutoTArray<RefPtr<SharedMessageBody>, 1> array;
array.AppendElement(data);
AutoTArray<MessageData, 1> messages;
// note: `messages` will borrow the underlying buffer, but this is okay
// because reverse destruction order means `messages` will be destroyed prior
// to `array`/`data`.
SharedMessagePortMessage::FromSharedToMessagesChild(mActor, array, messages);
SharedMessageBody::FromSharedToMessagesChild(mActor->Manager(), array,
messages);
mActor->SendPostMessages(messages);
}
@ -463,7 +464,7 @@ void MessagePort::Dispatch() {
break;
}
RefPtr<SharedMessagePortMessage> data = mMessages.ElementAt(0);
RefPtr<SharedMessageBody> data = mMessages.ElementAt(0);
mMessages.RemoveElementAt(0);
mPostMessageRunnable = new PostMessageRunnable(this, data);
@ -572,8 +573,8 @@ void MessagePort::Entangled(nsTArray<MessageData>& aMessages) {
if (!mMessagesForTheOtherPort.IsEmpty()) {
{
nsTArray<MessageData> messages;
SharedMessagePortMessage::FromSharedToMessagesChild(
mActor, mMessagesForTheOtherPort, messages);
SharedMessageBody::FromSharedToMessagesChild(
mActor->Manager(), mMessagesForTheOtherPort, messages);
mActor->SendPostMessages(messages);
}
// Because `messages` borrow the underlying JSStructuredCloneData buffers,
@ -581,10 +582,10 @@ void MessagePort::Entangled(nsTArray<MessageData>& aMessages) {
mMessagesForTheOtherPort.Clear();
}
// We must convert the messages into SharedMessagePortMessages to avoid leaks.
FallibleTArray<RefPtr<SharedMessagePortMessage>> data;
if (NS_WARN_IF(!SharedMessagePortMessage::FromMessagesToSharedChild(aMessages,
data))) {
// We must convert the messages into SharedMessageBodys to avoid leaks.
FallibleTArray<RefPtr<SharedMessageBody>> data;
if (NS_WARN_IF(
!SharedMessageBody::FromMessagesToSharedChild(aMessages, data))) {
DispatchError();
return;
}
@ -631,9 +632,9 @@ void MessagePort::MessagesReceived(nsTArray<MessageData>& aMessages) {
RemoveDocFromBFCache();
FallibleTArray<RefPtr<SharedMessagePortMessage>> data;
if (NS_WARN_IF(!SharedMessagePortMessage::FromMessagesToSharedChild(aMessages,
data))) {
FallibleTArray<RefPtr<SharedMessageBody>> data;
if (NS_WARN_IF(
!SharedMessageBody::FromMessagesToSharedChild(aMessages, data))) {
DispatchError();
return;
}
@ -660,8 +661,8 @@ void MessagePort::Disentangle() {
{
nsTArray<MessageData> messages;
SharedMessagePortMessage::FromSharedToMessagesChild(mActor, mMessages,
messages);
SharedMessageBody::FromSharedToMessagesChild(mActor->Manager(), mMessages,
messages);
mActor->SendDisentangle(messages);
}

View File

@ -26,7 +26,7 @@ class MessageData;
class MessagePortChild;
struct PostMessageOptions;
class PostMessageRunnable;
class SharedMessagePortMessage;
class SharedMessageBody;
class RefMessageBodyService;
class StrongWorkerRef;
@ -210,8 +210,8 @@ class MessagePort final : public DOMEventTargetHelper {
RefPtr<RefMessageBodyService> mRefMessageBodyService;
nsTArray<RefPtr<SharedMessagePortMessage>> mMessages;
nsTArray<RefPtr<SharedMessagePortMessage>> mMessagesForTheOtherPort;
nsTArray<RefPtr<SharedMessageBody>> mMessages;
nsTArray<RefPtr<SharedMessageBody>> mMessagesForTheOtherPort;
nsAutoPtr<MessagePortIdentifier> mIdentifier;

View File

@ -6,7 +6,7 @@
#include "MessagePortParent.h"
#include "MessagePortService.h"
#include "SharedMessagePortMessage.h"
#include "mozilla/dom/SharedMessageBody.h"
#include "mozilla/Unused.h"
namespace mozilla {
@ -40,9 +40,9 @@ bool MessagePortParent::Entangle(const nsID& aDestinationUUID,
mozilla::ipc::IPCResult MessagePortParent::RecvPostMessages(
nsTArray<MessageData>&& 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))) {
FallibleTArray<RefPtr<SharedMessageBody>> messages;
if (NS_WARN_IF(!SharedMessageBody::FromMessagesToSharedParent(aMessages,
messages))) {
return IPC_FAIL_NO_REASON(this);
}
@ -68,9 +68,9 @@ mozilla::ipc::IPCResult MessagePortParent::RecvPostMessages(
mozilla::ipc::IPCResult MessagePortParent::RecvDisentangle(
nsTArray<MessageData>&& 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))) {
FallibleTArray<RefPtr<SharedMessageBody>> messages;
if (NS_WARN_IF(!SharedMessageBody::FromMessagesToSharedParent(aMessages,
messages))) {
return IPC_FAIL_NO_REASON(this);
}

View File

@ -6,7 +6,7 @@
#include "MessagePortService.h"
#include "MessagePortParent.h"
#include "SharedMessagePortMessage.h"
#include "mozilla/dom/SharedMessageBody.h"
#include "mozilla/dom/quota/CheckedUnsafePtr.h"
#include "mozilla/ipc/BackgroundParent.h"
#include "mozilla/StaticPtr.h"
@ -69,7 +69,7 @@ class MessagePortService::MessagePortServiceData final {
CheckedUnsafePtr<MessagePortParent> mParent;
FallibleTArray<NextParent> mNextParents;
FallibleTArray<RefPtr<SharedMessagePortMessage>> mMessages;
FallibleTArray<RefPtr<SharedMessageBody>> mMessages;
bool mWaitingForNewParent;
bool mNextStepCloseAll;
@ -146,11 +146,11 @@ bool MessagePortService::RequestEntangling(MessagePortParent* aParent,
// are destroyed because of JSStructuredCloneData borrowing. So we use
// Move to initialize things swapped and do it before we declare `array` so
// that reverse destruction order works for us.
FallibleTArray<RefPtr<SharedMessagePortMessage>> messages(
FallibleTArray<RefPtr<SharedMessageBody>> messages(
std::move(data->mMessages));
FallibleTArray<MessageData> array;
if (!SharedMessagePortMessage::FromSharedToMessagesParent(aParent, messages,
array)) {
if (!SharedMessageBody::FromSharedToMessagesParent(aParent->Manager(),
messages, array)) {
CloseAll(aParent->ID());
return false;
}
@ -186,7 +186,7 @@ bool MessagePortService::RequestEntangling(MessagePortParent* aParent,
bool MessagePortService::DisentanglePort(
MessagePortParent* aParent,
FallibleTArray<RefPtr<SharedMessagePortMessage>>& aMessages) {
FallibleTArray<RefPtr<SharedMessageBody>>& aMessages) {
MessagePortServiceData* data;
if (!mPorts.Get(aParent->ID(), &data)) {
MOZ_ASSERT(false, "Unknown MessagePortParent should not happen.");
@ -232,8 +232,8 @@ bool MessagePortService::DisentanglePort(
data->mNextParents.RemoveElementAt(index);
FallibleTArray<MessageData> array;
if (!SharedMessagePortMessage::FromSharedToMessagesParent(data->mParent,
aMessages, array)) {
if (!SharedMessageBody::FromSharedToMessagesParent(data->mParent->Manager(),
aMessages, array)) {
return false;
}
@ -326,7 +326,7 @@ void MessagePortService::MaybeShutdown() {
bool MessagePortService::PostMessages(
MessagePortParent* aParent,
FallibleTArray<RefPtr<SharedMessagePortMessage>>& aMessages) {
FallibleTArray<RefPtr<SharedMessageBody>>& aMessages) {
MessagePortServiceData* data;
if (!mPorts.Get(aParent->ID(), &data)) {
MOZ_ASSERT(false, "Unknown MessagePortParent should not happend.");
@ -349,8 +349,8 @@ bool MessagePortService::PostMessages(
if (data->mParent && data->mParent->CanSendData()) {
{
FallibleTArray<MessageData> messages;
if (!SharedMessagePortMessage::FromSharedToMessagesParent(
data->mParent, data->mMessages, messages)) {
if (!SharedMessageBody::FromSharedToMessagesParent(
data->mParent->Manager(), data->mMessages, messages)) {
return false;
}

View File

@ -15,7 +15,7 @@ namespace mozilla {
namespace dom {
class MessagePortParent;
class SharedMessagePortMessage;
class SharedMessageBody;
class MessagePortService final {
public:
@ -31,15 +31,13 @@ class MessagePortService final {
const nsID& aDestinationUUID,
const uint32_t& aSequenceID);
bool DisentanglePort(
MessagePortParent* aParent,
FallibleTArray<RefPtr<SharedMessagePortMessage>>& aMessages);
bool DisentanglePort(MessagePortParent* aParent,
FallibleTArray<RefPtr<SharedMessageBody>>& aMessages);
bool ClosePort(MessagePortParent* aParent);
bool PostMessages(
MessagePortParent* aParent,
FallibleTArray<RefPtr<SharedMessagePortMessage>>& aMessages);
bool PostMessages(MessagePortParent* aParent,
FallibleTArray<RefPtr<SharedMessageBody>>& aMessages);
void ParentDestroy(MessagePortParent* aParent);

View File

@ -22,7 +22,6 @@ UNIFIED_SOURCES += [
'MessagePortChild.cpp',
'MessagePortParent.cpp',
'MessagePortService.cpp',
'SharedMessagePortMessage.cpp',
]
IPDL_SOURCES += [