mirror of
https://github.com/mozilla/gecko-dev.git
synced 2025-11-01 16:58:12 +02:00
Revert "Bug 1966443: Use proper length for Windows clipboard elements r=win-reviewers,emilio,gstoll" for causing Bug 1968744
This reverts commit cff2580bc6b540ff1bb9b890d9cf79c1bcc563a5.
This commit is contained in:
parent
4777da5f47
commit
b7be7bd4a6
1 changed files with 22 additions and 28 deletions
|
|
@ -578,7 +578,6 @@ NS_IMETHODIMP nsClipboard::SetNativeClipboardData(
|
||||||
}
|
}
|
||||||
|
|
||||||
//-------------------------------------------------------------------------
|
//-------------------------------------------------------------------------
|
||||||
/* static */
|
|
||||||
nsresult nsClipboard::GetGlobalData(HGLOBAL aHGBL, void** aData,
|
nsresult nsClipboard::GetGlobalData(HGLOBAL aHGBL, void** aData,
|
||||||
uint32_t* aLen) {
|
uint32_t* aLen) {
|
||||||
MOZ_CLIPBOARD_LOG("%s", __FUNCTION__);
|
MOZ_CLIPBOARD_LOG("%s", __FUNCTION__);
|
||||||
|
|
@ -701,29 +700,6 @@ HRESULT nsClipboard::FillSTGMedium(IDataObject* aDataObject, UINT aFormat,
|
||||||
}
|
}
|
||||||
|
|
||||||
//-------------------------------------------------------------------------
|
//-------------------------------------------------------------------------
|
||||||
// Get the data out of the global data handle. The size we
|
|
||||||
// return should be the size returned from GetGlobalData(), since the
|
|
||||||
// string returned from Windows may have nulls inserted -- it may not
|
|
||||||
// even be null-terminated. GetGlobalData adds bytes for null
|
|
||||||
// termination to the buffer but they are not considered in the returned
|
|
||||||
// byte count. We check and skip the last counted byte if it is a null
|
|
||||||
// since Windows also appears to add null termination. See GetGlobalData.
|
|
||||||
template <typename CharType>
|
|
||||||
static nsresult GetCharDataFromGlobalData(STGMEDIUM& aStm, CharType** aData,
|
|
||||||
uint32_t* aLen) {
|
|
||||||
uint32_t nBytes = 0;
|
|
||||||
MOZ_TRY(nsClipboard::GetGlobalData(aStm.hGlobal,
|
|
||||||
reinterpret_cast<void**>(aData), &nBytes));
|
|
||||||
auto nChars = nBytes / sizeof(CharType);
|
|
||||||
if (nChars < 1) {
|
|
||||||
*aLen = 0;
|
|
||||||
return NS_OK;
|
|
||||||
}
|
|
||||||
bool hasNullTerminator = (*aData)[nChars - 1] == CharType(0);
|
|
||||||
*aLen = hasNullTerminator ? nBytes - sizeof(CharType) : nBytes;
|
|
||||||
return NS_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
// If aFormat is CF_DIBV5, aMIMEImageFormat must be a type for which we have
|
// If aFormat is CF_DIBV5, aMIMEImageFormat must be a type for which we have
|
||||||
// an image encoder (e.g. image/png).
|
// an image encoder (e.g. image/png).
|
||||||
// For other values of aFormat, it is OK to pass null for aMIMEImageFormat.
|
// For other values of aFormat, it is OK to pass null for aMIMEImageFormat.
|
||||||
|
|
@ -788,13 +764,31 @@ nsresult nsClipboard::GetNativeDataOffClipboard(IDataObject* aDataObject,
|
||||||
// compile-time-constant format indicators:
|
// compile-time-constant format indicators:
|
||||||
switch (fe.cfFormat) {
|
switch (fe.cfFormat) {
|
||||||
case CF_TEXT: {
|
case CF_TEXT: {
|
||||||
return GetCharDataFromGlobalData(stm, reinterpret_cast<char**>(aData),
|
// Get the data out of the global data handle. The size we
|
||||||
aLen);
|
// return should not include the null because the other
|
||||||
|
// platforms don't use nulls, so just return the length we get
|
||||||
|
// back from strlen(), since we know CF_TEXT is null
|
||||||
|
// terminated. Recall that GetGlobalData() returns the size of
|
||||||
|
// the allocated buffer, not the size of the data (on 98, these
|
||||||
|
// are not the same) so we can't use that.
|
||||||
|
uint32_t allocLen = 0;
|
||||||
|
MOZ_TRY(GetGlobalData(stm.hGlobal, aData, &allocLen));
|
||||||
|
*aLen = strlen(reinterpret_cast<char*>(*aData));
|
||||||
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
case CF_UNICODETEXT: {
|
case CF_UNICODETEXT: {
|
||||||
return GetCharDataFromGlobalData(stm, reinterpret_cast<char16_t**>(aData),
|
// Get the data out of the global data handle. The size we
|
||||||
aLen);
|
// return should not include the null because the other
|
||||||
|
// platforms don't use nulls, so just return the length we get
|
||||||
|
// back from strlen(), since we know CF_UNICODETEXT is null
|
||||||
|
// terminated. Recall that GetGlobalData() returns the size of
|
||||||
|
// the allocated buffer, not the size of the data (on 98, these
|
||||||
|
// are not the same) so we can't use that.
|
||||||
|
uint32_t allocLen = 0;
|
||||||
|
MOZ_TRY(GetGlobalData(stm.hGlobal, aData, &allocLen));
|
||||||
|
*aLen = NS_strlen(reinterpret_cast<char16_t*>(*aData)) * 2;
|
||||||
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
case CF_DIBV5: {
|
case CF_DIBV5: {
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue