зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1493292 - GetStringSize instead of aDataLen. r=mats
Differential Revision: https://phabricator.services.mozilla.com/D11200 --HG-- extra : moz-landing-system : lando
This commit is contained in:
Родитель
5a990aab93
Коммит
b21e106022
|
@ -58,24 +58,34 @@ DataStruct::~DataStruct()
|
|||
}
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
void
|
||||
DataStruct::SetData(nsISupports* aData, uint32_t aDataLen, bool aIsPrivateData)
|
||||
{
|
||||
// Now, check to see if we consider the data to be "too large"
|
||||
// as well as ensuring that private browsing mode is disabled
|
||||
if (aDataLen > kLargeDatasetSize && !aIsPrivateData &&
|
||||
// as well as ensuring that private browsing mode is disabled.
|
||||
// File IO is not allowed in content processes.
|
||||
XRE_IsParentProcess()) {
|
||||
// if so, cache it to disk instead of memory
|
||||
if (NS_SUCCEEDED(WriteCache(aData, aDataLen))) {
|
||||
if (!aIsPrivateData && XRE_IsParentProcess()) {
|
||||
void* data = nullptr;
|
||||
uint32_t dataLen = 0;
|
||||
nsPrimitiveHelpers::CreateDataFromPrimitive(mFlavor, aData, &data, &dataLen);
|
||||
|
||||
if (dataLen > kLargeDatasetSize) {
|
||||
// Too large, cache it to disk instead of memory.
|
||||
if (NS_SUCCEEDED(WriteCache(data, dataLen))) {
|
||||
free(data);
|
||||
// Clear previously set small data.
|
||||
mData = nullptr;
|
||||
mDataLen = 0;
|
||||
return;
|
||||
}
|
||||
|
||||
NS_WARNING("Oh no, couldn't write data to the cache file");
|
||||
}
|
||||
|
||||
free(data);
|
||||
}
|
||||
|
||||
if (mCacheFD) {
|
||||
// Clear previously set big data.
|
||||
PR_Close(mCacheFD);
|
||||
|
@ -114,8 +124,12 @@ DataStruct::GetData(nsISupports** aData, uint32_t* aDataLen)
|
|||
|
||||
//-------------------------------------------------------------------------
|
||||
nsresult
|
||||
DataStruct::WriteCache(nsISupports* aData, uint32_t aDataLen)
|
||||
DataStruct::WriteCache(void* aData, uint32_t aDataLen)
|
||||
{
|
||||
MOZ_ASSERT(aData && aDataLen);
|
||||
MOZ_ASSERT(aDataLen <= std::numeric_limits<int32_t>::max(),
|
||||
"too large size for PR_Write");
|
||||
|
||||
nsresult rv;
|
||||
if (!mCacheFD) {
|
||||
rv = NS_OpenAnonymousTemporaryFile(&mCacheFD);
|
||||
|
@ -126,17 +140,12 @@ DataStruct::WriteCache(nsISupports* aData, uint32_t aDataLen)
|
|||
return NS_ERROR_FAILURE;
|
||||
}
|
||||
|
||||
// write out the contents of the clipboard to the file
|
||||
void* buff = nullptr;
|
||||
uint32_t dataLen = 0;
|
||||
nsPrimitiveHelpers::CreateDataFromPrimitive(mFlavor, aData, &buff, &dataLen);
|
||||
if (buff) {
|
||||
int32_t written = PR_Write(mCacheFD, buff, dataLen);
|
||||
free(buff);
|
||||
if (written) {
|
||||
// Write out the contents of the clipboard to the file.
|
||||
int32_t written = PR_Write(mCacheFD, aData, aDataLen);
|
||||
if (written == aDataLen) {
|
||||
return NS_OK;
|
||||
}
|
||||
}
|
||||
|
||||
PR_Close(mCacheFD);
|
||||
mCacheFD = nullptr;
|
||||
return NS_ERROR_FAILURE;
|
||||
|
|
|
@ -42,7 +42,7 @@ protected:
|
|||
kLargeDatasetSize = 1000000 // 1 million bytes
|
||||
};
|
||||
|
||||
nsresult WriteCache(nsISupports* aData, uint32_t aDataLen );
|
||||
nsresult WriteCache(void* aData, uint32_t aDataLen);
|
||||
nsresult ReadCache(nsISupports** aData, uint32_t* aDataLen );
|
||||
|
||||
// mData + mDataLen OR mCacheFD should be used, not both.
|
||||
|
|
Загрузка…
Ссылка в новой задаче