blob: b7d7312b92659c98e687ec31fe1e90135f62a2fe [file] [log] [blame]
// Copyright 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
(async function() {
TestRunner.addResult(
`Tests that data is correctly loaded by IndexedDBModel from IndexedDB object store and index.\n`);
await TestRunner.loadModule('application_test_runner');
// Note: every test that uses a storage API must manually clean-up state from previous tests.
await ApplicationTestRunner.resetState();
var indexedDBModel = ApplicationTestRunner.createIndexedDBModel();
var mainFrameId = TestRunner.resourceTreeModel.mainFrame.id;
var securityOrigin = 'http://127.0.0.1:8000';
var databaseName = 'testDatabase';
var objectStoreName = 'testObjectStore';
var indexName = 'testIndexName';
var databaseId = new Resources.IndexedDBModel.DatabaseId(securityOrigin, databaseName);
function addIDBValues(count, callback) {
var i = 0;
addValues();
function addValues() {
if (i == count) {
callback();
return;
}
++i;
var id = i < 10 ? '0' + i : i;
var key = 'key_' + id;
var value = 'value_' + id;
ApplicationTestRunner.addIDBValue(
mainFrameId, databaseName, objectStoreName, {key: key, value: value}, '', addValues);
}
}
function loadValuesAndDump(fromIndex, idbKeyRange, skipCount, pageSize, callback) {
var idbKeyRangeString = idbKeyRange ? '{lower:"' + idbKeyRange.lower + '",lowerOpen:' + idbKeyRange.lowerOpen +
',upper:"' + idbKeyRange.upper + '",upperOpen:' + idbKeyRange.upperOpen + '}' :
'null';
TestRunner.addResult(
'Dumping values, fromIndex = ' + fromIndex + ', skipCount = ' + skipCount + ', pageSize = ' + pageSize +
', idbKeyRange = ' + idbKeyRangeString);
if (fromIndex)
indexedDBModel.loadIndexData(
databaseId, objectStoreName, indexName, idbKeyRange, skipCount, pageSize, innerCallback);
else
indexedDBModel.loadObjectStoreData(databaseId, objectStoreName, idbKeyRange, skipCount, pageSize, innerCallback);
function innerCallback(entries, hasMore) {
var index = 0;
var entry;
dumpEntries();
function dumpEntries() {
if (index === entries.length) {
TestRunner.addResult(' hasMore = ' + hasMore);
callback();
return;
}
entry = entries[index++];
entry.value.callFunctionJSON(dumpMe, undefined, dumped.bind(this));
}
function dumpMe() {
return '{"key":"' + this.key + '","value":"' + this.value + '"}';
}
function dumped(value) {
TestRunner.addResult(
' Key = ' + entry.key.description + ', primaryKey = ' + entry.primaryKey.description +
', value = ' + value);
dumpEntries();
}
}
}
TestRunner.addSniffer(Resources.IndexedDBModel.prototype, '_updateOriginDatabaseNames', fillDatabase, false);
function fillDatabase() {
ApplicationTestRunner.createDatabase(mainFrameId, databaseName, step2);
function step2() {
ApplicationTestRunner.createObjectStore(mainFrameId, databaseName, objectStoreName, 'key', true, step3);
}
function step3() {
ApplicationTestRunner.createObjectStoreIndex(
mainFrameId, databaseName, objectStoreName, indexName, 'value', false, true, step4);
}
function step4() {
addIDBValues(6, refreshDatabaseNames);
}
}
function refreshDatabaseNames() {
TestRunner.addSniffer(Resources.IndexedDBModel.prototype, '_updateOriginDatabaseNames', refreshDatabase, false);
indexedDBModel.refreshDatabaseNames();
}
function refreshDatabase() {
indexedDBModel.addEventListener(Resources.IndexedDBModel.Events.DatabaseLoaded, runObjectStoreTests);
indexedDBModel.refreshDatabase(databaseId);
}
function runObjectStoreTests() {
indexedDBModel.removeEventListener(Resources.IndexedDBModel.Events.DatabaseLoaded, runObjectStoreTests);
loadValuesAndDump(false, null, 0, 2, step2);
function step2() {
loadValuesAndDump(false, null, 2, 2, step3);
}
function step3() {
loadValuesAndDump(false, null, 4, 2, step4);
}
function step4() {
loadValuesAndDump(false, null, 5, 2, step5);
}
function step5() {
loadValuesAndDump(false, null, 6, 2, step6);
}
function step6() {
loadValuesAndDump(false, null, 7, 2, step7);
}
function step7() {
loadValuesAndDump(false, IDBKeyRange.bound('key_02', 'key_05', true, false), 0, 2, step8);
}
function step8() {
loadValuesAndDump(false, IDBKeyRange.bound('key_02', 'key_05', true, false), 0, 3, step9);
}
function step9() {
loadValuesAndDump(false, IDBKeyRange.bound('key_02', 'key_05', true, false), 0, 4, step10);
}
function step10() {
loadValuesAndDump(false, IDBKeyRange.bound('key_02', 'key_05', true, false), 1, 2, step11);
}
function step11() {
loadValuesAndDump(false, IDBKeyRange.bound('key_02', 'key_05', true, false), 1, 3, step12);
}
function step12() {
loadValuesAndDump(false, IDBKeyRange.bound('key_02', 'key_05', true, false), 1, 4, step13);
}
function step13() {
runIndexTests();
}
}
function runIndexTests() {
loadValuesAndDump(true, null, 0, 2, step2);
function step2() {
runClearTests();
}
}
function runClearTests() {
indexedDBModel.clearObjectStore(databaseId, objectStoreName).then(step1);
TestRunner.addResult('Cleared data from objectStore');
function step1() {
indexedDBModel.addEventListener(Resources.IndexedDBModel.Events.DatabaseLoaded, step2);
indexedDBModel.refreshDatabase(databaseId);
}
function step2() {
indexedDBModel.removeEventListener(Resources.IndexedDBModel.Events.DatabaseLoaded, step2);
loadValuesAndDump(false, null, 0, 10, step3);
}
function step3() {
deleteDatabase();
}
}
function deleteDatabase() {
ApplicationTestRunner.deleteObjectStoreIndex(mainFrameId, databaseName, objectStoreName, indexName, step2);
function step2() {
ApplicationTestRunner.deleteObjectStore(mainFrameId, databaseName, objectStoreName, step3);
}
function step3() {
ApplicationTestRunner.deleteDatabase(mainFrameId, databaseName, step4);
}
function step4() {
ConsoleTestRunner.dumpConsoleMessages();
TestRunner.completeTest();
}
}
})();