123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156 |
- /**
- * Any copyright is dedicated to the Public Domain.
- * http://creativecommons.org/publicdomain/zero/1.0/
- */
- var disableWorkerTest = "Need a way to set temporary prefs from a worker";
- var testGenerator = testSteps();
- function testSteps()
- {
- const spec = "http://foo.com";
- const name =
- this.window ? window.location.pathname : "test_quotaExceeded_recovery";
- const objectStoreName = "foo";
- // We want 32 MB database, but there's the group limit so we need to
- // multiply by 5.
- const tempStorageLimitKB = 32 * 1024 * 5;
- // Store in 1 MB chunks.
- const dataSize = 1024 * 1024;
- for (let blobs of [false, true]) {
- setTemporaryStorageLimit(tempStorageLimitKB);
- clearAllDatabases(continueToNextStepSync);
- yield undefined;
- info("Opening database");
- let request = indexedDB.openForPrincipal(getPrincipal(spec), name);
- request.onerror = errorHandler;
- request.onupgradeneeded = grabEventAndContinueHandler;;
- request.onsuccess = unexpectedSuccessHandler;
- yield undefined;
- // upgradeneeded
- request.onupgradeneeded = unexpectedSuccessHandler;
- request.onsuccess = grabEventAndContinueHandler;
- info("Creating objectStore");
- request.result.createObjectStore(objectStoreName);
- yield undefined;
- // success
- let db = request.result;
- db.onerror = errorHandler;
- ok(true, "Adding data until quota is reached");
- let obj = {
- name: "foo"
- }
- if (!blobs) {
- obj.data = getRandomView(dataSize);
- }
- let i = 1;
- let j = 1;
- while (true) {
- if (blobs) {
- obj.data = getBlob(getView(dataSize));
- }
- let trans = db.transaction(objectStoreName, "readwrite");
- request = trans.objectStore(objectStoreName).add(obj, i);
- request.onerror = function(event)
- {
- event.stopPropagation();
- }
- trans.oncomplete = function(event) {
- i++;
- j++;
- testGenerator.send(true);
- }
- trans.onabort = function(event) {
- is(trans.error.name, "QuotaExceededError", "Reached quota limit");
- testGenerator.send(false);
- }
- let completeFired = yield undefined;
- if (completeFired) {
- ok(true, "Got complete event");
- } else {
- ok(true, "Got abort event");
- if (j == 1) {
- // Plain cleanup transaction (just vacuuming and checkpointing)
- // couldn't shrink database any further.
- break;
- }
- j = 1;
- trans = db.transaction(objectStoreName, "cleanup");
- trans.onabort = unexpectedSuccessHandler;;
- trans.oncomplete = grabEventAndContinueHandler;
- yield undefined;
- }
- }
- info("Reopening database");
- db.close();
- request = indexedDB.openForPrincipal(getPrincipal(spec), name);
- request.onerror = errorHandler;
- request.onsuccess = grabEventAndContinueHandler;
- yield undefined;
- db = request.result;
- db.onerror = errorHandler;
- info("Deleting some data")
- let trans = db.transaction(objectStoreName, "cleanup");
- trans.objectStore(objectStoreName).delete(1);
- trans.onabort = unexpectedSuccessHandler;;
- trans.oncomplete = grabEventAndContinueHandler;
- yield undefined;
- info("Adding data again")
- trans = db.transaction(objectStoreName, "readwrite");
- trans.objectStore(objectStoreName).add(obj, 1);
- trans.onabort = unexpectedSuccessHandler;
- trans.oncomplete = grabEventAndContinueHandler;
- yield undefined;
- info("Deleting database");
- db.close();
- request = indexedDB.deleteForPrincipal(getPrincipal(spec), name);
- request.onerror = errorHandler;
- request.onsuccess = grabEventAndContinueHandler;
- yield undefined;
- }
- finishTest();
- yield undefined;
- }
|