Source code
Revision control
Copy as Markdown
Other Tools
var testId;
const getNonZeroRandomValue = () => {
return 1 + Math.floor(Math.random() * (Number.MAX_SAFE_INTEGER - 1));
};
var messageSource;
var messageSink;
var messageTarget;
try {
messageSource = window;
messageSink = window.parent;
messageTarget = document.referrer;
} catch (_) {
messageSource = self;
messageSink = self;
messageTarget = null;
}
messageSource.addEventListener("message", e => {
try {
console.log("Write script received " + JSON.stringify(e.data));
testId = e.data.message;
const storeName = "testObjectStore" + testId;
const storeProps = { autoIncrement: false };
const actual = getNonZeroRandomValue();
if (e.data.type === "IDB") {
new Promise((openResolve, openReject) => {
const openReq = indexedDB.open(testId, 1);
openReq.onerror = () => {
openReject(openReq.error);
};
openReq.onupgradeneeded = ev => {
ev.target.result.createObjectStore(storeName, storeProps);
};
openReq.onsuccess = ev => {
openResolve(ev.target.result);
};
})
.then(db => {
new Promise((addResolve, addReject) => {
const blob = new Blob([actual], {});
const tx = db.transaction([storeName], "readwrite");
const objectStore = tx.objectStore(storeName);
const addReq = objectStore.add(blob, "actual");
addReq.onerror = () => {
addReject(addReq.error);
};
addReq.onsuccess = ev => {
addResolve(ev);
};
})
.then(() => {
const doneMessage = {
id: testId,
message: "write done",
expected: actual,
};
console.log("Sending parent " + JSON.stringify(doneMessage));
messageSink.postMessage(doneMessage, messageTarget);
})
.catch(err => {
console.log("Encountered error " + err.message);
messageSink.postMessage(
{ id: testId, message: err.message },
messageTarget
);
});
})
.catch(err => {
console.log("Sending parent error " + err.message);
messageSink.postMessage(
{ id: testId, message: err.message },
messageTarget
);
});
} else if (e.data.type === "FS") {
navigator.storage
.getDirectory()
.then(root => {
root.getFileHandle(testId, { create: true }).then(file => {
file.createWritable({}).then(writable => {
writable.write(actual).then(() => {
writable.close().then(() => {
const doneMessage = {
id: testId,
message: "write done",
expected: actual,
};
console.log("Sending parent " + JSON.stringify(doneMessage));
messageSink.postMessage(doneMessage, messageTarget);
});
});
});
});
})
.catch(err => {
console.log("Sending parent error " + err.message);
messageSink.postMessage(
{ id: testId, message: err.message },
messageTarget
);
});
} else {
throw Error("Unknown data type " + e.data.type);
}
} catch (err) {
console.log("Caught " + err.message);
messageSink.postMessage(
{ id: testId, message: err.message },
messageTarget
);
}
});