mirror of
https://repo.dactyloidae.xyz/Dactyloidae/UXP.git
synced 2026-10-31 11:37:30 +09:00
Refactor structured clone JSAPI to prevent mismatched scopes.
Roll-up of bugs 1442722, 1455071, 1433642, 1456604 and 1458320.
This commit is contained in:
parent
1b173ad9e4
commit
0795e50d87
15 changed files with 447 additions and 311 deletions
|
|
@ -271,10 +271,10 @@ BuildClonedMessageData(typename BlobTraits<Flavor>::ConcreteContentManagerType*
|
|||
ClonedMessageData& aClonedData)
|
||||
{
|
||||
SerializedStructuredCloneBuffer& buffer = aClonedData.data();
|
||||
auto iter = aData.Data().Iter();
|
||||
auto iter = aData.Data().Start();
|
||||
size_t size = aData.Data().Size();
|
||||
bool success;
|
||||
buffer.data = aData.Data().Borrow<js::SystemAllocPolicy>(iter, size, &success);
|
||||
buffer.data = aData.Data().Borrow(iter, size, &success);
|
||||
if (NS_WARN_IF(!success)) {
|
||||
return false;
|
||||
}
|
||||
|
|
@ -1286,6 +1286,7 @@ nsFrameMessageManager::ReceiveMessage(nsISupports* aTarget,
|
|||
if (aRetVal) {
|
||||
ErrorResult rv;
|
||||
StructuredCloneData* data = aRetVal->AppendElement();
|
||||
data->InitScope(JS::StructuredCloneScope::DifferentProcess);
|
||||
data->Write(cx, rval, rv);
|
||||
if (NS_WARN_IF(rv.Failed())) {
|
||||
aRetVal->RemoveElementAt(aRetVal->Length() - 1);
|
||||
|
|
|
|||
|
|
@ -137,7 +137,7 @@ nsStructuredCloneContainer::GetDataAsBase64(nsAString &aOut)
|
|||
return NS_ERROR_FAILURE;
|
||||
}
|
||||
|
||||
auto iter = Data().Iter();
|
||||
auto iter = Data().Start();
|
||||
size_t size = Data().Size();
|
||||
nsAutoCString binaryData;
|
||||
binaryData.SetLength(size);
|
||||
|
|
|
|||
|
|
@ -154,8 +154,8 @@ public:
|
|||
|
||||
bool success;
|
||||
SerializedStructuredCloneBuffer& buffer = message.data();
|
||||
auto iter = mData->BufferData().Iter();
|
||||
buffer.data = mData->BufferData().Borrow<js::SystemAllocPolicy>(iter, mData->BufferData().Size(), &success);
|
||||
auto iter = mData->BufferData().Start();
|
||||
buffer.data = mData->BufferData().Borrow(iter, mData->BufferData().Size(), &success);
|
||||
if (NS_WARN_IF(!success)) {
|
||||
return NS_OK;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -8440,12 +8440,12 @@ class ObjectStoreAddOrPutRequestOp::SCInputStream final
|
|||
: public nsIInputStream
|
||||
{
|
||||
const JSStructuredCloneData& mData;
|
||||
JSStructuredCloneData::IterImpl mIter;
|
||||
JSStructuredCloneData::Iterator mIter;
|
||||
|
||||
public:
|
||||
explicit SCInputStream(const JSStructuredCloneData& aData)
|
||||
: mData(aData)
|
||||
, mIter(aData.Iter())
|
||||
, mIter(aData.Start())
|
||||
{ }
|
||||
|
||||
private:
|
||||
|
|
@ -19687,7 +19687,7 @@ UpgradeFileIdsFunction::OnFunctionCall(mozIStorageValueArray* aArguments,
|
|||
return NS_ERROR_UNEXPECTED;
|
||||
}
|
||||
|
||||
StructuredCloneReadInfo cloneInfo;
|
||||
StructuredCloneReadInfo cloneInfo(JS::StructuredCloneScope::DifferentProcess);
|
||||
DatabaseOperationBase::GetStructuredCloneReadInfoFromValueArray(aArguments,
|
||||
1,
|
||||
0,
|
||||
|
|
@ -19892,7 +19892,7 @@ DatabaseOperationBase::GetStructuredCloneReadInfoFromBlob(
|
|||
return NS_ERROR_FILE_CORRUPTED;
|
||||
}
|
||||
|
||||
if (!aInfo->mData.WriteBytes(uncompressedBuffer, uncompressed.Length())) {
|
||||
if (!aInfo->mData.AppendBytes(uncompressedBuffer, uncompressed.Length())) {
|
||||
return NS_ERROR_OUT_OF_MEMORY;
|
||||
}
|
||||
|
||||
|
|
@ -19978,7 +19978,7 @@ DatabaseOperationBase::GetStructuredCloneReadInfoFromExternalBlob(
|
|||
break;
|
||||
}
|
||||
|
||||
if (NS_WARN_IF(!aInfo->mData.WriteBytes(buffer, numRead))) {
|
||||
if (NS_WARN_IF(!aInfo->mData.AppendBytes(buffer, numRead))) {
|
||||
rv = NS_ERROR_OUT_OF_MEMORY;
|
||||
break;
|
||||
}
|
||||
|
|
@ -25337,7 +25337,7 @@ UpdateIndexDataValuesFunction::OnFunctionCall(mozIStorageValueArray* aValues,
|
|||
}
|
||||
#endif
|
||||
|
||||
StructuredCloneReadInfo cloneInfo;
|
||||
StructuredCloneReadInfo cloneInfo(JS::StructuredCloneScope::DifferentProcess);
|
||||
nsresult rv =
|
||||
GetStructuredCloneReadInfoFromValueArray(aValues,
|
||||
/* aDataIndex */ 3,
|
||||
|
|
@ -26546,18 +26546,9 @@ ObjectStoreAddOrPutRequestOp::DoDatabaseWork(DatabaseConnection* aConnection)
|
|||
char keyPropBuffer[keyPropSize];
|
||||
LittleEndian::writeUint64(keyPropBuffer, keyPropValue);
|
||||
|
||||
auto iter = cloneData.Iter();
|
||||
DebugOnly<bool> result =
|
||||
iter.AdvanceAcrossSegments(cloneData, cloneInfo.offsetToKeyProp());
|
||||
MOZ_ASSERT(result);
|
||||
|
||||
for (uint32_t index = 0; index < keyPropSize; index++) {
|
||||
char* keyPropPointer = iter.Data();
|
||||
*keyPropPointer = keyPropBuffer[index];
|
||||
|
||||
result = iter.AdvanceAcrossSegments(cloneData, 1);
|
||||
MOZ_ASSERT(result);
|
||||
}
|
||||
auto iter = cloneData.Start();
|
||||
MOZ_ALWAYS_TRUE(cloneData.Advance(iter, cloneInfo.offsetToKeyProp()));
|
||||
MOZ_ALWAYS_TRUE(cloneData.UpdateBytes(iter, keyPropBuffer, keyPropSize));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -26583,7 +26574,7 @@ ObjectStoreAddOrPutRequestOp::DoDatabaseWork(DatabaseConnection* aConnection)
|
|||
} else {
|
||||
nsCString flatCloneData;
|
||||
flatCloneData.SetLength(cloneDataSize);
|
||||
auto iter = cloneData.Iter();
|
||||
auto iter = cloneData.Start();
|
||||
cloneData.ReadBytes(iter, flatCloneData.BeginWriting(), cloneDataSize);
|
||||
|
||||
// Compress the bytes before adding into the database.
|
||||
|
|
@ -26840,7 +26831,7 @@ SCInputStream::ReadSegments(nsWriteSegmentFun aWriter,
|
|||
*_retval += count;
|
||||
aCount -= count;
|
||||
|
||||
mIter.Advance(mData, count);
|
||||
mData.Advance(mIter, count);
|
||||
}
|
||||
|
||||
return NS_OK;
|
||||
|
|
@ -28029,7 +28020,7 @@ CursorOpBase::PopulateResponseFromStatement(
|
|||
|
||||
switch (mCursor->mType) {
|
||||
case OpenCursorParams::TObjectStoreOpenCursorParams: {
|
||||
StructuredCloneReadInfo cloneInfo;
|
||||
StructuredCloneReadInfo cloneInfo(JS::StructuredCloneScope::DifferentProcess);
|
||||
rv = GetStructuredCloneReadInfoFromStatement(aStmt,
|
||||
2,
|
||||
1,
|
||||
|
|
@ -28077,7 +28068,7 @@ CursorOpBase::PopulateResponseFromStatement(
|
|||
return rv;
|
||||
}
|
||||
|
||||
StructuredCloneReadInfo cloneInfo;
|
||||
StructuredCloneReadInfo cloneInfo(JS::StructuredCloneScope::DifferentProcess);
|
||||
rv = GetStructuredCloneReadInfoFromStatement(aStmt,
|
||||
4,
|
||||
3,
|
||||
|
|
|
|||
|
|
@ -67,7 +67,7 @@ struct IDBObjectStore::StructuredCloneWriteInfo
|
|||
uint64_t mOffsetToKeyProp;
|
||||
|
||||
explicit StructuredCloneWriteInfo(IDBDatabase* aDatabase)
|
||||
: mCloneBuffer(JS::StructuredCloneScope::SameProcessSameThread, nullptr,
|
||||
: mCloneBuffer(JS::StructuredCloneScope::DifferentProcessForIndexedDB, nullptr,
|
||||
nullptr)
|
||||
, mDatabase(aDatabase)
|
||||
, mOffsetToKeyProp(0)
|
||||
|
|
@ -1216,7 +1216,7 @@ IDBObjectStore::DeserializeValue(JSContext* aCx,
|
|||
// FIXME: Consider to use StructuredCloneHolder here and in other
|
||||
// deserializing methods.
|
||||
if (!JS_ReadStructuredClone(aCx, aCloneReadInfo.mData, JS_STRUCTURED_CLONE_VERSION,
|
||||
JS::StructuredCloneScope::SameProcessSameThread,
|
||||
JS::StructuredCloneScope::DifferentProcessForIndexedDB,
|
||||
aValue, &callbacks, &aCloneReadInfo)) {
|
||||
return false;
|
||||
}
|
||||
|
|
@ -1249,7 +1249,7 @@ IDBObjectStore::DeserializeIndexValue(JSContext* aCx,
|
|||
};
|
||||
|
||||
if (!JS_ReadStructuredClone(aCx, aCloneReadInfo.mData, JS_STRUCTURED_CLONE_VERSION,
|
||||
JS::StructuredCloneScope::SameProcessSameThread,
|
||||
JS::StructuredCloneScope::DifferentProcessForIndexedDB,
|
||||
aValue, &callbacks, &aCloneReadInfo)) {
|
||||
return false;
|
||||
}
|
||||
|
|
@ -1285,7 +1285,7 @@ IDBObjectStore::DeserializeUpgradeValue(JSContext* aCx,
|
|||
};
|
||||
|
||||
if (!JS_ReadStructuredClone(aCx, aCloneReadInfo.mData, JS_STRUCTURED_CLONE_VERSION,
|
||||
JS::StructuredCloneScope::SameProcessSameThread,
|
||||
JS::StructuredCloneScope::DifferentProcessForIndexedDB,
|
||||
aValue, &callbacks, &aCloneReadInfo)) {
|
||||
return false;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -64,6 +64,10 @@ struct StructuredCloneReadInfo
|
|||
IDBDatabase* mDatabase;
|
||||
bool mHasPreprocessInfo;
|
||||
|
||||
// In IndexedDatabaseInlines.h
|
||||
inline explicit
|
||||
StructuredCloneReadInfo(JS::StructuredCloneScope aScope);
|
||||
|
||||
// In IndexedDatabaseInlines.h
|
||||
inline
|
||||
StructuredCloneReadInfo();
|
||||
|
|
|
|||
|
|
@ -45,13 +45,20 @@ StructuredCloneFile::operator==(const StructuredCloneFile& aOther) const
|
|||
}
|
||||
|
||||
inline
|
||||
StructuredCloneReadInfo::StructuredCloneReadInfo()
|
||||
: mDatabase(nullptr)
|
||||
StructuredCloneReadInfo::StructuredCloneReadInfo(JS::StructuredCloneScope aScope)
|
||||
: mData(aScope)
|
||||
, mDatabase(nullptr)
|
||||
, mHasPreprocessInfo(false)
|
||||
{
|
||||
MOZ_COUNT_CTOR(StructuredCloneReadInfo);
|
||||
}
|
||||
|
||||
inline
|
||||
StructuredCloneReadInfo::StructuredCloneReadInfo()
|
||||
: StructuredCloneReadInfo(JS::StructuredCloneScope::DifferentProcessForIndexedDB)
|
||||
{
|
||||
}
|
||||
|
||||
inline
|
||||
StructuredCloneReadInfo::StructuredCloneReadInfo(
|
||||
StructuredCloneReadInfo&& aCloneReadInfo)
|
||||
|
|
|
|||
|
|
@ -88,7 +88,7 @@ StructuredCloneData::Write(JSContext* aCx,
|
|||
return;
|
||||
}
|
||||
|
||||
JSStructuredCloneData data;
|
||||
JSStructuredCloneData data(mBuffer->scope());
|
||||
mBuffer->abandon();
|
||||
mBuffer->steal(&data);
|
||||
mBuffer = nullptr;
|
||||
|
|
@ -107,7 +107,7 @@ StructuredCloneData::ReadIPCParams(const IPC::Message* aMsg,
|
|||
PickleIterator* aIter)
|
||||
{
|
||||
MOZ_ASSERT(!mInitialized);
|
||||
JSStructuredCloneData data;
|
||||
JSStructuredCloneData data(JS::StructuredCloneScope::DifferentProcess);
|
||||
if (!ReadParam(aMsg, aIter, &data)) {
|
||||
return false;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -31,8 +31,8 @@ public:
|
|||
static already_AddRefed<SharedJSAllocatedData>
|
||||
CreateFromExternalData(const char* aData, size_t aDataLength)
|
||||
{
|
||||
JSStructuredCloneData buf;
|
||||
buf.WriteBytes(aData, aDataLength);
|
||||
JSStructuredCloneData buf(JS::StructuredCloneScope::DifferentProcess);
|
||||
buf.AppendBytes(aData, aDataLength);
|
||||
RefPtr<SharedJSAllocatedData> sharedData =
|
||||
new SharedJSAllocatedData(Move(buf));
|
||||
return sharedData.forget();
|
||||
|
|
@ -41,12 +41,8 @@ public:
|
|||
static already_AddRefed<SharedJSAllocatedData>
|
||||
CreateFromExternalData(const JSStructuredCloneData& aData)
|
||||
{
|
||||
JSStructuredCloneData buf;
|
||||
auto iter = aData.Iter();
|
||||
while (!iter.Done()) {
|
||||
buf.WriteBytes(iter.Data(), iter.RemainingInSegment());
|
||||
iter.Advance(aData, iter.RemainingInSegment());
|
||||
}
|
||||
JSStructuredCloneData buf(aData.scope());
|
||||
buf.Append(aData);
|
||||
RefPtr<SharedJSAllocatedData> sharedData =
|
||||
new SharedJSAllocatedData(Move(buf));
|
||||
return sharedData.forget();
|
||||
|
|
@ -70,6 +66,7 @@ public:
|
|||
: StructuredCloneHolder(StructuredCloneHolder::CloningSupported,
|
||||
StructuredCloneHolder::TransferringSupported,
|
||||
StructuredCloneHolder::StructuredCloneScope::DifferentProcess)
|
||||
, mExternalData(StructuredCloneHolder::StructuredCloneScope::DifferentProcess)
|
||||
, mInitialized(false)
|
||||
{}
|
||||
|
||||
|
|
@ -113,10 +110,9 @@ public:
|
|||
|
||||
bool UseExternalData(const JSStructuredCloneData& aData)
|
||||
{
|
||||
auto iter = aData.Iter();
|
||||
auto iter = aData.Start();
|
||||
bool success = false;
|
||||
mExternalData =
|
||||
aData.Borrow<js::SystemAllocPolicy>(iter, aData.Size(), &success);
|
||||
mExternalData = aData.Borrow(iter, aData.Size(), &success);
|
||||
mInitialized = true;
|
||||
return success;
|
||||
}
|
||||
|
|
@ -133,6 +129,11 @@ public:
|
|||
return mSharedData ? mSharedData->Data() : mExternalData;
|
||||
}
|
||||
|
||||
void InitScope(JS::StructuredCloneScope aScope)
|
||||
{
|
||||
Data().initScope(aScope);
|
||||
}
|
||||
|
||||
size_t DataLength() const
|
||||
{
|
||||
return mSharedData ? mSharedData->DataLength() : mExternalData.Size();
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue