test_rename_index.js 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. /**
  2. * Any copyright is dedicated to the Public Domain.
  3. * http://creativecommons.org/publicdomain/zero/1.0/
  4. */
  5. var testGenerator = testSteps();
  6. function testSteps()
  7. {
  8. const name = this.window ? window.location.pathname : "Splendid Test";
  9. const storeName = "test store";
  10. const indexName_ToBeDeleted = "test index to be deleted";
  11. const indexName_v0 = "test index v0";
  12. const indexName_v1 = "test index v1";
  13. const indexName_v2 = "test index v2";
  14. const indexName_v3 = indexName_ToBeDeleted;
  15. const indexName_v4 = "test index v4";
  16. info("Rename in v1.");
  17. let request = indexedDB.open(name, 1);
  18. request.onerror = errorHandler;
  19. request.onupgradeneeded = grabEventAndContinueHandler;
  20. request.onsuccess = unexpectedSuccessHandler;
  21. let event = yield undefined;
  22. let db = event.target.result;
  23. let txn = event.target.transaction;
  24. is(db.objectStoreNames.length, 0, "Correct objectStoreNames list");
  25. let objectStore = db.createObjectStore(storeName, { keyPath: "foo" });
  26. is(db.objectStoreNames.length, 1, "Correct objectStoreNames list");
  27. is(db.objectStoreNames.item(0), objectStore.name, "Correct object store name");
  28. // create index to be deleted later in v3.
  29. objectStore.createIndex(indexName_ToBeDeleted, "foo");
  30. ok(objectStore.index(indexName_ToBeDeleted), "Index created.");
  31. // create target index to be renamed.
  32. let index = objectStore.createIndex(indexName_v0, "bar");
  33. ok(objectStore.index(indexName_v0), "Index created.");
  34. is(index.name, indexName_v0, "Correct index name");
  35. index.name = indexName_v1;
  36. is(index.name, indexName_v1, "Renamed index successfully");
  37. txn.oncomplete = continueToNextStepSync;
  38. yield undefined;
  39. request.onsuccess = continueToNextStep;
  40. yield undefined;
  41. db.close();
  42. info("Verify renaming done in v1 and run renaming in v2.");
  43. request = indexedDB.open(name, 2);
  44. request.onerror = errorHandler;
  45. request.onupgradeneeded = grabEventAndContinueHandler;
  46. request.onsuccess = unexpectedSuccessHandler;
  47. event = yield undefined;
  48. db = event.target.result;
  49. txn = event.target.transaction;
  50. objectStore = txn.objectStore(storeName);
  51. // indexName_v0 created in v1 shall not be available.
  52. try {
  53. index = objectStore.index(indexName_v0);
  54. ok(false, "NotFoundError shall be thrown.");
  55. } catch (e) {
  56. ok(e instanceof DOMException, "got a database exception");
  57. is(e.name, "NotFoundError", "correct error");
  58. }
  59. // rename to "v2".
  60. index = objectStore.index(indexName_v1);
  61. is(index.name, indexName_v1, "Correct index name")
  62. index.name = indexName_v2;
  63. is(index.name, indexName_v2, "Renamed index successfully");
  64. txn.oncomplete = continueToNextStepSync;
  65. yield undefined;
  66. request.onsuccess = continueToNextStep;
  67. yield undefined;
  68. db.close();
  69. info("Verify renaming done in v2.");
  70. request = indexedDB.open(name, 2);
  71. request.onerror = errorHandler;
  72. request.onupgradeneeded = errorHandler;
  73. request.onsuccess = grabEventAndContinueHandler;
  74. event = yield undefined;
  75. db = event.target.result;
  76. txn = db.transaction(storeName);
  77. objectStore = txn.objectStore(storeName);
  78. index = objectStore.index(indexName_v2);
  79. is(index.name, indexName_v2, "Correct index name");
  80. db.close();
  81. info("Rename in v3.");
  82. request = indexedDB.open(name, 3);
  83. request.onerror = errorHandler;
  84. request.onupgradeneeded = grabEventAndContinueHandler;
  85. request.onsuccess = unexpectedSuccessHandler;
  86. event = yield undefined;
  87. db = event.target.result;
  88. txn = event.target.transaction;
  89. objectStore = txn.objectStore(storeName);
  90. ok(objectStore.index(indexName_ToBeDeleted), "index is valid.");
  91. objectStore.deleteIndex(indexName_ToBeDeleted);
  92. try {
  93. objectStore.index(indexName_ToBeDeleted);
  94. ok(false, "NotFoundError shall be thrown if the index name is deleted.");
  95. } catch (e) {
  96. ok(e instanceof DOMException, "got a database exception");
  97. is(e.name, "NotFoundError", "correct error");
  98. }
  99. info("Rename with the name of the deleted index.");
  100. index = objectStore.index(indexName_v2);
  101. index.name = indexName_v3;
  102. is(index.name, indexName_v3, "Renamed index successfully");
  103. txn.oncomplete = continueToNextStepSync;
  104. yield undefined;
  105. request.onsuccess = continueToNextStep;
  106. yield undefined;
  107. db.close();
  108. info("Verify renaming done in v3.");
  109. request = indexedDB.open(name, 3);
  110. request.onerror = errorHandler;
  111. request.onupgradeneeded = errorHandler;
  112. request.onsuccess = grabEventAndContinueHandler;
  113. event = yield undefined;
  114. db = event.target.result;
  115. txn = db.transaction(storeName);
  116. objectStore = txn.objectStore(storeName);
  117. index = objectStore.index(indexName_v3);
  118. is(index.name, indexName_v3, "Correct index name");
  119. db.close();
  120. info("Abort the version change transaction while renaming index.");
  121. request = indexedDB.open(name, 4);
  122. request.onerror = errorHandler;
  123. request.onupgradeneeded = grabEventAndContinueHandler;
  124. request.onsuccess = unexpectedSuccessHandler;
  125. event = yield undefined;
  126. db = event.target.result;
  127. txn = event.target.transaction;
  128. objectStore = txn.objectStore(storeName);
  129. index = objectStore.index(indexName_v3);
  130. index.name = indexName_v4;
  131. is(index.name, indexName_v4, "Renamed successfully");
  132. let putRequest = objectStore.put({ foo: "fooValue", bar: "barValue" });
  133. putRequest.onsuccess = continueToNextStepSync;
  134. yield undefined;
  135. // Aborting the transaction.
  136. request.onerror = expectedErrorHandler("AbortError");
  137. txn.abort();
  138. yield undefined;
  139. // Verify if the name of the index handle is reverted.
  140. is(index.name, indexName_v3, "The name is reverted after aborted.");
  141. info("Verify if the objectstore name is unchanged.");
  142. request = indexedDB.open(name, 3);
  143. request.onerror = errorHandler;
  144. request.onupgradeneeded = errorHandler;
  145. request.onsuccess = grabEventAndContinueHandler;
  146. event = yield undefined;
  147. db = event.target.result;
  148. txn = db.transaction(storeName);
  149. objectStore = txn.objectStore(storeName);
  150. index = objectStore.index(indexName_v3);
  151. is(index.name, indexName_v3, "Correct index name");
  152. db.close();
  153. finishTest();
  154. yield undefined;
  155. }