mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-19 00:05:36 +00:00
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:
parent
f3e1f0d3c6
commit
e4b712dcb8
@ -176,7 +176,7 @@ PostMessageEvent::Run() {
|
||||
if (mCallerAgentClusterId.isSome() && targetWindow->GetDocGroup() &&
|
||||
targetWindow->GetDocGroup()->AgentClusterId().Equals(
|
||||
mCallerAgentClusterId.ref())) {
|
||||
cloneDataPolicy.allowIntraClusterClonableSharedObjects();
|
||||
cloneDataPolicy.allowSharedMemory();
|
||||
}
|
||||
|
||||
StructuredCloneHolder* holder;
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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.
|
||||
|
@ -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())) {
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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();
|
||||
|
||||
|
@ -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 ||
|
||||
|
@ -72,16 +72,11 @@ struct RefMessageData {
|
||||
nsID uuid;
|
||||
};
|
||||
|
||||
union MessageDataType {
|
||||
union MessageData {
|
||||
ClonedMessageData;
|
||||
RefMessageData;
|
||||
};
|
||||
|
||||
struct MessageData {
|
||||
nsID? agentClusterId;
|
||||
MessageDataType data;
|
||||
};
|
||||
|
||||
union IPCDataTransferData
|
||||
{
|
||||
nsString; // text
|
||||
|
@ -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();
|
||||
|
@ -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
|
||||
|
@ -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,
|
||||
|
@ -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,
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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,
|
||||
|
@ -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);
|
||||
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -4033,7 +4033,7 @@ void WorkerPrivate::PostMessageToParent(
|
||||
|
||||
JS::CloneDataPolicy clonePolicy;
|
||||
if (IsSharedMemoryAllowed()) {
|
||||
clonePolicy.allowIntraClusterClonableSharedObjects();
|
||||
clonePolicy.allowSharedMemory();
|
||||
}
|
||||
runnable->Write(aCx, aMessage, transferable, clonePolicy, aRv);
|
||||
|
||||
|
@ -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,
|
||||
|
@ -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 {
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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);
|
||||
|
@ -0,0 +1,2 @@
|
||||
[broadcastchannel-success-and-failure.html]
|
||||
disabled: https://bugzilla.mozilla.org/show_bug.cgi?id=1609990
|
@ -0,0 +1,2 @@
|
||||
[window-sharedworker-failure.html]
|
||||
disabled: https://bugzilla.mozilla.org/show_bug.cgi?id=1609990
|
Loading…
Reference in New Issue
Block a user