diff --git a/tests/html/html.status b/tests/html/html.status
index fc2af65ac76..5573fc09eba 100644
--- a/tests/html/html.status
+++ b/tests/html/html.status
@@ -120,7 +120,6 @@ indexeddb_1_test: Fail # indexedDB not in Safari 6.
indexeddb_2_test: Fail # indexedDB not in Safari 6.
indexeddb_3_test: Fail # indexedDB not in Safari 6.
indexeddb_4_test: Fail # indexedDB not in Safari 6.
-indexeddb_1_test: Fail # indexedDB not in Safari 6.
fileapi_test: Fail # requestFileSystem not supported in Safari 6.
datalistelement_test: Fail # HTMLDataListElement not yet supported in Safari.
contentelement_test: Fail # Safari 6 does not support content element.
@@ -163,10 +162,10 @@ documentfragment_test: Fail
element_test: Fail
exceptions_test: Fail # Uses webkitotifications, no analogue in moz
fileapi_test: Fail # FF does not support filesystem APIs.
-indexeddb_1_test: Fail # Need window.mozIndexedDB instead of window.webkitIndexedDB
-indexeddb_2_test: Fail # Need window.mozIndexedDB instead of window.webkitIndexedDB
-indexeddb_3_test: Fail # Need window.mozIndexedDB instead of window.webkitIndexedDB
-indexeddb_4_test: Fail # Need window.mozIndexedDB instead of window.webkitIndexedDB
+indexeddb_1_test: Fail # FF disables indexedDB from file URLs.
+indexeddb_2_test: Fail # FF disables indexedDB from file URLs.
+indexeddb_3_test: Fail # FF disables indexedDB from file URLs.
+indexeddb_4_test: Fail # FF disables indexedDB from file URLs.
# setup code fails. prepare. (DOM callback has errors) Caught [object Event]
inner_frame_test: Skip
# Interfaces not implemented: SVGTests, SVGLangSpace, SVGExternalResourcesRequired, SVGStylable
diff --git a/tests/html/indexeddb_1_test.dart b/tests/html/indexeddb_1_test.dart
index a587f8e31c7..3a8eb4c501f 100644
--- a/tests/html/indexeddb_1_test.dart
+++ b/tests/html/indexeddb_1_test.dart
@@ -5,7 +5,7 @@
const String DB_NAME = 'Test';
const String STORE_NAME = 'TEST';
-const String VERSION = '1';
+const int VERSION = 1;
testReadWrite(key, value, check,
[dbName = DB_NAME,
@@ -15,13 +15,13 @@ testReadWrite(key, value, check,
fail(e) {
guardAsync(() {
- Expect.fail('IndexedDB failure');
+ throw const Exception('IndexedDB failure');
});
}
- createObjectStore() {
+ createObjectStore(db) {
var store = db.createObjectStore(storeName);
- Expect.isNotNull(store);
+ expect(store, isNotNull);
}
step2(e) {
@@ -29,6 +29,7 @@ testReadWrite(key, value, check,
var request = transaction.objectStore(storeName).getObject(key);
request.on.success.add(expectAsync1((e) {
var object = e.target.result;
+ db.close();
check(value, object);
}));
request.on.error.add(fail);
@@ -44,14 +45,11 @@ testReadWrite(key, value, check,
initDb(e) {
db = e.target.result;
if (version != db.version) {
- // TODO. Some browsers do this the w3 way - passing the version to the
- // open call and listening to onversionchange. Can we feature-detect the
- // difference and make it work?
- var request = db.setVersion(version);
+ // Legacy 'setVersion' upgrade protocol. Chrome 23 and earlier.
+ var request = db.setVersion('$version');
request.on.success.add(
expectAsync1((e) {
- createObjectStore();
-
+ createObjectStore(db);
var transaction = e.target.result;
transaction.on.complete.add(expectAsync1((e) => step1()));
transaction.on.error.add(fail);
@@ -63,10 +61,26 @@ testReadWrite(key, value, check,
}
}
- var request = window.indexedDB.open(dbName);
- Expect.isNotNull(request);
- request.on.success.add(expectAsync1(initDb));
- request.on.error.add(fail);
+ openDb(e) {
+ var request = window.indexedDB.open(dbName, version);
+ expect(request, isNotNull);
+ request.on.success.add(expectAsync1(initDb));
+ request.on.error.add(fail);
+ if (request is IDBOpenDBRequest) {
+ // New upgrade protocol. Old API has no 'upgradeNeeded' and uses
+ // setVersion instead. This path take by FireFox 15, Chrome 24.
+ request.on.upgradeNeeded.add((e) {
+ guardAsync(() {
+ createObjectStore(e.target.result);
+ });
+ });
+ }
+ }
+
+ // Delete any existing DB.
+ var deleteRequest = window.indexedDB.deleteDatabase(dbName);
+ deleteRequest.on.success.add(expectAsync1(openDb));
+ deleteRequest.on.error.add(fail);
};
testReadWriteTyped(key, value, check,
@@ -77,13 +91,13 @@ testReadWriteTyped(key, value, check,
fail(e) {
guardAsync(() {
- Expect.fail('IndexedDB failure');
+ throw const Exception('IndexedDB failure');
});
}
- createObjectStore() {
+ createObjectStore(db) {
IDBObjectStore store = db.createObjectStore(storeName);
- Expect.isNotNull(store);
+ expect(store, isNotNull);
}
step2(e) {
@@ -91,14 +105,14 @@ testReadWriteTyped(key, value, check,
IDBRequest request = transaction.objectStore(storeName).getObject(key);
request.on.success.add(expectAsync1((e) {
var object = e.target.result;
+ db.close();
check(value, object);
}));
request.on.error.add(fail);
}
step1() {
- IDBTransaction transaction =
- db.transaction([storeName], 'readwrite');
+ IDBTransaction transaction = db.transaction([storeName], 'readwrite');
IDBRequest request = transaction.objectStore(storeName).put(value, key);
request.on.success.add(expectAsync1(step2));
request.on.error.add(fail);
@@ -107,11 +121,14 @@ testReadWriteTyped(key, value, check,
initDb(e) {
db = e.target.result;
if (version != db.version) {
- IDBRequest request = db.setVersion(version);
+ // Legacy 'setVersion' upgrade protocol.
+ IDBRequest request = db.setVersion('$version');
request.on.success.add(
expectAsync1((e) {
- createObjectStore();
- step1();
+ createObjectStore(db);
+ IDBTransaction transaction = e.target.result;
+ transaction.on.complete.add(expectAsync1((e) => step1()));
+ transaction.on.error.add(fail);
})
);
request.on.error.add(fail);
@@ -120,10 +137,26 @@ testReadWriteTyped(key, value, check,
}
}
- IDBRequest request = window.indexedDB.open(dbName);
- Expect.isNotNull(request);
- request.on.success.add(expectAsync1(initDb));
- request.on.error.add(fail);
+ openDb(e) {
+ IDBRequest request = window.indexedDB.open(dbName, version);
+ expect(request, isNotNull);
+ request.on.success.add(expectAsync1(initDb));
+ request.on.error.add(fail);
+ if (request is IDBOpenDBRequest) {
+ // New upgrade protocol. Old API has no 'upgradeNeeded' and uses
+ // setVersion instead.
+ request.on.upgradeNeeded.add((e) {
+ guardAsync(() {
+ createObjectStore(e.target.result);
+ });
+ });
+ }
+ }
+
+ // Delete any existing DB.
+ IDBRequest deleteRequest = window.indexedDB.deleteDatabase(dbName);
+ deleteRequest.on.success.add(expectAsync1(openDb));
+ deleteRequest.on.error.add(fail);
};
tests_dynamic() {
diff --git a/tests/html/indexeddb_2_test.dart b/tests/html/indexeddb_2_test.dart
index 8ab3a005ff9..7a643137bdd 100644
--- a/tests/html/indexeddb_2_test.dart
+++ b/tests/html/indexeddb_2_test.dart
@@ -9,7 +9,7 @@
const String DB_NAME = 'Test';
const String STORE_NAME = 'TEST';
-const String VERSION = '1';
+const int VERSION = 1;
testReadWrite(key, value, check,
[dbName = DB_NAME,
@@ -19,23 +19,23 @@ testReadWrite(key, value, check,
fail(e) {
guardAsync(() {
- Expect.fail('IndexedDB failure');
+ throw const Exception('IndexedDB failure');
});
}
- createObjectStore() {
+ createObjectStore(db) {
var store = db.createObjectStore(storeName);
- Expect.isNotNull(store);
+ expect(store, isNotNull);
}
step2(e) {
var transaction = db.transaction(storeName, 'readonly');
var request = transaction.objectStore(storeName).getObject(key);
request.on.success.add(expectAsync1((e) {
- var object = e.target.result;
- check(value, object);
- })
- );
+ var object = e.target.result;
+ db.close();
+ check(value, object);
+ }));
request.on.error.add(fail);
}
@@ -49,14 +49,11 @@ testReadWrite(key, value, check,
initDb(e) {
db = e.target.result;
if (version != db.version) {
- // TODO. Some browsers do this the w3 way - passing the version to the
- // open call and listening to onversionchange. Can we feature-detect the
- // difference and make it work?
- var request = db.setVersion(version);
+ // Legacy 'setVersion' upgrade protocol.
+ var request = db.setVersion('$version');
request.on.success.add(
expectAsync1((e) {
- createObjectStore();
-
+ createObjectStore(db);
var transaction = e.target.result;
transaction.on.complete.add(expectAsync1((e) => step1()));
transaction.on.error.add(fail);
@@ -68,10 +65,26 @@ testReadWrite(key, value, check,
}
}
- var request = window.indexedDB.open(dbName);
- Expect.isNotNull(request);
- request.on.success.add(expectAsync1(initDb));
- request.on.error.add(fail);
+ openDb(e) {
+ var request = window.indexedDB.open(dbName, version);
+ expect(request, isNotNull);
+ request.on.success.add(expectAsync1(initDb));
+ request.on.error.add(fail);
+ if (request is IDBOpenDBRequest) {
+ // New upgrade protocol. Old API has no 'upgradeNeeded' and uses
+ // setVersion instead.
+ request.on.upgradeNeeded.add((e) {
+ guardAsync(() {
+ createObjectStore(e.target.result);
+ });
+ });
+ }
+ }
+
+ // Delete any existing DB.
+ var deleteRequest = window.indexedDB.deleteDatabase(dbName);
+ deleteRequest.on.success.add(expectAsync1(openDb));
+ deleteRequest.on.error.add(fail);
};
@@ -96,7 +109,6 @@ main() {
test('test_verifyGraph', () {
// Nice to know verifyGraph is working before we rely on it.
- Expect.mapEquals(obj4, obj4);
verifyGraph(obj4, obj4);
verifyGraph(obj1, new Map.from(obj1));
verifyGraph(obj4, new Map.from(obj4));
@@ -104,7 +116,7 @@ main() {
var l1 = [1,2,3];
var l2 = [const [1, 2, 3], const [1, 2, 3]];
verifyGraph([l1, l1], l2);
- Expect.throws(() => verifyGraph([[1, 2, 3], [1, 2, 3]], l2));
+ expect(() => verifyGraph([[1, 2, 3], [1, 2, 3]], l2), throws);
verifyGraph(cyclic_list, cyclic_list);
});
diff --git a/tests/html/indexeddb_3_test.dart b/tests/html/indexeddb_3_test.dart
index 8413c4d9052..8914add798c 100644
--- a/tests/html/indexeddb_3_test.dart
+++ b/tests/html/indexeddb_3_test.dart
@@ -7,38 +7,68 @@
const String DB_NAME = 'Test';
const String STORE_NAME = 'TEST';
-const String VERSION = '1';
+const int VERSION = 1;
class Test {
- var db;
+ fail(message) => (e) {
+ guardAsync(() {
+ Expect.fail('IndexedDB failure: $message');
+ });
+ };
- start() {
- var request = window.indexedDB.open(DB_NAME);
- Expect.isNotNull(request);
- request.on.success.add(expectAsync1(initDb));
- request.on.error.add(fail('open'));
+ _createObjectStore(db) {
+ try {
+ // Nuke object store if it already exists.
+ db.deleteObjectStore(STORE_NAME);
+ }
+ on IDBDatabaseException catch(e) { } // Chrome
+ on DOMException catch(e) { } // Firefox
+ db.createObjectStore(STORE_NAME);
}
- initDb(e) {
- db = e.target.result;
- // TODO. Some browsers do this the w3 way - passing the VERSION to the
- // open call and listening to onversionchange. Can we feature-detect the
- // difference and make it work?
- var request = db.setVersion(VERSION);
- request.on.success.add(
- expectAsync1((e) {
- try {
- // Nuke object store if it already exists.
- db.deleteObjectStore(STORE_NAME);
- } on IDBDatabaseException catch(e) { }
- db.createObjectStore(STORE_NAME);
+ var db;
- var transaction = e.target.result;
- transaction.on.complete.add(expectAsync1((e) => writeItems(0)));
- transaction.on.error.add(fail);
- })
- );
- request.on.error.add(fail('setVersion error'));
+ _openDb(afterOpen()) {
+ var request = window.indexedDB.open(DB_NAME, VERSION);
+ if (request is IDBOpenDBRequest) {
+ // New upgrade protocol. FireFox 15, Chrome 24, hopefully IE10.
+ request.on.success.add(expectAsync1((e) {
+ db = e.target.result;
+ afterOpen();
+ }));
+ request.on.upgradeNeeded.add((e) {
+ guardAsync(() {
+ _createObjectStore(e.target.result);
+ });
+ });
+ request.on.error.add(fail('open'));
+ } else {
+ // Legacy setVersion upgrade protocol. Chrome < 23.
+ request.on.success.add(expectAsync1((e) {
+ db = e.target.result;
+ if (db.version != '$VERSION') {
+ var setRequest = db.setVersion('$VERSION');
+ setRequest.on.success.add(
+ expectAsync1((e) {
+ _createObjectStore(db);
+ var transaction = e.target.result;
+ transaction.on.complete.add(
+ expectAsync1((e) => afterOpen()));
+ transaction.on.error.add(fail('Upgrade'));
+ }));
+ setRequest.on.error.add(fail('setVersion error'));
+ } else {
+ afterOpen();
+ }
+ }));
+ request.on.error.add(fail('open'));
+ }
+ }
+
+ _createAndOpenDb(afterOpen()) {
+ var request = window.indexedDB.deleteDatabase(DB_NAME);
+ request.on.success.add(expectAsync1((e) { _openDb(afterOpen); }));
+ request.on.error.add(fail('delete old Db'));
}
writeItems(int index) {
@@ -54,11 +84,7 @@ class Test {
}
}
- fail(message) => (e) {
- guardAsync(() {
- Expect.fail('IndexedDB failure: $message');
- });
- };
+ setupDb() { _createAndOpenDb(() => writeItems(0)); }
readAllViaCursor() {
IDBTransaction txn = db.transaction(STORE_NAME, 'readonly');
@@ -73,6 +99,7 @@ class Test {
lastKey = cursor.key;
itemCount += 1;
sumKeys += cursor.key;
+ window.console.log('${cursor.key} ${cursor.value}');
Expect.equals('Item ${cursor.key}', cursor.value);
cursor.continueFunction();
} else {
@@ -116,7 +143,7 @@ main() {
useHtmlConfiguration();
var test_ = new Test();
- test('prepare', test_.start);
+ test('prepare', test_.setupDb);
test('readAll1', test_.readAllViaCursor);
test('readAll2', test_.readAllReversedViaCursor);
}
diff --git a/tests/html/indexeddb_4_test.dart b/tests/html/indexeddb_4_test.dart
index 16c4be57a13..28ddc12224e 100644
--- a/tests/html/indexeddb_4_test.dart
+++ b/tests/html/indexeddb_4_test.dart
@@ -7,38 +7,68 @@
const String DB_NAME = 'Test';
const String STORE_NAME = 'TEST';
-const String VERSION = '1';
+const int VERSION = 1;
class Test {
- var db;
+ fail(message) => (e) {
+ guardAsync(() {
+ Expect.fail('IndexedDB failure: $message');
+ });
+ };
- start() {
- var request = window.indexedDB.open(DB_NAME);
- Expect.isNotNull(request);
- request.on.success.add(expectAsync1(initDb));
- request.on.error.add(fail('open'));
+ _createObjectStore(db) {
+ try {
+ // Nuke object store if it already exists.
+ db.deleteObjectStore(STORE_NAME);
+ }
+ on IDBDatabaseException catch(e) { } // Chrome
+ on DOMException catch(e) { } // Firefox
+ db.createObjectStore(STORE_NAME);
}
- initDb(e) {
- db = e.target.result;
- // TODO. Some browsers do this the w3 way - passing the VERSION to the
- // open call and listening to onversionchange. Can we feature-detect the
- // difference and make it work?
- var request = db.setVersion(VERSION);
- request.on.success.add(
- expectAsync1((e) {
- try {
- // Nuke object store if it already exists.
- db.deleteObjectStore(STORE_NAME);
- } on IDBDatabaseException catch (e) { }
- db.createObjectStore(STORE_NAME);
+ var db;
- var transaction = e.target.result;
- transaction.on.complete.add(expectAsync1((e) => writeItems(0)));
- transaction.on.error.add(fail);
- })
- );
- request.on.error.add(fail('setVersion error'));
+ _openDb(afterOpen()) {
+ var request = window.indexedDB.open(DB_NAME, VERSION);
+ if (request is IDBOpenDBRequest) {
+ // New upgrade protocol.
+ request.on.success.add(expectAsync1((e) {
+ db = e.target.result;
+ afterOpen();
+ }));
+ request.on.upgradeNeeded.add((e) {
+ guardAsync(() {
+ _createObjectStore(e.target.result);
+ });
+ });
+ request.on.error.add(fail('open'));
+ } else {
+ // Legacy setVersion upgrade protocol.
+ request.on.success.add(expectAsync1((e) {
+ db = e.target.result;
+ if (db.version != '$VERSION') {
+ var setRequest = db.setVersion('$VERSION');
+ setRequest.on.success.add(
+ expectAsync1((e) {
+ _createObjectStore(db);
+ var transaction = e.target.result;
+ transaction.on.complete.add(
+ expectAsync1((e) => afterOpen()));
+ transaction.on.error.add(fail('Upgrade'));
+ }));
+ setRequest.on.error.add(fail('setVersion error'));
+ } else {
+ afterOpen();
+ }
+ }));
+ request.on.error.add(fail('open'));
+ }
+ }
+
+ _createAndOpenDb(afterOpen()) {
+ var request = window.indexedDB.deleteDatabase(DB_NAME);
+ request.on.success.add(expectAsync1((e) { _openDb(afterOpen); }));
+ request.on.error.add(fail('delete old Db'));
}
writeItems(int index) {
@@ -46,20 +76,15 @@ class Test {
var transaction = db.transaction([STORE_NAME], 'readwrite');
var request = transaction.objectStore(STORE_NAME)
.put('Item $index', index);
- request.on.success.add(
- expectAsync1((e) {
+ request.on.success.add(expectAsync1((e) {
writeItems(index + 1);
- })
- );
+ }
+ ));
request.on.error.add(fail('put'));
}
}
- fail(message) => (e) {
- guardAsync(() {
- Expect.fail('IndexedDB failure: $message');
- });
- };
+ setupDb() { _createAndOpenDb(() => writeItems(0)); }
testRange(range, expectedFirst, expectedLast) {
IDBTransaction txn = db.transaction(STORE_NAME, 'readonly');
@@ -126,7 +151,7 @@ main() {
useHtmlConfiguration();
var test_ = new Test();
- test('prepare', test_.start);
+ test('prepare', test_.setupDb);
test('only1', test_.only1);
test('only2', test_.only2);