test_file_os_delete.html (3336B)
1 <!-- 2 Any copyright is dedicated to the Public Domain. 3 http://creativecommons.org/publicdomain/zero/1.0/ 4 --> 5 <html> 6 <head> 7 <title>Indexed Database Property Test</title> 8 9 <script src="/tests/SimpleTest/SimpleTest.js"></script> 10 <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/> 11 12 <script type="text/javascript"> 13 function* testSteps() 14 { 15 const READ_WRITE = "readwrite"; 16 17 const name = window.location.pathname; 18 19 const objectStoreName = "Blobs"; 20 21 getCurrentUsage(grabFileUsageAndContinueHandler); 22 let startUsage = yield undefined; 23 24 const fileData1 = { 25 key: 1, 26 obj: { id: 1, file: getRandomFile("random.bin", 100000) }, 27 }; 28 const fileData2 = { 29 key: 2, 30 obj: { id: 1, file: getRandomFile("random.bin", 100000) }, 31 }; 32 33 SpecialPowers.pushPrefEnv({ set: [["dom.indexedDB.dataThreshold", -1]] }, 34 continueToNextStep); 35 yield undefined; 36 37 { 38 let request = indexedDB.open(name, 1); 39 request.onerror = errorHandler; 40 request.onupgradeneeded = grabEventAndContinueHandler; 41 request.onsuccess = grabEventAndContinueHandler; 42 let event = yield undefined; 43 44 is(event.type, "upgradeneeded", "Got correct event type"); 45 46 let db = event.target.result; 47 db.onerror = errorHandler; 48 49 let objectStore = db.createObjectStore(objectStoreName, { }); 50 51 objectStore.createIndex("index", "id", { unique: true }); 52 53 objectStore.add(fileData1.obj, fileData1.key); 54 55 request = objectStore.add(fileData2.obj, fileData2.key); 56 request.addEventListener("error", new ExpectError("ConstraintError", true)); 57 request.onsuccess = unexpectedSuccessHandler; 58 yield undefined; 59 60 event = yield undefined; 61 62 is(event.type, "success", "Got correct event type"); 63 64 getCurrentUsage(grabFileUsageAndContinueHandler); 65 let originalUsage = yield undefined; 66 67 // FIXME This might not work in private browsing mode because of the 68 // encryption overhead. We need to decide how to handle that. We might 69 // change the usage reporting to remove the overhead. 70 71 is(originalUsage, startUsage + fileData1.obj.file.size + fileData2.obj.file.size, 72 "Correct file usage"); 73 74 let trans = db.transaction([objectStoreName], READ_WRITE); 75 trans.objectStore(objectStoreName).delete(fileData1.key); 76 trans.oncomplete = grabEventAndContinueHandler; 77 event = yield undefined; 78 79 is(event.type, "complete", "Got correct event type"); 80 81 getCurrentUsage(grabFileUsageAndContinueHandler); 82 let usage = yield undefined; 83 84 is(usage, originalUsage, "OS files exists"); 85 86 fileData1.obj.file = null; 87 fileData2.obj.file = null; 88 } 89 90 scheduleGC(); 91 yield undefined; 92 93 // Flush pending file deletions before checking usage. 94 flushPendingFileDeletions(); 95 96 yield* assertEventuallyWithGC( 97 function* () { 98 getCurrentUsage(grabFileUsageAndContinueHandler); 99 let endUsage = yield undefined; 100 101 return endUsage == startUsage; 102 }, 103 "OS files deleted" 104 ); 105 106 finishTest(); 107 } 108 </script> 109 <script type="text/javascript" src="file.js"></script> 110 <script type="text/javascript" src="helpers.js"></script> 111 112 </head> 113 114 <body onload="runTest();"></body> 115 116 </html>