63b23e5a73e7af363dd50a9cf407ffb04bc53f8d
[WebKit-https.git] / LayoutTests / imported / w3c / web-platform-tests / IndexedDB / support.js
1 var databaseName = "database";
2 var databaseVersion = 1;
3
4 /* Delete created databases
5  *
6  * Go through each finished test, see if it has an associated database. Close
7  * that and delete the database. */
8 add_completion_callback(function(tests)
9 {
10     for (var i in tests)
11     {
12         if(tests[i].db)
13         {
14             tests[i].db.close();
15             window.indexedDB.deleteDatabase(tests[i].db.name);
16         }
17     }
18 });
19
20 function fail(test, desc) {
21     return test.step_func(function(e) {
22         if (e && e.message && e.target.error)
23             assert_unreached(desc + " (" + e.target.error.name + ": " + e.message + ")");
24         else if (e && e.message)
25             assert_unreached(desc + " (" + e.message + ")");
26         else if (e && e.target.readyState === 'done' && e.target.error)
27             assert_unreached(desc + " (" + e.target.error.name + ")");
28         else
29             assert_unreached(desc);
30     });
31 }
32
33 function createdb(test, dbname, version)
34 {
35     var rq_open = createdb_for_multiple_tests(dbname, version);
36     return rq_open.setTest(test);
37 }
38
39 function createdb_for_multiple_tests(dbname, version) {
40     var rq_open,
41         fake_open = {},
42         test = null,
43         dbname = (dbname ? dbname : "testdb-" + new Date().getTime() + Math.random() );
44
45     if (version)
46         rq_open = window.indexedDB.open(dbname, version);
47     else
48         rq_open = window.indexedDB.open(dbname);
49
50     function auto_fail(evt, current_test) {
51         /* Fail handlers, if we haven't set on/whatever/, don't
52          * expect to get event whatever. */
53         rq_open.manually_handled = {}
54
55         rq_open.addEventListener(evt, function(e) {
56             if (current_test !== test) {
57                 return;
58             }
59
60             test.step(function() {
61                 if (!rq_open.manually_handled[evt]) {
62                     assert_unreached("unexpected open." + evt + " event");
63                 }
64
65                 if (e.target.result + '' == '[object IDBDatabase]' &&
66                     !this.db) {
67                   this.db = e.target.result;
68
69                   this.db.onerror = fail(test, 'unexpected db.error');
70                   this.db.onabort = fail(test, 'unexpected db.abort');
71                   this.db.onversionchange =
72                       fail(test, 'unexpected db.versionchange');
73                 }
74             })
75         })
76         rq_open.__defineSetter__("on" + evt, function(h) {
77             rq_open.manually_handled[evt] = true;
78             if (!h)
79                 rq_open.addEventListener(evt, function() {});
80             else
81                 rq_open.addEventListener(evt, test.step_func(h));
82         })
83     }
84
85     // add a .setTest method to the IDBOpenDBRequest object
86     Object.defineProperty(rq_open, 'setTest', {
87         enumerable: false,
88         value: function(t) {
89             test = t;
90
91             auto_fail("upgradeneeded", test);
92             auto_fail("success", test);
93             auto_fail("blocked", test);
94             auto_fail("error", test);
95
96             return this;
97         }
98     });
99
100     return rq_open;
101 }
102
103 function assert_key_equals(actual, expected, description) {
104   assert_equals(indexedDB.cmp(actual, expected), 0, description);
105 }
106
107 function indexeddb_test(upgrade_func, open_func, description, options) {
108   async_test(function(t) {
109     var options = Object.assign({upgrade_will_abort: false}, options);
110     var dbname = document.location + '-' + t.name;
111     var del = indexedDB.deleteDatabase(dbname);
112     del.onerror = t.unreached_func('deleteDatabase should succeed');
113     var open = indexedDB.open(dbname, 1);
114     if (!options.upgrade_will_abort) {
115       open.onsuccess = t.unreached_func('open should not succeed');
116     } else {
117       open.onerror = t.unreached_func('open should succeed');
118     }
119     open.onupgradeneeded = t.step_func(function() {
120       var db = open.result;
121       var tx = open.transaction;
122       upgrade_func(t, db, tx);
123     });
124     open.onsuccess = t.step_func(function() {
125       var db = open.result;
126       if (open_func)
127         open_func(t, db);
128     });
129   }, description);
130 }
131
132 // Call with a Test and an array of expected results in order. Returns
133 // a function; call the function when a result arrives and when the
134 // expected number appear the order will be asserted and test
135 // completed.
136 function expect(t, expected) {
137   var results = [];
138   return result => {
139     results.push(result);
140     if (results.length === expected.length) {
141       assert_array_equals(results, expected);
142       t.done();
143     }
144   };
145 }