widget/windows/tests/TestWinDND.cpp

Thu, 15 Jan 2015 15:59:08 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Thu, 15 Jan 2015 15:59:08 +0100
branch
TOR_BUG_9701
changeset 10
ac0c01689b40
permissions
-rw-r--r--

Implement a real Private Browsing Mode condition by changing the API/ABI;
This solves Tor bug #9701, complying with disk avoidance documented in
https://www.torproject.org/projects/torbrowser/design/#disk-avoidance.

     1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
     2 /* This Source Code Form is subject to the terms of the Mozilla Public
     3  * License, v. 2.0. If a copy of the MPL was not distributed with this
     4  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
     5 #define MOZILLA_INTERNAL_API
     7 #include <ole2.h>
     8 #include <shlobj.h>
    10 #include "TestHarness.h"
    11 #include "nsIArray.h"
    12 #include "nsIFile.h"
    13 #include "nsNetUtil.h"
    14 #include "nsISupportsPrimitives.h"
    15 #include "nsIFileURL.h"
    16 #include "nsITransferable.h"
    17 #include "nsClipboard.h"
    18 #include "nsDataObjCollection.h"
    20 nsIFile* xferFile;
    22 nsresult CheckValidHDROP(STGMEDIUM* pSTG)
    23 {
    24   if (pSTG->tymed != TYMED_HGLOBAL) {
    25     fail("Received data is not in an HGLOBAL");
    26     return NS_ERROR_UNEXPECTED;
    27   }
    29   HGLOBAL hGlobal = pSTG->hGlobal;
    30   DROPFILES* pDropFiles;
    31   pDropFiles = (DROPFILES*)GlobalLock(hGlobal);
    32   if (!pDropFiles) {
    33     fail("There is no data at the given HGLOBAL");
    34     return NS_ERROR_UNEXPECTED;
    35   }
    37   if (pDropFiles->pFiles != sizeof(DROPFILES))
    38     fail("DROPFILES struct has wrong size");
    40   if (pDropFiles->fWide != true) {
    41     fail("Received data is not Unicode");
    42     return NS_ERROR_UNEXPECTED;
    43   }
    44   nsString s;
    45   unsigned long offset = 0;
    46   while (1) {
    47     s = (char16_t*)((char*)pDropFiles + pDropFiles->pFiles + offset);
    48     if (s.IsEmpty())
    49       break;
    50     nsresult rv;
    51     nsCOMPtr<nsIFile> localFile(
    52                do_CreateInstance(NS_LOCAL_FILE_CONTRACTID, &rv));
    53     rv = localFile->InitWithPath(s);
    54     if (NS_FAILED(rv)) {
    55       fail("File could not be opened");
    56       return NS_ERROR_UNEXPECTED;
    57     }
    58     offset += sizeof(char16_t) * (s.Length() + 1);
    59   }
    60   return NS_OK;
    61 }
    63 nsresult CheckValidTEXT(STGMEDIUM* pSTG)
    64 {
    65   if (pSTG->tymed != TYMED_HGLOBAL) {
    66     fail("Received data is not in an HGLOBAL");
    67     return NS_ERROR_UNEXPECTED;
    68   }
    70   HGLOBAL hGlobal = pSTG->hGlobal;
    71   char* pText;
    72   pText = (char*)GlobalLock(hGlobal);
    73   if (!pText) {
    74     fail("There is no data at the given HGLOBAL");
    75     return NS_ERROR_UNEXPECTED;
    76   }
    78   nsCString string;
    79   string = pText;
    81   if (!string.Equals(NS_LITERAL_CSTRING("Mozilla can drag and drop"))) {
    82     fail("Text passed through drop object wrong");
    83     return NS_ERROR_UNEXPECTED;
    84   }
    85   return NS_OK;
    86 }
    88 nsresult CheckValidTEXTTwo(STGMEDIUM* pSTG)
    89 {
    90   if (pSTG->tymed != TYMED_HGLOBAL) {
    91     fail("Received data is not in an HGLOBAL");
    92     return NS_ERROR_UNEXPECTED;
    93   }
    95   HGLOBAL hGlobal = pSTG->hGlobal;
    96   char* pText;
    97   pText = (char*)GlobalLock(hGlobal);
    98   if (!pText) {
    99     fail("There is no data at the given HGLOBAL");
   100     return NS_ERROR_UNEXPECTED;
   101   }
   103   nsCString string;
   104   string = pText;
   106   if (!string.Equals(NS_LITERAL_CSTRING("Mozilla can drag and drop twice over"))) {
   107     fail("Text passed through drop object wrong");
   108     return NS_ERROR_UNEXPECTED;
   109   }
   110   return NS_OK;
   111 }
   113 nsresult CheckValidUNICODE(STGMEDIUM* pSTG)
   114 {
   115   if (pSTG->tymed != TYMED_HGLOBAL) {
   116     fail("Received data is not in an HGLOBAL");
   117     return NS_ERROR_UNEXPECTED;
   118   }
   120   HGLOBAL hGlobal = pSTG->hGlobal;
   121   char16_t* pText;
   122   pText = (char16_t*)GlobalLock(hGlobal);
   123   if (!pText) {
   124     fail("There is no data at the given HGLOBAL");
   125     return NS_ERROR_UNEXPECTED;
   126   }
   128   nsString string;
   129   string = pText;
   131   if (!string.Equals(NS_LITERAL_STRING("Mozilla can drag and drop"))) {
   132     fail("Text passed through drop object wrong");
   133     return NS_ERROR_UNEXPECTED;
   134   }
   135   return NS_OK;
   136 }
   138 nsresult CheckValidUNICODETwo(STGMEDIUM* pSTG)
   139 {
   140   if (pSTG->tymed != TYMED_HGLOBAL) {
   141     fail("Received data is not in an HGLOBAL");
   142     return NS_ERROR_UNEXPECTED;
   143   }
   145   HGLOBAL hGlobal = pSTG->hGlobal;
   146   char16_t* pText;
   147   pText = (char16_t*)GlobalLock(hGlobal);
   148   if (!pText) {
   149     fail("There is no data at the given HGLOBAL");
   150     return NS_ERROR_UNEXPECTED;
   151   }
   153   nsString string;
   154   string = pText;
   156   if (!string.Equals(NS_LITERAL_STRING("Mozilla can drag and drop twice over"))) {
   157     fail("Text passed through drop object wrong");
   158     return NS_ERROR_UNEXPECTED;
   159   }
   160   return NS_OK;
   161 }
   163 nsresult GetTransferableFile(nsCOMPtr<nsITransferable>& pTransferable)
   164 {
   165   nsresult rv;
   167   nsCOMPtr<nsISupports> genericWrapper = do_QueryInterface(xferFile);
   169   pTransferable = do_CreateInstance("@mozilla.org/widget/transferable;1");
   170   pTransferable->Init(nullptr);
   171   rv = pTransferable->SetTransferData("application/x-moz-file", genericWrapper,
   172                                       0);
   173   return rv;
   174 }
   176 nsresult GetTransferableText(nsCOMPtr<nsITransferable>& pTransferable)
   177 {
   178   nsresult rv;
   179   NS_NAMED_LITERAL_STRING(mozString, "Mozilla can drag and drop");
   180   nsCOMPtr<nsISupportsString> xferString =
   181                                do_CreateInstance(NS_SUPPORTS_STRING_CONTRACTID);
   182   rv = xferString->SetData(mozString);
   183   NS_ENSURE_SUCCESS(rv, rv);
   185   nsCOMPtr<nsISupports> genericWrapper = do_QueryInterface(xferString);
   187   pTransferable = do_CreateInstance("@mozilla.org/widget/transferable;1");
   188   pTransferable->Init(nullptr);
   189   rv = pTransferable->SetTransferData("text/unicode", genericWrapper,
   190                                       mozString.Length() * sizeof(char16_t));
   191   return rv;
   192 }
   194 nsresult GetTransferableTextTwo(nsCOMPtr<nsITransferable>& pTransferable)
   195 {
   196   nsresult rv;
   197   NS_NAMED_LITERAL_STRING(mozString, " twice over");
   198   nsCOMPtr<nsISupportsString> xferString =
   199                                do_CreateInstance(NS_SUPPORTS_STRING_CONTRACTID);
   200   rv = xferString->SetData(mozString);
   201   NS_ENSURE_SUCCESS(rv, rv);
   203   nsCOMPtr<nsISupports> genericWrapper = do_QueryInterface(xferString);
   205   pTransferable = do_CreateInstance("@mozilla.org/widget/transferable;1");
   206   pTransferable->Init(nullptr);
   207   rv = pTransferable->SetTransferData("text/unicode", genericWrapper,
   208                                       mozString.Length() * sizeof(char16_t));
   209   return rv;
   210 }
   212 nsresult GetTransferableURI(nsCOMPtr<nsITransferable>& pTransferable)
   213 {
   214   nsresult rv;
   216   nsCOMPtr<nsIURI> xferURI;
   218   rv = NS_NewURI(getter_AddRefs(xferURI), "http://www.mozilla.org");
   219   NS_ENSURE_SUCCESS(rv, rv);
   221   nsCOMPtr<nsISupports> genericWrapper = do_QueryInterface(xferURI);
   223   pTransferable = do_CreateInstance("@mozilla.org/widget/transferable;1");
   224   pTransferable->Init(nullptr);
   225   rv = pTransferable->SetTransferData("text/x-moz-url", genericWrapper, 0);
   226   return rv;
   227 }
   229 nsresult MakeDataObject(nsISupportsArray* transferableArray,
   230                         nsRefPtr<IDataObject>& itemToDrag)
   231 {
   232   nsresult rv;
   233   uint32_t itemCount = 0;
   235   nsCOMPtr<nsIURI> uri;
   236   rv = NS_NewURI(getter_AddRefs(uri), "http://www.mozilla.org");
   237   NS_ENSURE_SUCCESS(rv, rv);
   239   rv = transferableArray->Count(&itemCount);
   240   NS_ENSURE_SUCCESS(rv, rv);
   242   // Copied more or less exactly from nsDragService::InvokeDragSession
   243   // This is what lets us play fake Drag Service for the test
   244   if (itemCount > 1) {
   245     nsDataObjCollection * dataObjCollection = new nsDataObjCollection();
   246     if (!dataObjCollection)
   247       return NS_ERROR_OUT_OF_MEMORY;
   248     itemToDrag = dataObjCollection;
   249     for (uint32_t i=0; i<itemCount; ++i) {
   250       nsCOMPtr<nsISupports> supports;
   251       transferableArray->GetElementAt(i, getter_AddRefs(supports));
   252       nsCOMPtr<nsITransferable> trans(do_QueryInterface(supports));
   253       if (trans) {
   254         nsRefPtr<IDataObject> dataObj;
   255         rv = nsClipboard::CreateNativeDataObject(trans,
   256                                                  getter_AddRefs(dataObj), uri);
   257         NS_ENSURE_SUCCESS(rv, rv);
   258         // Add the flavors to the collection object too
   259         rv = nsClipboard::SetupNativeDataObject(trans, dataObjCollection);
   260         NS_ENSURE_SUCCESS(rv, rv);
   262         dataObjCollection->AddDataObject(dataObj);
   263       }
   264     }
   265   } // if dragging multiple items
   266   else {
   267     nsCOMPtr<nsISupports> supports;
   268     transferableArray->GetElementAt(0, getter_AddRefs(supports));
   269     nsCOMPtr<nsITransferable> trans(do_QueryInterface(supports));
   270     if (trans) {
   271       rv = nsClipboard::CreateNativeDataObject(trans,
   272                                                getter_AddRefs(itemToDrag),
   273                                                uri);
   274       NS_ENSURE_SUCCESS(rv, rv);
   275     }
   276   } // else dragging a single object
   277   return rv;
   278 }
   280 nsresult Do_CheckOneFile()
   281 {
   282   nsresult rv;
   283   nsCOMPtr<nsITransferable> transferable;
   284   nsCOMPtr<nsISupportsArray> transferableArray;
   285   nsCOMPtr<nsISupports> genericWrapper;
   286   nsRefPtr<IDataObject> dataObj;
   287   rv = NS_NewISupportsArray(getter_AddRefs(transferableArray));
   288   if (NS_FAILED(rv)) {
   289     fail("Could not create the necessary nsISupportsArray");
   290     return rv;
   291   }
   293   rv = GetTransferableFile(transferable);
   294   if (NS_FAILED(rv)) {
   295     fail("Could not create the proper nsITransferable!");
   296     return rv;
   297   }
   298   genericWrapper = do_QueryInterface(transferable);
   299   rv = transferableArray->AppendElement(genericWrapper);
   300   if (NS_FAILED(rv)) {
   301     fail("Could not append element to transferable array");
   302     return rv;
   303   }
   305   rv = MakeDataObject(transferableArray, dataObj);
   306   if (NS_FAILED(rv)) {
   307     fail("Could not create data object");
   308     return rv;
   309   }
   311   FORMATETC fe;
   312   SET_FORMATETC(fe, CF_HDROP, 0, DVASPECT_CONTENT, -1, TYMED_HGLOBAL);
   313   if (dataObj->QueryGetData(&fe) != S_OK) {
   314     fail("File data object does not support the file data type!");
   315     return NS_ERROR_UNEXPECTED;
   316   }
   318   STGMEDIUM* stg;
   319   stg = (STGMEDIUM*)CoTaskMemAlloc(sizeof(STGMEDIUM));
   320   if (dataObj->GetData(&fe, stg) != S_OK) {
   321     fail("File data object did not provide data on request");
   322     return NS_ERROR_UNEXPECTED;
   323   }
   325   rv = CheckValidHDROP(stg);
   326   if (NS_FAILED(rv)) {
   327     fail("HDROP was invalid");
   328     return rv;
   329   }
   331   ReleaseStgMedium(stg);
   333   return NS_OK;
   334 }
   336 nsresult Do_CheckTwoFiles()
   337 {
   338   nsresult rv;
   339   nsCOMPtr<nsITransferable> transferable;
   340   nsCOMPtr<nsISupportsArray> transferableArray;
   341   nsCOMPtr<nsISupports> genericWrapper;
   342   nsRefPtr<IDataObject> dataObj;
   343   rv = NS_NewISupportsArray(getter_AddRefs(transferableArray));
   344   if (NS_FAILED(rv)) {
   345     fail("Could not create the necessary nsISupportsArray");
   346     return rv;
   347   }
   349   rv = GetTransferableFile(transferable);
   350   if (NS_FAILED(rv)) {
   351     fail("Could not create the proper nsITransferable!");
   352     return rv;
   353   }
   354   genericWrapper = do_QueryInterface(transferable);
   355   rv = transferableArray->AppendElement(genericWrapper);
   356   if (NS_FAILED(rv)) {
   357     fail("Could not append element to transferable array");
   358     return rv;
   359   }
   361   rv = GetTransferableFile(transferable);
   362   if (NS_FAILED(rv)) {
   363     fail("Could not create the proper nsITransferable!");
   364     return rv;
   365   }
   366   genericWrapper = do_QueryInterface(transferable);
   367   rv = transferableArray->AppendElement(genericWrapper);
   368   if (NS_FAILED(rv)) {
   369     fail("Could not append element to transferable array");
   370     return rv;
   371   }
   373   rv = MakeDataObject(transferableArray, dataObj);
   374   if (NS_FAILED(rv)) {
   375     fail("Could not create data object");
   376     return rv;
   377   }
   379   FORMATETC fe;
   380   SET_FORMATETC(fe, CF_HDROP, 0, DVASPECT_CONTENT, -1, TYMED_HGLOBAL);
   381   if (dataObj->QueryGetData(&fe) != S_OK) {
   382     fail("File data object does not support the file data type!");
   383     return NS_ERROR_UNEXPECTED;
   384   }
   386   STGMEDIUM* stg;
   387   stg = (STGMEDIUM*)CoTaskMemAlloc(sizeof(STGMEDIUM));
   388   if (dataObj->GetData(&fe, stg) != S_OK) {
   389     fail("File data object did not provide data on request");
   390     return NS_ERROR_UNEXPECTED;
   391   }
   393   rv = CheckValidHDROP(stg);
   394   if (NS_FAILED(rv)) {
   395     fail("HDROP was invalid");
   396     return rv;
   397   }
   399   ReleaseStgMedium(stg);
   401   return NS_OK;
   402 }
   404 nsresult Do_CheckOneString()
   405 {
   406   nsresult rv;
   407   nsCOMPtr<nsITransferable> transferable;
   408   nsCOMPtr<nsISupportsArray> transferableArray;
   409   nsCOMPtr<nsISupports> genericWrapper;
   410   nsRefPtr<IDataObject> dataObj;
   411   rv = NS_NewISupportsArray(getter_AddRefs(transferableArray));
   412   if (NS_FAILED(rv)) {
   413     fail("Could not create the necessary nsISupportsArray");
   414     return rv;
   415   }
   417   rv = GetTransferableText(transferable);
   418   if (NS_FAILED(rv)) {
   419     fail("Could not create the proper nsITransferable!");
   420     return rv;
   421   }
   422   genericWrapper = do_QueryInterface(transferable);
   423   rv = transferableArray->AppendElement(genericWrapper);
   424   if (NS_FAILED(rv)) {
   425     fail("Could not append element to transferable array");
   426     return rv;
   427   }
   429   rv = MakeDataObject(transferableArray, dataObj);
   430   if (NS_FAILED(rv)) {
   431     fail("Could not create data object");
   432     return rv;
   433   }
   435   FORMATETC fe;
   436   SET_FORMATETC(fe, CF_TEXT, 0, DVASPECT_CONTENT, -1, TYMED_HGLOBAL);
   437   if (dataObj->QueryGetData(&fe) != S_OK) {
   438     fail("String data object does not support the ASCII text data type!");
   439     return NS_ERROR_UNEXPECTED;
   440   }
   442   STGMEDIUM* stg;
   443   stg = (STGMEDIUM*)CoTaskMemAlloc(sizeof(STGMEDIUM));
   444   if (dataObj->GetData(&fe, stg) != S_OK) {
   445     fail("String data object did not provide ASCII data on request");
   446     return NS_ERROR_UNEXPECTED;
   447   }
   449   rv = CheckValidTEXT(stg);
   450   if (NS_FAILED(rv)) {
   451     fail("TEXT was invalid");
   452     return rv;
   453   }
   455   ReleaseStgMedium(stg);
   457   SET_FORMATETC(fe, CF_UNICODETEXT, 0, DVASPECT_CONTENT, -1, TYMED_HGLOBAL);
   458   if (dataObj->QueryGetData(&fe) != S_OK) {
   459     fail("String data object does not support the wide text data type!");
   460     return NS_ERROR_UNEXPECTED;
   461   }
   463   if (dataObj->GetData(&fe, stg) != S_OK) {
   464     fail("String data object did not provide wide data on request");
   465     return NS_ERROR_UNEXPECTED;
   466   }
   468   rv = CheckValidUNICODE(stg);
   469   if (NS_FAILED(rv)) {
   470     fail("UNICODE was invalid");
   471     return rv;
   472   }
   474   return NS_OK;
   475 }
   477 nsresult Do_CheckTwoStrings()
   478 {
   479   nsresult rv;
   480   nsCOMPtr<nsITransferable> transferable;
   481   nsCOMPtr<nsISupportsArray> transferableArray;
   482   nsCOMPtr<nsISupports> genericWrapper;
   483   nsRefPtr<IDataObject> dataObj;
   484   rv = NS_NewISupportsArray(getter_AddRefs(transferableArray));
   485   if (NS_FAILED(rv)) {
   486     fail("Could not create the necessary nsISupportsArray");
   487     return rv;
   488   }
   490   rv = GetTransferableText(transferable);
   491   if (NS_FAILED(rv)) {
   492     fail("Could not create the proper nsITransferable!");
   493     return rv;
   494   }
   495   genericWrapper = do_QueryInterface(transferable);
   496   rv = transferableArray->AppendElement(genericWrapper);
   497   if (NS_FAILED(rv)) {
   498     fail("Could not append element to transferable array");
   499     return rv;
   500   }
   502   rv = GetTransferableTextTwo(transferable);
   503   if (NS_FAILED(rv)) {
   504     fail("Could not create the proper nsITransferable!");
   505     return rv;
   506   }
   507   genericWrapper = do_QueryInterface(transferable);
   508   rv = transferableArray->AppendElement(genericWrapper);
   509   if (NS_FAILED(rv)) {
   510     fail("Could not append element to transferable array");
   511     return rv;
   512   }
   514   rv = MakeDataObject(transferableArray, dataObj);
   515   if (NS_FAILED(rv)) {
   516     fail("Could not create data object");
   517     return rv;
   518   }
   520   FORMATETC fe;
   521   SET_FORMATETC(fe, CF_TEXT, 0, DVASPECT_CONTENT, -1, TYMED_HGLOBAL);
   522   if (dataObj->QueryGetData(&fe) != S_OK) {
   523     fail("String data object does not support the ASCII text data type!");
   524     return NS_ERROR_UNEXPECTED;
   525   }
   527   STGMEDIUM* stg;
   528   stg = (STGMEDIUM*)CoTaskMemAlloc(sizeof(STGMEDIUM));
   529   if (dataObj->GetData(&fe, stg) != S_OK) {
   530     fail("String data object did not provide ASCII data on request");
   531     return NS_ERROR_UNEXPECTED;
   532   }
   534   rv = CheckValidTEXTTwo(stg);
   535   if (NS_FAILED(rv)) {
   536     fail("TEXT was invalid");
   537     return rv;
   538   }
   540   ReleaseStgMedium(stg);
   542   SET_FORMATETC(fe, CF_UNICODETEXT, 0, DVASPECT_CONTENT, -1, TYMED_HGLOBAL);
   543   if (dataObj->QueryGetData(&fe) != S_OK) {
   544     fail("String data object does not support the wide text data type!");
   545     return NS_ERROR_UNEXPECTED;
   546   }
   548   if (dataObj->GetData(&fe, stg) != S_OK) {
   549     fail("String data object did not provide wide data on request");
   550     return NS_ERROR_UNEXPECTED;
   551   }
   553   rv = CheckValidUNICODETwo(stg);
   554   if (NS_FAILED(rv)) {
   555     fail("UNICODE was invalid");
   556     return rv;
   557   }
   559   return NS_OK;
   560 }
   562 nsresult Do_CheckSetArbitraryData(bool aMultiple)
   563 {
   564   nsresult rv;
   565   nsCOMPtr<nsITransferable> transferable;
   566   nsCOMPtr<nsISupportsArray> transferableArray;
   567   nsCOMPtr<nsISupports> genericWrapper;
   568   nsRefPtr<IDataObject> dataObj;
   569   rv = NS_NewISupportsArray(getter_AddRefs(transferableArray));
   570   if (NS_FAILED(rv)) {
   571     fail("Could not create the necessary nsISupportsArray");
   572     return rv;
   573   }
   575   rv = GetTransferableText(transferable);
   576   if (NS_FAILED(rv)) {
   577     fail("Could not create the proper nsITransferable!");
   578     return rv;
   579   }
   580   genericWrapper = do_QueryInterface(transferable);
   581   rv = transferableArray->AppendElement(genericWrapper);
   582   if (NS_FAILED(rv)) {
   583     fail("Could not append element to transferable array");
   584     return rv;
   585   }
   587   if (aMultiple) {
   588     rv = GetTransferableText(transferable);
   589     if (NS_FAILED(rv)) {
   590       fail("Could not create the proper nsITransferable!");
   591       return rv;
   592     }
   593     genericWrapper = do_QueryInterface(transferable);
   594     rv = transferableArray->AppendElement(genericWrapper);
   595     if (NS_FAILED(rv)) {
   596       fail("Could not append element to transferable array");
   597       return rv;
   598     }
   599   }
   601   rv = MakeDataObject(transferableArray, dataObj);
   602   if (NS_FAILED(rv)) {
   603     fail("Could not create data object");
   604     return rv;
   605   }
   607   static CLIPFORMAT mozArbitraryFormat =
   608                                ::RegisterClipboardFormatW(L"MozillaTestFormat");
   609   FORMATETC fe;
   610   STGMEDIUM stg;
   611   SET_FORMATETC(fe, mozArbitraryFormat, 0, DVASPECT_CONTENT, -1, TYMED_HGLOBAL);
   613   HGLOBAL hg = GlobalAlloc(GPTR, 1024);
   614   stg.tymed = TYMED_HGLOBAL;
   615   stg.hGlobal = hg;
   616   stg.pUnkForRelease = nullptr;
   618   if (dataObj->SetData(&fe, &stg, true) != S_OK) {
   619     if (aMultiple) {
   620       fail("Unable to set arbitrary data type on data object collection!");
   621     } else {
   622       fail("Unable to set arbitrary data type on data object!");
   623     }
   624     return NS_ERROR_UNEXPECTED;
   625   }
   627   if (dataObj->QueryGetData(&fe) != S_OK) {
   628     fail("Arbitrary data set on data object is not advertised!");
   629     return NS_ERROR_UNEXPECTED;
   630   }
   632   STGMEDIUM* stg2;
   633   stg2 = (STGMEDIUM*)CoTaskMemAlloc(sizeof(STGMEDIUM));
   634   if (dataObj->GetData(&fe, stg2) != S_OK) {
   635     fail("Data object did not provide arbitrary data upon request!");
   636     return NS_ERROR_UNEXPECTED;
   637   }
   639   if (stg2->hGlobal != hg) {
   640     fail("Arbitrary data was not returned properly!");
   641     return rv;
   642   }
   643   ReleaseStgMedium(stg2);
   645   return NS_OK;
   646 }
   648 // This function performs basic drop tests, testing a data object consisting
   649 // of one transferable
   650 nsresult Do_Test1()
   651 {
   652   nsresult rv = NS_OK;
   653   nsresult workingrv;
   655   workingrv = Do_CheckOneFile();
   656   if (NS_FAILED(workingrv)) {
   657     fail("Drag object tests failed on a single file");
   658     rv = NS_ERROR_UNEXPECTED;
   659   } else {
   660     passed("Successfully created a working file drag object!");
   661   }
   663   workingrv = Do_CheckOneString();
   664   if (NS_FAILED(workingrv)) {
   665     fail("Drag object tests failed on a single string");
   666     rv = NS_ERROR_UNEXPECTED;
   667   } else {
   668     passed("Successfully created a working string drag object!");
   669   }
   671   workingrv = Do_CheckSetArbitraryData(false);
   672   if (NS_FAILED(workingrv)) {
   673     fail("Drag object tests failed on setting arbitrary data");
   674     rv = NS_ERROR_UNEXPECTED;
   675   } else {
   676     passed("Successfully set arbitrary data on a drag object");
   677   }
   679   return rv;
   680 }
   682 // This function performs basic drop tests, testing a data object consisting of
   683 // two transferables.
   684 nsresult Do_Test2()
   685 {
   686   nsresult rv = NS_OK;
   687   nsresult workingrv;
   689   workingrv = Do_CheckTwoFiles();
   690   if (NS_FAILED(workingrv)) {
   691     fail("Drag object tests failed on multiple files");
   692     rv = NS_ERROR_UNEXPECTED;
   693   } else {
   694     passed("Successfully created a working multiple file drag object!");
   695   }
   697   workingrv = Do_CheckTwoStrings();
   698   if (NS_FAILED(workingrv)) {
   699     fail("Drag object tests failed on multiple strings");
   700     rv = NS_ERROR_UNEXPECTED;
   701   } else {
   702     passed("Successfully created a working multiple string drag object!");
   703   }
   705   workingrv = Do_CheckSetArbitraryData(true);
   706   if (NS_FAILED(workingrv)) {
   707     fail("Drag object tests failed on setting arbitrary data");
   708     rv = NS_ERROR_UNEXPECTED;
   709   } else {
   710     passed("Successfully set arbitrary data on a drag object");
   711   }
   713   return rv;
   714 }
   716 // This function performs advanced drag and drop tests, testing a data object
   717 // consisting of multiple transferables that have different data types
   718 nsresult Do_Test3()
   719 {
   720   nsresult rv = NS_OK;
   721   nsresult workingrv;
   723   // XXX TODO Write more advanced tests in Bug 535860
   724   return rv;
   725 }
   727 int main(int argc, char** argv)
   728 {
   729   ScopedXPCOM xpcom("Test Windows Drag and Drop");
   731   nsCOMPtr<nsIFile> file;
   732   file = xpcom.GetProfileDirectory();
   733   xferFile = file;
   735   if (NS_SUCCEEDED(Do_Test1()))
   736     passed("Basic Drag and Drop data type tests (single transferable) succeeded!");
   738   if (NS_SUCCEEDED(Do_Test2()))
   739     passed("Basic Drag and Drop data type tests (multiple transferables) succeeded!");
   741 //if (NS_SUCCEEDED(Do_Test3()))
   742 //  passed("Advanced Drag and Drop data type tests succeeded!");
   744   return gFailCount;
   745 }

mercurial