DXR is a code search and navigation tool aimed at making sense of large projects. It supports full-text and regex searches as well as structural queries.

Mercurial (d8847129d134)

VCS Links

Line Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174
<!--
  Any copyright is dedicated to the Public Domain.
  http://creativecommons.org/publicdomain/zero/1.0/
-->
<!DOCTYPE HTML>
<html> <!--
https://bugzilla.mozilla.org/show_bug.cgi?id=717103
-->
<head>
  <title>Test for the device storage API </title>
  <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
  <script type="text/javascript" src="devicestorage_common.js"></script>

<link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
</head>
<body>
<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=717103">Mozilla Bug 717103</a>
<p id="display"></p>
<div id="content" style="display: none">
  
</div>
<pre id="test">
<script class="testbody" type="text/javascript">

SimpleTest.requestFlakyTimeout("untriaged");
devicestorage_setup();
// We put the old files in 2 levels deep. When you add a file to a directory
// it will modify the parents last modification time, but not the parents
// parents. So we want to make sure that even though x's timestamp is earlier
// than the since parameter, we still pick up the later files.
var oldFiles = ["x/y/aa.png", "x/y/ab.png", "x/y/ac.png"];
var timeFile = "t.png";
var newFiles = ["x/y/ad.png", "x/y/ae.png", "x/y/af.png", // new files in old dir
                "z/bd.png", "z/be.png", "z/bf.png"];      // new files in new dir

var storage = navigator.getDeviceStorage('pictures');
var prefix = "devicestorage/" + randomFilename(12);
var i;
var timestamp;
var lastFileAddedTimestamp;

function verifyAndDelete(prefix, files, e) {
  if (e.target.result == null) {
    ok(files.length == 0, "when the enumeration is done, we shouldn't have any files in this array")
    dump("We still have length = " + files.length + "\n");
    dump(files + "\n");
    devicestorage_cleanup();
    return;
  }

  var filename = e.target.result.name;
  if (filename[0] == "/") {
    // We got /storageName/prefix/filename
    // Remove the storageName (this shows up on FirefoxOS)
    filename = filename.substring(1); // Remove leading slash
    var slashIndex = filename.indexOf("/");
    if (slashIndex >= 0) {
      filename = filename.substring(slashIndex + 1); // Remove storageName
    }
  }
  if (filename.startsWith(prefix)) {
    filename = filename.substring(prefix.length + 1); // Remove prefix
  }

  var index = files.indexOf(filename);
  ok(index > -1, "filename should be in the enumeration : " + e.target.result.name);
  if (index == -1)
    return;

  files.splice(index, 1);

  // clean up
  var cleanup = storage.delete(e.target.result.name);
  cleanup.onsuccess = function(e) {}
}

function addFile(filename, callback) {
  var addReq = storage.addNamed(createRandomBlob('image/png'), prefix + '/' + filename);
  addReq.onsuccess = function(e) {
    // After adding the file, we go ahead and grab the timestamp of the file
    // that we just added
    var getReq = storage.get(prefix + '/' + filename);
    getReq.onsuccess = function(e) {
      lastFileAddedTimestamp = e.target.result.lastModifiedDate;
      callback();
    }
    getReq.onerror = function(e) {
      ok(false, "getError was called : " + e.target.error.name);
      devicestorage_cleanup();
    };
  }
  addReq.onerror = function(e) {
    ok(false, "addError was called : " + e.target.error.name);
    devicestorage_cleanup();
  }
}

function addFileArray(fileArray, callback) {
  var i = 0;
  function addNextFile() {
    i = i + 1;
    if (i == fileArray.length) {
      callback();
      return;
    }
    addFile(fileArray[i], addNextFile);
  }
  addFile(fileArray[0], addNextFile);
}

function delFile(filename, callback) {
  var req = storage.delete(prefix + '/' + filename);
  req.onsuccess = function(e) {
    callback();
  };
  req.onerror = function(e) {
    ok(false, "delError was called : " + e.target.error.name);
    devicestorage_cleanup();
  };
}

function afterNewFiles() {
  var cursor = storage.enumerate(prefix, {"since": timestamp});
  cursor.onsuccess = function(e) {
    verifyAndDelete(prefix, newFiles, e);
    if (e.target.result) {
      e.target.continue();
    }
  };
  cursor.onerror = function (e) {
    ok(false, "handleError was called : " + e.target.error.name);
    devicestorage_cleanup();
  };
}

function waitForTimestampChange() {
  // We've added a new file. See if the timestamp differs from
  // oldFileAddedTimestamp, and if it's the same wait for a bit
  // and try again.
  if (lastFileAddedTimestamp.valueOf() === timestamp.valueOf()) {
    delFile(timeFile, function() {
      setTimeout(function() {
        addFile(timeFile, waitForTimestampChange);
      }, 1000);
    });
  } else {
    timestamp = lastFileAddedTimestamp;
    // The timestamp has changed. Go ahead and add the rest of the new files
    delFile(timeFile, function() {
      addFileArray(newFiles, afterNewFiles);
    });
  }
}

function afterOldFiles() {
  timestamp = lastFileAddedTimestamp;
  setTimeout(function() {
    // We've added our old files and waited for a second.
    // Add a new file until the timestamp changes
    addFile(timeFile, waitForTimestampChange);
  }, 1000);
}

function addOldFiles() {
  addFileArray(oldFiles, afterOldFiles);
}

addOldFiles();

</script>
</pre>
</body>
</html>