| Index: third_party/WebKit/LayoutTests/storage/indexeddb/resources/observer-changes.js
|
| diff --git a/third_party/WebKit/LayoutTests/storage/indexeddb/resources/observer-changes.js b/third_party/WebKit/LayoutTests/storage/indexeddb/resources/observer-changes.js
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..dbbbcdc965bac6c51f53beb86d661e394e0b89c5
|
| --- /dev/null
|
| +++ b/third_party/WebKit/LayoutTests/storage/indexeddb/resources/observer-changes.js
|
| @@ -0,0 +1,262 @@
|
| +if (this.importScripts) {
|
| + importScripts('../../../resources/testharness.js');
|
| + importScripts('../../../resources/generic-idb-operations.js');
|
| +}
|
| +
|
| +(function() {
|
| + var pathname = location.pathname + ' - ' + 'changes';
|
| + var callback_count = Array(6).fill(0);
|
| + var dbname = [];
|
| + for(var i = 1; i <= 6; i++)
|
| + dbname.push(pathname + i.toString());
|
| +
|
| + callback_count.fill(0);
|
| + var putOps = [{type: 'put', key : 1, value: 1 },
|
| + {type: 'put', key : 2, value: 2 },
|
| + {type: 'put', key : 3, value: 3 },];
|
| + var deleteOps = [ {type: 'kDelete', key: {lower : 1, upper : 2} }, {type: 'kDelete', key: {lower : 3, upper : 3} }];
|
| + var addOps = [ {type: 'add', key : 3, value: 3 } ];
|
| + var clearOps = [ {type: 'clear'} ];
|
| + var put_records = { 'store': putOps };
|
| +
|
| + var ops0 = putOps.concat(deleteOps, addOps, clearOps);
|
| + var records0 = { 'store' : ops0 };
|
| + var observed_records0 = { 'store' : ops0 };
|
| + var observed_changes0 = { dbName: dbname[0], records: observed_records0 };
|
| +
|
| + function callback0(changes) {
|
| + compareChanges(changes, observed_changes0);
|
| + callback_count[0]++;
|
| + };
|
| +
|
| + async_test(function(t) {
|
| + var openRequest = indexedDB.open(dbname[0]);
|
| + // TODO(dmurph): operationType should be 'delete' instead of 'kDelete', once fixed. Issue crbug.com/609934.
|
| + var obs = new IDBObserver(t.step_func(callback0), { operationTypes: [ 'clear', 'put', 'add', 'kDelete' ] });
|
| + openRequest.onupgradeneeded = t.step_func(function() {
|
| + createObjectStores(openRequest.result, ['store']);
|
| + });
|
| + openRequest.onsuccess = t.step_func(function() {
|
| + var db = openRequest.result;
|
| + var tx1 = db.transaction('store', 'readwrite');
|
| + var tx2 = db.transaction('store', 'readwrite');
|
| + obs.observe(db, tx1);
|
| + operateOnTx(tx2, records0);
|
| +
|
| + tx1.oncomplete = t.step_func(function() {
|
| + countCallbacks(callback_count[0], 0);
|
| + });
|
| + tx1.onerror = t.unreached_func('transaction should not fail')
|
| + tx2.oncomplete = t.step_func(function() {
|
| + countCallbacks(callback_count[0], 1);
|
| + t.done();
|
| + });
|
| + tx2.onerror = t.unreached_func('transaction should not fail')
|
| + });
|
| + openRequest.onerror = t.unreached_func('opening database should not fail');
|
| + }, 'Observer: Record all operations');
|
| +
|
| + var ops1 = putOps.concat(deleteOps, addOps, clearOps);
|
| + var records1 = { 'store' : ops1 };
|
| + var observed_ops1 = putOps.concat(clearOps);
|
| + var observed_records1 = { 'store' : observed_ops1 };
|
| + var observed_changes1 = { dbName: dbname[1], records: observed_records1 };
|
| +
|
| + function callback1(changes) {
|
| + compareChanges(changes, observed_changes1);
|
| + callback_count[1]++;
|
| + };
|
| +
|
| + async_test(function(t) {
|
| + var openRequest = indexedDB.open(dbname[1]);
|
| + var cnt2 = 0;
|
| + var obs1 = new IDBObserver(t.step_func(callback1), { operationTypes: ['clear', 'put'] });
|
| + var obs2 = new IDBObserver(t.step_func(function(){
|
| + cnt2++;
|
| + }));
|
| +
|
| + openRequest.onupgradeneeded = t.step_func(function() {
|
| + createObjectStores(openRequest.result, ['store']);
|
| + });
|
| + openRequest.onsuccess = t.step_func(function() {
|
| + var db = openRequest.result;
|
| + var tx1 = db.transaction('store', 'readwrite');
|
| + var tx2 = db.transaction('store', 'readwrite');
|
| + obs1.observe(db, tx1);
|
| + obs2.observe(db, tx1);
|
| + operateOnTx(tx2, records1);
|
| +
|
| + tx1.oncomplete = t.step_func(function() {
|
| + countCallbacks(callback_count[1], 0);
|
| + countCallbacks(cnt2, 0);
|
| +
|
| + });
|
| + tx2.oncomplete = t.step_func(function() {
|
| + countCallbacks(callback_count[1], 1);
|
| + countCallbacks(cnt2, 0);
|
| + t.done();
|
| + });
|
| + });
|
| + openRequest.onerror = t.unreached_func('opening database should not fail');
|
| + }, 'Observer: Operation type filtering');
|
| +
|
| + var records2 = { 'store' : putOps, 'store2' : addOps };
|
| + var observed_records2 = { 'store' : putOps };
|
| + var observed_changes2 = { dbName: dbname[2], records: observed_records2 };
|
| +
|
| + function callback2(changes){
|
| + compareChanges(changes, observed_changes2);
|
| + callback_count[2]++;
|
| + }
|
| + var stores = ['store', 'store2']
|
| +
|
| + async_test(function(t) {
|
| + var openRequest = indexedDB.open(dbname[2]);
|
| + var obs = new IDBObserver(t.step_func(callback2), { operationTypes: ['put', 'add'] });
|
| +
|
| + openRequest.onupgradeneeded = t.step_func(function() {
|
| + createObjectStores(openRequest.result, stores);
|
| + });
|
| + openRequest.onsuccess = t.step_func(function() {
|
| + var db = openRequest.result;
|
| + var tx1 = db.transaction(stores[0], 'readwrite');
|
| + var tx2 = db.transaction(stores, 'readwrite');
|
| + obs.observe(db, tx1);
|
| + operateOnTx(tx2, records2);
|
| +
|
| + tx1.oncomplete = t.step_func(function() {
|
| + countCallbacks(callback_count[2], 0);
|
| + });
|
| + tx2.oncomplete = t.step_func(function() {
|
| + countCallbacks(callback_count[2], 1);
|
| + t.done();
|
| + });
|
| + });
|
| + openRequest.onerror = t.unreached_func('opening database should not fail');
|
| + }, 'Observer: ObjectStore filtering');
|
| +
|
| + var records3 = { 'store' : putOps };
|
| + var put_records = { 'store' : putOps };
|
| + var observed_changes3 = { dbName: dbname[3], records: put_records };
|
| +
|
| + function callback3(changes){
|
| + compareChanges(changes, observed_changes3);
|
| + callback_count[3]++;
|
| + }
|
| + async_test(function(t) {
|
| + var openRequest = indexedDB.open(dbname[3]);
|
| + var obs = new IDBObserver(t.step_func(callback3), { operationTypes: ['put'] });
|
| +
|
| + openRequest.onupgradeneeded = t.step_func(function() {
|
| + createObjectStores(openRequest.result, ['store']);
|
| + });
|
| + openRequest.onsuccess = t.step_func(function() {
|
| + var db = openRequest.result;
|
| + var tx1 = db.transaction('store', 'readwrite');
|
| + // External transaction on same database connection.
|
| + operateOnDb(db, records3);
|
| + var tx2 = db.transaction('store', 'readwrite');
|
| + operateOnTx(tx2, records3);
|
| + obs.observe(db, tx1);
|
| +
|
| + tx1.oncomplete = t.step_func(function() {
|
| + countCallbacks(callback_count[3], 0);
|
| + });
|
| + tx2.oncomplete = t.step_func(function() {
|
| + countCallbacks(callback_count[3], 2);
|
| + t.done();
|
| + });
|
| + tx2.onerror = t.unreached_func('tx should not have error');
|
| + });
|
| + openRequest.onerror = t.unreached_func('opening database should not fail');
|
| + }, 'Observer : Records external transaction');
|
| +
|
| + var observed_changes4 = { dbName: dbname[4], records: put_records };
|
| +
|
| + function callback4(changes){
|
| + compareChanges(changes, observed_changes4);
|
| + callback_count[4]++;
|
| + }
|
| +
|
| + async_test(function(t) {
|
| + var openRequest = indexedDB.open(dbname[4]);
|
| + var obs = new IDBObserver(t.step_func(callback4), { operationTypes: ['put'] });
|
| +
|
| + openRequest.onupgradeneeded = t.step_func(function() {
|
| + createObjectStores(openRequest.result, ['store']);
|
| + });
|
| + openRequest.onsuccess = t.step_func(function() {
|
| + var db = openRequest.result;
|
| + var tx1 = db.transaction('store', 'readwrite');
|
| + obs.observe(db, tx1);
|
| + tx1.oncomplete = t.step_func(function() {
|
| + countCallbacks(callback_count[4], 0);
|
| + });
|
| + tx1.onerror = t.unreached_func('transaction should not fail');
|
| +
|
| + var openRequest2 = indexedDB.open(dbname[4]);
|
| + openRequest2.onsuccess = t.step_func(function(){
|
| + var db2 = openRequest2.result;
|
| + var tx2 = db2.transaction('store', 'readwrite');
|
| + operateOnTx(tx2, put_records);
|
| + tx2.oncomplete = function(){
|
| + countCallbacks(callback_count[4], 1);
|
| + t.done();
|
| + }
|
| + tx2.onerror = t.unreached_func('transaction should not fail');
|
| + });
|
| + });
|
| + openRequest.onerror = t.unreached_func('opening database should not fail');
|
| + }, 'Observer : Record changes on another connection');
|
| +
|
| + var records5_2 = {'store2' : putOps}
|
| + var observed_changes5_1 = { dbName: dbname[5], records: put_records };
|
| + var observed_changes5_2 = { dbName: dbname[5], records: records5_2 };
|
| +
|
| + function callback5(changes){
|
| + assert_true(callback_count[5] < 2);
|
| + if(callback_count[5] == 0)
|
| + compareChanges(changes, observed_changes5_1);
|
| + else
|
| + compareChanges(changes, observed_changes5_2);
|
| + callback_count[5]++;
|
| + }
|
| +
|
| + async_test(function(t) {
|
| + var openRequest = indexedDB.open(dbname[5]);
|
| + var obs = new IDBObserver(t.step_func(callback5), { operationTypes: ['put'] });
|
| +
|
| + openRequest.onupgradeneeded = t.step_func(function() {
|
| + createObjectStores(openRequest.result, [ 'store', 'store2' ]);
|
| + });
|
| + openRequest.onsuccess = t.step_func(function() {
|
| + var db = openRequest.result;
|
| + var tx1 = db.transaction([ 'store', 'store2'], 'readwrite');
|
| + var tx2 = db.transaction('store', 'readwrite');
|
| +
|
| + obs.observe(db, tx1);
|
| + tx1.objectStore('store').get(1);
|
| + t.step_func(operateOnTx(tx2, put_records));
|
| +
|
| + tx1.oncomplete = t.step_func(function() {
|
| + countCallbacks(callback_count[5], 0);
|
| + });
|
| + tx1.onerror = t.unreached_func('transaction should not fail');
|
| + tx2.oncomplete = t.step_func(function(){
|
| + countCallbacks(callback_count[5], 1);
|
| + var tx3 = db.transaction('store2', 'readwrite');
|
| + t.step_func(operateOnTx(tx3, records5_2));
|
| +
|
| + tx3.oncomplete = t.step_func(function(){
|
| + countCallbacks(callback_count[5], 2);
|
| + t.done();
|
| + });
|
| + tx3.onerror = t.unreached_func('transaction should not fail');
|
| + });
|
| + tx2.onerror = t.unreached_func('transaction should not fail');
|
| + });
|
| + openRequest.onerror = t.unreached_func('opening database should not fail');
|
| + }, 'Observer : Record multiple transactions');
|
| +
|
| + done();
|
| +})();
|
|
|