blob: 7fa1465408c7d408cce05f76df2a611f0fe7a3e7 [file] [log] [blame]
// Copyright (c) 2012 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.
function test()
{
if (document.location.hash === '#part1') {
testPart1();
} else if (document.location.hash === '#part2') {
testPart2();
} else if (document.location.hash === '#part3') {
testPart3();
} else {
result('fail - unexpected hash');
}
}
function testPart1()
{
// Prepare the database, then exit normally
// Set version 1, create store1
var delreq = window.indexedDB.deleteDatabase('version-change-crash');
delreq.onerror = unexpectedErrorCallback;
delreq.onsuccess = function() {
var openreq = window.indexedDB.open('version-change-crash', 1);
openreq.onerror = unexpectedErrorCallback;
openreq.onblocked = unexpectedBlockedCallback;
openreq.onupgradeneeded = function(e) {
openreq.result.createObjectStore('store1');
};
openreq.onsuccess = function(e) {
result('pass - part1 - complete');
};
};
}
function testPart2()
{
// Start a VERSION_CHANGE then crash
// Set version 2, twiddle stores and crash
var openreq = window.indexedDB.open('version-change-crash', 2);
openreq.onerror = unexpectedErrorCallback;
openreq.onblocked = unexpectedBlockedCallback;
openreq.onsuccess = unexpectedSuccessCallback;
openreq.onupgradeneeded = function(e) {
var db = openreq.result;
var transaction = openreq.transaction;
transaction.onabort = unexpectedAbortCallback;
transaction.oncomplete = unexpectedCompleteCallback;
var store = db.createObjectStore('store2');
result('pass - part2 - crash me');
// Keep adding to the transaction so it can't commit
(function loop() { store.put(0, 0).onsuccess = loop; }());
};
}
function testPart3()
{
// Validate that Part 2 never committed
// Check version
var openreq = window.indexedDB.open('version-change-crash');
openreq.onerror = unexpectedErrorCallback;
openreq.onblocked = unexpectedBlockedCallback;
openreq.onupgradeneeded = unexpectedUpgradeNeededCallback;
openreq.onsuccess = function(e) {
var db = openreq.result;
if (db.version !== 1) {
result('fail - version incorrect');
return;
}
if (!db.objectStoreNames.contains('store1')) {
result('fail - store1 does not exist');
return;
}
if (db.objectStoreNames.contains('store2')) {
result('fail - store2 exists');
return;
}
result('pass - part3 - rolled back');
};
}