test_idle_maintenance.js (4277B)
1 /** 2 * Any copyright is dedicated to the Public Domain. 3 * http://creativecommons.org/publicdomain/zero/1.0/ 4 */ 5 /* eslint-disable mozilla/no-arbitrary-setTimeout */ 6 7 /* exported testGenerator */ 8 var testGenerator = testSteps(); 9 10 function* testSteps() { 11 let uri = Services.io.newURI("https://www.example.com"); 12 let principal = Services.scriptSecurityManager.createContentPrincipal( 13 uri, 14 {} 15 ); 16 17 info("Setting permissions"); 18 19 Services.perms.addFromPrincipal( 20 principal, 21 "indexedDB", 22 Ci.nsIPermissionManager.ALLOW_ACTION 23 ); 24 25 info("Creating databases"); 26 27 // Keep at least one database open. 28 let req = indexedDB.open("foo-a", 1); 29 req.onerror = errorHandler; 30 req.onsuccess = grabEventAndContinueHandler; 31 let event = yield undefined; 32 33 // Keep at least one factory operation alive by deleting a database that is 34 // stil open. 35 req = indexedDB.open("foo-b", 1); 36 req.onerror = errorHandler; 37 req.onsuccess = grabEventAndContinueHandler; 38 event = yield undefined; 39 40 indexedDB.deleteDatabase("foo-b"); 41 42 // Create a database which we will later try to open while maintenance is 43 // performed. 44 req = indexedDB.open("foo-c", 1); 45 req.onerror = errorHandler; 46 req.onsuccess = grabEventAndContinueHandler; 47 event = yield undefined; 48 49 let dbC = event.target.result; 50 dbC.close(); 51 52 let dbCount = 0; 53 54 for (let persistence of ["persistent", "temporary", "default"]) { 55 for (let i = 1; i <= 5; i++) { 56 let dbName = "foo-" + i; 57 let dbPersistence = persistence; 58 let req = indexedDB.openForPrincipal(principal, dbName, { 59 version: 1, 60 storage: dbPersistence, 61 }); 62 req.onerror = event => { 63 if (dbPersistence != "persistent") { 64 errorHandler(event); 65 return; 66 } 67 68 // Explicit persistence is currently blocked on mobile. 69 info( 70 "Failed to create persistent database '" + 71 dbPersistence + 72 "/" + 73 dbName + 74 "', hopefully this is on mobile!" 75 ); 76 77 event.preventDefault(); 78 79 if (!--dbCount) { 80 continueToNextStep(); 81 } 82 }; 83 req.onupgradeneeded = event => { 84 let db = event.target.result; 85 let objectStore = db.createObjectStore("foo"); 86 87 // Add lots of data... 88 for (let j = 0; j < 100; j++) { 89 objectStore.add("abcdefghijklmnopqrstuvwxyz0123456789", j); 90 } 91 92 // And then clear it so that maintenance has some space to reclaim. 93 objectStore.clear(); 94 }; 95 req.onsuccess = event => { 96 let db = event.target.result; 97 ok(db, "Created database '" + dbPersistence + "/" + dbName + "'"); 98 99 db.close(); 100 101 if (!--dbCount) { 102 continueToNextStep(); 103 } 104 }; 105 dbCount++; 106 } 107 } 108 yield undefined; 109 110 info("Getting usage before maintenance"); 111 112 let usageBeforeMaintenance; 113 114 Services.qms.getUsageForPrincipal(principal, request => { 115 let usage = request.result.usage; 116 ok(usage > 0, "Usage is non-zero"); 117 usageBeforeMaintenance = usage; 118 continueToNextStep(); 119 }); 120 yield undefined; 121 122 info("Starting idle maintenance"); 123 124 const indexedDatabaseManager = Cc[ 125 "@mozilla.org/dom/indexeddb/manager;1" 126 ].getService(Ci.nsIIndexedDatabaseManager); 127 128 const maintenancePromise = indexedDatabaseManager.doMaintenance(); 129 130 info("Opening database while maintenance is performed"); 131 132 req = indexedDB.open("foo-c", 1); 133 req.onerror = errorHandler; 134 req.onsuccess = grabEventAndContinueHandler; 135 yield undefined; 136 137 info("Waiting for maintenance to finish"); 138 139 maintenancePromise.then(continueToNextStep); 140 yield undefined; 141 142 info("Getting usage after maintenance"); 143 144 let usageAfterMaintenance; 145 146 Services.qms.getUsageForPrincipal(principal, request => { 147 let usage = request.result.usage; 148 ok(usage > 0, "Usage is non-zero"); 149 usageAfterMaintenance = usage; 150 continueToNextStep(); 151 }); 152 yield undefined; 153 154 info( 155 "Usage before: " + 156 usageBeforeMaintenance + 157 ". " + 158 "Usage after: " + 159 usageAfterMaintenance 160 ); 161 162 ok( 163 usageAfterMaintenance <= usageBeforeMaintenance, 164 "Maintenance decreased file sizes or left them the same" 165 ); 166 167 finishTest(); 168 yield undefined; 169 }