Skip to content

Commit

Permalink
Bug 1493292 - Remove len from nsTransferable. r=smaug
Browse files Browse the repository at this point in the history
Depends on D11202

Differential Revision: https://phabricator.services.mozilla.com/D11203
  • Loading branch information
evilpie committed Nov 20, 2018
1 parent af85f6a commit 16f5d46
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 29 deletions.
29 changes: 11 additions & 18 deletions widget/nsTransferable.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,6 @@ NS_IMPL_ISUPPORTS(nsTransferable, nsITransferable)

DataStruct::DataStruct(DataStruct&& aRHS)
: mData(aRHS.mData.forget())
, mDataLen(aRHS.mDataLen)
, mCacheFD(aRHS.mCacheFD)
, mFlavor(aRHS.mFlavor)
{
Expand All @@ -60,7 +59,7 @@ DataStruct::~DataStruct()
//-------------------------------------------------------------------------

void
DataStruct::SetData(nsISupports* aData, uint32_t aDataLen, bool aIsPrivateData)
DataStruct::SetData(nsISupports* aData, 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.
Expand All @@ -76,7 +75,6 @@ DataStruct::SetData(nsISupports* aData, uint32_t aDataLen, bool aIsPrivateData)
free(data);
// Clear previously set small data.
mData = nullptr;
mDataLen = 0;
return;
}

Expand All @@ -93,33 +91,30 @@ DataStruct::SetData(nsISupports* aData, uint32_t aDataLen, bool aIsPrivateData)
}

mData = aData;
mDataLen = aDataLen;
}

//-------------------------------------------------------------------------
void
DataStruct::GetData(nsISupports** aData, uint32_t* aDataLen)
DataStruct::GetData(nsISupports** aData)
{
// check here to see if the data is cached on disk
if (mCacheFD) {
// if so, read it in and pass it back
// ReadCache creates memory and copies the data into it.
if (NS_SUCCEEDED(ReadCache(aData, aDataLen))) {
if (NS_SUCCEEDED(ReadCache(aData))) {
return;
}

// oh shit, something went horribly wrong here.
NS_WARNING("Oh no, couldn't read data in from the cache file");
*aData = nullptr;
*aDataLen = 0;
PR_Close(mCacheFD);
mCacheFD = nullptr;
return;
}

nsCOMPtr<nsISupports> data = mData;
data.forget(aData);
*aDataLen = mDataLen;
}

//-------------------------------------------------------------------------
Expand Down Expand Up @@ -153,7 +148,7 @@ DataStruct::WriteCache(void* aData, uint32_t aDataLen)

//-------------------------------------------------------------------------
nsresult
DataStruct::ReadCache(nsISupports** aData, uint32_t* aDataLen)
DataStruct::ReadCache(nsISupports** aData)
{
if (!mCacheFD) {
return NS_ERROR_FAILURE;
Expand All @@ -180,7 +175,6 @@ DataStruct::ReadCache(nsISupports** aData, uint32_t* aDataLen)

nsPrimitiveHelpers::CreatePrimitiveForData(
mFlavor, data.get(), fileSize, aData);
*aDataLen = fileSize;
return NS_OK;
}

Expand Down Expand Up @@ -271,12 +265,12 @@ nsTransferable::GetTransferData(const char* aFlavor,
// First look and see if the data is present in one of the intrinsic flavors.
if (Maybe<size_t> index = FindDataFlavor(aFlavor)) {
nsCOMPtr<nsISupports> dataBytes;
uint32_t len;
mDataArray[index.value()].GetData(getter_AddRefs(dataBytes), &len);
mDataArray[index.value()].GetData(getter_AddRefs(dataBytes));

// Do we have a (lazy) data provider?
if (nsCOMPtr<nsIFlavorDataProvider> dataProvider =
do_QueryInterface(dataBytes)) {
uint32_t len;
rv = dataProvider->GetFlavorData(this, aFlavor,
getter_AddRefs(dataBytes), &len);
if (NS_FAILED(rv)) {
Expand All @@ -301,10 +295,10 @@ nsTransferable::GetTransferData(const char* aFlavor,
mFormatConv->CanConvert(data.GetFlavor().get(), aFlavor, &canConvert);
if (canConvert) {
nsCOMPtr<nsISupports> dataBytes;
uint32_t len;
data.GetData(getter_AddRefs(dataBytes), &len);
data.GetData(getter_AddRefs(dataBytes));

// Do we have a (lazy) data provider?
uint32_t len;
if (nsCOMPtr<nsIFlavorDataProvider> dataProvider =
do_QueryInterface(dataBytes)) {
rv = dataProvider->GetFlavorData(this, aFlavor,
Expand Down Expand Up @@ -341,8 +335,7 @@ nsTransferable::GetAnyTransferData(nsACString& aFlavor,
DataStruct& data = mDataArray.ElementAt(i);
if (data.IsDataAvailable()) {
aFlavor.Assign(data.GetFlavor());
uint32_t dataLen;
data.GetData(aData, &dataLen);
data.GetData(aData);
return NS_OK;
}
}
Expand All @@ -364,7 +357,7 @@ nsTransferable::SetTransferData(const char* aFlavor,
// first check our intrinsic flavors to see if one has been registered.
if (Maybe<size_t> index = FindDataFlavor(aFlavor)) {
DataStruct& data = mDataArray.ElementAt(index.value());
data.SetData(aData, 0, mPrivateData);
data.SetData(aData, mPrivateData);
return NS_OK;
}

Expand All @@ -384,7 +377,7 @@ nsTransferable::SetTransferData(const char* aFlavor,
data.GetFlavor().get(),
getter_AddRefs(ConvertedData),
&ConvertedLen);
data.SetData(ConvertedData, ConvertedLen, mPrivateData);
data.SetData(ConvertedData, mPrivateData);
return NS_OK;
}
}
Expand Down
21 changes: 10 additions & 11 deletions widget/nsTransferable.h
Original file line number Diff line number Diff line change
Expand Up @@ -25,29 +25,28 @@ class nsIMutableArray;
struct DataStruct
{
explicit DataStruct ( const char* aFlavor )
: mDataLen(0), mCacheFD(nullptr), mFlavor(aFlavor) { }
: mCacheFD(nullptr), mFlavor(aFlavor) { }
DataStruct(DataStruct&& aRHS);
~DataStruct();

const nsCString& GetFlavor() const { return mFlavor; }
void SetData( nsISupports* inData, uint32_t inDataLen, bool aIsPrivateData );
void GetData( nsISupports** outData, uint32_t *outDataLen );
bool IsDataAvailable() const { return mData ? mDataLen > 0 : mCacheFD != nullptr; }
void SetData(nsISupports* inData, bool aIsPrivateData);
void GetData(nsISupports** outData);
bool IsDataAvailable() const { return mData || mCacheFD; }

protected:

enum {
// The size of data over which we write the data to disk rather than
// keep it around in memory.
kLargeDatasetSize = 1000000 // 1 million bytes
};

nsresult WriteCache(void* aData, uint32_t aDataLen);
nsresult ReadCache(nsISupports** aData, uint32_t* aDataLen );
// mData + mDataLen OR mCacheFD should be used, not both.
nsresult ReadCache(nsISupports** aData);

// mData OR mCacheFD should be used, not both.
nsCOMPtr<nsISupports> mData; // OWNER - some varient of primitive wrapper
uint32_t mDataLen;
PRFileDesc* mCacheFD;
const nsCString mFlavor;

Expand Down

0 comments on commit 16f5d46

Please sign in to comment.