<!DOCTYPE html> <title>IDBCursor.advance()</title> <link rel="author" href="mailto:odinho@opera.com" title="Odin Hørthe Omdal"> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> <script src="support.js"></script> <script> var db, open; setup(function() { open = indexedDB.open("testdb-" + new Date().getTime()); open.onupgradeneeded = function(e) { db = e.target.result; var objStore = db.createObjectStore("test"); objStore.createIndex("index", ""); objStore.add("cupcake", 5); objStore.add("pancake", 3); // Yes, it is intended objStore.add("pie", 1); objStore.add("pie", 4); objStore.add("taco", 2); }; }, { explicit_done: true }); open.onsuccess = function() { async_test(document.title + " - advances").step(function(e) { var count = 0; var rq = db.transaction("test").objectStore("test").index("index").openCursor(); rq.onsuccess = this.step_func(function(e) { if (!e.target.result) { assert_equals(count, 3, "count"); this.done(); return; } var cursor = e.target.result; switch(count) { case 0: assert_equals(cursor.value, "cupcake"); assert_equals(cursor.primaryKey, 5); break; case 1: assert_equals(cursor.value, "pie"); assert_equals(cursor.primaryKey, 1); break; case 2: assert_equals(cursor.value, "taco"); assert_equals(cursor.primaryKey, 2); break; default: assert_unreached("Unexpected count: " + count); } count++; cursor.advance(2); }); rq.onerror = fail(this, "unexpected error") }); async_test(document.title + " - advances backwards").step(function(e) { var count = 0; var rq = db.transaction("test").objectStore("test").index("index").openCursor(null, "prev"); rq.onsuccess = this.step_func(function(e) { if (!e.target.result) { assert_equals(count, 3, "count"); this.done(); return; } var cursor = e.target.result; switch(count) { case 0: assert_equals(cursor.value, "taco"); assert_equals(cursor.primaryKey, 2); break; case 1: assert_equals(cursor.value, "pie"); assert_equals(cursor.primaryKey, 1); break; case 2: assert_equals(cursor.value, "cupcake"); assert_equals(cursor.primaryKey, 5); break; default: assert_unreached("Unexpected count: " + count); } count++; cursor.advance(2); }); rq.onerror = fail(this, "unexpected error") }); async_test(document.title + " - skip far forward").step(function(e) { var count = 0; var rq = db.transaction("test").objectStore("test").index("index") .openCursor(); rq.onsuccess = this.step_func(function(e) { if (!e.target.result) { assert_equals(count, 1, "count"); this.done(); return; } var cursor = e.target.result; switch(count) { case 0: assert_equals(cursor.value, "cupcake"); assert_equals(cursor.primaryKey, 5); break; default: assert_unreached("Unexpected count: " + count); } count++; cursor.advance(100000); }); rq.onerror = fail(this, "unexpected error") }); async_test(document.title + " - within range").step(function(e) { var count = 0; var rq = db.transaction("test").objectStore("test").index("index") .openCursor(IDBKeyRange.lowerBound("cupcake", true)); rq.onsuccess = this.step_func(function(e) { if (!e.target.result) { assert_equals(count, 2, "count"); this.done(); return; } var cursor = e.target.result; switch(count) { case 0: assert_equals(cursor.value, "pancake"); assert_equals(cursor.primaryKey, 3); break; case 1: assert_equals(cursor.value, "pie"); assert_equals(cursor.primaryKey, 4); break; default: assert_unreached("Unexpected count: " + count); } count++; cursor.advance(2); }); rq.onerror = fail(this, "unexpected error") }); async_test(document.title + " - within single key range").step(function(e) { var count = 0; var rq = db.transaction("test").objectStore("test").index("index") .openCursor("pancake"); rq.onsuccess = this.step_func(function(e) { if (!e.target.result) { assert_equals(count, 1, "count"); this.done(); return; } var cursor = e.target.result; switch(count) { case 0: assert_equals(cursor.value, "pancake"); assert_equals(cursor.primaryKey, 3); break; default: assert_unreached("Unexpected count: " + count); } count++; cursor.advance(1); }); rq.onerror = fail(this, "unexpected error") }); async_test(document.title + " - within single key range, with several results").step(function(e) { var count = 0; var rq = db.transaction("test").objectStore("test").index("index") .openCursor("pie"); rq.onsuccess = this.step_func(function(e) { if (!e.target.result) { assert_equals(count, 2, "count"); this.done(); return; } var cursor = e.target.result; switch(count) { case 0: assert_equals(cursor.value, "pie"); assert_equals(cursor.primaryKey, 1); break; case 1: assert_equals(cursor.value, "pie"); assert_equals(cursor.primaryKey, 4); break; default: assert_unreached("Unexpected count: " + count); } count++; cursor.advance(1); }); rq.onerror = fail(this, "unexpected error") }); // Stop blocking the testing system from hereon done(); } </script> <div id="log"></div>