dom/indexedDB/test/file.js

Wed, 31 Dec 2014 06:55:50 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Wed, 31 Dec 2014 06:55:50 +0100
changeset 2
7e26c7da4463
permissions
-rw-r--r--

Added tag UPSTREAM_283F7C6 for changeset ca08bd8f51b2

     1 /**
     2  * Any copyright is dedicated to the Public Domain.
     3  * http://creativecommons.org/publicdomain/zero/1.0/
     4  */
     6 const DEFAULT_QUOTA = 50 * 1024 * 1024;
     8 var bufferCache = [];
     9 var utils = SpecialPowers.getDOMWindowUtils(window);
    11 if (!SpecialPowers.isMainProcess()) {
    12   window.runTest = function() {
    13     todo(false, "Test disabled in child processes, for now");
    14     finishTest();
    15   }
    16 }
    18 function getView(size)
    19 {
    20   let buffer = new ArrayBuffer(size);
    21   let view = new Uint8Array(buffer);
    22   is(buffer.byteLength, size, "Correct byte length");
    23   return view;
    24 }
    26 function getRandomView(size)
    27 {
    28   let view = getView(size);
    29   for (let i = 0; i < size; i++) {
    30     view[i] = parseInt(Math.random() * 255)
    31   }
    32   return view;
    33 }
    35 function compareBuffers(buffer1, buffer2)
    36 {
    37   if (buffer1.byteLength != buffer2.byteLength) {
    38     return false;
    39   }
    40   let view1 = new Uint8Array(buffer1);
    41   let view2 = new Uint8Array(buffer2);
    42   for (let i = 0; i < buffer1.byteLength; i++) {
    43     if (view1[i] != view2[i]) {
    44       return false;
    45     }
    46   }
    47   return true;
    48 }
    50 function getBlob(type, view)
    51 {
    52   return SpecialPowers.unwrap(utils.getBlob([view], {type: type}));
    53 }
    55 function getFile(name, type, view)
    56 {
    57   return SpecialPowers.unwrap(utils.getFile(name, [view], {type: type}));
    58 }
    60 function getRandomBlob(size)
    61 {
    62   return getBlob("binary/random", getRandomView(size));
    63 }
    65 function getRandomFile(name, size)
    66 {
    67   return getFile(name, "binary/random", getRandomView(size));
    68 }
    70 function getNullBlob(size)
    71 {
    72   return getBlob("binary/null", getView(size));
    73 }
    75 function getNullFile(name, size)
    76 {
    77   return getFile(name, "binary/null", getView(size));
    78 }
    80 function verifyBuffers(buffer1, buffer2)
    81 {
    82   ok(compareBuffers(buffer1, buffer2), "Correct blob data");
    83 }
    85 function verifyBlob(blob1, blob2, fileId, blobReadHandler)
    86 {
    87   is(blob1 instanceof Components.interfaces.nsIDOMBlob, true,
    88      "Instance of nsIDOMBlob");
    89   is(blob1 instanceof Components.interfaces.nsIDOMFile,
    90      blob2 instanceof Components.interfaces.nsIDOMFile,
    91      "Instance of nsIDOMFile");
    92   is(blob1.size, blob2.size, "Correct size");
    93   is(blob1.type, blob2.type, "Correct type");
    94   if (blob2 instanceof Components.interfaces.nsIDOMFile) {
    95     is(blob1.name, blob2.name, "Correct name");
    96   }
    97   is(utils.getFileId(blob1), fileId, "Correct file id");
    99   let buffer1;
   100   let buffer2;
   102   for (let i = 0; i < bufferCache.length; i++) {
   103     if (bufferCache[i].blob == blob2) {
   104       buffer2 = bufferCache[i].buffer;
   105       break;
   106     }
   107   }
   109   if (!buffer2) {
   110     let reader = new FileReader();
   111     reader.readAsArrayBuffer(blob2);
   112     reader.onload = function(event) {
   113       buffer2 = event.target.result;
   114       bufferCache.push({ blob: blob2, buffer: buffer2 });
   115       if (buffer1) {
   116         verifyBuffers(buffer1, buffer2);
   117         if (blobReadHandler) {
   118           blobReadHandler();
   119         }
   120         else {
   121           testGenerator.next();
   122         }
   123       }
   124     }
   125   }
   127   let reader = new FileReader();
   128   reader.readAsArrayBuffer(blob1);
   129   reader.onload = function(event) {
   130     buffer1 = event.target.result;
   131     if (buffer2) {
   132       verifyBuffers(buffer1, buffer2);
   133       if (blobReadHandler) {
   134         blobReadHandler();
   135       }
   136       else {
   137         testGenerator.next();
   138       }
   139     }
   140   }
   141 }
   143 function verifyBlobArray(blobs1, blobs2, expectedFileIds)
   144 {
   145   is(blobs1 instanceof Array, true, "Got an array object");
   146   is(blobs1.length, blobs2.length, "Correct length");
   148   if (!blobs1.length) {
   149     return;
   150   }
   152   let verifiedCount = 0;
   154   function blobReadHandler() {
   155     if (++verifiedCount == blobs1.length) {
   156       testGenerator.next();
   157     }
   158     else {
   159       verifyBlob(blobs1[verifiedCount], blobs2[verifiedCount],
   160                  expectedFileIds[verifiedCount], blobReadHandler);
   161     }
   162   }
   164   verifyBlob(blobs1[verifiedCount], blobs2[verifiedCount],
   165              expectedFileIds[verifiedCount], blobReadHandler);
   166 }
   168 function grabFileUsageAndContinueHandler(usage, fileUsage)
   169 {
   170   testGenerator.send(fileUsage);
   171 }
   173 function getUsage(usageHandler)
   174 {
   175   let comp = SpecialPowers.wrap(Components);
   176   let quotaManager = comp.classes["@mozilla.org/dom/quota/manager;1"]
   177                          .getService(comp.interfaces.nsIQuotaManager);
   179   // We need to pass a JS callback to getUsageForURI. However, that callback
   180   // takes an XPCOM URI object, which will cause us to throw when we wrap it
   181   // for the content compartment. So we need to define the function in a
   182   // privileged scope, which we do using a sandbox.
   183   var sysPrin = SpecialPowers.Services.scriptSecurityManager.getSystemPrincipal();
   184   var sb = new SpecialPowers.Cu.Sandbox(sysPrin);
   185   sb.usageHandler = usageHandler;
   186   var cb = SpecialPowers.Cu.evalInSandbox((function(uri, usage, fileUsage) {
   187                                            usageHandler(usage, fileUsage); }).toSource(), sb);
   189   let uri = SpecialPowers.wrap(window).document.documentURIObject;
   190   quotaManager.getUsageForURI(uri, cb);
   191 }
   193 function getFileId(file)
   194 {
   195   return utils.getFileId(file);
   196 }
   198 function hasFileInfo(name, id)
   199 {
   200   return utils.getFileReferences(name, id);
   201 }
   203 function getFileRefCount(name, id)
   204 {
   205   let count = {};
   206   utils.getFileReferences(name, id, null, count);
   207   return count.value;
   208 }
   210 function getFileDBRefCount(name, id)
   211 {
   212   let count = {};
   213   utils.getFileReferences(name, id, null, {}, count);
   214   return count.value;
   215 }

mercurial