Backed out 6 changesets (bug 1493292) for bustage on /nsTransferable.cpp. CLOSED TREE

Backed out changeset f198bf91320b (bug 1493292)
Backed out changeset 6487aa307123 (bug 1493292)
Backed out changeset f2cabd69c568 (bug 1493292)
Backed out changeset 71430fceb4a3 (bug 1493292)
Backed out changeset 3a9b6d65d8c7 (bug 1493292)
Backed out changeset 55769869037c (bug 1493292)
This commit is contained in:
Csoregi Natalia 2018-11-20 17:13:18 +02:00
Родитель 2e8ddc13d2
Коммит df7483024d
42 изменённых файлов: 272 добавлений и 173 удалений

Просмотреть файл

@ -731,12 +731,13 @@ function getTextFromClipboard() {
Services.clipboard.getData(trans, Services.clipboard.kGlobalClipboard);
var str = {};
trans.getTransferData("text/unicode", str);
var strLength = {};
trans.getTransferData("text/unicode", str, strLength);
if (str)
str = str.value.QueryInterface(Ci.nsISupportsString);
if (str)
return str.data;
return str.data.substring(0, strLength.value / 2);
return "";
}

Просмотреть файл

@ -2504,11 +2504,12 @@ function readFromClipboard() {
Services.clipboard.getData(trans, Services.clipboard.kGlobalClipboard);
var data = {};
trans.getTransferData("text/unicode", data);
var dataLen = {};
trans.getTransferData("text/unicode", data, dataLen);
if (data) {
data = data.value.QueryInterface(Ci.nsISupportsString);
url = data.data;
url = data.data.substring(0, dataLen.value / 2);
}
} catch (ex) {
}

Просмотреть файл

