if (this.document === undefined) { importScripts("/resources/testharness.js"); } test(function(t) { assert_true('estimate' in navigator.storage); assert_equals(typeof navigator.storage.estimate, 'function'); assert_true(navigator.storage.estimate() instanceof Promise); }, 'estimate() method exists and returns a Promise'); promise_test(function(t) { return navigator.storage.estimate().then(function(result) { assert_true(typeof result === 'object'); assert_true('usage' in result); assert_equals(typeof result.usage, 'number'); assert_true('quota' in result); assert_equals(typeof result.quota, 'number'); }); }, 'estimate() resolves to dictionary with members'); promise_test(function(t) { const arraySize = 1e6; const objectStoreName = "storageManager"; const dbname = this.window ? window.location.pathname : "estimate-worker.https.html"; let db; let usageBeforeCreate, usageAfterCreate, usageAfterPut; function deleteDB(name) { return new Promise(function(resolve, reject) { let deleteRequest = indexedDB.deleteDatabase(name); deleteRequest.onerror = function() { reject(deleteRequest.error); }; deleteRequest.onsuccess = function() { resolve(); }; }); } return deleteDB(dbname) .then(() => { return navigator.storage.estimate(); }) .then(estimate => { usageBeforeCreate = estimate.usage; return new Promise(function(resolve, reject) { let openRequest = indexedDB.open(dbname); openRequest.onerror = function() { reject(openRequest.error); }; openRequest.onupgradeneeded = function(event) { openRequest.result.createObjectStore(objectStoreName); }; openRequest.onsuccess = function() { resolve(openRequest.result); }; }); }) .then(connection => { db = connection; return navigator.storage.estimate(); }) .then(estimate => { usageAfterCreate = estimate.usage; assert_greater_than(usageAfterCreate, usageBeforeCreate, 'estimated usage should increase after object store is created'); let txn = db.transaction(objectStoreName, 'readwrite'); let buffer = new ArrayBuffer(arraySize); let view = new Uint8Array(buffer); for (let i = 0; i < arraySize; i++) { view[i] = parseInt(Math.random() * 255); } let testBlob = new Blob([buffer], {type: "binary/random"}); txn.objectStore(objectStoreName).add(testBlob, 1); return new Promise(function(resolve, reject) { txn.onabort = function() { reject(txn.error); }; txn.oncomplete = function() { resolve(); }; }); }) .then(() => { return navigator.storage.estimate(); }) .then(estimate => { usageAfterPut = estimate.usage; assert_greater_than(usageAfterPut, usageAfterCreate, 'estimated usage should increase after large value is stored'); db.close(); return deleteDB(dbname) }) .then(() => { t.done(); }) }, 'estimate() shows usage increase after large value is stored'); done();