test-write-and-notify.js (3614B)
1 var testId; 2 3 const getNonZeroRandomValue = () => { 4 return 1 + Math.floor(Math.random() * (Number.MAX_SAFE_INTEGER - 1)); 5 }; 6 7 var messageSource; 8 var messageSink; 9 var messageTarget; 10 try { 11 messageSource = window; 12 messageSink = window.parent; 13 messageTarget = document.referrer; 14 } catch (_) { 15 messageSource = self; 16 messageSink = self; 17 messageTarget = null; 18 } 19 20 messageSource.addEventListener("message", e => { 21 try { 22 console.log("Write script received " + JSON.stringify(e.data)); 23 testId = e.data.message; 24 const storeName = "testObjectStore" + testId; 25 const storeProps = { autoIncrement: false }; 26 27 const actual = getNonZeroRandomValue(); 28 29 if (e.data.type === "IDB") { 30 new Promise((openResolve, openReject) => { 31 const openReq = indexedDB.open(testId, 1); 32 openReq.onerror = () => { 33 openReject(openReq.error); 34 }; 35 openReq.onupgradeneeded = ev => { 36 ev.target.result.createObjectStore(storeName, storeProps); 37 }; 38 openReq.onsuccess = ev => { 39 openResolve(ev.target.result); 40 }; 41 }) 42 .then(db => { 43 new Promise((addResolve, addReject) => { 44 const blob = new Blob([actual], {}); 45 const tx = db.transaction([storeName], "readwrite"); 46 const objectStore = tx.objectStore(storeName); 47 const addReq = objectStore.add(blob, "actual"); 48 addReq.onerror = () => { 49 addReject(addReq.error); 50 }; 51 addReq.onsuccess = ev => { 52 addResolve(ev); 53 }; 54 }) 55 .then(() => { 56 const doneMessage = { 57 id: testId, 58 message: "write done", 59 expected: actual, 60 }; 61 console.log("Sending parent " + JSON.stringify(doneMessage)); 62 messageSink.postMessage(doneMessage, messageTarget); 63 }) 64 .catch(err => { 65 console.log("Encountered error " + err.message); 66 messageSink.postMessage( 67 { id: testId, message: err.message }, 68 messageTarget 69 ); 70 }); 71 }) 72 .catch(err => { 73 console.log("Sending parent error " + err.message); 74 messageSink.postMessage( 75 { id: testId, message: err.message }, 76 messageTarget 77 ); 78 }); 79 } else if (e.data.type === "FS") { 80 navigator.storage 81 .getDirectory() 82 .then(root => { 83 root.getFileHandle(testId, { create: true }).then(file => { 84 file.createWritable({}).then(writable => { 85 writable.write(actual).then(() => { 86 writable.close().then(() => { 87 const doneMessage = { 88 id: testId, 89 message: "write done", 90 expected: actual, 91 }; 92 console.log("Sending parent " + JSON.stringify(doneMessage)); 93 messageSink.postMessage(doneMessage, messageTarget); 94 }); 95 }); 96 }); 97 }); 98 }) 99 .catch(err => { 100 console.log("Sending parent error " + err.message); 101 messageSink.postMessage( 102 { id: testId, message: err.message }, 103 messageTarget 104 ); 105 }); 106 } else { 107 throw Error("Unknown data type " + e.data.type); 108 } 109 } catch (err) { 110 console.log("Caught " + err.message); 111 messageSink.postMessage( 112 { id: testId, message: err.message }, 113 messageTarget 114 ); 115 } 116 });