1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/widget/windows/tests/TestWinDND.cpp Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,745 @@ 1.4 +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 1.5 +/* This Source Code Form is subject to the terms of the Mozilla Public 1.6 + * License, v. 2.0. If a copy of the MPL was not distributed with this 1.7 + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 1.8 +#define MOZILLA_INTERNAL_API 1.9 + 1.10 +#include <ole2.h> 1.11 +#include <shlobj.h> 1.12 + 1.13 +#include "TestHarness.h" 1.14 +#include "nsIArray.h" 1.15 +#include "nsIFile.h" 1.16 +#include "nsNetUtil.h" 1.17 +#include "nsISupportsPrimitives.h" 1.18 +#include "nsIFileURL.h" 1.19 +#include "nsITransferable.h" 1.20 +#include "nsClipboard.h" 1.21 +#include "nsDataObjCollection.h" 1.22 + 1.23 +nsIFile* xferFile; 1.24 + 1.25 +nsresult CheckValidHDROP(STGMEDIUM* pSTG) 1.26 +{ 1.27 + if (pSTG->tymed != TYMED_HGLOBAL) { 1.28 + fail("Received data is not in an HGLOBAL"); 1.29 + return NS_ERROR_UNEXPECTED; 1.30 + } 1.31 + 1.32 + HGLOBAL hGlobal = pSTG->hGlobal; 1.33 + DROPFILES* pDropFiles; 1.34 + pDropFiles = (DROPFILES*)GlobalLock(hGlobal); 1.35 + if (!pDropFiles) { 1.36 + fail("There is no data at the given HGLOBAL"); 1.37 + return NS_ERROR_UNEXPECTED; 1.38 + } 1.39 + 1.40 + if (pDropFiles->pFiles != sizeof(DROPFILES)) 1.41 + fail("DROPFILES struct has wrong size"); 1.42 + 1.43 + if (pDropFiles->fWide != true) { 1.44 + fail("Received data is not Unicode"); 1.45 + return NS_ERROR_UNEXPECTED; 1.46 + } 1.47 + nsString s; 1.48 + unsigned long offset = 0; 1.49 + while (1) { 1.50 + s = (char16_t*)((char*)pDropFiles + pDropFiles->pFiles + offset); 1.51 + if (s.IsEmpty()) 1.52 + break; 1.53 + nsresult rv; 1.54 + nsCOMPtr<nsIFile> localFile( 1.55 + do_CreateInstance(NS_LOCAL_FILE_CONTRACTID, &rv)); 1.56 + rv = localFile->InitWithPath(s); 1.57 + if (NS_FAILED(rv)) { 1.58 + fail("File could not be opened"); 1.59 + return NS_ERROR_UNEXPECTED; 1.60 + } 1.61 + offset += sizeof(char16_t) * (s.Length() + 1); 1.62 + } 1.63 + return NS_OK; 1.64 +} 1.65 + 1.66 +nsresult CheckValidTEXT(STGMEDIUM* pSTG) 1.67 +{ 1.68 + if (pSTG->tymed != TYMED_HGLOBAL) { 1.69 + fail("Received data is not in an HGLOBAL"); 1.70 + return NS_ERROR_UNEXPECTED; 1.71 + } 1.72 + 1.73 + HGLOBAL hGlobal = pSTG->hGlobal; 1.74 + char* pText; 1.75 + pText = (char*)GlobalLock(hGlobal); 1.76 + if (!pText) { 1.77 + fail("There is no data at the given HGLOBAL"); 1.78 + return NS_ERROR_UNEXPECTED; 1.79 + } 1.80 + 1.81 + nsCString string; 1.82 + string = pText; 1.83 + 1.84 + if (!string.Equals(NS_LITERAL_CSTRING("Mozilla can drag and drop"))) { 1.85 + fail("Text passed through drop object wrong"); 1.86 + return NS_ERROR_UNEXPECTED; 1.87 + } 1.88 + return NS_OK; 1.89 +} 1.90 + 1.91 +nsresult CheckValidTEXTTwo(STGMEDIUM* pSTG) 1.92 +{ 1.93 + if (pSTG->tymed != TYMED_HGLOBAL) { 1.94 + fail("Received data is not in an HGLOBAL"); 1.95 + return NS_ERROR_UNEXPECTED; 1.96 + } 1.97 + 1.98 + HGLOBAL hGlobal = pSTG->hGlobal; 1.99 + char* pText; 1.100 + pText = (char*)GlobalLock(hGlobal); 1.101 + if (!pText) { 1.102 + fail("There is no data at the given HGLOBAL"); 1.103 + return NS_ERROR_UNEXPECTED; 1.104 + } 1.105 + 1.106 + nsCString string; 1.107 + string = pText; 1.108 + 1.109 + if (!string.Equals(NS_LITERAL_CSTRING("Mozilla can drag and drop twice over"))) { 1.110 + fail("Text passed through drop object wrong"); 1.111 + return NS_ERROR_UNEXPECTED; 1.112 + } 1.113 + return NS_OK; 1.114 +} 1.115 + 1.116 +nsresult CheckValidUNICODE(STGMEDIUM* pSTG) 1.117 +{ 1.118 + if (pSTG->tymed != TYMED_HGLOBAL) { 1.119 + fail("Received data is not in an HGLOBAL"); 1.120 + return NS_ERROR_UNEXPECTED; 1.121 + } 1.122 + 1.123 + HGLOBAL hGlobal = pSTG->hGlobal; 1.124 + char16_t* pText; 1.125 + pText = (char16_t*)GlobalLock(hGlobal); 1.126 + if (!pText) { 1.127 + fail("There is no data at the given HGLOBAL"); 1.128 + return NS_ERROR_UNEXPECTED; 1.129 + } 1.130 + 1.131 + nsString string; 1.132 + string = pText; 1.133 + 1.134 + if (!string.Equals(NS_LITERAL_STRING("Mozilla can drag and drop"))) { 1.135 + fail("Text passed through drop object wrong"); 1.136 + return NS_ERROR_UNEXPECTED; 1.137 + } 1.138 + return NS_OK; 1.139 +} 1.140 + 1.141 +nsresult CheckValidUNICODETwo(STGMEDIUM* pSTG) 1.142 +{ 1.143 + if (pSTG->tymed != TYMED_HGLOBAL) { 1.144 + fail("Received data is not in an HGLOBAL"); 1.145 + return NS_ERROR_UNEXPECTED; 1.146 + } 1.147 + 1.148 + HGLOBAL hGlobal = pSTG->hGlobal; 1.149 + char16_t* pText; 1.150 + pText = (char16_t*)GlobalLock(hGlobal); 1.151 + if (!pText) { 1.152 + fail("There is no data at the given HGLOBAL"); 1.153 + return NS_ERROR_UNEXPECTED; 1.154 + } 1.155 + 1.156 + nsString string; 1.157 + string = pText; 1.158 + 1.159 + if (!string.Equals(NS_LITERAL_STRING("Mozilla can drag and drop twice over"))) { 1.160 + fail("Text passed through drop object wrong"); 1.161 + return NS_ERROR_UNEXPECTED; 1.162 + } 1.163 + return NS_OK; 1.164 +} 1.165 + 1.166 +nsresult GetTransferableFile(nsCOMPtr<nsITransferable>& pTransferable) 1.167 +{ 1.168 + nsresult rv; 1.169 + 1.170 + nsCOMPtr<nsISupports> genericWrapper = do_QueryInterface(xferFile); 1.171 + 1.172 + pTransferable = do_CreateInstance("@mozilla.org/widget/transferable;1"); 1.173 + pTransferable->Init(nullptr); 1.174 + rv = pTransferable->SetTransferData("application/x-moz-file", genericWrapper, 1.175 + 0); 1.176 + return rv; 1.177 +} 1.178 + 1.179 +nsresult GetTransferableText(nsCOMPtr<nsITransferable>& pTransferable) 1.180 +{ 1.181 + nsresult rv; 1.182 + NS_NAMED_LITERAL_STRING(mozString, "Mozilla can drag and drop"); 1.183 + nsCOMPtr<nsISupportsString> xferString = 1.184 + do_CreateInstance(NS_SUPPORTS_STRING_CONTRACTID); 1.185 + rv = xferString->SetData(mozString); 1.186 + NS_ENSURE_SUCCESS(rv, rv); 1.187 + 1.188 + nsCOMPtr<nsISupports> genericWrapper = do_QueryInterface(xferString); 1.189 + 1.190 + pTransferable = do_CreateInstance("@mozilla.org/widget/transferable;1"); 1.191 + pTransferable->Init(nullptr); 1.192 + rv = pTransferable->SetTransferData("text/unicode", genericWrapper, 1.193 + mozString.Length() * sizeof(char16_t)); 1.194 + return rv; 1.195 +} 1.196 + 1.197 +nsresult GetTransferableTextTwo(nsCOMPtr<nsITransferable>& pTransferable) 1.198 +{ 1.199 + nsresult rv; 1.200 + NS_NAMED_LITERAL_STRING(mozString, " twice over"); 1.201 + nsCOMPtr<nsISupportsString> xferString = 1.202 + do_CreateInstance(NS_SUPPORTS_STRING_CONTRACTID); 1.203 + rv = xferString->SetData(mozString); 1.204 + NS_ENSURE_SUCCESS(rv, rv); 1.205 + 1.206 + nsCOMPtr<nsISupports> genericWrapper = do_QueryInterface(xferString); 1.207 + 1.208 + pTransferable = do_CreateInstance("@mozilla.org/widget/transferable;1"); 1.209 + pTransferable->Init(nullptr); 1.210 + rv = pTransferable->SetTransferData("text/unicode", genericWrapper, 1.211 + mozString.Length() * sizeof(char16_t)); 1.212 + return rv; 1.213 +} 1.214 + 1.215 +nsresult GetTransferableURI(nsCOMPtr<nsITransferable>& pTransferable) 1.216 +{ 1.217 + nsresult rv; 1.218 + 1.219 + nsCOMPtr<nsIURI> xferURI; 1.220 + 1.221 + rv = NS_NewURI(getter_AddRefs(xferURI), "http://www.mozilla.org"); 1.222 + NS_ENSURE_SUCCESS(rv, rv); 1.223 + 1.224 + nsCOMPtr<nsISupports> genericWrapper = do_QueryInterface(xferURI); 1.225 + 1.226 + pTransferable = do_CreateInstance("@mozilla.org/widget/transferable;1"); 1.227 + pTransferable->Init(nullptr); 1.228 + rv = pTransferable->SetTransferData("text/x-moz-url", genericWrapper, 0); 1.229 + return rv; 1.230 +} 1.231 + 1.232 +nsresult MakeDataObject(nsISupportsArray* transferableArray, 1.233 + nsRefPtr<IDataObject>& itemToDrag) 1.234 +{ 1.235 + nsresult rv; 1.236 + uint32_t itemCount = 0; 1.237 + 1.238 + nsCOMPtr<nsIURI> uri; 1.239 + rv = NS_NewURI(getter_AddRefs(uri), "http://www.mozilla.org"); 1.240 + NS_ENSURE_SUCCESS(rv, rv); 1.241 + 1.242 + rv = transferableArray->Count(&itemCount); 1.243 + NS_ENSURE_SUCCESS(rv, rv); 1.244 + 1.245 + // Copied more or less exactly from nsDragService::InvokeDragSession 1.246 + // This is what lets us play fake Drag Service for the test 1.247 + if (itemCount > 1) { 1.248 + nsDataObjCollection * dataObjCollection = new nsDataObjCollection(); 1.249 + if (!dataObjCollection) 1.250 + return NS_ERROR_OUT_OF_MEMORY; 1.251 + itemToDrag = dataObjCollection; 1.252 + for (uint32_t i=0; i<itemCount; ++i) { 1.253 + nsCOMPtr<nsISupports> supports; 1.254 + transferableArray->GetElementAt(i, getter_AddRefs(supports)); 1.255 + nsCOMPtr<nsITransferable> trans(do_QueryInterface(supports)); 1.256 + if (trans) { 1.257 + nsRefPtr<IDataObject> dataObj; 1.258 + rv = nsClipboard::CreateNativeDataObject(trans, 1.259 + getter_AddRefs(dataObj), uri); 1.260 + NS_ENSURE_SUCCESS(rv, rv); 1.261 + // Add the flavors to the collection object too 1.262 + rv = nsClipboard::SetupNativeDataObject(trans, dataObjCollection); 1.263 + NS_ENSURE_SUCCESS(rv, rv); 1.264 + 1.265 + dataObjCollection->AddDataObject(dataObj); 1.266 + } 1.267 + } 1.268 + } // if dragging multiple items 1.269 + else { 1.270 + nsCOMPtr<nsISupports> supports; 1.271 + transferableArray->GetElementAt(0, getter_AddRefs(supports)); 1.272 + nsCOMPtr<nsITransferable> trans(do_QueryInterface(supports)); 1.273 + if (trans) { 1.274 + rv = nsClipboard::CreateNativeDataObject(trans, 1.275 + getter_AddRefs(itemToDrag), 1.276 + uri); 1.277 + NS_ENSURE_SUCCESS(rv, rv); 1.278 + } 1.279 + } // else dragging a single object 1.280 + return rv; 1.281 +} 1.282 + 1.283 +nsresult Do_CheckOneFile() 1.284 +{ 1.285 + nsresult rv; 1.286 + nsCOMPtr<nsITransferable> transferable; 1.287 + nsCOMPtr<nsISupportsArray> transferableArray; 1.288 + nsCOMPtr<nsISupports> genericWrapper; 1.289 + nsRefPtr<IDataObject> dataObj; 1.290 + rv = NS_NewISupportsArray(getter_AddRefs(transferableArray)); 1.291 + if (NS_FAILED(rv)) { 1.292 + fail("Could not create the necessary nsISupportsArray"); 1.293 + return rv; 1.294 + } 1.295 + 1.296 + rv = GetTransferableFile(transferable); 1.297 + if (NS_FAILED(rv)) { 1.298 + fail("Could not create the proper nsITransferable!"); 1.299 + return rv; 1.300 + } 1.301 + genericWrapper = do_QueryInterface(transferable); 1.302 + rv = transferableArray->AppendElement(genericWrapper); 1.303 + if (NS_FAILED(rv)) { 1.304 + fail("Could not append element to transferable array"); 1.305 + return rv; 1.306 + } 1.307 + 1.308 + rv = MakeDataObject(transferableArray, dataObj); 1.309 + if (NS_FAILED(rv)) { 1.310 + fail("Could not create data object"); 1.311 + return rv; 1.312 + } 1.313 + 1.314 + FORMATETC fe; 1.315 + SET_FORMATETC(fe, CF_HDROP, 0, DVASPECT_CONTENT, -1, TYMED_HGLOBAL); 1.316 + if (dataObj->QueryGetData(&fe) != S_OK) { 1.317 + fail("File data object does not support the file data type!"); 1.318 + return NS_ERROR_UNEXPECTED; 1.319 + } 1.320 + 1.321 + STGMEDIUM* stg; 1.322 + stg = (STGMEDIUM*)CoTaskMemAlloc(sizeof(STGMEDIUM)); 1.323 + if (dataObj->GetData(&fe, stg) != S_OK) { 1.324 + fail("File data object did not provide data on request"); 1.325 + return NS_ERROR_UNEXPECTED; 1.326 + } 1.327 + 1.328 + rv = CheckValidHDROP(stg); 1.329 + if (NS_FAILED(rv)) { 1.330 + fail("HDROP was invalid"); 1.331 + return rv; 1.332 + } 1.333 + 1.334 + ReleaseStgMedium(stg); 1.335 + 1.336 + return NS_OK; 1.337 +} 1.338 + 1.339 +nsresult Do_CheckTwoFiles() 1.340 +{ 1.341 + nsresult rv; 1.342 + nsCOMPtr<nsITransferable> transferable; 1.343 + nsCOMPtr<nsISupportsArray> transferableArray; 1.344 + nsCOMPtr<nsISupports> genericWrapper; 1.345 + nsRefPtr<IDataObject> dataObj; 1.346 + rv = NS_NewISupportsArray(getter_AddRefs(transferableArray)); 1.347 + if (NS_FAILED(rv)) { 1.348 + fail("Could not create the necessary nsISupportsArray"); 1.349 + return rv; 1.350 + } 1.351 + 1.352 + rv = GetTransferableFile(transferable); 1.353 + if (NS_FAILED(rv)) { 1.354 + fail("Could not create the proper nsITransferable!"); 1.355 + return rv; 1.356 + } 1.357 + genericWrapper = do_QueryInterface(transferable); 1.358 + rv = transferableArray->AppendElement(genericWrapper); 1.359 + if (NS_FAILED(rv)) { 1.360 + fail("Could not append element to transferable array"); 1.361 + return rv; 1.362 + } 1.363 + 1.364 + rv = GetTransferableFile(transferable); 1.365 + if (NS_FAILED(rv)) { 1.366 + fail("Could not create the proper nsITransferable!"); 1.367 + return rv; 1.368 + } 1.369 + genericWrapper = do_QueryInterface(transferable); 1.370 + rv = transferableArray->AppendElement(genericWrapper); 1.371 + if (NS_FAILED(rv)) { 1.372 + fail("Could not append element to transferable array"); 1.373 + return rv; 1.374 + } 1.375 + 1.376 + rv = MakeDataObject(transferableArray, dataObj); 1.377 + if (NS_FAILED(rv)) { 1.378 + fail("Could not create data object"); 1.379 + return rv; 1.380 + } 1.381 + 1.382 + FORMATETC fe; 1.383 + SET_FORMATETC(fe, CF_HDROP, 0, DVASPECT_CONTENT, -1, TYMED_HGLOBAL); 1.384 + if (dataObj->QueryGetData(&fe) != S_OK) { 1.385 + fail("File data object does not support the file data type!"); 1.386 + return NS_ERROR_UNEXPECTED; 1.387 + } 1.388 + 1.389 + STGMEDIUM* stg; 1.390 + stg = (STGMEDIUM*)CoTaskMemAlloc(sizeof(STGMEDIUM)); 1.391 + if (dataObj->GetData(&fe, stg) != S_OK) { 1.392 + fail("File data object did not provide data on request"); 1.393 + return NS_ERROR_UNEXPECTED; 1.394 + } 1.395 + 1.396 + rv = CheckValidHDROP(stg); 1.397 + if (NS_FAILED(rv)) { 1.398 + fail("HDROP was invalid"); 1.399 + return rv; 1.400 + } 1.401 + 1.402 + ReleaseStgMedium(stg); 1.403 + 1.404 + return NS_OK; 1.405 +} 1.406 + 1.407 +nsresult Do_CheckOneString() 1.408 +{ 1.409 + nsresult rv; 1.410 + nsCOMPtr<nsITransferable> transferable; 1.411 + nsCOMPtr<nsISupportsArray> transferableArray; 1.412 + nsCOMPtr<nsISupports> genericWrapper; 1.413 + nsRefPtr<IDataObject> dataObj; 1.414 + rv = NS_NewISupportsArray(getter_AddRefs(transferableArray)); 1.415 + if (NS_FAILED(rv)) { 1.416 + fail("Could not create the necessary nsISupportsArray"); 1.417 + return rv; 1.418 + } 1.419 + 1.420 + rv = GetTransferableText(transferable); 1.421 + if (NS_FAILED(rv)) { 1.422 + fail("Could not create the proper nsITransferable!"); 1.423 + return rv; 1.424 + } 1.425 + genericWrapper = do_QueryInterface(transferable); 1.426 + rv = transferableArray->AppendElement(genericWrapper); 1.427 + if (NS_FAILED(rv)) { 1.428 + fail("Could not append element to transferable array"); 1.429 + return rv; 1.430 + } 1.431 + 1.432 + rv = MakeDataObject(transferableArray, dataObj); 1.433 + if (NS_FAILED(rv)) { 1.434 + fail("Could not create data object"); 1.435 + return rv; 1.436 + } 1.437 + 1.438 + FORMATETC fe; 1.439 + SET_FORMATETC(fe, CF_TEXT, 0, DVASPECT_CONTENT, -1, TYMED_HGLOBAL); 1.440 + if (dataObj->QueryGetData(&fe) != S_OK) { 1.441 + fail("String data object does not support the ASCII text data type!"); 1.442 + return NS_ERROR_UNEXPECTED; 1.443 + } 1.444 + 1.445 + STGMEDIUM* stg; 1.446 + stg = (STGMEDIUM*)CoTaskMemAlloc(sizeof(STGMEDIUM)); 1.447 + if (dataObj->GetData(&fe, stg) != S_OK) { 1.448 + fail("String data object did not provide ASCII data on request"); 1.449 + return NS_ERROR_UNEXPECTED; 1.450 + } 1.451 + 1.452 + rv = CheckValidTEXT(stg); 1.453 + if (NS_FAILED(rv)) { 1.454 + fail("TEXT was invalid"); 1.455 + return rv; 1.456 + } 1.457 + 1.458 + ReleaseStgMedium(stg); 1.459 + 1.460 + SET_FORMATETC(fe, CF_UNICODETEXT, 0, DVASPECT_CONTENT, -1, TYMED_HGLOBAL); 1.461 + if (dataObj->QueryGetData(&fe) != S_OK) { 1.462 + fail("String data object does not support the wide text data type!"); 1.463 + return NS_ERROR_UNEXPECTED; 1.464 + } 1.465 + 1.466 + if (dataObj->GetData(&fe, stg) != S_OK) { 1.467 + fail("String data object did not provide wide data on request"); 1.468 + return NS_ERROR_UNEXPECTED; 1.469 + } 1.470 + 1.471 + rv = CheckValidUNICODE(stg); 1.472 + if (NS_FAILED(rv)) { 1.473 + fail("UNICODE was invalid"); 1.474 + return rv; 1.475 + } 1.476 + 1.477 + return NS_OK; 1.478 +} 1.479 + 1.480 +nsresult Do_CheckTwoStrings() 1.481 +{ 1.482 + nsresult rv; 1.483 + nsCOMPtr<nsITransferable> transferable; 1.484 + nsCOMPtr<nsISupportsArray> transferableArray; 1.485 + nsCOMPtr<nsISupports> genericWrapper; 1.486 + nsRefPtr<IDataObject> dataObj; 1.487 + rv = NS_NewISupportsArray(getter_AddRefs(transferableArray)); 1.488 + if (NS_FAILED(rv)) { 1.489 + fail("Could not create the necessary nsISupportsArray"); 1.490 + return rv; 1.491 + } 1.492 + 1.493 + rv = GetTransferableText(transferable); 1.494 + if (NS_FAILED(rv)) { 1.495 + fail("Could not create the proper nsITransferable!"); 1.496 + return rv; 1.497 + } 1.498 + genericWrapper = do_QueryInterface(transferable); 1.499 + rv = transferableArray->AppendElement(genericWrapper); 1.500 + if (NS_FAILED(rv)) { 1.501 + fail("Could not append element to transferable array"); 1.502 + return rv; 1.503 + } 1.504 + 1.505 + rv = GetTransferableTextTwo(transferable); 1.506 + if (NS_FAILED(rv)) { 1.507 + fail("Could not create the proper nsITransferable!"); 1.508 + return rv; 1.509 + } 1.510 + genericWrapper = do_QueryInterface(transferable); 1.511 + rv = transferableArray->AppendElement(genericWrapper); 1.512 + if (NS_FAILED(rv)) { 1.513 + fail("Could not append element to transferable array"); 1.514 + return rv; 1.515 + } 1.516 + 1.517 + rv = MakeDataObject(transferableArray, dataObj); 1.518 + if (NS_FAILED(rv)) { 1.519 + fail("Could not create data object"); 1.520 + return rv; 1.521 + } 1.522 + 1.523 + FORMATETC fe; 1.524 + SET_FORMATETC(fe, CF_TEXT, 0, DVASPECT_CONTENT, -1, TYMED_HGLOBAL); 1.525 + if (dataObj->QueryGetData(&fe) != S_OK) { 1.526 + fail("String data object does not support the ASCII text data type!"); 1.527 + return NS_ERROR_UNEXPECTED; 1.528 + } 1.529 + 1.530 + STGMEDIUM* stg; 1.531 + stg = (STGMEDIUM*)CoTaskMemAlloc(sizeof(STGMEDIUM)); 1.532 + if (dataObj->GetData(&fe, stg) != S_OK) { 1.533 + fail("String data object did not provide ASCII data on request"); 1.534 + return NS_ERROR_UNEXPECTED; 1.535 + } 1.536 + 1.537 + rv = CheckValidTEXTTwo(stg); 1.538 + if (NS_FAILED(rv)) { 1.539 + fail("TEXT was invalid"); 1.540 + return rv; 1.541 + } 1.542 + 1.543 + ReleaseStgMedium(stg); 1.544 + 1.545 + SET_FORMATETC(fe, CF_UNICODETEXT, 0, DVASPECT_CONTENT, -1, TYMED_HGLOBAL); 1.546 + if (dataObj->QueryGetData(&fe) != S_OK) { 1.547 + fail("String data object does not support the wide text data type!"); 1.548 + return NS_ERROR_UNEXPECTED; 1.549 + } 1.550 + 1.551 + if (dataObj->GetData(&fe, stg) != S_OK) { 1.552 + fail("String data object did not provide wide data on request"); 1.553 + return NS_ERROR_UNEXPECTED; 1.554 + } 1.555 + 1.556 + rv = CheckValidUNICODETwo(stg); 1.557 + if (NS_FAILED(rv)) { 1.558 + fail("UNICODE was invalid"); 1.559 + return rv; 1.560 + } 1.561 + 1.562 + return NS_OK; 1.563 +} 1.564 + 1.565 +nsresult Do_CheckSetArbitraryData(bool aMultiple) 1.566 +{ 1.567 + nsresult rv; 1.568 + nsCOMPtr<nsITransferable> transferable; 1.569 + nsCOMPtr<nsISupportsArray> transferableArray; 1.570 + nsCOMPtr<nsISupports> genericWrapper; 1.571 + nsRefPtr<IDataObject> dataObj; 1.572 + rv = NS_NewISupportsArray(getter_AddRefs(transferableArray)); 1.573 + if (NS_FAILED(rv)) { 1.574 + fail("Could not create the necessary nsISupportsArray"); 1.575 + return rv; 1.576 + } 1.577 + 1.578 + rv = GetTransferableText(transferable); 1.579 + if (NS_FAILED(rv)) { 1.580 + fail("Could not create the proper nsITransferable!"); 1.581 + return rv; 1.582 + } 1.583 + genericWrapper = do_QueryInterface(transferable); 1.584 + rv = transferableArray->AppendElement(genericWrapper); 1.585 + if (NS_FAILED(rv)) { 1.586 + fail("Could not append element to transferable array"); 1.587 + return rv; 1.588 + } 1.589 + 1.590 + if (aMultiple) { 1.591 + rv = GetTransferableText(transferable); 1.592 + if (NS_FAILED(rv)) { 1.593 + fail("Could not create the proper nsITransferable!"); 1.594 + return rv; 1.595 + } 1.596 + genericWrapper = do_QueryInterface(transferable); 1.597 + rv = transferableArray->AppendElement(genericWrapper); 1.598 + if (NS_FAILED(rv)) { 1.599 + fail("Could not append element to transferable array"); 1.600 + return rv; 1.601 + } 1.602 + } 1.603 + 1.604 + rv = MakeDataObject(transferableArray, dataObj); 1.605 + if (NS_FAILED(rv)) { 1.606 + fail("Could not create data object"); 1.607 + return rv; 1.608 + } 1.609 + 1.610 + static CLIPFORMAT mozArbitraryFormat = 1.611 + ::RegisterClipboardFormatW(L"MozillaTestFormat"); 1.612 + FORMATETC fe; 1.613 + STGMEDIUM stg; 1.614 + SET_FORMATETC(fe, mozArbitraryFormat, 0, DVASPECT_CONTENT, -1, TYMED_HGLOBAL); 1.615 + 1.616 + HGLOBAL hg = GlobalAlloc(GPTR, 1024); 1.617 + stg.tymed = TYMED_HGLOBAL; 1.618 + stg.hGlobal = hg; 1.619 + stg.pUnkForRelease = nullptr; 1.620 + 1.621 + if (dataObj->SetData(&fe, &stg, true) != S_OK) { 1.622 + if (aMultiple) { 1.623 + fail("Unable to set arbitrary data type on data object collection!"); 1.624 + } else { 1.625 + fail("Unable to set arbitrary data type on data object!"); 1.626 + } 1.627 + return NS_ERROR_UNEXPECTED; 1.628 + } 1.629 + 1.630 + if (dataObj->QueryGetData(&fe) != S_OK) { 1.631 + fail("Arbitrary data set on data object is not advertised!"); 1.632 + return NS_ERROR_UNEXPECTED; 1.633 + } 1.634 + 1.635 + STGMEDIUM* stg2; 1.636 + stg2 = (STGMEDIUM*)CoTaskMemAlloc(sizeof(STGMEDIUM)); 1.637 + if (dataObj->GetData(&fe, stg2) != S_OK) { 1.638 + fail("Data object did not provide arbitrary data upon request!"); 1.639 + return NS_ERROR_UNEXPECTED; 1.640 + } 1.641 + 1.642 + if (stg2->hGlobal != hg) { 1.643 + fail("Arbitrary data was not returned properly!"); 1.644 + return rv; 1.645 + } 1.646 + ReleaseStgMedium(stg2); 1.647 + 1.648 + return NS_OK; 1.649 +} 1.650 + 1.651 +// This function performs basic drop tests, testing a data object consisting 1.652 +// of one transferable 1.653 +nsresult Do_Test1() 1.654 +{ 1.655 + nsresult rv = NS_OK; 1.656 + nsresult workingrv; 1.657 + 1.658 + workingrv = Do_CheckOneFile(); 1.659 + if (NS_FAILED(workingrv)) { 1.660 + fail("Drag object tests failed on a single file"); 1.661 + rv = NS_ERROR_UNEXPECTED; 1.662 + } else { 1.663 + passed("Successfully created a working file drag object!"); 1.664 + } 1.665 + 1.666 + workingrv = Do_CheckOneString(); 1.667 + if (NS_FAILED(workingrv)) { 1.668 + fail("Drag object tests failed on a single string"); 1.669 + rv = NS_ERROR_UNEXPECTED; 1.670 + } else { 1.671 + passed("Successfully created a working string drag object!"); 1.672 + } 1.673 + 1.674 + workingrv = Do_CheckSetArbitraryData(false); 1.675 + if (NS_FAILED(workingrv)) { 1.676 + fail("Drag object tests failed on setting arbitrary data"); 1.677 + rv = NS_ERROR_UNEXPECTED; 1.678 + } else { 1.679 + passed("Successfully set arbitrary data on a drag object"); 1.680 + } 1.681 + 1.682 + return rv; 1.683 +} 1.684 + 1.685 +// This function performs basic drop tests, testing a data object consisting of 1.686 +// two transferables. 1.687 +nsresult Do_Test2() 1.688 +{ 1.689 + nsresult rv = NS_OK; 1.690 + nsresult workingrv; 1.691 + 1.692 + workingrv = Do_CheckTwoFiles(); 1.693 + if (NS_FAILED(workingrv)) { 1.694 + fail("Drag object tests failed on multiple files"); 1.695 + rv = NS_ERROR_UNEXPECTED; 1.696 + } else { 1.697 + passed("Successfully created a working multiple file drag object!"); 1.698 + } 1.699 + 1.700 + workingrv = Do_CheckTwoStrings(); 1.701 + if (NS_FAILED(workingrv)) { 1.702 + fail("Drag object tests failed on multiple strings"); 1.703 + rv = NS_ERROR_UNEXPECTED; 1.704 + } else { 1.705 + passed("Successfully created a working multiple string drag object!"); 1.706 + } 1.707 + 1.708 + workingrv = Do_CheckSetArbitraryData(true); 1.709 + if (NS_FAILED(workingrv)) { 1.710 + fail("Drag object tests failed on setting arbitrary data"); 1.711 + rv = NS_ERROR_UNEXPECTED; 1.712 + } else { 1.713 + passed("Successfully set arbitrary data on a drag object"); 1.714 + } 1.715 + 1.716 + return rv; 1.717 +} 1.718 + 1.719 +// This function performs advanced drag and drop tests, testing a data object 1.720 +// consisting of multiple transferables that have different data types 1.721 +nsresult Do_Test3() 1.722 +{ 1.723 + nsresult rv = NS_OK; 1.724 + nsresult workingrv; 1.725 + 1.726 + // XXX TODO Write more advanced tests in Bug 535860 1.727 + return rv; 1.728 +} 1.729 + 1.730 +int main(int argc, char** argv) 1.731 +{ 1.732 + ScopedXPCOM xpcom("Test Windows Drag and Drop"); 1.733 + 1.734 + nsCOMPtr<nsIFile> file; 1.735 + file = xpcom.GetProfileDirectory(); 1.736 + xferFile = file; 1.737 + 1.738 + if (NS_SUCCEEDED(Do_Test1())) 1.739 + passed("Basic Drag and Drop data type tests (single transferable) succeeded!"); 1.740 + 1.741 + if (NS_SUCCEEDED(Do_Test2())) 1.742 + passed("Basic Drag and Drop data type tests (multiple transferables) succeeded!"); 1.743 + 1.744 +//if (NS_SUCCEEDED(Do_Test3())) 1.745 +// passed("Advanced Drag and Drop data type tests succeeded!"); 1.746 + 1.747 + return gFailCount; 1.748 +}