@ -28,7 +28,7 @@ add_task(async function copyURL() {
transferable.addDataFlavor(flavor);
Services.clipboard.getData(transferable, Services.clipboard.kGlobalClipboard);
let strObj = {};
transferable.getTransferData(flavor, strObj);
transferable.getTransferData(flavor, strObj, {});
Assert.ok(!!strObj.value);
strObj.value.QueryInterface(Ci.nsISupportsString);
Assert.equal(strObj.value.data, gBrowser.selectedBrowser.currentURI.spec);

Просмотреть файл

@ -965,7 +965,7 @@ PlacesController.prototype = {
xferable.init(null);
xferable.addDataFlavor(PlacesUtils.TYPE_X_MOZ_PLACE_ACTION);
this.clipboard.getData(xferable, Ci.nsIClipboard.kGlobalClipboard);
xferable.getTransferData(PlacesUtils.TYPE_X_MOZ_PLACE_ACTION, action);
xferable.getTransferData(PlacesUtils.TYPE_X_MOZ_PLACE_ACTION, action, {});
[action, actionOwner] =
action.value.QueryInterface(Ci.nsISupportsString).data.split(",");
} catch (ex) {

Просмотреть файл

@ -2618,7 +2618,8 @@ dump(`callFromJSON: < ${JSON.stringify(call)}\n`);
Services.clipboard.getData(
trans, Services.clipboard.kGlobalClipboard);
let str = {};
trans.getTransferData("text/unicode", str);
let strLength = {};
trans.getTransferData("text/unicode", str, strLength);
let pasteText = str.value.QueryInterface(Ci.nsISupportsString).data;
return new String_PP_Var(pasteText);
}

Просмотреть файл

@ -165,9 +165,11 @@ async function getImageSizeFromClipboard() {
clip.getData(trans, clipid.kGlobalClipboard);
const data = {};
trans.getTransferData(flavor, data);
const dataLength = {};
trans.getTransferData(flavor, data, dataLength);
ok(data.value, "screenshot exists");
ok(dataLength.value > 0, "screenshot has length");
let image = data.value;

Просмотреть файл

@ -42,7 +42,7 @@ function getText() {
const data = {};
try {
xferable.getTransferData(flavor, data);
xferable.getTransferData(flavor, data, {});
} catch (e) {
// Clipboard doesn't contain data in flavor, return null.
return null;

Просмотреть файл

@ -230,10 +230,12 @@ CheckAndGetExtensionForMime(const nsCString& aExtension,
NS_IMETHODIMP
nsContentAreaDragDropDataProvider::GetFlavorData(nsITransferable *aTransferable,
const char *aFlavor,
nsISupports **aData)
nsISupports **aData,
uint32_t *aDataLen)
{
NS_ENSURE_ARG_POINTER(aData);
NS_ENSURE_ARG_POINTER(aData && aDataLen);
*aData = nullptr;
*aDataLen = 0;
nsresult rv = NS_ERROR_NOT_IMPLEMENTED;
@ -241,7 +243,9 @@ nsContentAreaDragDropDataProvider::GetFlavorData(nsITransferable *aTransferable,
// get the URI from the kFilePromiseURLMime flavor
NS_ENSURE_ARG(aTransferable);
nsCOMPtr<nsISupports> tmp;
aTransferable->GetTransferData(kFilePromiseURLMime, getter_AddRefs(tmp));
uint32_t dataSize = 0;
aTransferable->GetTransferData(kFilePromiseURLMime,
getter_AddRefs(tmp), &dataSize);
nsCOMPtr<nsISupportsString> supportsString =
do_QueryInterface(tmp);
if (!supportsString)
@ -257,7 +261,7 @@ nsContentAreaDragDropDataProvider::GetFlavorData(nsITransferable *aTransferable,
NS_ENSURE_SUCCESS(rv, rv);
aTransferable->GetTransferData(kFilePromiseDestFilename,
getter_AddRefs(tmp));
getter_AddRefs(tmp), &dataSize);
supportsString = do_QueryInterface(tmp);
if (!supportsString)
return NS_ERROR_FAILURE;
@ -276,7 +280,7 @@ nsContentAreaDragDropDataProvider::GetFlavorData(nsITransferable *aTransferable,
// content processes.
if (XRE_IsParentProcess()) {
aTransferable->GetTransferData(kImageRequestMime,
getter_AddRefs(tmp));
getter_AddRefs(tmp), &dataSize);
supportsString = do_QueryInterface(tmp);
if (!supportsString)
return NS_ERROR_FAILURE;
@ -324,8 +328,9 @@ nsContentAreaDragDropDataProvider::GetFlavorData(nsITransferable *aTransferable,
// get the target directory from the kFilePromiseDirectoryMime
// flavor
nsCOMPtr<nsISupports> dirPrimitive;
dataSize = 0;
aTransferable->GetTransferData(kFilePromiseDirectoryMime,
getter_AddRefs(dirPrimitive));
getter_AddRefs(dirPrimitive), &dataSize);
nsCOMPtr<nsIFile> destDirectory = do_QueryInterface(dirPrimitive);
if (!destDirectory)
return NS_ERROR_FAILURE;
@ -343,6 +348,7 @@ nsContentAreaDragDropDataProvider::GetFlavorData(nsITransferable *aTransferable,
// send back an nsIFile
if (NS_SUCCEEDED(rv)) {
CallQueryInterface(file, aData);
*aDataLen = sizeof(nsIFile*);
}
}
@ -788,22 +794,27 @@ DragDataProducer::Produce(DataTransfer* aDataTransfer,
nsCOMPtr<nsISupports> supports;
nsCOMPtr<nsISupportsString> data;
rv = transferable->GetTransferData(kHTMLMime, getter_AddRefs(supports));
uint32_t dataSize;
rv = transferable->GetTransferData(kHTMLMime, getter_AddRefs(supports),
&dataSize);
data = do_QueryInterface(supports);
if (NS_SUCCEEDED(rv)) {
data->GetData(mHtmlString);
}
rv = transferable->GetTransferData(kHTMLContext, getter_AddRefs(supports));
rv = transferable->GetTransferData(kHTMLContext, getter_AddRefs(supports),
&dataSize);
data = do_QueryInterface(supports);
if (NS_SUCCEEDED(rv)) {
data->GetData(mContextString);
}
rv = transferable->GetTransferData(kHTMLInfo, getter_AddRefs(supports));
rv = transferable->GetTransferData(kHTMLInfo, getter_AddRefs(supports),
&dataSize);
data = do_QueryInterface(supports);
if (NS_SUCCEEDED(rv)) {
data->GetData(mInfoString);
}
rv = transferable->GetTransferData(kUnicodeMime, getter_AddRefs(supports));
rv = transferable->GetTransferData(kUnicodeMime, getter_AddRefs(supports),
&dataSize);
data = do_QueryInterface(supports);
NS_ENSURE_SUCCESS(rv, rv); // require plain text at a minimum
data->GetData(mTitleString);

Просмотреть файл

@ -7755,7 +7755,8 @@ nsContentUtils::IPCTransferableToTransferable(const IPCDataTransfer& aDataTransf
rv = dataWrapper->SetData(text);
NS_ENSURE_SUCCESS(rv, rv);
rv = aTransferable->SetTransferData(item.flavor().get(), dataWrapper);
rv = aTransferable->SetTransferData(item.flavor().get(), dataWrapper,
text.Length() * sizeof(char16_t));
NS_ENSURE_SUCCESS(rv, rv);
} else if (item.data().type() == IPCDataTransferData::TShmem) {
@ -7765,7 +7766,7 @@ nsContentUtils::IPCTransferableToTransferable(const IPCDataTransfer& aDataTransf
getter_AddRefs(imageContainer));
NS_ENSURE_SUCCESS(rv, rv);
aTransferable->SetTransferData(item.flavor().get(), imageContainer);
aTransferable->SetTransferData(item.flavor().get(), imageContainer, sizeof(nsISupports*));
} else {
nsCOMPtr<nsISupportsCString> dataWrapper =
do_CreateInstance(NS_SUPPORTS_CSTRING_CONTRACTID, &rv);
@ -7778,7 +7779,7 @@ nsContentUtils::IPCTransferableToTransferable(const IPCDataTransfer& aDataTransf
rv = dataWrapper->SetData(text);
NS_ENSURE_SUCCESS(rv, rv);
rv = aTransferable->SetTransferData(item.flavor().get(), dataWrapper);
rv = aTransferable->SetTransferData(item.flavor().get(), dataWrapper, text.Length());
NS_ENSURE_SUCCESS(rv, rv);
}
@ -7993,7 +7994,8 @@ nsContentUtils::TransferableToIPCTransferable(nsITransferable* aTransferable,
}
nsCOMPtr<nsISupports> data;
aTransferable->GetTransferData(flavorStr.get(), getter_AddRefs(data));
uint32_t dataLen = 0;
aTransferable->GetTransferData(flavorStr.get(), getter_AddRefs(data), &dataLen);
nsCOMPtr<nsISupportsString> text = do_QueryInterface(data);
nsCOMPtr<nsISupportsCString> ctext = do_QueryInterface(data);

Просмотреть файл

@ -415,7 +415,8 @@ nsCopySupport::ImageCopy(nsIImageLoadingContent* aImageElement,
#endif
// copy the image data onto the transferable
rv = trans->SetTransferData(kNativeImageMime, image);
rv = trans->SetTransferData(kNativeImageMime, image,
sizeof(nsISupports*));
NS_ENSURE_SUCCESS(rv, rv);
}
@ -453,7 +454,8 @@ static nsresult AppendString(nsITransferable *aTransferable,
rv = aTransferable->AddDataFlavor(aFlavor);
NS_ENSURE_SUCCESS(rv, rv);
return aTransferable->SetTransferData(aFlavor, data);
return aTransferable->SetTransferData(aFlavor, data,
aString.Length() * sizeof(char16_t));
}
static nsresult AppendDOMNode(nsITransferable *aTransferable,

Просмотреть файл

@ -85,7 +85,7 @@ async function testCopyPaste (isXHTML) {
transferable.addDataFlavor(mime);
clipboard.getData(transferable, 1);
var data = SpecialPowers.createBlankObject();
transferable.getTransferData(mime, data) ;
transferable.getTransferData(mime, data, {}) ;
return data;
}
function testHtmlClipboardValue(mime, expected) {

Просмотреть файл

@ -60,7 +60,7 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=816298
transferable.addDataFlavor(mime);
clipboard.getData(transferable, 1);
var data = SpecialPowers.createBlankObject();
transferable.getTransferData(mime, data) ;
transferable.getTransferData(mime, data, {}) ;
return SpecialPowers.wrap(data);
}
function testHtmlClipboardValue(mime, expected, test) {

Просмотреть файл

@ -32,7 +32,7 @@ function testCopyImage () {
transferable.addDataFlavor(mime);
clipboard.getData(transferable, 1);
var data = SpecialPowers.createBlankObject();
transferable.getTransferData(mime, data);
transferable.getTransferData(mime, data, {});
return data;
}

Просмотреть файл

@ -1076,7 +1076,8 @@ DataTransfer::GetTransferable(uint32_t aIndex, nsILoadContext* aLoadContext)
strSupports->SetData(str);
nsresult rv = transferable->SetTransferData(kCustomTypesMime,
strSupports);
strSupports,
totalCustomLength);
if (NS_FAILED(rv)) {
return nullptr;
}
@ -1116,7 +1117,8 @@ DataTransfer::GetTransferable(uint32_t aIndex, nsILoadContext* aLoadContext)
continue;
}
nsresult rv = transferable->SetTransferData(format, convertedData);
nsresult rv = transferable->SetTransferData(format, convertedData,
lengthInBytes);
if (NS_FAILED(rv)) {
return nullptr;
}

Просмотреть файл

@ -179,8 +179,9 @@ DataTransferItem::FillInExternalData()
}
}
uint32_t length = 0;
nsCOMPtr<nsISupports> data;
nsresult rv = trans->GetTransferData(format, getter_AddRefs(data));
nsresult rv = trans->GetTransferData(format, getter_AddRefs(data), &length);
if (NS_WARN_IF(NS_FAILED(rv) || !data)) {
return;
}

Просмотреть файл

@ -1585,6 +1585,7 @@ HTMLEditor::PasteInternal(int32_t aClipboardType,
bool bHavePrivateHTMLFlavor = HavePrivateHTMLFlavor(clipboard);
if (bHavePrivateHTMLFlavor) {
nsCOMPtr<nsISupports> contextDataObj, infoDataObj;
uint32_t contextLen, infoLen;
nsCOMPtr<nsISupportsString> textDataObj;
nsCOMPtr<nsITransferable> contextTransferable =
@ -1596,7 +1597,8 @@ HTMLEditor::PasteInternal(int32_t aClipboardType,
contextTransferable->AddDataFlavor(kHTMLContext);
clipboard->GetData(contextTransferable, aClipboardType);
contextTransferable->GetTransferData(kHTMLContext,
getter_AddRefs(contextDataObj));
getter_AddRefs(contextDataObj),
&contextLen);
nsCOMPtr<nsITransferable> infoTransferable =
do_CreateInstance("@mozilla.org/widget/transferable;1");
@ -1607,16 +1609,23 @@ HTMLEditor::PasteInternal(int32_t aClipboardType,
infoTransferable->AddDataFlavor(kHTMLInfo);
clipboard->GetData(infoTransferable, aClipboardType);
infoTransferable->GetTransferData(kHTMLInfo,
getter_AddRefs(infoDataObj));
getter_AddRefs(infoDataObj),
&infoLen);
if (contextDataObj) {
nsAutoString text;
textDataObj = do_QueryInterface(contextDataObj);
textDataObj->GetData(contextStr);
textDataObj->GetData(text);
MOZ_ASSERT(text.Length() <= contextLen / 2);
contextStr.Assign(text.get(), contextLen / 2);
}
if (infoDataObj) {
nsAutoString text;
textDataObj = do_QueryInterface(infoDataObj);
textDataObj->GetData(infoStr);
textDataObj->GetData(text);
MOZ_ASSERT(text.Length() <= infoLen / 2);
infoStr.Assign(text.get(), infoLen / 2);
}
}
@ -1785,8 +1794,10 @@ HTMLEditor::CanPasteTransferable(nsITransferable* aTransferable)
for (size_t i = 0; i < length; i++, flavors++) {
nsCOMPtr<nsISupports> data;
uint32_t dataLen;
nsresult rv = aTransferable->GetTransferData(*flavors,
getter_AddRefs(data));
getter_AddRefs(data),
&dataLen);
if (NS_SUCCEEDED(rv) && data) {
return true;
}

Просмотреть файл

@ -465,8 +465,10 @@ TextEditor::CanPasteTransferable(nsITransferable* aTransferable)
}
nsCOMPtr<nsISupports> data;
uint32_t dataLen;
nsresult rv = aTransferable->GetTransferData(kUnicodeMime,
getter_AddRefs(data));
getter_AddRefs(data),
&dataLen);
if (NS_SUCCEEDED(rv) && data) {
return true;
}

Просмотреть файл

@ -55,7 +55,7 @@ function copyCF_HTML(cfhtml, success, failure) {
cb.getData(trans, cb.kGlobalClipboard);
var data = SpecialPowers.createBlankObject();
try {
trans.getTransferData(CF_HTML, data);
trans.getTransferData(CF_HTML, data, {});
data = SpecialPowers.wrap(data).value.QueryInterface(Ci.nsISupportsCString).data;
} catch (e) {
setTimeout(function() { copyCF_HTML_worker(successFn, failureFn); }, 100);

Просмотреть файл

@ -1794,7 +1794,7 @@ SpecialPowersAPI.prototype = {
Services.clipboard.getData(xferable, whichClipboard);
var data = {};
try {
xferable.getTransferData(flavor, data);
xferable.getTransferData(flavor, data, {});
} catch (e) {}
data = data.value || null;
if (data == null)

Просмотреть файл

@ -611,7 +611,8 @@ function GetClipboardSearchString(aLoadContext) {
Clipboard.getData(trans, Ci.nsIClipboard.kFindClipboard);
let data = {};
trans.getTransferData("text/unicode", data);
let dataLen = {};
trans.getTransferData("text/unicode", data, dataLen);
if (data.value) {
data = data.value.QueryInterface(Ci.nsISupportsString);
searchString = data.toString();

Просмотреть файл

@ -91,7 +91,8 @@ function convertHTMLToPlainText(html) {
input.data = html.replace(/\n/g, "<br>");
var output = {};
converter.convert("text/html", input, "text/unicode", output);
converter.convert("text/html", input, input.data.length, "text/unicode",
output, {});
if (output.value instanceof Ci.nsISupportsString)
return output.value.data.replace(/\r\n/g, "\n");

Просмотреть файл

@ -33,7 +33,9 @@ nsClipboard::SetData(nsITransferable *aTransferable,
return NS_ERROR_NOT_IMPLEMENTED;
nsCOMPtr<nsISupports> tmp;
nsresult rv = aTransferable->GetTransferData(kUnicodeMime, getter_AddRefs(tmp));
uint32_t len;
nsresult rv = aTransferable->GetTransferData(kUnicodeMime, getter_AddRefs(tmp),
&len);
NS_ENSURE_SUCCESS(rv, rv);
nsCOMPtr<nsISupportsString> supportsString = do_QueryInterface(tmp);
// No support for non-text data
@ -71,7 +73,8 @@ nsClipboard::GetData(nsITransferable *aTransferable, int32_t aWhichClipboard)
nsCOMPtr<nsISupports> nsisupportsDataWrapper =
do_QueryInterface(dataWrapper);
rv = aTransferable->SetTransferData(kUnicodeMime, nsisupportsDataWrapper);
rv = aTransferable->SetTransferData(kUnicodeMime, nsisupportsDataWrapper,
buffer.Length() * sizeof(char16_t));
NS_ENSURE_SUCCESS(rv, rv);
return NS_OK;

Просмотреть файл

@ -6251,13 +6251,15 @@ provideDataForType:(NSString*)aType
continue;
}
item->SetTransferData(kFilePromiseDirectoryMime, macLocalFile);
item->SetTransferData(kFilePromiseDirectoryMime, macLocalFile,
sizeof(nsIFile*));
// Now request the kFilePromiseMime data, which will invoke the data
// provider. If successful, the file will have been created.
nsCOMPtr<nsISupports> fileDataPrimitive;
uint32_t dataSize = 0;
item->GetTransferData(kFilePromiseMime,
getter_AddRefs(fileDataPrimitive));
getter_AddRefs(fileDataPrimitive), &dataSize);
}
CFRelease(urlRef);
CFRelease(pboardRef);

Просмотреть файл

@ -239,7 +239,7 @@ nsClipboard::TransferableFromPasteboard(nsITransferable *aTransferable, NSPasteb
nsCOMPtr<nsISupports> genericDataWrapper;
nsPrimitiveHelpers::CreatePrimitiveForData(flavorStr, clipboardDataPtrNoBOM, dataLength,
getter_AddRefs(genericDataWrapper));
aTransferable->SetTransferData(flavorStr.get(), genericDataWrapper);
aTransferable->SetTransferData(flavorStr.get(), genericDataWrapper, dataLength);
free(clipboardDataPtr);
break;
}
@ -269,7 +269,7 @@ nsClipboard::TransferableFromPasteboard(nsITransferable *aTransferable, NSPasteb
nsPrimitiveHelpers::CreatePrimitiveForData(flavorStr, clipboardDataPtr, dataLength,
getter_AddRefs(genericDataWrapper));
aTransferable->SetTransferData(flavorStr.get(), genericDataWrapper);
aTransferable->SetTransferData(flavorStr.get(), genericDataWrapper, dataLength);
free(clipboardDataPtr);
}
else if (flavorStr.EqualsLiteral(kJPEGImageMime) ||
@ -336,7 +336,7 @@ nsClipboard::TransferableFromPasteboard(nsITransferable *aTransferable, NSPasteb
NS_NewByteInputStream(getter_AddRefs(byteStream), (const char*)[encodedData bytes],
[encodedData length], NS_ASSIGNMENT_COPY);
aTransferable->SetTransferData(flavorStr.get(), byteStream);
aTransferable->SetTransferData(flavorStr.get(), byteStream, sizeof(nsIInputStream*));
}
if (dest)
@ -389,9 +389,10 @@ nsClipboard::GetNativeClipboardData(nsITransferable* aTransferable, int32_t aWhi
nsCString& flavorStr = flavors[i];
nsCOMPtr<nsISupports> dataSupports;
rv = mTransferable->GetTransferData(flavorStr.get(), getter_AddRefs(dataSupports));
uint32_t dataSize = 0;
rv = mTransferable->GetTransferData(flavorStr.get(), getter_AddRefs(dataSupports), &dataSize);
if (NS_SUCCEEDED(rv)) {
aTransferable->SetTransferData(flavorStr.get(), dataSupports);
aTransferable->SetTransferData(flavorStr.get(), dataSupports, dataSize);
return NS_OK; // maybe try to fill in more types? Is there a point?
}
}
@ -516,8 +517,9 @@ nsClipboard::PasteboardDictFromTransferable(nsITransferable* aTransferable)
NSString *pboardType = nil;
if (nsClipboard::IsStringType(flavorStr, &pboardType)) {
uint32_t dataSize = 0;
nsCOMPtr<nsISupports> genericDataWrapper;
rv = aTransferable->GetTransferData(flavorStr.get(), getter_AddRefs(genericDataWrapper));
rv = aTransferable->GetTransferData(flavorStr.get(), getter_AddRefs(genericDataWrapper), &dataSize);
if (NS_FAILED(rv)) {
[pboardType release];
continue;
@ -540,8 +542,9 @@ nsClipboard::PasteboardDictFromTransferable(nsITransferable* aTransferable)
[pasteboardOutputDict setObject:nativeString forKey:pboardType];
}
else if (flavorStr.EqualsLiteral(kCustomTypesMime)) {
uint32_t dataSize = 0;
nsCOMPtr<nsISupports> genericDataWrapper;
rv = aTransferable->GetTransferData(flavorStr.get(), getter_AddRefs(genericDataWrapper));
rv = aTransferable->GetTransferData(flavorStr.get(), getter_AddRefs(genericDataWrapper), &dataSize);
if (NS_FAILED(rv)) {
continue;
}
@ -561,8 +564,9 @@ nsClipboard::PasteboardDictFromTransferable(nsITransferable* aTransferable)
else if (flavorStr.EqualsLiteral(kPNGImageMime) || flavorStr.EqualsLiteral(kJPEGImageMime) ||
flavorStr.EqualsLiteral(kJPGImageMime) || flavorStr.EqualsLiteral(kGIFImageMime) ||
flavorStr.EqualsLiteral(kNativeImageMime)) {
uint32_t dataSize = 0;
nsCOMPtr<nsISupports> transferSupports;
aTransferable->GetTransferData(flavorStr.get(), getter_AddRefs(transferSupports));
aTransferable->GetTransferData(flavorStr.get(), getter_AddRefs(transferSupports), &dataSize);
nsCOMPtr<imgIContainer> image(do_QueryInterface(transferSupports));
if (!image) {
@ -609,8 +613,9 @@ nsClipboard::PasteboardDictFromTransferable(nsITransferable* aTransferable)
CFRelease(tiffData);
}
else if (flavorStr.EqualsLiteral(kFileMime)) {
uint32_t len = 0;
nsCOMPtr<nsISupports> genericFile;
rv = aTransferable->GetTransferData(flavorStr.get(), getter_AddRefs(genericFile));
rv = aTransferable->GetTransferData(flavorStr.get(), getter_AddRefs(genericFile), &len);
if (NS_FAILED(rv)) {
continue;
}
@ -646,8 +651,9 @@ nsClipboard::PasteboardDictFromTransferable(nsITransferable* aTransferable)
forKey:urlPromiseContent];
}
else if (flavorStr.EqualsLiteral(kURLMime)) {
uint32_t len = 0;
nsCOMPtr<nsISupports> genericURL;
rv = aTransferable->GetTransferData(flavorStr.get(), getter_AddRefs(genericURL));
rv = aTransferable->GetTransferData(flavorStr.get(), getter_AddRefs(genericURL), &len);
nsCOMPtr<nsISupportsString> urlObject(do_QueryInterface(genericURL));
nsAutoString url;
@ -663,7 +669,7 @@ nsClipboard::PasteboardDictFromTransferable(nsITransferable* aTransferable)
nsAutoString urlTitle;
urlObject->GetData(urlTitle);
urlTitle.Mid(urlTitle, newlinePos + 1, urlTitle.Length() - (newlinePos + 1));
urlTitle.Mid(urlTitle, newlinePos + 1, len - (newlinePos + 1));
nativeTitle =
[NSString stringWithCharacters:

Просмотреть файл

@ -393,9 +393,10 @@ nsDragService::GetData(nsITransferable* aTransferable, uint32_t aItemIndex)
nsCString& flavorStr = flavors[i];
nsCOMPtr<nsISupports> dataSupports;
rv = currentTransferable->GetTransferData(flavorStr.get(), getter_AddRefs(dataSupports));
uint32_t dataSize = 0;
rv = currentTransferable->GetTransferData(flavorStr.get(), getter_AddRefs(dataSupports), &dataSize);
if (NS_SUCCEEDED(rv)) {
aTransferable->SetTransferData(flavorStr.get(), dataSupports);
aTransferable->SetTransferData(flavorStr.get(), dataSupports, dataSize);
return NS_OK; // maybe try to fill in more types? Is there a point?
}
}
@ -442,7 +443,7 @@ nsDragService::GetData(nsITransferable* aTransferable, uint32_t aItemIndex)
if (NS_FAILED(rv))
continue;
aTransferable->SetTransferData(flavorStr.get(), file);
aTransferable->SetTransferData(flavorStr.get(), file, dataLength);
break;
}
@ -469,7 +470,7 @@ nsDragService::GetData(nsITransferable* aTransferable, uint32_t aItemIndex)
nsPrimitiveHelpers::CreatePrimitiveForData(flavorStr, clipboardDataPtr, dataLength,
getter_AddRefs(genericDataWrapper));
aTransferable->SetTransferData(flavorStr.get(), genericDataWrapper);
aTransferable->SetTransferData(flavorStr.get(), genericDataWrapper, sizeof(nsIInputStream*));
free(clipboardDataPtr);
break;
}
@ -535,7 +536,7 @@ nsDragService::GetData(nsITransferable* aTransferable, uint32_t aItemIndex)
nsCOMPtr<nsISupports> genericDataWrapper;
nsPrimitiveHelpers::CreatePrimitiveForData(flavorStr, clipboardDataPtrNoBOM, dataLength,
getter_AddRefs(genericDataWrapper));
aTransferable->SetTransferData(flavorStr.get(), genericDataWrapper);
aTransferable->SetTransferData(flavorStr.get(), genericDataWrapper, dataLength);
free(clipboardDataPtr);
break;
}

Просмотреть файл

@ -236,7 +236,8 @@ nsClipboard::SetTransferableData(nsITransferable* aTransferable,
aClipboardData,
aClipboardDataLength,
getter_AddRefs(wrapper));
aTransferable->SetTransferData(aFlavor.get(), wrapper);
aTransferable->SetTransferData(aFlavor.get(),
wrapper, aClipboardDataLength);
}
NS_IMETHODIMP
@ -277,7 +278,8 @@ nsClipboard::GetData(nsITransferable *aTransferable, int32_t aWhichClipboard)
clipboardData,
clipboardDataLength,
NS_ASSIGNMENT_COPY);
aTransferable->SetTransferData(flavorStr.get(), byteStream);
aTransferable->SetTransferData(flavorStr.get(), byteStream,
sizeof(nsIInputStream*));
mContext->ReleaseClipboardData(clipboardData);
return NS_OK;
@ -473,6 +475,7 @@ nsClipboard::SelectionGetEvent(GtkClipboard *aClipboard,
nsresult rv;
nsCOMPtr<nsISupports> item;
uint32_t len;
GdkAtom selectionTarget = gtk_selection_data_get_target(aSelectionData);
@ -481,7 +484,8 @@ nsClipboard::SelectionGetEvent(GtkClipboard *aClipboard,
// Try to convert our internal type into a text string. Get
// the transferable for this clipboard and try to get the
// text/unicode type for it.
rv = trans->GetTransferData("text/unicode", getter_AddRefs(item));
rv = trans->GetTransferData("text/unicode", getter_AddRefs(item),
&len);
if (!item || NS_FAILED(rv))
return;
@ -507,7 +511,7 @@ nsClipboard::SelectionGetEvent(GtkClipboard *aClipboard,
nsCOMPtr<nsISupports> imageItem;
nsCOMPtr<imgIContainer> image;
for (uint32_t i = 0; i < ArrayLength(imageMimeTypes); i++) {
rv = trans->GetTransferData(imageMimeTypes[i], getter_AddRefs(imageItem));
rv = trans->GetTransferData(imageMimeTypes[i], getter_AddRefs(imageItem), &len);
image = do_QueryInterface(imageItem);
if (image) {
break;
@ -528,7 +532,7 @@ nsClipboard::SelectionGetEvent(GtkClipboard *aClipboard,
}
if (selectionTarget == gdk_atom_intern(kHTMLMime, FALSE)) {
rv = trans->GetTransferData(kHTMLMime, getter_AddRefs(item));
rv = trans->GetTransferData(kHTMLMime, getter_AddRefs(item), &len);
if (!item || NS_FAILED(rv)) {
return;
}
@ -558,7 +562,7 @@ nsClipboard::SelectionGetEvent(GtkClipboard *aClipboard,
if (!target_name)
return;
rv = trans->GetTransferData(target_name, getter_AddRefs(item));
rv = trans->GetTransferData(target_name, getter_AddRefs(item), &len);
// nothing found?
if (!item || NS_FAILED(rv)) {
g_free(target_name);

Просмотреть файл

@ -709,17 +709,20 @@ nsDragService::GetData(nsITransferable * aTransferable,
continue;
nsCOMPtr<nsISupports> data;
uint32_t tmpDataLen = 0;
MOZ_LOG(sDragLm, LogLevel::Debug,
("trying to get transfer data for %s\n",
flavorStr.get()));
rv = item->GetTransferData(flavorStr.get(),
getter_AddRefs(data));
getter_AddRefs(data),
&tmpDataLen);
if (NS_FAILED(rv)) {
MOZ_LOG(sDragLm, LogLevel::Debug, ("failed.\n"));
continue;
}
MOZ_LOG(sDragLm, LogLevel::Debug, ("succeeded.\n"));
rv = aTransferable->SetTransferData(flavorStr.get(), data);
rv = aTransferable->SetTransferData(flavorStr.get(), data,
tmpDataLen);
if (NS_FAILED(rv)) {
MOZ_LOG(sDragLm,
LogLevel::Debug,
@ -786,7 +789,8 @@ nsDragService::GetData(nsITransferable * aTransferable,
// and calls text-specific operations.
// Make a secret hideout here for nsIFile
// objects and return early.
aTransferable->SetTransferData(flavorStr.get(), file);
aTransferable->SetTransferData(flavorStr.get(), file,
convertedTextLen);
g_free(convertedText);
return NS_OK;
}
@ -939,7 +943,8 @@ nsDragService::GetData(nsITransferable * aTransferable,
mTargetDragData, mTargetDragDataLen,
getter_AddRefs(genericDataWrapper));
aTransferable->SetTransferData(flavorStr.get(),
genericDataWrapper);
genericDataWrapper,
mTargetDragDataLen);
// we found one, get out of this loop!
MOZ_LOG(sDragLm, LogLevel::Debug, ("dataFound and converted!\n"));
break;
@ -1485,7 +1490,9 @@ CreateURIList(nsIArray* aItems, nsACString& aURIList)
}
nsCOMPtr<nsISupports> data;
nsresult rv = item->GetTransferData(kURLMime, getter_AddRefs(data));
uint32_t len = 0;
nsresult rv = item->GetTransferData(kURLMime, getter_AddRefs(data),
&len);
if (NS_SUCCEEDED(rv)) {
nsCOMPtr<nsISupportsString> string = do_QueryInterface(data);
@ -1508,7 +1515,7 @@ CreateURIList(nsIArray* aItems, nsACString& aURIList)
// There is no URI available. If there is a file available, create
// a URI from the file.
rv = item->GetTransferData(kFileMime, getter_AddRefs(data));
rv = item->GetTransferData(kFileMime, getter_AddRefs(data), &len);
if (NS_SUCCEEDED(rv)) {
if (nsCOMPtr<nsIFile> file = do_QueryInterface(data)) {
nsCOMPtr<nsIURI> fileURI;
@ -1648,7 +1655,8 @@ nsDragService::SourceDataGet(GtkWidget *aWidget,
nsCOMPtr<nsIFile> directory;
file->GetParent(getter_AddRefs(directory));
item->SetTransferData(kFilePromiseDirectoryMime, directory);
item->SetTransferData(kFilePromiseDirectoryMime, directory,
sizeof(nsIFile*));
nsCOMPtr<nsISupportsString> filenamePrimitive =
do_CreateInstance(NS_SUPPORTS_STRING_CONTRACTID);
@ -1659,7 +1667,8 @@ nsDragService::SourceDataGet(GtkWidget *aWidget,
file->GetLeafName(leafName);
filenamePrimitive->SetData(leafName);
item->SetTransferData(kFilePromiseDestFilename, filenamePrimitive);
item->SetTransferData(kFilePromiseDestFilename, filenamePrimitive,
leafName.Length() * sizeof(PRUnichar));
// Request a different type in GetTransferData.
actualFlavor = kFilePromiseMime;
@ -1668,8 +1677,10 @@ nsDragService::SourceDataGet(GtkWidget *aWidget,
}
nsresult rv;
nsCOMPtr<nsISupports> data;
uint32_t len;
rv = item->GetTransferData(actualFlavor,
getter_AddRefs(data));
getter_AddRefs(data),
&len);
if (strcmp(actualFlavor, kFilePromiseMime) == 0) {
if (NS_SUCCEEDED(rv)) {
@ -1739,8 +1750,9 @@ nsDragService::SourceBeginDrag(GdkDragContext *aContext)
for (uint32_t i = 0; i < flavors.Length(); ++i) {
if (flavors[i].EqualsLiteral(kFilePromiseDestFilename)) {
nsCOMPtr<nsISupports> data;
uint32_t dataSize = 0;
transferable->GetTransferData(kFilePromiseDestFilename,
getter_AddRefs(data));
getter_AddRefs(data), &dataSize);
nsCOMPtr<nsISupportsString> fileName = do_QueryInterface(data);
if (!fileName)
return;

Просмотреть файл

@ -32,8 +32,10 @@ HeadlessClipboard::SetData(nsITransferable *aTransferable,
// Only support plain text for now.
nsCOMPtr<nsISupports> clip;
uint32_t len;
nsresult rv = aTransferable->GetTransferData(kUnicodeMime,
getter_AddRefs(clip));
getter_AddRefs(clip),
&len);
if (NS_FAILED(rv)) {
return rv;
}
@ -64,7 +66,8 @@ HeadlessClipboard::GetData(nsITransferable *aTransferable,
return rv;
}
nsCOMPtr<nsISupports> genericDataWrapper = do_QueryInterface(dataWrapper);
rv = aTransferable->SetTransferData(kUnicodeMime, genericDataWrapper);
uint32_t len = mClipboard->GetText().Length() * sizeof(char16_t);
rv = aTransferable->SetTransferData(kUnicodeMime, genericDataWrapper, len);
if (NS_WARN_IF(NS_FAILED(rv))) {
return rv;
}

Просмотреть файл

@ -16,11 +16,12 @@ function getString(clipboard) {
try {
var data = {};
trans.getTransferData("text/unicode", data);
var dataLen = {};
trans.getTransferData("text/unicode", data, dataLen);
if (data) {
data = data.value.QueryInterface(Ci.nsISupportsString);
str = data.data;
str = data.data.substring(0, dataLen.value / 2);
}
} catch (ex) {
// If the clipboard is empty getTransferData will throw.

Просмотреть файл

@ -97,7 +97,8 @@ nsClipboardHelper::CopyStringToClipboard(const nsAString& aString,
NS_ENSURE_TRUE(genericData, NS_ERROR_FAILURE);
// set the transfer data
rv = trans->SetTransferData(kUnicodeMime, genericData);
rv = trans->SetTransferData(kUnicodeMime, genericData,
aString.Length() * 2);
NS_ENSURE_SUCCESS(rv, rv);
// put the transferable on the clipboard

Просмотреть файл

@ -67,7 +67,8 @@ nsClipboardProxy::GetData(nsITransferable *aTransferable, int32_t aWhichClipboar
rv = dataWrapper->SetData(data);
NS_ENSURE_SUCCESS(rv, rv);
rv = aTransferable->SetTransferData(item.flavor().get(), dataWrapper);
rv = aTransferable->SetTransferData(item.flavor().get(), dataWrapper,
data.Length() * sizeof(char16_t));
NS_ENSURE_SUCCESS(rv, rv);
} else if (item.data().type() == IPCDataTransferData::TShmem) {
// If this is an image, convert it into an nsIInputStream.
@ -82,7 +83,7 @@ nsClipboardProxy::GetData(nsITransferable *aTransferable, int32_t aWhichClipboar
NS_NewCStringInputStream(getter_AddRefs(stream),
nsDependentCSubstring(data.get<char>(), data.Size<char>()));
rv = aTransferable->SetTransferData(flavor.get(), stream);
rv = aTransferable->SetTransferData(flavor.get(), stream, sizeof(nsISupports*));
NS_ENSURE_SUCCESS(rv, rv);
} else if (flavor.EqualsLiteral(kNativeHTMLMime) ||
flavor.EqualsLiteral(kRTFMime) ||
@ -94,7 +95,8 @@ nsClipboardProxy::GetData(nsITransferable *aTransferable, int32_t aWhichClipboar
rv = dataWrapper->SetData(nsDependentCSubstring(data.get<char>(), data.Size<char>()));
NS_ENSURE_SUCCESS(rv, rv);
rv = aTransferable->SetTransferData(item.flavor().get(), dataWrapper);
rv = aTransferable->SetTransferData(item.flavor().get(), dataWrapper,
data.Size<char>());
NS_ENSURE_SUCCESS(rv, rv);
}

Просмотреть файл

@ -102,14 +102,15 @@ nsHTMLFormatConverter::CanConvert(const char *aFromDataFlavor, const char *aToDa
//XXX unicode out of the string. Lame lame lame.
//
NS_IMETHODIMP
nsHTMLFormatConverter::Convert(const char *aFromDataFlavor, nsISupports *aFromData,
const char *aToDataFlavor, nsISupports **aToData)
nsHTMLFormatConverter::Convert(const char *aFromDataFlavor, nsISupports *aFromData, uint32_t aDataLen,
const char *aToDataFlavor, nsISupports **aToData, uint32_t *aDataToLen)
{
if ( !aToData )
if ( !aToData || !aDataToLen )
return NS_ERROR_INVALID_ARG;
nsresult rv = NS_OK;
*aToData = nullptr;
*aDataToLen = 0;
if ( !nsCRT::strcmp(aFromDataFlavor, kHTMLMime) ) {
nsAutoCString toFlavor ( aToDataFlavor );
@ -131,12 +132,16 @@ nsHTMLFormatConverter::Convert(const char *aFromDataFlavor, nsISupports *aFromDa
if (toFlavor.Equals(kHTMLMime)) {
int32_t dataLen = dataStr.Length() * 2;
nsPrimitiveHelpers::CreatePrimitiveForData ( toFlavor, dataStr.get(), dataLen, aToData );
if ( *aToData )
*aDataToLen = dataLen;
} else {
nsAutoString outStr;
res = ConvertFromHTMLToUnicode(dataStr, outStr);
if (NS_SUCCEEDED(res)) {
int32_t dataLen = outStr.Length() * 2;
nsPrimitiveHelpers::CreatePrimitiveForData ( toFlavor, outStr.get(), dataLen, aToData );
if ( *aToData )
*aDataToLen = dataLen;
}
}
} // else if HTML or Unicode
@ -145,6 +150,8 @@ nsHTMLFormatConverter::Convert(const char *aFromDataFlavor, nsISupports *aFromDa
if ( NS_SUCCEEDED(ConvertFromHTMLToAOLMail(dataStr, outStr)) ) {
int32_t dataLen = outStr.Length() * 2;
nsPrimitiveHelpers::CreatePrimitiveForData ( toFlavor, outStr.get(), dataLen, aToData );
if ( *aToData )
*aDataToLen = dataLen;
}
} // else if AOL mail
else {

Просмотреть файл

@ -39,8 +39,8 @@ interface nsIFormatConverter : nsISupports
* @param aFromFormatConverter flavor to convert to (destination own the memory)
* @returns returns NS_OK if it was converted
*/
void convert ( in string aFromDataFlavor, in nsISupports aFromData,
in string aToDataFlavor, out nsISupports aToData ) ;
void convert ( in string aFromDataFlavor, in nsISupports aFromData, in unsigned long aDataLen,
in string aToDataFlavor, out nsISupports aToData, out unsigned long aDataToLen ) ;
};

Просмотреть файл

@ -86,8 +86,9 @@ interface nsIFlavorDataProvider : nsISupports
* @param aTransferable (in parameter) the transferable we're being called for.
* @param aFlavor (in parameter) the flavor of data to retrieve
* @param aData the data. Some variant of class in nsISupportsPrimitives.idl
* @param aDataLen the length of the data
*/
void getFlavorData(in nsITransferable aTransferable, in string aFlavor, out nsISupports aData);
void getFlavorData(in nsITransferable aTransferable, in string aFlavor, out nsISupports aData, out unsigned long aDataLen);
};
@ -131,7 +132,7 @@ interface nsITransferable : nsISupports
* @param aData the data. Some variant of class in nsISupportsPrimitives.idl
* @param aDataLen the length of the data
*/
void getTransferData(in string aFlavor, out nsISupports aData);
void getTransferData ( in string aFlavor, out nsISupports aData, out unsigned long aDataLen ) ;
/**
* Returns the best flavor in the transferable, given those that have
@ -162,7 +163,7 @@ interface nsITransferable : nsISupports
* an nsIFile, or an nsIFlavorDataProvider (see above)
* @param aDataLen the length of the data, or 0 if passing a nsIFlavorDataProvider
*/
void setTransferData(in string aFlavor, in nsISupports aData);
void setTransferData ( in string aFlavor, in nsISupports aData, in unsigned long aDataLen ) ;
/**
* Add the data flavor, indicating that this transferable

Просмотреть файл

@ -42,6 +42,7 @@ NS_IMPL_ISUPPORTS(nsTransferable, nsITransferable)
DataStruct::DataStruct(DataStruct&& aRHS)
: mData(aRHS.mData.forget())
, mDataLen(aRHS.mDataLen)
, mCacheFD(aRHS.mCacheFD)
, mFlavor(aRHS.mFlavor)
{
@ -57,31 +58,22 @@ DataStruct::~DataStruct()
}
//-------------------------------------------------------------------------
void
DataStruct::SetData(nsISupports* aData, bool aIsPrivateData)
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.
// File IO is not allowed in content processes.
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;
return;
}
NS_WARNING("Oh no, couldn't write data to the cache file");
// as well as ensuring that private browsing mode is disabled
if (aDataLen > kLargeDatasetSize && !aIsPrivateData &&
// 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))) {
// Clear previously set small data.
mData = nullptr;
mDataLen = 0;
return;
}
free(data);
NS_WARNING("Oh no, couldn't write data to the cache file");
}
if (mCacheFD) {
@ -91,23 +83,25 @@ DataStruct::SetData(nsISupports* aData, bool aIsPrivateData)
}
mData = aData;
mDataLen = aDataLen;
}
//-------------------------------------------------------------------------
void
DataStruct::GetData(nsISupports** aData)
DataStruct::GetData(nsISupports** aData, uint32_t* aDataLen)
{
// 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))) {
if (NS_SUCCEEDED(ReadCache(aData, aDataLen))) {
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;
@ -115,16 +109,13 @@ DataStruct::GetData(nsISupports** aData)
nsCOMPtr<nsISupports> data = mData;
data.forget(aData);
*aDataLen = mDataLen;
}
//-------------------------------------------------------------------------
nsresult
DataStruct::WriteCache(void* aData, uint32_t aDataLen)
DataStruct::WriteCache(nsISupports* 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);
@ -135,12 +126,17 @@ DataStruct::WriteCache(void* aData, uint32_t aDataLen)
return NS_ERROR_FAILURE;
}
// Write out the contents of the clipboard to the file.
int32_t written = PR_Write(mCacheFD, aData, aDataLen);
if (written == aDataLen) {
return NS_OK;
// 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) {
return NS_OK;
}
}
PR_Close(mCacheFD);
mCacheFD = nullptr;
return NS_ERROR_FAILURE;
@ -148,7 +144,7 @@ DataStruct::WriteCache(void* aData, uint32_t aDataLen)
//-------------------------------------------------------------------------
nsresult
DataStruct::ReadCache(nsISupports** aData)
DataStruct::ReadCache(nsISupports** aData, uint32_t* aDataLen)
{
if (!mCacheFD) {
return NS_ERROR_FAILURE;
@ -175,6 +171,7 @@ DataStruct::ReadCache(nsISupports** aData)
nsPrimitiveHelpers::CreatePrimitiveForData(
mFlavor, data.get(), fileSize, aData);
*aDataLen = fileSize;
return NS_OK;
}
@ -254,24 +251,27 @@ nsTransferable::FindDataFlavor(const char* aFlavor)
//
NS_IMETHODIMP
nsTransferable::GetTransferData(const char* aFlavor,
nsISupports** aData)
nsISupports** aData,
uint32_t* aDataLen)
{
MOZ_ASSERT(mInitialized);
*aData = nullptr;
*aDataLen = 0;
nsresult rv = NS_OK;
// 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;
mDataArray[index.value()].GetData(getter_AddRefs(dataBytes));
uint32_t len;
mDataArray[index.value()].GetData(getter_AddRefs(dataBytes), &len);
// Do we have a (lazy) data provider?
if (nsCOMPtr<nsIFlavorDataProvider> dataProvider =
do_QueryInterface(dataBytes)) {
rv = dataProvider->GetFlavorData(this, aFlavor,
getter_AddRefs(dataBytes));
getter_AddRefs(dataBytes), &len);
if (NS_FAILED(rv)) {
dataBytes = nullptr;
// The provider failed, fall into the converter code below.
@ -279,6 +279,7 @@ nsTransferable::GetTransferData(const char* aFlavor,
}
if (dataBytes) {
*aDataLen = len;
dataBytes.forget(aData);
return NS_OK;
}
@ -294,21 +295,22 @@ nsTransferable::GetTransferData(const char* aFlavor,
mFormatConv->CanConvert(data.GetFlavor().get(), aFlavor, &canConvert);
if (canConvert) {
nsCOMPtr<nsISupports> dataBytes;
data.GetData(getter_AddRefs(dataBytes));
uint32_t len;
data.GetData(getter_AddRefs(dataBytes), &len);
// Do we have a (lazy) data provider?
if (nsCOMPtr<nsIFlavorDataProvider> dataProvider =
do_QueryInterface(dataBytes)) {
rv = dataProvider->GetFlavorData(this, aFlavor,
getter_AddRefs(dataBytes));
getter_AddRefs(dataBytes), &len);
if (NS_FAILED(rv)) {
// Give up.
return rv;
}
}
return mFormatConv->Convert(data.GetFlavor().get(), dataBytes, aFlavor,
aData);
return mFormatConv->Convert(data.GetFlavor().get(), dataBytes, len,
aFlavor, aData, aDataLen);
}
}
}
@ -332,7 +334,8 @@ nsTransferable::GetAnyTransferData(nsACString& aFlavor,
DataStruct& data = mDataArray.ElementAt(i);
if (data.IsDataAvailable()) {
aFlavor.Assign(data.GetFlavor());
data.GetData(aData);
uint32_t dataLen;
data.GetData(aData, &dataLen);
return NS_OK;
}
}
@ -347,14 +350,15 @@ nsTransferable::GetAnyTransferData(nsACString& aFlavor,
//
NS_IMETHODIMP
nsTransferable::SetTransferData(const char* aFlavor,
nsISupports* aData)
nsISupports* aData,
uint32_t aDataLen)
{
MOZ_ASSERT(mInitialized);
// 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, mPrivateData);
data.SetData(aData, aDataLen, mPrivateData);
return NS_OK;
}
@ -367,11 +371,14 @@ nsTransferable::SetTransferData(const char* aFlavor,
if (canConvert) {
nsCOMPtr<nsISupports> ConvertedData;
uint32_t ConvertedLen;
mFormatConv->Convert(aFlavor,
aData,
aDataLen,
data.GetFlavor().get(),
getter_AddRefs(ConvertedData));
data.SetData(ConvertedData, mPrivateData);
getter_AddRefs(ConvertedData),
&ConvertedLen);
data.SetData(ConvertedData, ConvertedLen, mPrivateData);
return NS_OK;
}
}
@ -380,7 +387,7 @@ nsTransferable::SetTransferData(const char* aFlavor,
// Can't set data neither directly nor through converter. Just add this flavor
// and try again
if (NS_SUCCEEDED(AddDataFlavor(aFlavor))) {
return SetTransferData(aFlavor, aData);
return SetTransferData(aFlavor, aData, aDataLen);
}
return NS_ERROR_FAILURE;

Просмотреть файл

@ -25,15 +25,15 @@ class nsIMutableArray;
struct DataStruct
{
explicit DataStruct ( const char* aFlavor )
: mCacheFD(nullptr), mFlavor(aFlavor) { }
: mDataLen(0), mCacheFD(nullptr), mFlavor(aFlavor) { }
DataStruct(DataStruct&& aRHS);
~DataStruct();
const nsCString& GetFlavor() const { return mFlavor; }
void SetData(nsISupports* inData, bool aIsPrivateData);
void GetData(nsISupports** outData);
bool IsDataAvailable() const { return mData || mCacheFD; }
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; }
protected:
enum {
@ -41,12 +41,13 @@ protected:
// keep it around in memory.
kLargeDatasetSize = 1000000 // 1 million bytes
};
nsresult WriteCache(void* aData, uint32_t aDataLen);
nsresult ReadCache(nsISupports** aData);
// mData OR mCacheFD should be used, not both.
nsresult WriteCache(nsISupports* aData, uint32_t aDataLen );
nsresult ReadCache(nsISupports** aData, uint32_t* aDataLen );
// mData + mDataLen OR mCacheFD should be used, not both.
nsCOMPtr<nsISupports> mData; // OWNER - some varient of primitive wrapper
uint32_t mDataLen;
PRFileDesc* mCacheFD;
const nsCString mFlavor;

Просмотреть файл

@ -66,11 +66,12 @@ function readFromClipboard()
trans.addDataFlavor('text/html');
clip.getData(trans,clipid.kGlobalClipboard);
var str = new Object();
trans.getTransferData("text/html",str);
var strLength = new Object();
trans.getTransferData("text/html",str,strLength);
if (str)
str = str.value.QueryInterface(Ci.nsISupportsString);
if (str)
pastetext = str.data;
pastetext = str.data.substring(0,strLength.value / 2);
return pastetext;
}

Просмотреть файл

@ -33,7 +33,7 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=565392
var transferable = Cc['@mozilla.org/widget/transferable;1']
.createInstance(Ci.nsITransferable);
transferable.init(getLoadContext());
transferable.setTransferData("application/x-moz-file", file);
transferable.setTransferData("application/x-moz-file", file, 0);
return transferable;
}
@ -48,7 +48,7 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=565392
transferable.addDataFlavor(mime);
clipboard.getData(transferable, 1);
var data = {};
transferable.getTransferData(mime, data);
transferable.getTransferData(mime, data, {}) ;
return data;
}

Просмотреть файл

@ -37,15 +37,16 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=948065
trans.addDataFlavor("text/unicode");
clipboard.getData(trans, Ci.nsIClipboard.kGlobalClipboard);
let str = {};
let length = {};
try {
trans.getTransferData('text/unicode', str);
trans.getTransferData('text/unicode', str, length);
} catch (e) {
str = '';
}
if (str) {
str = str.value.QueryInterface(Ci.nsISupportsString);
if (str) {
str = str.data;
str = str.data.substring(0, length.value / 2);
}
}
return str;

Просмотреть файл

@ -30,11 +30,13 @@
function checkTransferableText(transferable, expectedString, description) {
var data = {};
transferable.getTransferData("text/unicode", data);
var dataLen = {};
transferable.getTransferData("text/unicode", data, dataLen);
var actualValue = data.value.QueryInterface(Ci.nsISupportsString).data;
// Use ok + shortenString instead of is(...) to avoid dumping millions of characters in the output.
ok(actualValue === expectedString, description + ": text should match. " +
"Expected " + shortenString(expectedString) + ", got " + shortenString(actualValue));
is(dataLen.value, expectedString.length * 2, description + ": text length should match");
function shortenString(str) {
return str && str.length > 30 ? str.slice(0, 10) + "..." + str.slice(-10) : String(str);

Просмотреть файл

@ -730,7 +730,7 @@ nsresult nsClipboard::GetDataFromDataObject(IDataObject * aDataObject,
}
NS_ASSERTION ( genericDataWrapper, "About to put null data into the transferable" );
aTransferable->SetTransferData(flavorStr.get(), genericDataWrapper);
aTransferable->SetTransferData(flavorStr.get(), genericDataWrapper, dataLen);
res = NS_OK;
// we found one, get out of the loop

Просмотреть файл

@ -898,8 +898,9 @@ nsDataObj::GetDib(const nsACString& inFlavor,
STGMEDIUM & aSTG)
{
ULONG result = E_FAIL;
uint32_t len = 0;
nsCOMPtr<nsISupports> genericDataWrapper;
mTransferable->GetTransferData(PromiseFlatCString(inFlavor).get(), getter_AddRefs(genericDataWrapper));
mTransferable->GetTransferData(PromiseFlatCString(inFlavor).get(), getter_AddRefs(genericDataWrapper), &len);
nsCOMPtr<imgIContainer> image ( do_QueryInterface(genericDataWrapper) );
if ( image ) {
nsCOMPtr<imgITools> imgTools = do_CreateInstance("@mozilla.org/image/tools;1");
@ -1363,6 +1364,7 @@ HRESULT nsDataObj::GetPreferredDropEffect ( FORMATETC& aFE, STGMEDIUM& aSTG )
HRESULT nsDataObj::GetText(const nsACString & aDataFlavor, FORMATETC& aFE, STGMEDIUM& aSTG)
{
void* data = nullptr;
uint32_t len;
// if someone asks for text/plain, look up text/unicode instead in the transferable.
const char* flavorStr;
@ -1374,11 +1376,9 @@ HRESULT nsDataObj::GetText(const nsACString & aDataFlavor, FORMATETC& aFE, STGME
// NOTE: CreateDataFromPrimitive creates new memory, that needs to be deleted
nsCOMPtr<nsISupports> genericDataWrapper;
mTransferable->GetTransferData(flavorStr, getter_AddRefs(genericDataWrapper));
if ( !genericDataWrapper )
mTransferable->GetTransferData(flavorStr, getter_AddRefs(genericDataWrapper), &len);
if ( !len )
return E_FAIL;
uint32_t len;
nsPrimitiveHelpers::CreateDataFromPrimitive(
nsDependentCString(flavorStr), genericDataWrapper, &data, &len);
if ( !data )
@ -1482,9 +1482,11 @@ HRESULT nsDataObj::GetFile(FORMATETC& aFE, STGMEDIUM& aSTG)
HRESULT nsDataObj::DropFile(FORMATETC& aFE, STGMEDIUM& aSTG)
{
nsresult rv;
uint32_t len = 0;
nsCOMPtr<nsISupports> genericDataWrapper;
mTransferable->GetTransferData(kFileMime, getter_AddRefs(genericDataWrapper));
mTransferable->GetTransferData(kFileMime, getter_AddRefs(genericDataWrapper),
&len);
nsCOMPtr<nsIFile> file ( do_QueryInterface(genericDataWrapper) );
if (!file)
return E_FAIL;
@ -1535,9 +1537,10 @@ HRESULT nsDataObj::DropImage(FORMATETC& aFE, STGMEDIUM& aSTG)
{
nsresult rv;
if (!mCachedTempFile) {
uint32_t len = 0;
nsCOMPtr<nsISupports> genericDataWrapper;
mTransferable->GetTransferData(kNativeImageMime, getter_AddRefs(genericDataWrapper));
mTransferable->GetTransferData(kNativeImageMime, getter_AddRefs(genericDataWrapper), &len);
nsCOMPtr<imgIContainer> image(do_QueryInterface(genericDataWrapper));
if (!image)
return E_FAIL;
@ -1838,8 +1841,9 @@ nsDataObj :: ExtractShortcutURL ( nsString & outURL )
NS_ASSERTION ( mTransferable, "We don't have a good transferable" );
nsresult rv = NS_ERROR_FAILURE;
uint32_t len = 0;
nsCOMPtr<nsISupports> genericURL;
if ( NS_SUCCEEDED(mTransferable->GetTransferData(kURLMime, getter_AddRefs(genericURL)))) {
if ( NS_SUCCEEDED(mTransferable->GetTransferData(kURLMime, getter_AddRefs(genericURL), &len)) ) {
nsCOMPtr<nsISupportsString> urlObject ( do_QueryInterface(genericURL) );
if ( urlObject ) {
nsAutoString url;
@ -1855,8 +1859,8 @@ nsDataObj :: ExtractShortcutURL ( nsString & outURL )
rv = NS_OK;
}
}
} else if ( NS_SUCCEEDED(mTransferable->GetTransferData(kURLDataMime, getter_AddRefs(genericURL))) ||
NS_SUCCEEDED(mTransferable->GetTransferData(kURLPrivateMime, getter_AddRefs(genericURL))) ) {
} else if ( NS_SUCCEEDED(mTransferable->GetTransferData(kURLDataMime, getter_AddRefs(genericURL), &len)) ||
NS_SUCCEEDED(mTransferable->GetTransferData(kURLPrivateMime, getter_AddRefs(genericURL), &len)) ) {
nsCOMPtr<nsISupportsString> urlObject ( do_QueryInterface(genericURL) );
if ( urlObject ) {
nsAutoString url;
@ -1888,8 +1892,9 @@ nsDataObj :: ExtractShortcutTitle ( nsString & outTitle )
NS_ASSERTION ( mTransferable, "We'd don't have a good transferable" );
nsresult rv = NS_ERROR_FAILURE;
uint32_t len = 0;
nsCOMPtr<nsISupports> genericURL;
if ( NS_SUCCEEDED(mTransferable->GetTransferData(kURLMime, getter_AddRefs(genericURL)) )) {
if ( NS_SUCCEEDED(mTransferable->GetTransferData(kURLMime, getter_AddRefs(genericURL), &len)) ) {
nsCOMPtr<nsISupportsString> urlObject ( do_QueryInterface(genericURL) );
if ( urlObject ) {
nsAutoString url;
@ -1900,7 +1905,7 @@ nsDataObj :: ExtractShortcutTitle ( nsString & outTitle )
int32_t lineIndex = url.FindChar ( '\n' );
NS_ASSERTION ( lineIndex != -1, "Format for url flavor is <url> <linefeed> <page title>" );
if ( lineIndex != -1 ) {
url.Mid ( outTitle, lineIndex + 1, url.Length() - (lineIndex + 1) );
url.Mid ( outTitle, lineIndex + 1, (len/2) - (lineIndex + 1) );
rv = NS_OK;
}
}
@ -2096,7 +2101,8 @@ HRESULT nsDataObj::GetDownloadDetails(nsIURI **aSourceURI,
// get the URI from the kFilePromiseURLMime flavor
nsCOMPtr<nsISupports> urlPrimitive;
mTransferable->GetTransferData(kFilePromiseURLMime, getter_AddRefs(urlPrimitive));
uint32_t dataSize = 0;
mTransferable->GetTransferData(kFilePromiseURLMime, getter_AddRefs(urlPrimitive), &dataSize);
nsCOMPtr<nsISupportsString> srcUrlPrimitive = do_QueryInterface(urlPrimitive);
NS_ENSURE_TRUE(srcUrlPrimitive, E_FAIL);
@ -2109,7 +2115,7 @@ HRESULT nsDataObj::GetDownloadDetails(nsIURI **aSourceURI,
nsAutoString srcFileName;
nsCOMPtr<nsISupports> fileNamePrimitive;
mTransferable->GetTransferData(kFilePromiseDestFilename, getter_AddRefs(fileNamePrimitive));
mTransferable->GetTransferData(kFilePromiseDestFilename, getter_AddRefs(fileNamePrimitive), &dataSize);
nsCOMPtr<nsISupportsString> srcFileNamePrimitive = do_QueryInterface(fileNamePrimitive);
if (srcFileNamePrimitive) {
srcFileNamePrimitive->GetData(srcFileName);