|
1 /* This Source Code Form is subject to the terms of the Mozilla Public |
|
2 * License, v. 2.0. If a copy of the MPL was not distributed with this |
|
3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ |
|
4 |
|
5 "use strict"; |
|
6 |
|
7 let xulApp = require("sdk/system/xul-app"); |
|
8 if (xulApp.versionInRange(xulApp.platformVersion, "16.0a1", "*")) { |
|
9 new function tests() { |
|
10 |
|
11 const { indexedDB, IDBKeyRange, DOMException |
|
12 } = require("sdk/indexed-db"); |
|
13 |
|
14 exports["test indexedDB is frozen"] = function(assert){ |
|
15 let original = indexedDB.open; |
|
16 let f = function(){}; |
|
17 assert.throws(function(){indexedDB.open = f}); |
|
18 assert.equal(indexedDB.open,original); |
|
19 assert.notEqual(indexedDB.open,f); |
|
20 |
|
21 }; |
|
22 |
|
23 exports["test db variables"] = function(assert) { |
|
24 [ indexedDB, IDBKeyRange, DOMException |
|
25 ].forEach(function(value) { |
|
26 assert.notEqual(typeof(value), "undefined", "variable is defined"); |
|
27 }); |
|
28 } |
|
29 |
|
30 exports["test open"] = function(assert, done) { |
|
31 let request = indexedDB.open("MyTestDatabase"); |
|
32 request.onerror = function(event) { |
|
33 assert.fail("Failed to open indexedDB") |
|
34 done(); |
|
35 }; |
|
36 request.onsuccess = function(event) { |
|
37 assert.pass("IndexedDB was open"); |
|
38 done(); |
|
39 }; |
|
40 }; |
|
41 |
|
42 exports["test dbname is unprefixed"] = function(assert, done) { |
|
43 // verify fixes in https://bugzilla.mozilla.org/show_bug.cgi?id=786688 |
|
44 let dbName = "dbname-unprefixed"; |
|
45 let request = indexedDB.open(dbName); |
|
46 request.onerror = function(event) { |
|
47 assert.fail("Failed to open db"); |
|
48 done(); |
|
49 }; |
|
50 request.onsuccess = function(event) { |
|
51 assert.equal(request.result.name, dbName); |
|
52 done(); |
|
53 }; |
|
54 }; |
|
55 |
|
56 exports["test structuring the database"] = function(assert, done) { |
|
57 // This is what our customer data looks like. |
|
58 let customerData = [ |
|
59 { ssn: "444-44-4444", name: "Bill", age: 35, email: "bill@company.com" }, |
|
60 { ssn: "555-55-5555", name: "Donna", age: 32, email: "donna@home.org" } |
|
61 ]; |
|
62 let dbName = "the_name"; |
|
63 let request = indexedDB.open(dbName, 2); |
|
64 request.onerror = function(event) { |
|
65 assert.fail("Failed to open db"); |
|
66 done(); |
|
67 }; |
|
68 request.onsuccess = function(event) { |
|
69 assert.pass("transaction is complete"); |
|
70 testRead(assert, done); |
|
71 } |
|
72 request.onupgradeneeded = function(event) { |
|
73 assert.pass("data base upgrade") |
|
74 |
|
75 var db = event.target.result; |
|
76 |
|
77 // Create an objectStore to hold information about our customers. We"re |
|
78 // going to use "ssn" as our key path because it"s guaranteed to be |
|
79 // unique. |
|
80 var objectStore = db.createObjectStore("customers", { keyPath: "ssn" }); |
|
81 |
|
82 // Create an index to search customers by name. We may have duplicates |
|
83 // so we can"t use a unique index. |
|
84 objectStore.createIndex("name", "name", { unique: false }); |
|
85 |
|
86 // Create an index to search customers by email. We want to ensure that |
|
87 // no two customers have the same email, so use a unique index. |
|
88 objectStore.createIndex("email", "email", { unique: true }); |
|
89 |
|
90 // Store values in the newly created objectStore. |
|
91 customerData.forEach(function(data) { |
|
92 objectStore.add(data); |
|
93 }); |
|
94 assert.pass("data added to object store"); |
|
95 }; |
|
96 }; |
|
97 |
|
98 function testRead(assert, done) { |
|
99 let dbName = "the_name"; |
|
100 let request = indexedDB.open(dbName, 2); |
|
101 request.onsuccess = function(event) { |
|
102 assert.pass("data opened") |
|
103 var db = event.target.result; |
|
104 let transaction = db.transaction(["customers"]); |
|
105 var objectStore = transaction.objectStore("customers"); |
|
106 var request = objectStore.get("444-44-4444"); |
|
107 request.onerror = function(event) { |
|
108 assert.fail("Failed to retrive data") |
|
109 }; |
|
110 request.onsuccess = function(event) { |
|
111 // Do something with the request.result! |
|
112 assert.equal(request.result.name, "Bill", "Name is correct"); |
|
113 done(); |
|
114 }; |
|
115 }; |
|
116 request.onerror = function() { |
|
117 assert.fail("failed to open db"); |
|
118 }; |
|
119 }; |
|
120 |
|
121 } |
|
122 } else { |
|
123 exports.testDB = function(assert) { |
|
124 assert.pass("IndexedDB is not implemented") |
|
125 } |
|
126 } |
|
127 |
|
128 require("test").run(exports); |