test-read-and-notify.js (2019B)
1 let testId; 2 3 let messageSource; 4 let messageSink; 5 let messageTarget; 6 try { 7 messageSource = window; 8 messageSink = window.parent; 9 messageTarget = document.referrer; 10 } catch (_) { 11 messageSource = self; 12 messageSink = self; 13 messageTarget = null; 14 } 15 16 messageSource.addEventListener("message", async e => { 17 try { 18 console.log("Read script received " + e.data.message); 19 testId = e.data.message; 20 const storeName = "testObjectStore" + testId; 21 let actual; 22 23 if (e.data.type === "IDB") { 24 const openReq = indexedDB.open(testId); 25 const db = await new Promise((openResolve, openReject) => { 26 openReq.onerror = err => { 27 openReject(err); 28 }; 29 openReq.onsuccess = ev => { 30 openResolve(ev.target.result); 31 }; 32 }); 33 34 const objectStore = db 35 .transaction([storeName], "readonly") 36 .objectStore(storeName); 37 const item = await new Promise((getResolve, getReject) => { 38 const getReq = objectStore.get("actual"); 39 getReq.onerror = err => { 40 getReject(err); 41 }; 42 getReq.onsuccess = ev => { 43 getResolve(ev.target.result); 44 }; 45 }); 46 47 actual = await item.text(); 48 } else if (e.data.type === "FS") { 49 const root = await navigator.storage.getDirectory(); 50 const fileHandle = await root.getFileHandle(testId, { create: false }); 51 const file = await fileHandle.getFile(); 52 actual = await file.text(); 53 } else { 54 throw Error("Unknown data type " + e.data.type); 55 } 56 57 if (actual.toString() === e.data.expected.toString()) { 58 messageSink.postMessage({ id: testId, message: testId }, messageTarget); 59 } else { 60 const description = "Found " + actual + ", expected " + e.data.expected; 61 messageSink.postMessage( 62 { id: testId, message: description }, 63 messageTarget 64 ); 65 } 66 } catch (err) { 67 messageSink.postMessage( 68 { id: testId, message: err.message }, 69 messageTarget 70 ); 71 } 72 });