Commit 075f218d authored by kristipark's avatar kristipark Committed by Commit Bot

Added a refresh database button on the IndexedDB view.

BUG=723871

Review-Url: https://codereview.chromium.org/2902673003
Cr-Commit-Position: refs/heads/master@{#475739}
parent 39484888
Tests refreshing the database information and data views.
Dumping IndexedDB tree:
(empty)
Created database.
Dumping IndexedDB tree:
database: testDatabase - http://127.0.0.1:8000
(no object stores)
Created first objectstore.
Dumping IndexedDB tree:
database: testDatabase - http://127.0.0.1:8000
Object store: testObjectStore1
Index: testIndex
Created second objectstore.
Dumping IndexedDB tree:
database: testDatabase - http://127.0.0.1:8000
Object store: testObjectStore1
Index: testIndex
Object store: testObjectStore2
Index: testIndex
Added testObjectStore1 entry.
Dumping ObjectStore data:
Object store: testObjectStore1
(no entries)
Object store: testObjectStore2
(no entries)
Refreshed database.
Dumping ObjectStore data:
Object store: testObjectStore1
Key = testKey, value = [object Object]
Object store: testObjectStore2
(no entries)
<html>
<head>
<script src="../inspector-test.js"></script>
<script src="../resources-test.js"></script>
<script src="../console-test.js"></script>
<script src="indexeddb-test.js"></script>
<script>
function onIndexedDBError(e) {
console.error("IndexedDB error: " + e);
}
function createDatabase(databaseName) {
var callback;
var promise = new Promise((fulfill) => callback = fulfill);
var request = indexedDB.open(databaseName);
request.onerror = onIndexedDBError;
request.onsuccess = function(event) {
request.result.close();
callback();
}
return promise;
}
function createObjectStore(databaseName, objectStoreName, indexName, keyPath) {
var callback;
var promise = new Promise((fulfill) => callback = fulfill);
var request = indexedDB.open(databaseName);
request.onerror = onIndexedDBError;
request.onsuccess = function(event) {
var db = request.result;
var version = db.version;
db.close();
var upgradeRequest = indexedDB.open(databaseName, version + 1);
upgradeRequest.onerror = onIndexedDBError;
upgradeRequest.onupgradeneeded = function(e) {
var upgradeDb = e.target.result;
var store = upgradeDb.createObjectStore(objectStoreName, { keyPath: "test", autoIncrement: false });
store.createIndex(indexName, "test", { unique: false, multiEntry: false });
callback();
}
upgradeRequest.onsuccess = function(e) {
var upgradeDb = e.target.result;
upgradeDb.close();
callback();
}
}
return promise;
}
function addIDBValue(databaseName, objectStoreName, key, value) {
var callback;
var promise = new Promise((fulfill) => callback = fulfill);
var request = indexedDB.open(databaseName);
request.onerror = onIndexedDBError;
request.onsuccess = function(event) {
var db = request.result;
var transaction = db.transaction(objectStoreName, "readwrite");
var store = transaction.objectStore(objectStoreName);
store.put({ test: key, testValue: value });
transaction.onerror = onIndexedDBError;
transaction.oncomplete = function() {
db.close();
callback();
};
}
return promise;
}
async function test()
{
var databaseName = "testDatabase";
var objectStoreName1 = "testObjectStore1";
var objectStoreName2 = "testObjectStore2";
var indexName = "testIndex";
var keyPath = "testKey";
var indexedDBModel = InspectorTest.mainTarget.model(Resources.IndexedDBModel);
var databaseId;
function waitRefreshDatabase(callback) {
var view = UI.panels.resources._sidebar.indexedDBListTreeElement._idbDatabaseTreeElements[0]._view;
InspectorTest.addSniffer(Resources.IDBDatabaseView.prototype, "_updatedForTests", callback, false);
view._refreshDatabaseButtonClicked();
}
function waitUpdateDataView(callback) {
InspectorTest.addSniffer(Resources.IDBDataView.prototype, "_updatedDataForTests", callback, false);
}
function waitDatabaseLoaded(callback) {
var event = indexedDBModel.addEventListener(Resources.IndexedDBModel.Events.DatabaseLoaded, () => {
Common.EventTarget.removeEventListeners([event]);
callback();
});
}
function waitDatabaseAdded(callback) {
var event = indexedDBModel.addEventListener(Resources.IndexedDBModel.Events.DatabaseAdded, () => {
Common.EventTarget.removeEventListeners([event]);
callback();
});
UI.panels.resources._sidebar.indexedDBListTreeElement.refreshIndexedDB();
}
function dumpObjectStores() {
InspectorTest.addResult("Dumping ObjectStore data:");
var idbDatabaseTreeElement = UI.panels.resources._sidebar.indexedDBListTreeElement._idbDatabaseTreeElements[0];
for (var i = 0; i < idbDatabaseTreeElement.childCount(); ++i) {
var objectStoreTreeElement = idbDatabaseTreeElement.childAt(i);
InspectorTest.addResult(" Object store: " + objectStoreTreeElement.title);
var entries = objectStoreTreeElement._view._entries;
if (!entries.length) {
InspectorTest.addResult(" (no entries)");
continue;
}
for (var j = 0; j < entries.length; ++j) {
InspectorTest.addResult(" Key = " + entries[j].key._value + ", value = " + entries[j].value);
}
}
}
// Initial tree
InspectorTest.dumpIndexedDBTree();
// Create database
await InspectorTest.evaluateInPageAsync("createDatabase('" + databaseName + "')");
await new Promise(waitDatabaseAdded);
var idbDatabaseTreeElement = UI.panels.resources._sidebar.indexedDBListTreeElement._idbDatabaseTreeElements[0];
databaseId = idbDatabaseTreeElement._databaseId;
InspectorTest.addResult("Created database.");
InspectorTest.dumpIndexedDBTree();
// Load indexedDb database view
indexedDBModel.refreshDatabase(databaseId); // Initial database refresh.
await new Promise(waitDatabaseLoaded); // Needed to initialize database view, otherwise
idbDatabaseTreeElement.onselect(false); // IDBDatabaseTreeElement.database would be undefined.
var databaseView = idbDatabaseTreeElement._view;
// Create first objectstore
await InspectorTest.evaluateInPageAsync("createObjectStore('" + databaseName + "', '" + objectStoreName1 + "', '" + indexName + "', '" + keyPath + "')");
await new Promise(waitRefreshDatabase);
InspectorTest.addResult("Created first objectstore.");
InspectorTest.dumpIndexedDBTree();
// Create second objectstore
await InspectorTest.evaluateInPageAsync("createObjectStore('" + databaseName + "', '" + objectStoreName2 + "', '" + indexName + "', '" + keyPath + "')");
await new Promise(waitRefreshDatabase);
InspectorTest.addResult("Created second objectstore.");
InspectorTest.dumpIndexedDBTree();
// Load objectstore data views
for (var i = 0; i < idbDatabaseTreeElement.childCount(); ++i) {
var objectStoreTreeElement = idbDatabaseTreeElement.childAt(i);
objectStoreTreeElement.onselect(false);
}
// Add entries
await InspectorTest.evaluateInPageAsync("addIDBValue('" + databaseName + "', '" + objectStoreName1 + "', 'testKey', 'testValue')");
InspectorTest.addResult("Added " + objectStoreName1 + " entry.");
dumpObjectStores();
// Refresh database view
await new Promise(waitRefreshDatabase);
for (var i = 0; i < idbDatabaseTreeElement.childCount(); ++i) {
var objectStoreTreeElement = idbDatabaseTreeElement.childAt(i);
if (objectStoreTreeElement._objectStore.name === objectStoreName1) {
objectStoreTreeElement.onselect(false);
break;
}
}
await new Promise(waitUpdateDataView); // Wait for objectstore data to load on page.
InspectorTest.addResult("Refreshed database.");
dumpObjectStores();
InspectorTest.completeTest();
}
</script>
</head>
<body onload="runTest()">
<p>Tests refreshing the database information and data views.</p>
</body>
</html>
......@@ -23,8 +23,8 @@ InspectorTest.dumpIndexedDBTree = function()
InspectorTest.addResult(" (no indexes)");
continue;
}
for (var j = 0; j < objectStoreTreeElement.childCount(); ++j) {
var indexTreeElement = objectStoreTreeElement.childAt(j);
for (var k = 0; k < objectStoreTreeElement.childCount(); ++k) {
var indexTreeElement = objectStoreTreeElement.childAt(k);
InspectorTest.addResult(" Index: " + indexTreeElement.title);
}
}
......
......@@ -53,6 +53,11 @@ Resources.IDBDatabaseView = class extends UI.VBox {
Common.UIString('Delete database'), () => this._deleteDatabase(), Common.UIString('Delete database'));
footer.appendChild(this._clearButton);
this._refreshButton = UI.createTextButton(
Common.UIString('Refresh database'), () => this._refreshDatabaseButtonClicked(),
Common.UIString('Refresh database'));
footer.appendChild(this._refreshButton);
this.update(database);
}
......@@ -61,12 +66,21 @@ Resources.IDBDatabaseView = class extends UI.VBox {
this._versionElement.textContent = this._database.version;
}
_refreshDatabaseButtonClicked() {
this._model.refreshDatabase(this._database.databaseId);
}
/**
* @param {!Resources.IndexedDBModel.Database} database
*/
update(database) {
this._database = database;
this._refreshDatabase();
this._updatedForTests();
}
_updatedForTests() {
// Sniffed in tests.
}
_deleteDatabase() {
......@@ -289,6 +303,7 @@ Resources.IDBDataView = class extends UI.SimpleView {
this._pageBackButton.setEnabled(!!skipCount);
this._pageForwardButton.setEnabled(hasMore);
this._updatedDataForTests();
}
var idbKeyRange = key ? window.IDBKeyRange.lowerBound(key) : null;
......@@ -302,6 +317,10 @@ Resources.IDBDataView = class extends UI.SimpleView {
}
}
_updatedDataForTests() {
// Sniffed in tests.
}
/**
* @param {!Common.Event} event
*/
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment