Backed out 4 changesets (bug 1609990) for causing Spidermonkey rust bustage CLOSED TREE

Backed out changeset 81a77bb3772c (bug 1609990)
Backed out changeset d4524885cb97 (bug 1609990)
Backed out changeset c95aac908332 (bug 1609990)
Backed out changeset bae3e50ab64d (bug 1609990)
This commit is contained in:
Noemi Erli 2020-01-24 18:13:24 +02:00
parent f3e1f0d3c6
commit e4b712dcb8
27 changed files with 124 additions and 208 deletions

View File

@ -176,7 +176,7 @@ PostMessageEvent::Run() {
if (mCallerAgentClusterId.isSome() && targetWindow->GetDocGroup() &&
targetWindow->GetDocGroup()->AgentClusterId().Equals(
mCallerAgentClusterId.ref())) {
cloneDataPolicy.allowIntraClusterClonableSharedObjects();
cloneDataPolicy.allowSharedMemory();
}
StructuredCloneHolder* holder;

View File

@ -45,15 +45,14 @@ namespace dom {
namespace {
JSObject* StructuredCloneCallbacksRead(
JSContext* aCx, JSStructuredCloneReader* aReader,
const JS::CloneDataPolicy& aCloneDataPolicy, uint32_t aTag, uint32_t aIndex,
void* aClosure) {
JSObject* StructuredCloneCallbacksRead(JSContext* aCx,
JSStructuredCloneReader* aReader,
uint32_t aTag, uint32_t aIndex,
void* aClosure) {
StructuredCloneHolderBase* holder =
static_cast<StructuredCloneHolderBase*>(aClosure);
MOZ_ASSERT(holder);
return holder->CustomReadHandler(aCx, aReader, aCloneDataPolicy, aTag,
aIndex);
return holder->CustomReadHandler(aCx, aReader, aTag, aIndex);
}
bool StructuredCloneCallbacksWrite(JSContext* aCx,
@ -312,23 +311,25 @@ void StructuredCloneHolder::ReadFromBuffer(nsIGlobalObject* aGlobal,
JSContext* aCx,
JSStructuredCloneData& aBuffer,
JS::MutableHandle<JS::Value> aValue,
JS::CloneDataPolicy aCloneDataPolicy,
ErrorResult& aRv) {
ReadFromBuffer(aGlobal, aCx, aBuffer, JS_STRUCTURED_CLONE_VERSION, aValue,
aCloneDataPolicy, aRv);
aRv);
}
void StructuredCloneHolder::ReadFromBuffer(
nsIGlobalObject* aGlobal, JSContext* aCx, JSStructuredCloneData& aBuffer,
uint32_t aAlgorithmVersion, JS::MutableHandle<JS::Value> aValue,
JS::CloneDataPolicy aCloneDataPolicy, ErrorResult& aRv) {
void StructuredCloneHolder::ReadFromBuffer(nsIGlobalObject* aGlobal,
JSContext* aCx,
JSStructuredCloneData& aBuffer,
uint32_t aAlgorithmVersion,
JS::MutableHandle<JS::Value> aValue,
ErrorResult& aRv) {
MOZ_ASSERT(!mBuffer, "ReadFromBuffer() must be called without a Write().");
mozilla::AutoRestore<nsIGlobalObject*> guard(mGlobal);
mGlobal = aGlobal;
if (!JS_ReadStructuredClone(aCx, aBuffer, aAlgorithmVersion, CloneScope(),
aValue, aCloneDataPolicy, &sCallbacks, this)) {
aValue, JS::CloneDataPolicy(), &sCallbacks,
this)) {
JS_ClearPendingException(aCx);
aRv.Throw(NS_ERROR_DOM_DATA_CLONE_ERR);
}
@ -816,7 +817,7 @@ bool WriteWasmModule(JSStructuredCloneWriter* aWriter,
StructuredCloneHolder::StructuredCloneScope::SameProcess);
// We store the position of the wasmModule in the array as index.
if (JS_WriteUint32Pair(aWriter, SCTAG_DOM_WASM_MODULE,
if (JS_WriteUint32Pair(aWriter, SCTAG_DOM_WASM,
aHolder->WasmModules().Length())) {
aHolder->WasmModules().AppendElement(aWasmModule);
return true;
@ -868,8 +869,7 @@ bool WriteInputStream(JSStructuredCloneWriter* aWriter,
} // anonymous namespace
JSObject* StructuredCloneHolder::CustomReadHandler(
JSContext* aCx, JSStructuredCloneReader* aReader,
const JS::CloneDataPolicy& aCloneDataPolicy, uint32_t aTag,
JSContext* aCx, JSStructuredCloneReader* aReader, uint32_t aTag,
uint32_t aIndex) {
MOZ_ASSERT(mSupportsCloning);
@ -906,9 +906,8 @@ JSObject* StructuredCloneHolder::CustomReadHandler(
return StructuredCloneBlob::ReadStructuredClone(aCx, aReader, this);
}
if (aTag == SCTAG_DOM_WASM_MODULE &&
CloneScope() == StructuredCloneScope::SameProcess &&
aCloneDataPolicy.areIntraClusterClonableSharedObjectsAllowed()) {
if (aTag == SCTAG_DOM_WASM &&
CloneScope() == StructuredCloneScope::SameProcess) {
return ReadWasmModule(aCx, aIndex, this);
}

View File

@ -51,10 +51,9 @@ class StructuredCloneHolderBase {
// These methods should be implemented in order to clone data.
// Read more documentation in js/public/StructuredClone.h.
virtual JSObject* CustomReadHandler(
JSContext* aCx, JSStructuredCloneReader* aReader,
const JS::CloneDataPolicy& aCloneDataPolicy, uint32_t aTag,
uint32_t aIndex) = 0;
virtual JSObject* CustomReadHandler(JSContext* aCx,
JSStructuredCloneReader* aReader,
uint32_t aTag, uint32_t aIndex) = 0;
virtual bool CustomWriteHandler(JSContext* aCx,
JSStructuredCloneWriter* aWriter,
@ -239,10 +238,9 @@ class StructuredCloneHolder : public StructuredCloneHolderBase {
// Implementations of the virtual methods to allow cloning of objects which
// JS engine itself doesn't clone.
virtual JSObject* CustomReadHandler(
JSContext* aCx, JSStructuredCloneReader* aReader,
const JS::CloneDataPolicy& aCloneDataPolicy, uint32_t aTag,
uint32_t aIndex) override;
virtual JSObject* CustomReadHandler(JSContext* aCx,
JSStructuredCloneReader* aReader,
uint32_t aTag, uint32_t aIndex) override;
virtual bool CustomWriteHandler(JSContext* aCx,
JSStructuredCloneWriter* aWriter,
@ -294,14 +292,12 @@ class StructuredCloneHolder : public StructuredCloneHolderBase {
// and/or the PortIdentifiers.
void ReadFromBuffer(nsIGlobalObject* aGlobal, JSContext* aCx,
JSStructuredCloneData& aBuffer,
JS::MutableHandle<JS::Value> aValue,
JS::CloneDataPolicy aCloneDataPolicy, ErrorResult& aRv);
JS::MutableHandle<JS::Value> aValue, ErrorResult& aRv);
void ReadFromBuffer(nsIGlobalObject* aGlobal, JSContext* aCx,
JSStructuredCloneData& aBuffer,
uint32_t aAlgorithmVersion,
JS::MutableHandle<JS::Value> aValue,
JS::CloneDataPolicy aCloneDataPolicy, ErrorResult& aRv);
JS::MutableHandle<JS::Value> aValue, ErrorResult& aRv);
void SameProcessScopeRequired(bool* aSameProcessScopeRequired);

View File

@ -39,7 +39,7 @@ enum StructuredCloneTags {
SCTAG_DOM_FILE,
// IMPORTANT: Don't change the order of these enum values. You could break
// IDB.
SCTAG_DOM_WASM_MODULE,
SCTAG_DOM_WASM,
// IMPORTANT: Don't change the order of these enum values. You could break
// IDB.

View File

@ -5948,7 +5948,7 @@ void nsGlobalWindowOuter::PostMessageMozOuter(JSContext* aCx,
JS::CloneDataPolicy clonePolicy;
if (GetDocGroup() && callerInnerWindow &&
callerInnerWindow->IsSharedMemoryAllowed()) {
clonePolicy.allowIntraClusterClonableSharedObjects();
clonePolicy.allowSharedMemory();
}
event->Write(aCx, aMessage, aTransfer, clonePolicy, aError);
if (NS_WARN_IF(aError.Failed())) {

View File

@ -345,7 +345,8 @@ function test_windowToIframe() {
// PostMessage to cross-origin iframe
function test_windowToCrossOriginIframe() {
info("Testing window to cross-origin iframe");
test_windowToIframeURL('http://example.com/tests/dom/base/test/iframe_postMessages.html', false);
test_windowToIframeURL('http://example.com/tests/dom/base/test/iframe_postMessages.html',
!SpecialPowers.useRemoteSubframes);
}
// iframe helper class

View File

@ -349,18 +349,8 @@ void BroadcastChannel::PostMessage(JSContext* aCx,
return;
}
Maybe<nsID> agentClusterId;
nsCOMPtr<nsIGlobalObject> global = GetOwnerGlobal();
MOZ_ASSERT(global);
if (global) {
Maybe<ClientInfo> clientInfo = global->GetClientInfo();
if (clientInfo) {
agentClusterId = clientInfo->AgentClusterId();
}
}
RefPtr<SharedMessageBody> data = new SharedMessageBody(
StructuredCloneHolder::TransferringNotSupported, agentClusterId);
RefPtr<SharedMessageBody> data =
new SharedMessageBody(StructuredCloneHolder::TransferringNotSupported);
data->Write(aCx, aMessage, JS::UndefinedHandleValue, mPortUUID,
mRefMessageBodyService, aRv);
@ -484,7 +474,6 @@ void BroadcastChannel::MessageReceived(const MessageData& aData) {
data->Read(cx, &value, mRefMessageBodyService,
SharedMessageBody::ReadMethod::KeepRefMessageBody, rv);
if (NS_WARN_IF(rv.Failed())) {
JS_ClearPendingException(cx);
DispatchError(cx);
return;
}

View File

@ -96,9 +96,8 @@ void BroadcastChannelService::PostMessage(BroadcastChannelParent* aParent,
// We need to keep the array alive for the life-time of this operation.
nsTArray<RefPtr<BlobImpl>> blobImpls;
if (aData.data().type() == MessageDataType::TClonedMessageData) {
const nsTArray<IPCBlob>& blobs =
aData.data().get_ClonedMessageData().blobs();
if (aData.type() == MessageData::TClonedMessageData) {
const nsTArray<IPCBlob>& blobs = aData.get_ClonedMessageData().blobs();
if (!blobs.IsEmpty()) {
blobImpls.SetCapacity(blobs.Length());
@ -128,11 +127,10 @@ void BroadcastChannelService::PostMessage(BroadcastChannelParent* aParent,
// We need to have a copy of the data for this parent.
MessageData newData(aData);
MOZ_ASSERT(newData.data().type() == aData.data().type());
MOZ_ASSERT(newData.type() == aData.type());
if (!blobImpls.IsEmpty()) {
nsTArray<IPCBlob>& newBlobImpls =
newData.data().get_ClonedMessageData().blobs();
nsTArray<IPCBlob>& newBlobImpls = newData.get_ClonedMessageData().blobs();
MOZ_ASSERT(blobImpls.Length() == newBlobImpls.Length());
// Serialize Blob objects for this message.
@ -149,9 +147,9 @@ void BroadcastChannelService::PostMessage(BroadcastChannelParent* aParent,
}
// If this is a refMessageData, we need to know when it can be released.
if (aData.data().type() == MessageDataType::TRefMessageData) {
if (aData.type() == MessageData::TRefMessageData) {
Unused << aParent->SendRefMessageDelivered(
aData.data().get_RefMessageData().uuid(), selectedActorsOnSamePid);
aData.get_RefMessageData().uuid(), selectedActorsOnSamePid);
}
}

View File

@ -284,7 +284,6 @@ class ConsoleRunnable : public StructuredCloneHolderBase {
protected:
JSObject* CustomReadHandler(JSContext* aCx, JSStructuredCloneReader* aReader,
const JS::CloneDataPolicy& aCloneDataPolicy,
uint32_t aTag, uint32_t aIndex) override {
AssertIsOnMainThread();

View File

@ -555,7 +555,7 @@ bool ReadBlobOrFile(JSStructuredCloneReader* aReader, uint32_t aTag,
}
bool ReadWasmModule(JSStructuredCloneReader* aReader, WasmModuleData* aRetval) {
static_assert(SCTAG_DOM_WASM_MODULE == 0xFFFF8006, "Update me!");
static_assert(SCTAG_DOM_WASM == 0xFFFF8006, "Update me!");
MOZ_ASSERT(aReader && aRetval);
uint32_t bytecodeIndex;
@ -735,28 +735,28 @@ class ValueDeserializationHelper {
}
};
JSObject* CommonStructuredCloneReadCallback(
JSContext* aCx, JSStructuredCloneReader* aReader,
const JS::CloneDataPolicy& aCloneDataPolicy, uint32_t aTag, uint32_t aData,
void* aClosure) {
JSObject* CommonStructuredCloneReadCallback(JSContext* aCx,
JSStructuredCloneReader* aReader,
uint32_t aTag, uint32_t aData,
void* aClosure) {
// We need to statically assert that our tag values are what we expect
// so that if people accidentally change them they notice.
static_assert(SCTAG_DOM_BLOB == 0xffff8001 &&
SCTAG_DOM_FILE_WITHOUT_LASTMODIFIEDDATE == 0xffff8002 &&
SCTAG_DOM_MUTABLEFILE == 0xffff8004 &&
SCTAG_DOM_FILE == 0xffff8005 &&
SCTAG_DOM_WASM_MODULE == 0xffff8006,
SCTAG_DOM_WASM == 0xffff8006,
"You changed our structured clone tag values and just ate "
"everyone's IndexedDB data. I hope you are happy.");
if (aTag == SCTAG_DOM_FILE_WITHOUT_LASTMODIFIEDDATE ||
aTag == SCTAG_DOM_BLOB || aTag == SCTAG_DOM_FILE ||
aTag == SCTAG_DOM_MUTABLEFILE || aTag == SCTAG_DOM_WASM_MODULE) {
aTag == SCTAG_DOM_MUTABLEFILE || aTag == SCTAG_DOM_WASM) {
auto* const cloneReadInfo = static_cast<StructuredCloneReadInfo*>(aClosure);
JS::Rooted<JSObject*> result(aCx);
if (aTag == SCTAG_DOM_WASM_MODULE) {
if (aTag == SCTAG_DOM_WASM) {
WasmModuleData data(aData);
if (NS_WARN_IF(!ReadWasmModule(aReader, &data))) {
return nullptr;
@ -819,10 +819,10 @@ JSObject* CommonStructuredCloneReadCallback(
aTag);
}
JSObject* CopyingStructuredCloneReadCallback(
JSContext* aCx, JSStructuredCloneReader* aReader,
const JS::CloneDataPolicy& aCloneDataPolicy, uint32_t aTag, uint32_t aData,
void* aClosure) {
JSObject* CopyingStructuredCloneReadCallback(JSContext* aCx,
JSStructuredCloneReader* aReader,
uint32_t aTag, uint32_t aData,
void* aClosure) {
MOZ_ASSERT(aTag != SCTAG_DOM_FILE_WITHOUT_LASTMODIFIEDDATE);
if (aTag == SCTAG_DOM_BLOB || aTag == SCTAG_DOM_FILE ||

View File

@ -72,16 +72,11 @@ struct RefMessageData {
nsID uuid;
};
union MessageDataType {
union MessageData {
ClonedMessageData;
RefMessageData;
};
struct MessageData {
nsID? agentClusterId;
MessageDataType data;
};
union IPCDataTransferData
{
nsString; // text

View File

@ -19,11 +19,8 @@ using namespace ipc;
namespace dom {
SharedMessageBody::SharedMessageBody(
StructuredCloneHolder::TransferringSupport aSupportsTransferring,
const Maybe<nsID>& aAgentClusterId)
: mRefDataId(Nothing()),
mSupportsTransferring(aSupportsTransferring),
mAgentClusterId(aAgentClusterId) {}
StructuredCloneHolder::TransferringSupport aSupportsTransferring)
: mRefDataId({}), mSupportsTransferring(aSupportsTransferring) {}
void SharedMessageBody::Write(JSContext* aCx, JS::Handle<JS::Value> aValue,
JS::Handle<JS::Value> aTransfers, nsID& aPortID,
@ -47,7 +44,7 @@ void SharedMessageBody::Write(JSContext* aCx, JS::Handle<JS::Value> aValue,
RefPtr<RefMessageBody> refData =
new RefMessageBody(aPortID, std::move(mCloneData));
mRefDataId.emplace(aRefMessageBodyService->Register(refData.forget(), aRv));
mRefDataId = aRefMessageBodyService->Register(refData.forget(), aRv);
}
void SharedMessageBody::Read(JSContext* aCx,
@ -58,37 +55,16 @@ void SharedMessageBody::Read(JSContext* aCx,
MOZ_ASSERT(aRefMessageBodyService);
if (mCloneData) {
// Use a default cloneDataPolicy here, because SharedArrayBuffers and WASM
// are not supported.
return mCloneData->Read(aCx, aValue, JS::CloneDataPolicy(), aRv);
}
JS::CloneDataPolicy cloneDataPolicy;
// Clones within the same agent cluster are allowed to use shared array
// buffers and WASM modules.
if (mAgentClusterId.isSome()) {
nsIGlobalObject* global = xpc::CurrentNativeGlobal(aCx);
MOZ_ASSERT(global);
Maybe<ClientInfo> clientInfo = global->GetClientInfo();
if (clientInfo) {
Maybe<nsID> agentClusterId = clientInfo->AgentClusterId();
if (agentClusterId.isSome() &&
mAgentClusterId.value().Equals(agentClusterId.value())) {
cloneDataPolicy.allowIntraClusterClonableSharedObjects();
}
}
return mCloneData->Read(aCx, aValue, aRv);
}
MOZ_ASSERT(!mRefData);
MOZ_ASSERT(mRefDataId.isSome());
if (aReadMethod == SharedMessageBody::StealRefMessageBody) {
mRefData = aRefMessageBodyService->Steal(mRefDataId.value());
mRefData = aRefMessageBodyService->Steal(mRefDataId);
} else {
MOZ_ASSERT(aReadMethod == SharedMessageBody::KeepRefMessageBody);
mRefData = aRefMessageBodyService->GetAndCount(mRefDataId.value());
mRefData = aRefMessageBodyService->GetAndCount(mRefDataId);
}
if (!mRefData) {
@ -96,7 +72,7 @@ void SharedMessageBody::Read(JSContext* aCx,
return;
}
mRefData->CloneData()->Read(aCx, aValue, cloneDataPolicy, aRv);
mRefData->CloneData()->Read(aCx, aValue, aRv);
}
bool SharedMessageBody::TakeTransferredPortsAsSequence(
@ -116,18 +92,15 @@ void SharedMessageBody::FromSharedToMessageChild(
MOZ_ASSERT(aManager);
MOZ_ASSERT(aData);
aMessage.agentClusterId() = aData->mAgentClusterId;
if (aData->mCloneData) {
ClonedMessageData clonedData;
aData->mCloneData->BuildClonedMessageDataForBackgroundChild(aManager,
clonedData);
aMessage.data() = clonedData;
aMessage = clonedData;
return;
}
MOZ_ASSERT(aData->mRefDataId.isSome());
aMessage.data() = RefMessageData(aData->mRefDataId.value());
aMessage = RefMessageData(aData->mRefDataId);
}
/* static */
@ -149,17 +122,16 @@ void SharedMessageBody::FromSharedToMessagesChild(
already_AddRefed<SharedMessageBody> SharedMessageBody::FromMessageToSharedChild(
MessageData& aMessage,
StructuredCloneHolder::TransferringSupport aSupportsTransferring) {
RefPtr<SharedMessageBody> data =
new SharedMessageBody(aSupportsTransferring, aMessage.agentClusterId());
RefPtr<SharedMessageBody> data = new SharedMessageBody(aSupportsTransferring);
if (aMessage.data().type() == MessageDataType::TClonedMessageData) {
if (aMessage.type() == MessageData::TClonedMessageData) {
data->mCloneData = MakeUnique<ipc::StructuredCloneData>(
JS::StructuredCloneScope::UnknownDestination, aSupportsTransferring);
data->mCloneData->StealFromClonedMessageDataForBackgroundChild(
aMessage.data().get_ClonedMessageData());
aMessage.get_ClonedMessageData());
} else {
MOZ_ASSERT(aMessage.data().type() == MessageDataType::TRefMessageData);
data->mRefDataId.emplace(aMessage.data().get_RefMessageData().uuid());
MOZ_ASSERT(aMessage.type() == MessageData::TRefMessageData);
data->mRefDataId = aMessage.get_RefMessageData().uuid();
}
return data.forget();
@ -169,17 +141,15 @@ already_AddRefed<SharedMessageBody> SharedMessageBody::FromMessageToSharedChild(
already_AddRefed<SharedMessageBody> SharedMessageBody::FromMessageToSharedChild(
const MessageData& aMessage,
StructuredCloneHolder::TransferringSupport aSupportsTransferring) {
RefPtr<SharedMessageBody> data =
new SharedMessageBody(aSupportsTransferring, aMessage.agentClusterId());
RefPtr<SharedMessageBody> data = new SharedMessageBody(aSupportsTransferring);
if (aMessage.data().type() == MessageDataType::TClonedMessageData) {
if (aMessage.type() == MessageData::TClonedMessageData) {
data->mCloneData = MakeUnique<ipc::StructuredCloneData>(
JS::StructuredCloneScope::UnknownDestination, aSupportsTransferring);
data->mCloneData->BorrowFromClonedMessageDataForBackgroundChild(
aMessage.data().get_ClonedMessageData());
data->mCloneData->BorrowFromClonedMessageDataForBackgroundChild(aMessage);
} else {
MOZ_ASSERT(aMessage.data().type() == MessageDataType::TRefMessageData);
data->mRefDataId.emplace(aMessage.data().get_RefMessageData().uuid());
MOZ_ASSERT(aMessage.type() == MessageData::TRefMessageData);
data->mRefDataId = aMessage.get_RefMessageData().uuid();
}
return data.forget();
@ -221,18 +191,16 @@ bool SharedMessageBody::FromSharedToMessagesParent(
for (auto& data : aData) {
MessageData* message = aArray.AppendElement(mozilla::fallible);
message->agentClusterId() = data->mAgentClusterId;
if (data->mCloneData) {
ClonedMessageData clonedData;
data->mCloneData->BuildClonedMessageDataForBackgroundParent(aManager,
clonedData);
message->data() = clonedData;
*message = clonedData;
continue;
}
MOZ_ASSERT(data->mRefDataId.isSome());
message->data() = RefMessageData(data->mRefDataId.value());
*message = RefMessageData(data->mRefDataId);
}
return true;
@ -243,17 +211,15 @@ already_AddRefed<SharedMessageBody>
SharedMessageBody::FromMessageToSharedParent(
MessageData& aMessage,
StructuredCloneHolder::TransferringSupport aSupportsTransferring) {
RefPtr<SharedMessageBody> data =
new SharedMessageBody(aSupportsTransferring, aMessage.agentClusterId());
RefPtr<SharedMessageBody> data = new SharedMessageBody(aSupportsTransferring);
if (aMessage.data().type() == MessageDataType::TClonedMessageData) {
if (aMessage.type() == MessageData::TClonedMessageData) {
data->mCloneData = MakeUnique<ipc::StructuredCloneData>(
JS::StructuredCloneScope::UnknownDestination, aSupportsTransferring);
data->mCloneData->StealFromClonedMessageDataForBackgroundParent(
aMessage.data().get_ClonedMessageData());
data->mCloneData->StealFromClonedMessageDataForBackgroundParent(aMessage);
} else {
MOZ_ASSERT(aMessage.data().type() == MessageDataType::TRefMessageData);
data->mRefDataId.emplace(aMessage.data().get_RefMessageData().uuid());
MOZ_ASSERT(aMessage.type() == MessageData::TRefMessageData);
data->mRefDataId = aMessage.get_RefMessageData().uuid();
}
return data.forget();

View File

@ -8,7 +8,6 @@
#define mozilla_dom_SharedMessageBody_h
#include "mozilla/dom/ipc/StructuredCloneData.h"
#include "mozilla/Maybe.h"
namespace mozilla {
@ -26,9 +25,8 @@ class SharedMessageBody final {
public:
NS_INLINE_DECL_REFCOUNTING(SharedMessageBody)
SharedMessageBody(
StructuredCloneHolder::TransferringSupport aSupportsTransferring,
const Maybe<nsID>& aAgentClusterId);
explicit SharedMessageBody(
StructuredCloneHolder::TransferringSupport aSupportsTransferring);
// Note that the populated MessageData borrows the underlying
// JSStructuredCloneData from the SharedMessageBody, so the caller is
@ -100,10 +98,8 @@ class SharedMessageBody final {
UniquePtr<ipc::StructuredCloneData> mCloneData;
RefPtr<RefMessageBody> mRefData;
Maybe<nsID> mRefDataId;
const StructuredCloneHolder::TransferringSupport mSupportsTransferring;
const Maybe<nsID> mAgentClusterId;
nsID mRefDataId;
StructuredCloneHolder::TransferringSupport mSupportsTransferring;
};
} // namespace dom

View File

@ -102,19 +102,12 @@ bool StructuredCloneData::Copy(const StructuredCloneData& aData) {
void StructuredCloneData::Read(JSContext* aCx,
JS::MutableHandle<JS::Value> aValue,
ErrorResult& aRv) {
Read(aCx, aValue, JS::CloneDataPolicy(), aRv);
}
void StructuredCloneData::Read(JSContext* aCx,
JS::MutableHandle<JS::Value> aValue,
JS::CloneDataPolicy aCloneDataPolicy,
ErrorResult& aRv) {
MOZ_ASSERT(mInitialized);
nsIGlobalObject* global = xpc::CurrentNativeGlobal(aCx);
MOZ_ASSERT(global);
ReadFromBuffer(global, aCx, Data(), aValue, aCloneDataPolicy, aRv);
ReadFromBuffer(global, aCx, Data(), aValue, aRv);
}
void StructuredCloneData::Write(JSContext* aCx, JS::Handle<JS::Value> aValue,

View File

@ -176,9 +176,6 @@ class StructuredCloneData : public StructuredCloneHolder {
void Read(JSContext* aCx, JS::MutableHandle<JS::Value> aValue,
ErrorResult& aRv);
void Read(JSContext* aCx, JS::MutableHandle<JS::Value> aValue,
JS::CloneDataPolicy aCloneDataPolicy, ErrorResult& aRv);
void Write(JSContext* aCx, JS::Handle<JS::Value> aValue, ErrorResult& aRv);
void Write(JSContext* aCx, JS::Handle<JS::Value> aValue,

View File

@ -75,7 +75,7 @@ class PostMessageRunnable final : public CancelableRunnable {
MOZ_ASSERT(mPort->mPostMessageRunnable == this);
DispatchMessage();
nsresult rv = DispatchMessage();
// We must check if we were waiting for this message in order to shutdown
// the port.
@ -84,7 +84,7 @@ class PostMessageRunnable final : public CancelableRunnable {
mPort->mPostMessageRunnable = nullptr;
mPort->Dispatch();
return NS_OK;
return rv;
}
nsresult Cancel() override {
@ -96,7 +96,7 @@ class PostMessageRunnable final : public CancelableRunnable {
}
private:
void DispatchMessage() const {
nsresult DispatchMessage() const {
NS_ASSERT_OWNINGTHREAD(Runnable);
nsCOMPtr<nsIGlobalObject> globalObject = mPort->GetParentObject();
@ -104,12 +104,12 @@ class PostMessageRunnable final : public CancelableRunnable {
AutoJSAPI jsapi;
if (!globalObject || !jsapi.Init(globalObject)) {
NS_WARNING("Failed to initialize AutoJSAPI object.");
return;
return NS_ERROR_FAILURE;
}
JSContext* cx = jsapi.cx();
IgnoredErrorResult rv;
ErrorResult rv;
JS::Rooted<JS::Value> value(cx);
UniquePtr<AbstractTimelineMarker> start;
@ -135,9 +135,8 @@ class PostMessageRunnable final : public CancelableRunnable {
}
if (NS_WARN_IF(rv.Failed())) {
JS_ClearPendingException(cx);
mPort->DispatchError();
return;
return rv.StealNSResult();
}
// Create the event
@ -149,7 +148,7 @@ class PostMessageRunnable final : public CancelableRunnable {
Sequence<OwningNonNull<MessagePort>> ports;
if (!mData->TakeTransferredPortsAsSequence(ports)) {
mPort->DispatchError();
return;
return NS_ERROR_OUT_OF_MEMORY;
}
event->InitMessageEvent(nullptr, NS_LITERAL_STRING("message"),
@ -158,6 +157,8 @@ class PostMessageRunnable final : public CancelableRunnable {
event->SetTrusted(true);
mPort->DispatchEvent(*event);
return NS_OK;
}
private:
@ -329,17 +330,8 @@ void MessagePort::PostMessage(JSContext* aCx, JS::Handle<JS::Value> aMessage,
return;
}
Maybe<nsID> agentClusterId;
nsCOMPtr<nsIGlobalObject> global = GetOwnerGlobal();
if (global) {
Maybe<ClientInfo> clientInfo = global->GetClientInfo();
if (clientInfo) {
agentClusterId = clientInfo->AgentClusterId();
}
}
RefPtr<SharedMessageBody> data = new SharedMessageBody(
StructuredCloneHolder::TransferringSupported, agentClusterId);
RefPtr<SharedMessageBody> data =
new SharedMessageBody(StructuredCloneHolder::TransferringSupported);
UniquePtr<AbstractTimelineMarker> start;
UniquePtr<AbstractTimelineMarker> end;

View File

@ -772,8 +772,7 @@ void PromiseWorkerProxy::CleanUp() {
}
JSObject* PromiseWorkerProxy::CustomReadHandler(
JSContext* aCx, JSStructuredCloneReader* aReader,
const JS::CloneDataPolicy& aCloneDataPolicy, uint32_t aTag,
JSContext* aCx, JSStructuredCloneReader* aReader, uint32_t aTag,
uint32_t aIndex) {
if (NS_WARN_IF(!mCallbacks)) {
return nullptr;

View File

@ -157,7 +157,6 @@ class PromiseWorkerProxy : public PromiseNativeHandler,
// StructuredCloneHolderBase
JSObject* CustomReadHandler(JSContext* aCx, JSStructuredCloneReader* aReader,
const JS::CloneDataPolicy& aCloneDataPolicy,
uint32_t aTag, uint32_t aIndex) override;
bool CustomWriteHandler(JSContext* aCx, JSStructuredCloneWriter* aWriter,

View File

@ -66,7 +66,7 @@ bool MessageEventRunnable::DispatchDOMEvent(JSContext* aCx,
parent->GetClientInfo()->AgentClusterId().isSome() &&
parent->GetClientInfo()->AgentClusterId()->Equals(
aWorkerPrivate->AgentClusterId())) {
cloneDataPolicy.allowIntraClusterClonableSharedObjects();
cloneDataPolicy.allowSharedMemory();
}
Read(parent, aCx, &messageData, cloneDataPolicy, rv);

View File

@ -106,12 +106,12 @@ void Worker::PostMessage(JSContext* aCx, JS::Handle<JS::Value> aMessage,
if (NS_IsMainThread()) {
nsGlobalWindowInner* win = nsContentUtils::CallerInnerWindow();
if (win && win->IsSharedMemoryAllowed()) {
clonePolicy.allowIntraClusterClonableSharedObjects();
clonePolicy.allowSharedMemory();
}
} else {
WorkerPrivate* worker = GetCurrentThreadWorkerPrivate();
if (worker && worker->IsSharedMemoryAllowed()) {
clonePolicy.allowIntraClusterClonableSharedObjects();
clonePolicy.allowSharedMemory();
}
}

View File

@ -4033,7 +4033,7 @@ void WorkerPrivate::PostMessageToParent(
JS::CloneDataPolicy clonePolicy;
if (IsSharedMemoryAllowed()) {
clonePolicy.allowIntraClusterClonableSharedObjects();
clonePolicy.allowSharedMemory();
}
runnable->Write(aCx, aMessage, transferable, clonePolicy, aRv);

View File

@ -205,29 +205,24 @@ enum TransferableOwnership {
};
class CloneDataPolicy {
bool allowIntraClusterClonableSharedObjects_;
bool sharedArrayBuffer_;
public:
// The default is to deny all policy-controlled aspects.
CloneDataPolicy() : allowIntraClusterClonableSharedObjects_(false) {}
CloneDataPolicy() : sharedArrayBuffer_(false) {}
// In the JS engine, SharedArrayBuffers and WASM modules can only be cloned
// intra-process because the shared memory areas are allocated in
// process-private memory. Clients should therefore deny SharedArrayBuffers
// when cloning data that are to be transmitted inter-process.
// In the JS engine, SharedArrayBuffers can only be cloned intra-process
// because the shared memory areas are allocated in process-private memory.
// Clients should therefore deny SharedArrayBuffers when cloning data that
// are to be transmitted inter-process.
//
// Clients should also deny SharedArrayBuffers and WASM modules when cloning
// data that are to be transmitted intra-process if policy needs dictate such
// denial.
// Clients should also deny SharedArrayBuffers when cloning data that are to
// be transmitted intra-process if policy needs dictate such denial.
void allowIntraClusterClonableSharedObjects() {
allowIntraClusterClonableSharedObjects_ = true;
}
void allowSharedMemory() { sharedArrayBuffer_ = true; }
bool areIntraClusterClonableSharedObjectsAllowed() const {
return allowIntraClusterClonableSharedObjects_;
}
bool isSharedArrayBufferAllowed() const { return sharedArrayBuffer_; }
};
} /* namespace JS */
@ -241,10 +236,10 @@ class CloneDataPolicy {
* from the reader r. closure is any value passed to the JS_ReadStructuredClone
* function. Return the new object on success, nullptr on error/exception.
*/
typedef JSObject* (*ReadStructuredCloneOp)(
JSContext* cx, JSStructuredCloneReader* r,
const JS::CloneDataPolicy& cloneDataPolicy, uint32_t tag, uint32_t data,
void* closure);
typedef JSObject* (*ReadStructuredCloneOp)(JSContext* cx,
JSStructuredCloneReader* r,
uint32_t tag, uint32_t data,
void* closure);
/**
* Structured data serialization hook. The engine can write primitive values,

View File

@ -3420,7 +3420,7 @@ bool js::testingFunc_serialize(JSContext* cx, unsigned argc, Value* vp) {
}
if (StringEqualsLiteral(poli, "allow")) {
policy.allowIntraClusterClonableSharedObjects();
policy.allowSharedMemory();
} else if (StringEqualsLiteral(poli, "deny")) {
// default
} else {
@ -3500,7 +3500,7 @@ static bool Deserialize(JSContext* cx, unsigned argc, Value* vp) {
}
if (StringEqualsLiteral(poli, "allow")) {
policy.allowIntraClusterClonableSharedObjects();
policy.allowSharedMemory();
} else if (StringEqualsLiteral(poli, "deny")) {
// default
} else {

View File

@ -1259,7 +1259,7 @@ bool JSStructuredCloneWriter::writeArrayBuffer(HandleObject obj) {
bool JSStructuredCloneWriter::writeSharedArrayBuffer(HandleObject obj) {
MOZ_ASSERT(obj->canUnwrapAs<SharedArrayBufferObject>());
if (!cloneDataPolicy.areIntraClusterClonableSharedObjectsAllowed()) {
if (!cloneDataPolicy.isSharedArrayBufferAllowed()) {
auto errorMsg =
context()->realm()->creationOptions().getCoopAndCoepEnabled()
? JSMSG_SC_NOT_CLONABLE_WITH_COOP_COEP
@ -1305,7 +1305,7 @@ bool JSStructuredCloneWriter::writeSharedWasmMemory(HandleObject obj) {
MOZ_ASSERT(obj->canUnwrapAs<WasmMemoryObject>());
// Check the policy here so that we can report a sane error.
if (!cloneDataPolicy.areIntraClusterClonableSharedObjectsAllowed()) {
if (!cloneDataPolicy.isSharedArrayBufferAllowed()) {
auto errorMsg =
context()->realm()->creationOptions().getCoopAndCoepEnabled()
? JSMSG_SC_NOT_CLONABLE_WITH_COOP_COEP
@ -2234,7 +2234,7 @@ bool JSStructuredCloneReader::readArrayBuffer(uint32_t nbytes,
}
bool JSStructuredCloneReader::readSharedArrayBuffer(MutableHandleValue vp) {
if (!cloneDataPolicy.areIntraClusterClonableSharedObjectsAllowed()) {
if (!cloneDataPolicy.isSharedArrayBufferAllowed()) {
auto errorMsg =
context()->realm()->creationOptions().getCoopAndCoepEnabled()
? JSMSG_SC_NOT_CLONABLE_WITH_COOP_COEP
@ -2298,7 +2298,7 @@ bool JSStructuredCloneReader::readSharedWasmMemory(uint32_t nbytes,
return false;
}
if (!cloneDataPolicy.areIntraClusterClonableSharedObjectsAllowed()) {
if (!cloneDataPolicy.isSharedArrayBufferAllowed()) {
auto errorMsg =
context()->realm()->creationOptions().getCoopAndCoepEnabled()
? JSMSG_SC_NOT_CLONABLE_WITH_COOP_COEP
@ -2643,8 +2643,7 @@ bool JSStructuredCloneReader::startRead(MutableHandleValue vp) {
if (!allObjs.append(dummy)) {
return false;
}
JSObject* obj =
callbacks->read(context(), this, cloneDataPolicy, tag, data, closure);
JSObject* obj = callbacks->read(context(), this, tag, data, closure);
if (!obj) {
return false;
}

View File

@ -59,7 +59,6 @@ class MOZ_STACK_CLASS StackScopedCloneData : public StructuredCloneHolderBase {
~StackScopedCloneData() { Clear(); }
JSObject* CustomReadHandler(JSContext* aCx, JSStructuredCloneReader* aReader,
const JS::CloneDataPolicy& aCloneDataPolicy,
uint32_t aTag, uint32_t aData) override {
if (aTag == SCTAG_REFLECTOR) {
MOZ_ASSERT(!aData);

View File

@ -0,0 +1,2 @@
[broadcastchannel-success-and-failure.html]
disabled: https://bugzilla.mozilla.org/show_bug.cgi?id=1609990

View File

@ -0,0 +1,2 @@
[window-sharedworker-failure.html]
disabled: https://bugzilla.mozilla.org/show_bug.cgi?id=1609990