Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(331)

Unified Diff: third_party/WebKit/LayoutTests/storage/indexeddb/resources/observer.js

Issue 2125213002: [IndexedDB] Propogating changes to observers : Renderer (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@lifetime
Patch Set: Minor bugs fixed Created 4 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/LayoutTests/storage/indexeddb/resources/observer.js
diff --git a/third_party/WebKit/LayoutTests/storage/indexeddb/resources/observer.js b/third_party/WebKit/LayoutTests/storage/indexeddb/resources/observer.js
index 341ab497675544661efaf9699b51aea687819b87..fff551ffd484cf3c69af200b6dfec338d5251f36 100644
--- a/third_party/WebKit/LayoutTests/storage/indexeddb/resources/observer.js
+++ b/third_party/WebKit/LayoutTests/storage/indexeddb/resources/observer.js
@@ -1,35 +1,130 @@
+/* This test checks the following
jsbell 2016/07/14 20:08:14 Please use // comments rather than /* */, like the
palakj1 2016/07/15 20:16:04 Done.
palakj1 2016/07/15 20:16:05 Done.
+ * Create observer during version change
+ * Ignore observe call during version change
+ * All operations {add, put, delete, clear} recorded
+ * Filtering object stores
+ * Add observer with an empty transaction.
+ * Observer Callback fired before transaction oncomplete.
+ * Multiple observer callbacks.
+ */
+
if (this.importScripts) {
importScripts('../../../resources/testharness.js');
}
-function callback(){};
+(function(){
jsbell 2016/07/14 20:08:14 nit: space between () and {
+ var callback1_count = 0, callback2_count = 0;
+ var dbname = location.pathname + ' - ' + 'changes';
+ var operations = [{type: 'put', key : {lower : 1, upper : 1} },
+ {type: 'put', key : {lower : 2, upper : 2} },
+ {type: 'put', key : {lower : 3, upper : 3} },
+ {type: 'put', key : {lower : 4, upper : 4} },
+ {type: 'kDelete', key: {lower : 1, upper : 3} },
+ {type: 'add', key : {lower : 1, upper : 1} },
+ {type: 'clear'} ];
+
+ function observation_equals(actual, expected){
+ assert_equals(actual.type, expected.type);
+ if(actual.type == 'clear') {
jsbell 2016/07/14 20:08:14 nit: space between if and (
+ assert_equals(actual.key, undefined, 'clear operation has no key');
+ assert_equals(actual.value, null, 'clear operation has no value');
+ return;
+ }
+ assert_equals(actual.key.lower, expected.key.lower, 'key lower bound');
+ assert_equals(actual.key.upper, expected.key.upper, 'key upper bound');
+ assert_equals(actual.key.lower_open, expected.key.lower_open, 'key lower open');
+ assert_equals(actual.key.upper_open, expected.key.upper_open, 'key upper open');
+ if(actual.type == 'kDelete') {
jsbell 2016/07/14 20:08:14 ditto
+ assert_equals(actual.value, null, 'delete operation has no value');
+ return;
+ }
+ assert_equals(actual.value, null , 'observation value');
jsbell 2016/07/14 20:08:14 Add a TODO that this will need to be updated?
+ }
+
+ function callback1(changes){
+ assert_equals(changes.database.name, dbname, 'database');
jsbell 2016/07/14 20:08:14 Can you make the assertion messages clearer? Ideal
+ assert_equals(changes.records.size, 1, 'observer records #objstore');
+ assert_true(changes.records.has('store'));
+
+ var obsv = changes.records.get('store');
+ if(callback1_count == 0)
+ assert_equals(obsv.length, 7, '#observations');
+ else
+ assert_equals(obsv.length, 1, '#observations');
+ for(i in obsv)
+ observation_equals(obsv[i], operations[i]);
+
+ callback1_count++;
+ };
-async_test(function(t) {
- var description = 'observer addition and removal test';
- var dbname = location.pathname + ' - ' + description;
- var openRequest = indexedDB.open(dbname);
- var obs1 = new IDBObserver(callback, {transaction: true, values: true});
- var obs2 = new IDBObserver(callback, {transaction: true, values: true});
+ function callback2(changes) {
+ assert_equals(changes.database.name, dbname, 'database');
+ assert_equals(changes.records.size, 2, 'observer records #objstores');
+ assert_true(changes.records.has('store'));
+ assert_true(changes.records.has('store2'));
- openRequest.onupgradeneeded = t.step_func(function() {
+ var obsv1 = changes.records.get('store');
+ assert_equals(obsv1.length, 1, '#observations');
+ observation_equals(obsv1[0], operations[0]);
+
+ var obsv2 = changes.records.get('store2');
+ assert_equals(obsv2.length, 1, '#observations');
+ observation_equals(obsv2[0], operations[0]);
+
+ callback2_count++;
+ };
+
+ async_test(function(t) {
+ var description = 'observer changes test';
dmurph 2016/07/14 18:32:55 don't need this, right?
+ var openRequest = indexedDB.open(dbname);
+ var obs1 = new IDBObserver(t.step_func(callback1));
+ openRequest.onupgradeneeded = t.step_func(function() {
+ var db = openRequest.result;
+ db.createObjectStore('store');
+ db.createObjectStore('store2');
+ var obs2 = new IDBObserver(t.step_func(callback2));
+ // observe call in version change transaction is ignored
+ obs2.observe(db, openRequest.transaction);
+ });
+ openRequest.onsuccess = t.step_func(function() {
var db = openRequest.result;
- db.createObjectStore('store');
- });
- openRequest.onsuccess = t.step_func(function() {
- var db = openRequest.result;
- var tx = db.transaction('store', 'readwrite');
- var store = tx.objectStore('store');
- var put_request = store.put(1,1);
- obs1.observe(db, tx);
- obs1.unobserve(db);
- obs1.observe(db, tx);
- obs2.observe(db, tx);
- tx.oncomplete = t.step_func(function(){
- obs1.unobserve(db);
- t.done();
- });
+ var tx = db.transaction('store', 'readwrite'); // Empty transaction to add the obs1.
+ var tx2 = db.transaction(['store', 'store2'], 'readwrite');
+ obs1.observe(db, tx);
+ obs2.observe(db, tx2);
+
+ var store = tx2.objectStore('store');
+ var store2 = tx2.objectStore('store2');
+ for(i = 1; i <= 4; i++)
jsbell 2016/07/14 20:08:14 nit: space between for and (
+ store.put(i,i);
+ store.delete(IDBKeyRange.bound(1,3));
+ store.add(1,1);
+ store.clear();
+
+ // This operation would not be observed.
+ store2.put(2,2);
+ tx.oncomplete = t.step_func(function(){
+ assert_equals(callback1_count, 0, 'callback1 count');
+ assert_equals(callback2_count, 0, 'callback1 count');
+ });
+ tx2.oncomplete = t.step_func(function(){
+ assert_equals(callback1_count, 1, 'callback1 count');
+ assert_equals(callback2_count, 0, 'callback1 count');
+ });
+
+ var tx3 = db.transaction(['store', 'store2'], 'readwrite');
+ var store3 = tx3.objectStore('store', 'readwrite');
+ var store4 = tx3.objectStore('store2', 'readwrite');
+ store3.put(1,1);
+ store4.put(1,1);
+
+ tx3.oncomplete = t.step_func(function(){
+ assert_equals(callback1_count, 2, 'callback1 count');
+ assert_equals(callback2_count, 1, 'callback1 count');
+ t.done();
});
-}, 'observer addition and removal test');
+ });
+ }, 'observer changes test');
jsbell 2016/07/14 20:08:14 Can you describe more about what is being tested?
+})();
-done();

Powered by Google App Engine
This is Rietveld 408576698