1if (this.importScripts) {
2 importScripts('../../../fast/js/resources/js-test-pre.js');
3 importScripts('shared.js');
4}
5
6description("Test IndexedDB database metadata mutation/snapshotting");
7
8function test()
9{
10 removeVendorPrefixes();
11 evalAndLog("dbname = self.location.pathname");
12 evalAndLog("request = indexedDB.deleteDatabase(dbname)");
13 request.onerror = unexpectedErrorCallback;
14 request.onsuccess = firstOpen;
15}
16
17function firstOpen()
18{
19 debug("");
20 debug("firstOpen():");
21 evalAndLog("request = indexedDB.open(dbname)");
22 request.onerror = unexpectedErrorCallback;
23 request.onsuccess = function() {
24 evalAndLog("connection1 = request.result");
25 evalAndLog("request = connection1.setVersion('1')");
26 request.onerror = unexpectedErrorCallback;
27 request.onsuccess = function() {
28 evalAndLog("trans = request.result");
29 evalAndLog("connection1store1 = connection1.createObjectStore('store1')");
30 evalAndLog("connection1store1.createIndex('index1', 'path')");
31
32 shouldBeEqualToString("connection1.version", "1");
33 shouldBe("connection1.objectStoreNames.length", "1");
34 shouldBe("connection1store1.indexNames.length", "1");
35
36 trans.onabort = unexpectedAbortCallback;
37 trans.oncomplete = function() {
38 debug("Connection's properties should be snapshotted on close");
39 evalAndLog("connection1.close()");
40 secondOpen();
41 };
42 };
43 };
44}
45
46function secondOpen()
47{
48 debug("");
49 debug("secondOpen():");
50 evalAndLog("request = indexedDB.open(dbname)");
51 request.onerror = unexpectedErrorCallback;
52 request.onsuccess = function() {
53 evalAndLog("connection2 = request.result");
54 evalAndLog("request = connection2.setVersion('2')");
55 request.onerror = unexpectedErrorCallback;
56 request.onsuccess = function() {
57 evalAndLog("trans = request.result");
58 evalAndLog("connection2.createObjectStore('store2')");
59 evalAndLog("connection2store1 = trans.objectStore('store1')");
60 evalAndLog("connection2store1.createIndex('index2', 'path')");
61
62 shouldBeEqualToString("connection2.version", "2");
63 shouldBe("connection2.objectStoreNames.length", "2");
64 shouldBe("connection2store1.indexNames.length", "2");
65
66 trans.onabort = unexpectedAbortCallback;
67 trans.oncomplete = function() {
68 debug("Connection's properties should be snapshotted on close");
69 evalAndLog("connection2.close()");
70 thirdOpen();
71 };
72 };
73 };
74}
75
76function thirdOpen()
77{
78 debug("");
79 debug("thirdOpen():");
80 evalAndLog("request = indexedDB.open(dbname)");
81 request.onerror = unexpectedErrorCallback;
82 request.onsuccess = function() {
83 evalAndLog("connection3 = request.result");
84 evalAndLog("request = connection3.setVersion('3')");
85 request.onerror = unexpectedErrorCallback;
86 request.onsuccess = function() {
87 evalAndLog("trans = request.result");
88 evalAndLog("connection3.createObjectStore('store3')");
89 evalAndLog("connection3store1 = trans.objectStore('store1')");
90 evalAndLog("connection3store1.createIndex('index3', 'path')");
91
92 shouldBeEqualToString("connection3.version", "3");
93 shouldBe("connection3.objectStoreNames.length", "3");
94 shouldBe("connection3store1.indexNames.length", "3");
95
96 trans.oncomplete = unexpectedCompleteCallback;
97 trans.onabort = function() {
98 debug("Connection's properties should be snapshotted on close");
99 evalAndLog("connection3.close()");
100 fourthOpen();
101 };
102 debug("Connection's properties should be reverted on abort");
103 evalAndLog("trans.abort()");
104 };
105 };
106}
107
108function fourthOpen()
109{
110 debug("");
111 debug("fourthOpen():");
112 evalAndLog("request = indexedDB.open(dbname)");
113 request.onerror = unexpectedErrorCallback;
114 request.onsuccess = function() {
115 evalAndLog("connection4 = request.result");
116 evalAndLog("request = connection4.setVersion('4')");
117 request.onerror = unexpectedErrorCallback;
118 request.onsuccess = function() {
119 evalAndLog("trans = request.result");
120 evalAndLog("connection4.createObjectStore('store4')");
121 evalAndLog("connection4store1 = trans.objectStore('store1')");
122 evalAndLog("connection4store1.createIndex('index4', 'path')");
123
124 shouldBeEqualToString("connection4.version", "4");
125 shouldBe("connection4.objectStoreNames.length", "3");
126 shouldBe("connection4store1.indexNames.length", "3");
127
128 trans.onabort = unexpectedAbortCallback;
129 trans.oncomplete = function() {
130 debug("Connection's properties should be snapshotted on close");
131 evalAndLog("connection4.close()");
132 checkState();
133 };
134 };
135 };
136}
137
138function checkState()
139{
140 debug("");
141 debug("checkState():");
142
143 shouldBeEqualToString("connection1.version", "1");
144 shouldBe("connection1.objectStoreNames.length", "1");
145 shouldBe("connection1store1.indexNames.length", "1");
146 debug("");
147
148 shouldBeEqualToString("connection2.version", "2");
149 shouldBe("connection2.objectStoreNames.length", "2");
150 shouldBe("connection2store1.indexNames.length", "2");
151 debug("");
152
153 shouldBeEqualToString("connection3.version", "2");
154 shouldBe("connection3.objectStoreNames.length", "2");
155 shouldBe("connection3store1.indexNames.length", "2");
156 debug("");
157
158 shouldBeEqualToString("connection4.version", "4");
159 shouldBe("connection4.objectStoreNames.length", "3");
160 shouldBe("connection4store1.indexNames.length", "3");
161 debug("");
162
163 finishJSTest();
164}
165
166test();