aboutsummaryrefslogtreecommitdiff
path: root/contexts/data/lib/closure-library/closure/goog/db/db_test.html
diff options
context:
space:
mode:
Diffstat (limited to 'contexts/data/lib/closure-library/closure/goog/db/db_test.html')
-rw-r--r--contexts/data/lib/closure-library/closure/goog/db/db_test.html1175
1 files changed, 0 insertions, 1175 deletions
diff --git a/contexts/data/lib/closure-library/closure/goog/db/db_test.html b/contexts/data/lib/closure-library/closure/goog/db/db_test.html
deleted file mode 100644
index 8d8d4e4..0000000
--- a/contexts/data/lib/closure-library/closure/goog/db/db_test.html
+++ /dev/null
@@ -1,1175 +0,0 @@
-<!DOCTYPE html>
-<html>
-<!--
-Copyright 2011 The Closure Library Authors. All Rights Reserved.
-
-Use of this source code is governed by the Apache License, Version 2.0.
-See the COPYING file for details.
--->
-<!--
--->
-<head>
-<title>Closure Integration Tests - goog.db</title>
-<script src="../base.js"></script>
-<script>
-goog.require('goog.async.Deferred');
-goog.require('goog.db');
-goog.require('goog.db.IndexedDb');
-goog.require('goog.db.KeyRange');
-goog.require('goog.db.ObjectStore');
-goog.require('goog.db.Transaction');
-goog.require('goog.db.Transaction.TransactionMode');
-goog.require('goog.events');
-goog.require('goog.events.EventTarget');
-goog.require('goog.testing.AsyncTestCase');
-goog.require('goog.testing.PropertyReplacer');
-goog.require('goog.testing.asserts');
-goog.require('goog.testing.jsunit');
-goog.require('goog.userAgent.product');
-goog.require('goog.userAgent.product.isVersion');
-</script>
-</head>
-<body>
-<script>
-// Chrome 18+ is the only browser confirmed to work. Firefox 6 does not.
-var idbSupported = goog.userAgent.product.CHROME &&
- goog.userAgent.product.isVersion("18");
-var asyncTestCase = goog.testing.AsyncTestCase.createAndInstall();
-var dbName = 'testDb';
-var globalDb = null;
-
-function restartDatabase(db) {
- if (db && db.isOpen()) {
- db.close();
- }
- return goog.db.openDatabase(dbName);
-}
-
-function cleanUpDatabase(db) {
- // this is currently not done by deleting the test database because the
- // deleteDatabase method in the API is not implemented. When it is, this
- // method can just close the connection, delete the database, then reopen
- // it on the fresh database.
- return db.setVersion('').addCallback(function(tx) {
- var storeNames = db.getObjectStoreNames();
- for (var i = 0; i < storeNames.length; i++) {
- db.deleteObjectStore(storeNames[i]);
- }
- return restartDatabase(db);
- });
-}
-
-function addStore(db) {
- return db.setVersion('test').addCallback(function(tx) {
- db.createObjectStore('store');
- return restartDatabase(db);
- });
-}
-
-function addStoreWithIndex(db) {
- return db.setVersion('test').addCallback(function(tx) {
- var store = db.createObjectStore('store', {keyPath: 'key'});
- store.createIndex('index', 'value');
- return restartDatabase(db);
- });
-}
-
-function populateStore(values, keys, db) {
- var d = new goog.async.Deferred();
- var putTx = db.createTransaction(
- ['store'],
- goog.db.Transaction.TransactionMode.READ_WRITE);
-
- var store = putTx.objectStore('store');
- for (var i = 0; i < values.length; ++i) {
- store.put(values[i], keys[i]);
- }
-
- goog.events.listen(
- putTx,
- goog.db.Transaction.EventTypes.ERROR,
- failOnErrorEvent);
-
- goog.events.listen(
- putTx,
- goog.db.Transaction.EventTypes.COMPLETE,
- function() {
- d.callback(db)
- });
-
- return d;
-}
-
-function assertStoreValues(values, db) {
- var assertStoreTx = db.createTransaction(['store']);
- assertStoreTx.objectStore('store').getAll().addCallback(function(results) {
- assertSameElements(values, results);
- closeAndContinue(db);
- });
-}
-
-function failOnError(err) {
- fail(err.message);
-}
-
-function failOnErrorEvent(ev) {
- fail(ev.target.message);
-}
-
-function closeAndContinue(db) {
- db.close();
- asyncTestCase.continueTesting();
-}
-
-function setUp() {
- if (!idbSupported) {
- return;
- }
-
- globalDb = restartDatabase().addCallback(function(db) {
- if (db.getVersion() != '') {
- return cleanUpDatabase(db);
- }
- }).addErrback(failOnError);
-}
-
-function testDatabaseOpened() {
- if (!idbSupported) {
- return;
- }
-
- asyncTestCase.waitForAsync('check database is open');
- assertNotNull(globalDb);
- globalDb.branch().addCallback(function(db) {
- assertTrue(db.isOpen());
- closeAndContinue(db);
- }).addErrback(failOnError);
-}
-
-function testSetVersion() {
- if (!idbSupported) {
- return;
- }
-
- asyncTestCase.waitForAsync('set version request');
- globalDb.branch().addCallback(function(db) {
- assertEquals('', db.getVersion());
- return db.setVersion('version').addCallback(function(tx) {
- return restartDatabase(db);
- });
- }).addCallback(function(db) {
- assertEquals('version', db.getVersion());
- closeAndContinue(db);
- }).addErrback(failOnError);
-}
-
-function testManipulateObjectStores() {
- if (!idbSupported) {
- return;
- }
-
- asyncTestCase.waitForAsync('set version and manipulate object stores');
- globalDb.branch().addCallback(function(db) {
- assertEquals('', db.getVersion());
- return db.setVersion('objstores').addCallback(function(tx) {
- db.createObjectStore('basicStore');
- db.createObjectStore('keyPathStore', {keyPath: 'keyGoesHere'});
- db.createObjectStore(
- 'autoIncrementStore',
- {autoIncrement: true});
- return restartDatabase(db);
- });
- }).addCallback(function(db) {
- var storeNames = db.getObjectStoreNames();
- assertEquals(3, storeNames.length);
- assertTrue(storeNames.contains('basicStore'));
- assertTrue(storeNames.contains('keyPathStore'));
- assertTrue(storeNames.contains('autoIncrementStore'));
- assertEquals('objstores', db.getVersion());
- return db.setVersion('delstores').addCallback(function(tx) {
- db.deleteObjectStore('basicStore');
- return restartDatabase(db);
- });
- }).addCallback(function(db) {
- var storeNames = db.getObjectStoreNames();
- assertEquals(2, storeNames.length);
- assertFalse(storeNames.contains('basicStore'));
- assertTrue(storeNames.contains('keyPathStore'));
- assertTrue(storeNames.contains('autoIncrementStore'));
- closeAndContinue(db);
- }).addErrback(failOnError);
-}
-
-function testBadObjectStoreManipulation() {
- if (!idbSupported) {
- return;
- }
-
- asyncTestCase.waitForAsync('bad object store manipulation');
- var expectedCode = goog.db.Error.ErrorCode.NOT_ALLOWED_ERR;
- globalDb.branch().addCallback(function(db) {
- try {
- db.createObjectStore('diediedie');
- fail('Create object store outside transaction should have failed.');
- } catch (err) {
- // expected
- assertEquals(expectedCode, err.code);
- }
- }).addCallback(addStore).addCallback(function(db) {
- try {
- db.deleteObjectStore('store');
- fail('Delete object store outside transaction should have failed.');
- } catch (err) {
- // expected
- assertEquals(expectedCode, err.code);
- }
- }).addCallback(function(db) {
- return db.setVersion('delstore').addCallback(function(tx) {
- try {
- db.deleteObjectStore('diediedie');
- fail('Delete non-existent store should have failed.');
- } catch (err) {
- // expected
- assertEquals(goog.db.Error.ErrorCode.NOT_FOUND_ERR, err.code);
- }
- closeAndContinue(db);
- });
- }).addErrback(failOnError);
-}
-
-function testGetNonExistentObjectStore() {
- if (!idbSupported) {
- return;
- }
-
- asyncTestCase.waitForAsync('get non-existent object store');
- globalDb.branch().addCallback(addStore).addCallback(function(db) {
- var tx = db.createTransaction(['store']);
- try {
- tx.objectStore('diediedie');
- fail('getting non-existent object store should have failed');
- } catch (err) {
- assertEquals(goog.db.Error.ErrorCode.NOT_FOUND_ERR, err.code);
- }
- closeAndContinue(db);
- }).addErrback(failOnError);
-}
-
-function testCreateTransaction() {
- if (!idbSupported) {
- return;
- }
-
- asyncTestCase.waitForAsync('create transactions');
- globalDb.branch().addCallback(addStore).addCallback(function(db) {
- var tx = db.createTransaction(['store']);
- assertEquals(
- 'mode not READ_ONLY',
- goog.db.Transaction.TransactionMode.READ_ONLY,
- tx.getMode());
- tx = db.createTransaction(
- ['store'],
- goog.db.Transaction.TransactionMode.READ_WRITE);
- assertEquals(
- 'mode not READ_WRITE',
- goog.db.Transaction.TransactionMode.READ_WRITE,
- tx.getMode());
- closeAndContinue(db);
- }).addErrback(failOnError);
-}
-
-function testPutRecord() {
- if (!idbSupported) {
- return;
- }
-
- asyncTestCase.waitForAsync('putting record');
- globalDb.branch().addCallback(addStore).addCallback(function(db) {
- var rw = goog.db.Transaction.TransactionMode.READ_WRITE;
- var COMPLETE = goog.db.Transaction.EventTypes.COMPLETE;
- var ERROR = goog.db.Transaction.EventTypes.ERROR;
-
- function checkForOverwrittenValue() {
- var checkOverwriteTx = db.createTransaction(['store']);
- checkOverwriteTx.objectStore('store').get('putKey').addCallback(
- function(result) {
- // this is guaranteed to run before the COMPLETE event fires on
- // the transaction
- assertEquals('overwritten', result.key);
- assertEquals('value2', result.value);
- });
-
- goog.events.listen(checkOverwriteTx, ERROR, failOnErrorEvent);
- goog.events.listen(checkOverwriteTx, COMPLETE, function() {
- closeAndContinue(db);
- });
- }
-
- function overwriteValue() {
- var overwriteTx = db.createTransaction(['store'], rw);
- overwriteTx.objectStore('store').put(
- {key: 'overwritten', value: 'value2'},
- 'putKey');
-
- goog.events.listen(overwriteTx, ERROR, failOnErrorEvent);
- goog.events.listen(overwriteTx, COMPLETE, checkForOverwrittenValue);
- }
-
- function checkForInitialValue() {
- var checkResultsTx = db.createTransaction(['store']);
- checkResultsTx.objectStore('store').get('putKey').addCallback(
- function(result) {
- assertEquals('initial', result.key);
- assertEquals('value1', result.value);
- });
- goog.events.listen(checkResultsTx, ERROR, failOnErrorEvent);
- goog.events.listen(checkResultsTx, COMPLETE, overwriteValue);
- }
-
- var initialPutTx = db.createTransaction(['store'], rw);
- initialPutTx.objectStore('store').put(
- {key: 'initial', value: 'value1'},
- 'putKey');
-
- goog.events.listen(initialPutTx, ERROR, failOnErrorEvent);
- goog.events.listen(initialPutTx, COMPLETE, checkForInitialValue);
-
- }).addErrback(failOnError);
-}
-
-function testAddRecord() {
- if (!idbSupported) {
- return;
- }
-
- asyncTestCase.waitForAsync('adding record');
- globalDb.branch().addCallback(addStore).addCallback(function(db) {
- var rw = goog.db.Transaction.TransactionMode.READ_WRITE;
- var COMPLETE = goog.db.Transaction.EventTypes.COMPLETE;
- var ERROR = goog.db.Transaction.EventTypes.ERROR;
-
- var initialAddTx = db.createTransaction(['store'], rw);
- initialAddTx.objectStore('store').add(
- {key: 'hi', value: 'something'},
- 'stuff');
-
- goog.events.listen(initialAddTx, ERROR, failOnErrorEvent);
- goog.events.listen(initialAddTx, COMPLETE, function() {
- var successfulAddTx = db.createTransaction(['store']);
- successfulAddTx.objectStore('store').get('stuff').addCallback(
- function(result) {
- assertEquals('hi', result.key);
- assertEquals('something', result.value);
- });
-
- goog.events.listen(successfulAddTx, ERROR, failOnErrorEvent);
- goog.events.listen(successfulAddTx, COMPLETE, function() {
- var addOverwriteTx = db.createTransaction(['store'], rw);
- addOverwriteTx.objectStore('store').add(
- {key: 'bye', value: 'nothing'},
- 'stuff').addErrback(
- function(err) {
- // expected
- assertEquals(
- goog.db.Error.ErrorCode.CONSTRAINT_ERR,
- err.code);
- });
-
- goog.events.listen(addOverwriteTx, COMPLETE, function() {
- fail('adding existing record should not have succeeded');
- });
- goog.events.listen(addOverwriteTx, ERROR, function(ev) {
- assertEquals(
- goog.db.Error.ErrorCode.CONSTRAINT_ERR,
- ev.target.code);
- closeAndContinue(db);
- });
- });
- });
- }).addErrback(failOnError);
-}
-
-function testPutRecordKeyPathStore() {
- if (!idbSupported) {
- return;
- }
-
- asyncTestCase.waitForAsync('adding record, key path store');
- globalDb.branch().addCallback(function(db) {
- return db.setVersion('test').addCallback(function(tx) {
- db.createObjectStore('keyStore', {keyPath: 'key'});
- return restartDatabase(db);
- });
- }).addCallback(function(db) {
- var COMPLETE = goog.db.Transaction.EventTypes.COMPLETE;
- var ERROR = goog.db.Transaction.EventTypes.ERROR;
-
- var putTx = db.createTransaction(
- ['keyStore'],
- goog.db.Transaction.TransactionMode.READ_WRITE);
- putTx.objectStore('keyStore').put({key: 'hi', value: 'something'});
-
- goog.events.listen(putTx, ERROR, failOnErrorEvent);
- goog.events.listen(putTx, COMPLETE, function() {
- var checkResultsTx = db.createTransaction(['keyStore']);
- checkResultsTx.objectStore('keyStore').get('hi').addCallback(
- function(result) {
- assertNotUndefined(result);
- assertEquals('hi', result.key);
- assertEquals('something', result.value);
- });
-
- goog.events.listen(checkResultsTx, ERROR, failOnErrorEvent);
- goog.events.listen(checkResultsTx, COMPLETE, function() {
- closeAndContinue(db);
- });
- });
- }).addErrback(failOnError);
-}
-
-function testPutBadRecordKeyPathStore() {
- if (!idbSupported) {
- return;
- }
-
- asyncTestCase.waitForAsync('adding bad record, key path store');
- globalDb.branch().addCallback(function(db) {
- return db.setVersion('test').addCallback(function(tx) {
- db.createObjectStore('keyStore', {keyPath: 'key'});
- return restartDatabase(db);
- });
- }).addCallback(function(db) {
- var badTx = db.createTransaction(
- ['keyStore'],
- goog.db.Transaction.TransactionMode.READ_WRITE);
- badTx.objectStore('keyStore').put(
- {key: 'diedie', value: 'anything'},
- 'badKey').addCallback(function() {
- fail('inserting with explicit key should have failed');
- }).addErrback(function(err) {
- // expected
- assertEquals(goog.db.Error.ErrorCode.DATA_ERR, err.code);
- closeAndContinue(db);
- });
- }).addErrback(failOnError);
-}
-
-function testPutRecordAutoIncrementStore() {
- if (!idbSupported) {
- return;
- }
-
- asyncTestCase.waitForAsync('adding record, auto increment store');
- globalDb.branch().addCallback(function(db) {
- return db.setVersion('test').addCallback(function(tx) {
- db.createObjectStore('aiStore', {autoIncrement: true});
- return restartDatabase(db);
- });
- }).addCallback(function(db) {
- var tx = db.createTransaction(
- ['aiStore'],
- goog.db.Transaction.TransactionMode.READ_WRITE);
- tx.objectStore('aiStore').put('1');
- tx.objectStore('aiStore').put('2');
- tx.objectStore('aiStore').put('3');
- goog.events.listen(
- tx,
- goog.db.Transaction.EventTypes.ERROR,
- failOnErrorEvent);
-
- goog.events.listen(tx, goog.db.Transaction.EventTypes.COMPLETE, function() {
- var tx = db.createTransaction(['aiStore']);
- tx.objectStore('aiStore').getAll().addCallback(function(results) {
- assertEquals(3, results.length);
- // only checking to see if the results are included because the keys
- // are not specified
- assertNotEquals(-1, results.indexOf('1'));
- assertNotEquals(-1, results.indexOf('2'));
- assertNotEquals(-1, results.indexOf('3'));
- closeAndContinue(db);
- });
- });
- }).addErrback(failOnError);
-}
-
-function testPutRecordKeyPathAndAutoIncrementStore() {
- if (!idbSupported) {
- return;
- }
-
- asyncTestCase.waitForAsync('adding record, key path + auto increment store');
- globalDb.branch().addCallback(function(db) {
- return db.setVersion('test').addCallback(function(tx) {
- db.createObjectStore('hybridStore', {
- keyPath: 'key',
- autoIncrement: true
- });
- return restartDatabase(db);
- });
- }).addCallback(function(db) {
- var tx = db.createTransaction(
- ['hybridStore'],
- goog.db.Transaction.TransactionMode.READ_WRITE);
- tx.objectStore('hybridStore').put({value: 'whatever'});
- goog.events.listen(
- tx,
- goog.db.Transaction.EventTypes.ERROR,
- failOnErrorEvent);
-
- goog.events.listen(tx, goog.db.Transaction.EventTypes.COMPLETE, function() {
- var tx = db.createTransaction(['hybridStore']);
- tx.objectStore('hybridStore').getAll().addCallback(function(results) {
- assertEquals(1, results.length);
- assertEquals('whatever', results[0].value);
- assertNotUndefined(results[0].key);
- closeAndContinue(db);
- });
- });
- }).addErrback(failOnError);
-}
-
-function testPutIllegalRecords() {
- if (!idbSupported) {
- return;
- }
-
- asyncTestCase.waitForAsync('adding illegal records');
- globalDb.branch().addCallback(addStore).addCallback(function(db) {
- var tx = db.createTransaction(
- ['store'],
- goog.db.Transaction.TransactionMode.READ_WRITE);
-
- tx.objectStore('store').put('death', null).addCallback(function() {
- fail('putting with null key should have failed');
- }).addErrback(function(err) {
- assertEquals(goog.db.Error.ErrorCode.DATA_ERR, err.code);
- });
-
- tx.objectStore('store').put('death', NaN).addCallback(function() {
- fail('putting with NaN key should have failed');
- }).addErrback(function(err) {
- assertEquals(goog.db.Error.ErrorCode.DATA_ERR, err.code);
- });
-
- tx.objectStore('store').put('death', undefined).addCallback(function() {
- fail('putting with undefined key should have failed');
- }).addErrback(function(err) {
- assertEquals(goog.db.Error.ErrorCode.DATA_ERR, err.code);
- });
-
- closeAndContinue(db);
- }).addErrback(failOnError);
-}
-
-function testPutIllegalRecordsWithIndex() {
- if (!idbSupported) {
- return;
- }
-
- asyncTestCase.waitForAsync('adding illegal records');
- globalDb.branch().addCallback(addStoreWithIndex).addCallback(function(db) {
- var tx = db.createTransaction(
- ['store'],
- goog.db.Transaction.TransactionMode.READ_WRITE);
-
- tx.objectStore('store').put({key: 'diediedie', value: null}).
- addErrback(function(err) {
- assertEquals(goog.db.Error.ErrorCode.DATA_ERR, err.code);
- });
-
- tx.objectStore('store').put({key: 'dietodeath', value: NaN}).
- addErrback(function(err) {
- assertEquals(goog.db.Error.ErrorCode.DATA_ERR, err.code);
- });
-
- tx.objectStore('store').put({key: 'dietodeath', value: undefined}).
- addErrback(function(err) {
- assertEquals(goog.db.Error.ErrorCode.DATA_ERR, err.code);
- });
-
- closeAndContinue(db);
- }).addErrback(failOnError);
-}
-
-function testDeleteRecord() {
- if (!idbSupported) {
- return;
- }
-
- asyncTestCase.waitForAsync('deleting record');
- globalDb.branch().addCallback(addStore).addCallback(function(db) {
- var rw = goog.db.Transaction.TransactionMode.READ_WRITE;
- var COMPLETE = goog.db.Transaction.EventTypes.COMPLETE;
- var ERROR = goog.db.Transaction.EventTypes.ERROR;
- var putTx = db.createTransaction(['store'], rw);
- putTx.objectStore('store').put({key: 'hi', value: 'something'}, 'stuff');
-
- goog.events.listen(putTx, ERROR, failOnErrorEvent);
- goog.events.listen(putTx, COMPLETE, function() {
- var deleteTx = db.createTransaction(['store'], rw);
- deleteTx.objectStore('store').remove('stuff');
-
- goog.events.listen(deleteTx, ERROR, failOnErrorEvent);
- goog.events.listen(deleteTx, COMPLETE, function() {
- var checkResultsTx = db.createTransaction(['store']);
- checkResultsTx.objectStore('store').get('stuff').addCallback(
- function(result) {
- assertUndefined(result);
- });
-
- goog.events.listen(checkResultsTx, ERROR, failOnErrorEvent);
- goog.events.listen(checkResultsTx, COMPLETE, function() {
- closeAndContinue(db);
- });
- });
- });
- }).addErrback(failOnError);
-}
-
-function testGetAll() {
- if (!idbSupported) {
- return;
- }
-
- var values = ['1', '2', '3'];
- var keys = ['a', 'b', 'c'];
-
- var addData = goog.partial(populateStore, values, keys);
- var checkStore = goog.partial(assertStoreValues, values);
-
- asyncTestCase.waitForAsync('getting all');
- globalDb.branch()
- .addCallbacks(addStore, failOnError)
- .addCallback(addData)
- .addCallback(checkStore);
-}
-
-function testCursorGet() {
- if (!idbSupported) {
- return;
- }
-
- var values = ['1', '2', '3', '4'];
- var keys = ['a', 'b', 'c', 'd'];
-
- var addData = goog.partial(populateStore, values, keys);
-
- // Open the cursor over range ['b', 'c'], move in backwards direction.
- var openCursorAndCheck = function(db) {
- var cursorTx = db.createTransaction(['store']);
- var store = cursorTx.objectStore('store');
- var d = new goog.async.Deferred();
- var values = [];
- var keys = [];
- var cursor = store.openCursor(
- goog.db.KeyRange.bound('b', 'c'),
- goog.db.Cursor.Direction.PREV);
-
- var key = goog.events.listen(
- cursor, goog.db.Cursor.EventType.NEW_DATA, function() {
- values.push(cursor.getValue());
- keys.push(cursor.getKey());
- cursor.next();
- });
-
- goog.events.listenOnce(cursor, [
- goog.db.Cursor.EventType.COMPLETE,
- goog.db.Cursor.EventType.ERROR
- ], function(evt) {
- goog.events.unlistenByKey(key);
- if (evt.type == goog.db.Cursor.EventType.COMPLETE) {
- d.callback(db);
- } else {
- d.errback();
- }
- });
-
- d.addCallback(function(db) {
- assertArrayEquals(['3', '2'], values);
- assertArrayEquals(['c', 'b'], keys);
- closeAndContinue(db);
- });
- };
-
- asyncTestCase.waitForAsync('getting range');
- globalDb.branch()
- .addCallbacks(addStore, failOnError)
- .addCallback(addData)
- .addCallback(openCursorAndCheck);
-}
-
-function testCursorReplace() {
- if (!idbSupported) {
- return;
- }
-
- var values = ['1', '2', '3', '4'];
- var keys = ['a', 'b', 'c', 'd'];
-
- var addData = goog.partial(populateStore, values, keys);
-
- // Store should contain ['1', '2', '5', '4'] after replacement.
- var checkStore = goog.partial(assertStoreValues, ['1', '2', '5', '4']);
-
- // Use a bounded cursor for ('b', 'c'] to update value '3' -> '5'.
- var openCursorAndReplace = function(db) {
- var d = new goog.async.Deferred();
- var cursorTx = db.createTransaction(
- ['store'],
- goog.db.Transaction.TransactionMode.READ_WRITE);
- var store = cursorTx.objectStore('store');
- var cursor = store.openCursor(goog.db.KeyRange.bound('b', 'c', true));
-
- var key = goog.events.listen(
- cursor, goog.db.Cursor.EventType.NEW_DATA, function() {
- assertEquals('3', cursor.getValue());
- cursor.update('5').addCallback(function() {
- cursor.next();
- }).addErrback(failOnError);
- });
-
- goog.events.listenOnce(cursor, [
- goog.db.Cursor.EventType.COMPLETE,
- goog.db.Cursor.EventType.ERROR
- ], function(evt) {
- goog.events.unlistenByKey(key);
- if (evt.type == goog.db.Cursor.EventType.COMPLETE) {
- d.callback(db);
- } else {
- d.errback();
- }
- });
- return d;
- };
-
- // Setup and execute test case.
- asyncTestCase.waitForAsync('replacing value by cursor');
- globalDb.branch()
- .addCallbacks(addStore, failOnError)
- .addCallback(addData)
- .addCallback(openCursorAndReplace)
- .addCallback(checkStore);
-}
-
-function testCursorRemove() {
- if (!idbSupported) {
- return;
- }
-
- var values = ['1', '2', '3', '4'];
- var keys = ['a', 'b', 'c', 'd'];
-
- var addData = goog.partial(populateStore, values, keys);
-
- // Store should contain ['1', '2'] after removing elements.
- var checkStore = goog.partial(assertStoreValues, ['1', '2']);
-
- // Use a bounded cursor for ('b', ...) to remove '3', '4'.
- var openCursorAndRemove = function(db) {
- var d = new goog.async.Deferred();
- var cursorTx = db.createTransaction(
- ['store'],
- goog.db.Transaction.TransactionMode.READ_WRITE);
- var store = cursorTx.objectStore('store');
- var cursor = store.openCursor(goog.db.KeyRange.lowerBound('b', true));
-
- var key = goog.events.listen(
- cursor, goog.db.Cursor.EventType.NEW_DATA, function() {
- cursor.remove('5').addCallback(function() {
- cursor.next();
- }).addErrback(failOnError);
- });
-
- goog.events.listenOnce(cursor, [
- goog.db.Cursor.EventType.COMPLETE,
- goog.db.Cursor.EventType.ERROR
- ], function(evt) {
- goog.events.unlistenByKey(key);
- if (evt.type == goog.db.Cursor.EventType.COMPLETE) {
- d.callback(db);
- } else {
- d.errback();
- }
- });
- return d;
- };
-
- // Setup and execute test case.
- asyncTestCase.waitForAsync('removing value by cursor');
- globalDb.branch()
- .addCallbacks(addStore, failOnError)
- .addCallback(addData)
- .addCallback(openCursorAndRemove)
- .addCallback(checkStore);
-}
-
-function testClear() {
- if (!idbSupported) {
- return;
- }
-
- asyncTestCase.waitForAsync('clearing');
- globalDb.branch().addCallback(addStore).addCallback(function(db) {
- var rw = goog.db.Transaction.TransactionMode.READ_WRITE;
- var COMPLETE = goog.db.Transaction.EventTypes.COMPLETE;
- var ERROR = goog.db.Transaction.EventTypes.ERROR;
-
- var putTx = db.createTransaction(['store'], rw);
- putTx.objectStore('store').put('1', 'a');
- putTx.objectStore('store').put('2', 'b');
- putTx.objectStore('store').put('3', 'c');
-
- goog.events.listen(putTx, ERROR, failOnErrorEvent);
- goog.events.listen(putTx, COMPLETE, function() {
- var clearTx = db.createTransaction(['store'], rw);
- clearTx.objectStore('store').clear();
-
- goog.events.listen(clearTx, ERROR, failOnErrorEvent);
- goog.events.listen(clearTx, COMPLETE, function() {
- var checkResultsTx = db.createTransaction(['store']);
- checkResultsTx.objectStore('store').getAll().addCallback(
- function(results) {
- assertEquals(0, results.length);
- }).addErrback(failOnError);
-
- goog.events.listen(checkResultsTx, ERROR, failOnErrorEvent);
- goog.events.listen(checkResultsTx, COMPLETE, function() {
- closeAndContinue(db);
- });
- });
- });
- }).addErrback(failOnError);
-}
-
-function testAbortTransaction() {
- if (!idbSupported) {
- return;
- }
-
- asyncTestCase.waitForAsync('abort transaction');
- globalDb.branch().addCallback(addStore).addCallback(function(db) {
- var abortTx = db.createTransaction(
- ['store'],
- goog.db.Transaction.TransactionMode.READ_WRITE);
- abortTx.objectStore('store').put('data', 'stuff').addCallback(function() {
- abortTx.abort();
- });
- goog.events.listen(
- abortTx,
- goog.db.Transaction.EventTypes.ERROR,
- failOnErrorEvent);
-
- goog.events.listen(
- abortTx,
- goog.db.Transaction.EventTypes.COMPLETE,
- function () {
- fail('transaction shouldn\'t have completed after being aborted');
- });
-
- goog.events.listen(
- abortTx,
- goog.db.Transaction.EventTypes.ABORT,
- function() {
- var checkResultsTx = db.createTransaction(['store']);
- checkResultsTx.objectStore('store').get('stuff').addCallback(
- function(result) {
- assertUndefined(result);
- });
- goog.events.listen(
- checkResultsTx,
- goog.db.Transaction.EventTypes.COMPLETE,
- function() {
- closeAndContinue(db);
- });
- });
- }).addErrback(failOnError);
-}
-
-function testInactiveTransaction() {
- if (!idbSupported) {
- return;
- }
-
- asyncTestCase.waitForAsync('inactive transaction');
- globalDb.branch().addCallback(addStoreWithIndex).addCallback(function(db) {
- var tx = db.createTransaction(
- ['store'],
- goog.db.Transaction.TransactionMode.READ_WRITE);
- var store = tx.objectStore('store');
- var index = store.getIndex('index');
- store.put({key: 'something', value: 'anything'});
- goog.events.listen(tx, goog.db.Transaction.EventTypes.COMPLETE, function() {
- var expectedCode = goog.db.Error.ErrorCode.TRANSACTION_INACTIVE_ERR;
- store.put({
- key: 'another',
- value: 'thing'
- }).addCallback(function() {
- fail('putting with inactive transaction should have failed');
- }).addErrback(function(err) {
- assertEquals(expectedCode, err.code);
- });
- store.add({
- key: 'another',
- value: 'thing'
- }).addCallback(function() {
- fail('adding with inactive transaction should have failed');
- }).addErrback(function(err) {
- assertEquals(expectedCode, err.code);
- });
- store.remove('something').addCallback(function() {
- fail('deleting with inactive transaction should have failed');
- }).addErrback(function(err) {
- assertEquals(expectedCode, err.code);
- });
- store.get('something').addCallback(function() {
- fail('getting with inactive transaction should have failed');
- }).addErrback(function(err) {
- assertEquals(expectedCode, err.code);
- });
- store.getAll().addCallback(function() {
- fail('getting all with inactive transaction should have failed');
- }).addErrback(function(err) {
- assertEquals(expectedCode, err.code);
- });
- store.clear().addCallback(function() {
- fail('clearing all with inactive transaction should have failed');
- }).addErrback(function(err) {
- assertEquals(expectedCode, err.code);
- });
-
- index.get('anything').
- addCallback(function() {
- fail('getting from index with inactive transaction should have '
- + 'failed');
- }).addErrback(function(err) {
- assertEquals(expectedCode, err.code);
- });
- index.getKey('anything').
- addCallback(function() {
- fail('getting key from index with inactive transaction '
- + 'should have failed');
- }).addErrback(function(err) {
- assertEquals(expectedCode, err.code);
- });
- index.getAll('anything').
- addCallback(function() {
- fail('getting all from index with inactive transaction '
- + 'should have failed');
- }).addErrback(function(err) {
- assertEquals(expectedCode, err.code);
- });
- index.getAllKeys('anything').
- addCallback(function() {
- fail('getting all keys from index with inactive transaction '
- + 'should have failed');
- }).addErrback(function(err) {
- assertEquals(expectedCode, err.code);
- });
- closeAndContinue(db);
- });
- }).addErrback(failOnError);
-}
-
-function testWrongTransactionMode() {
- if (!idbSupported) {
- return;
- }
-
- asyncTestCase.waitForAsync('wrong transaction mode');
- globalDb.branch().addCallback(addStore).addCallback(function(db) {
- var tx = db.createTransaction(['store']);
- assertEquals(goog.db.Transaction.TransactionMode.READ_ONLY, tx.getMode());
- tx.objectStore('store').put('KABOOM!', 'anything').addCallback(function() {
- fail('putting should have failed');
- }).addErrback(function(err) {
- assertEquals(goog.db.Error.ErrorCode.READ_ONLY_ERR, err.code);
- });
- tx.objectStore('store').add('EXPLODE!', 'die').addCallback(function() {
- fail('adding should have failed');
- }).addErrback(function(err) {
- assertEquals(goog.db.Error.ErrorCode.READ_ONLY_ERR, err.code);
- });
- tx.objectStore('store').remove('no key', 'nothing').addCallback(function() {
- fail('deleting should have failed');
- }).addErrback(function(err) {
- assertEquals(goog.db.Error.ErrorCode.READ_ONLY_ERR, err.code);
- });
- closeAndContinue(db);
- }).addErrback(failOnError);
-}
-
-function testManipulateIndexes() {
- if (!idbSupported) {
- return;
- }
-
- asyncTestCase.waitForAsync('index manipulation');
- globalDb.branch().addCallback(function(db) {
- return db.setVersion('testIndex').addCallback(function(tx) {
- var store = db.createObjectStore('store');
- store.createIndex('index', 'attr1');
- store.createIndex('uniqueIndex', 'attr2', {unique: true});
- store.createIndex('multirowIndex', 'attr3', {multirow: true});
- return restartDatabase(db);
- });
- }).addCallback(function(db) {
- return db.setVersion('testDelIndex').addCallback(function(tx) {
- var store = tx.objectStore('store');
- var index = store.getIndex('index');
- var uniqueIndex = store.getIndex('uniqueIndex');
- var multirowIndex = store.getIndex('multirowIndex');
- try {
- var dies = store.getIndex('diediedie');
- fail('getting non-existent index should have failed');
- } catch (err) {
- assertEquals(goog.db.Error.ErrorCode.NOT_FOUND_ERR, err.code);
- }
- store.deleteIndex('index');
- try {
- store.deleteIndex('diediedie');
- fail('deleting non-existent index should have failed');
- } catch (err) {
- assertEquals(goog.db.Error.ErrorCode.NOT_FOUND_ERR, err.code);
- }
- return restartDatabase(db);
- });
- }).addCallback(function(db) {
- var tx = db.createTransaction(['store']);
- var store = tx.objectStore('store');
- try {
- var index = store.getIndex('index');
- fail('getting deleted index should have failed');
- } catch (err) {
- assertEquals(goog.db.Error.ErrorCode.NOT_FOUND_ERR, err.code);
- }
- var uniqueIndex = store.getIndex('uniqueIndex');
- var multirowIndex = store.getIndex('multirowIndex');
- }).addCallback(closeAndContinue).addErrback(failOnError);
-}
-
-function testAddRecordWithIndex() {
- if (!idbSupported) {
- return;
- }
-
- asyncTestCase.waitForAsync('add record with index');
- globalDb.branch().addCallback(addStoreWithIndex).addCallback(function(db) {
- var COMPLETE = goog.db.Transaction.EventTypes.COMPLETE;
- var addTx = db.createTransaction(
- ['store'],
- goog.db.Transaction.TransactionMode.READ_WRITE);
- var store = addTx.objectStore('store');
- assertFalse(store.getIndex('index').isUnique());
- assertEquals('value', store.getIndex('index').getKeyPath());
- store.add({key: 'someKey', value: 'lookUpThis'});
-
- goog.events.listen(addTx, COMPLETE, function() {
- var checkResultsTx = db.createTransaction(['store']);
- var index = checkResultsTx.objectStore('store').getIndex('index');
- index.get('lookUpThis').addCallback(function(result) {
- assertNotUndefined(result);
- assertEquals('someKey', result.key);
- assertEquals('lookUpThis', result.value);
- });
- index.getKey('lookUpThis').addCallback(function(result) {
- assertNotUndefined(result);
- assertEquals('someKey', result);
- });
- goog.events.listen(
- checkResultsTx,
- goog.db.Transaction.EventTypes.ERROR,
- failOnErrorEvent);
- goog.events.listen(checkResultsTx, COMPLETE, function() {
- closeAndContinue(db);
- });
- });
- }).addErrback(failOnError);
-}
-
-function testGetMultipleRecordsFromIndex() {
- if (!idbSupported) {
- return;
- }
-
- asyncTestCase.waitForAsync('get multiple records from index');
- globalDb.branch().addCallback(addStoreWithIndex).addCallback(function(db) {
- var COMPLETE = goog.db.Transaction.EventTypes.COMPLETE;
- var addTx = db.createTransaction(
- ['store'],
- goog.db.Transaction.TransactionMode.READ_WRITE);
- addTx.objectStore('store').add({key: '1', value: 'a'});
- addTx.objectStore('store').add({key: '2', value: 'a'});
- addTx.objectStore('store').add({key: '3', value: 'b'});
- // The following line breaks Chrome 14, but not Chrome 15:
- // addTx.objectStore('store').add({key: '4'});
- goog.events.listen(
- addTx,
- goog.db.Transaction.EventTypes.ERROR,
- failOnErrorEvent);
-
- goog.events.listen(addTx, COMPLETE, function() {
- var checkResultsTx = db.createTransaction(['store']);
- var index = checkResultsTx.objectStore('store').getIndex('index');
- index.getAll().addCallback(function(results) {
- assertNotUndefined(results);
- assertEquals(3, results.length);
- });
- index.getAll('a').addCallback(function(results) {
- assertNotUndefined(results);
- assertEquals(2, results.length);
- });
- index.getAllKeys().addCallback(function(results) {
- assertNotUndefined(results);
- assertEquals(3, results.length);
- });
- index.getAllKeys('b').addCallback(function(results) {
- assertNotUndefined(results);
- assertEquals(1, results.length);
- });
-
- goog.events.listen(
- checkResultsTx,
- goog.db.Transaction.EventTypes.ERROR,
- failOnErrorEvent);
- goog.events.listen(checkResultsTx, COMPLETE, function() {
- closeAndContinue(db);
- });
- });
- }).addErrback(failOnError);
-}
-
-function testUniqueIndex() {
- if (!idbSupported) {
- return;
- }
-
- asyncTestCase.waitForAsync('adding to unique index');
- globalDb.branch().addCallback(function(db) {
- return db.setVersion('test').addCallback(function(tx) {
- var store = db.createObjectStore('store', {keyPath: 'key'});
- store.createIndex('index', 'value', {unique: true});
- return restartDatabase(db);
- });
- }).addCallback(function(db) {
- var tx = db.createTransaction(
- ['store'],
- goog.db.Transaction.TransactionMode.READ_WRITE);
- assertTrue(tx.objectStore('store').getIndex('index').isUnique());
- tx.objectStore('store').add({key: '1', value: 'a'});
- tx.objectStore('store').add({key: '2', value: 'a'});
- goog.events.listen(tx, goog.db.Transaction.EventTypes.ERROR, function(ev) {
- // expected
- assertTrue(
- 'Expected CONSTRAINT_ERR or UNKNOWN_ERR, was ' + ev.target.code,
- // Chrome 15+
- ev.target.code == goog.db.Error.ErrorCode.CONSTRAINT_ERR ||
- // Chrome 14
- ev.target.code == goog.db.Error.ErrorCode.UNKNOWN_ERR);
- closeAndContinue(db);
- });
- }).addErrback(failOnError);
-}
-
-</script>
-</body>
-</html>