test_cleanup_transaction.js 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. /**
  2. * Any copyright is dedicated to the Public Domain.
  3. * http://creativecommons.org/publicdomain/zero/1.0/
  4. */
  5. var disableWorkerTest = "Need a way to set temporary prefs from a worker";
  6. var testGenerator = testSteps();
  7. function testSteps()
  8. {
  9. const spec = "http://foo.com";
  10. const name =
  11. this.window ? window.location.pathname : "test_quotaExceeded_recovery";
  12. const objectStoreName = "foo";
  13. // We want 32 MB database, but there's the group limit so we need to
  14. // multiply by 5.
  15. const tempStorageLimitKB = 32 * 1024 * 5;
  16. // Store in 1 MB chunks.
  17. const dataSize = 1024 * 1024;
  18. for (let blobs of [false, true]) {
  19. setTemporaryStorageLimit(tempStorageLimitKB);
  20. clearAllDatabases(continueToNextStepSync);
  21. yield undefined;
  22. info("Opening database");
  23. let request = indexedDB.openForPrincipal(getPrincipal(spec), name);
  24. request.onerror = errorHandler;
  25. request.onupgradeneeded = grabEventAndContinueHandler;;
  26. request.onsuccess = unexpectedSuccessHandler;
  27. yield undefined;
  28. // upgradeneeded
  29. request.onupgradeneeded = unexpectedSuccessHandler;
  30. request.onsuccess = grabEventAndContinueHandler;
  31. info("Creating objectStore");
  32. request.result.createObjectStore(objectStoreName);
  33. yield undefined;
  34. // success
  35. let db = request.result;
  36. db.onerror = errorHandler;
  37. ok(true, "Adding data until quota is reached");
  38. let obj = {
  39. name: "foo"
  40. }
  41. if (!blobs) {
  42. obj.data = getRandomView(dataSize);
  43. }
  44. let i = 1;
  45. let j = 1;
  46. while (true) {
  47. if (blobs) {
  48. obj.data = getBlob(getView(dataSize));
  49. }
  50. let trans = db.transaction(objectStoreName, "readwrite");
  51. request = trans.objectStore(objectStoreName).add(obj, i);
  52. request.onerror = function(event)
  53. {
  54. event.stopPropagation();
  55. }
  56. trans.oncomplete = function(event) {
  57. i++;
  58. j++;
  59. testGenerator.send(true);
  60. }
  61. trans.onabort = function(event) {
  62. is(trans.error.name, "QuotaExceededError", "Reached quota limit");
  63. testGenerator.send(false);
  64. }
  65. let completeFired = yield undefined;
  66. if (completeFired) {
  67. ok(true, "Got complete event");
  68. } else {
  69. ok(true, "Got abort event");
  70. if (j == 1) {
  71. // Plain cleanup transaction (just vacuuming and checkpointing)
  72. // couldn't shrink database any further.
  73. break;
  74. }
  75. j = 1;
  76. trans = db.transaction(objectStoreName, "cleanup");
  77. trans.onabort = unexpectedSuccessHandler;;
  78. trans.oncomplete = grabEventAndContinueHandler;
  79. yield undefined;
  80. }
  81. }
  82. info("Reopening database");
  83. db.close();
  84. request = indexedDB.openForPrincipal(getPrincipal(spec), name);
  85. request.onerror = errorHandler;
  86. request.onsuccess = grabEventAndContinueHandler;
  87. yield undefined;
  88. db = request.result;
  89. db.onerror = errorHandler;
  90. info("Deleting some data")
  91. let trans = db.transaction(objectStoreName, "cleanup");
  92. trans.objectStore(objectStoreName).delete(1);
  93. trans.onabort = unexpectedSuccessHandler;;
  94. trans.oncomplete = grabEventAndContinueHandler;
  95. yield undefined;
  96. info("Adding data again")
  97. trans = db.transaction(objectStoreName, "readwrite");
  98. trans.objectStore(objectStoreName).add(obj, 1);
  99. trans.onabort = unexpectedSuccessHandler;
  100. trans.oncomplete = grabEventAndContinueHandler;
  101. yield undefined;
  102. info("Deleting database");
  103. db.close();
  104. request = indexedDB.deleteForPrincipal(getPrincipal(spec), name);
  105. request.onerror = errorHandler;
  106. request.onsuccess = grabEventAndContinueHandler;
  107. yield undefined;
  108. }
  109. finishTest();
  110. yield undefined;
  111. }