function deleteThenOpen(dbName, upgradeFunc, bodyFunc) {
const deleteRequest = indexedDB.deleteDatabase(dbName);
deleteRequest.onerror = PerfTestRunner.logFatalError.bind('deleteDatabase should not fail');
deleteRequest.onsuccess = (e) => {
const openRequest = indexedDB.open(dbName);
openRequest.onupgradeneeded = () => {
upgradeFunc(openRequest.result, openRequest);
}
openRequest.onsuccess = () => {
bodyFunc(openRequest.result, openRequest);
}
openRequest.onerror = (e) => {
window.PerfTestRunner.logFatalError("Error setting up database " + dbName + ". Error: " + e.type);
}
}
}
// Non-performant on purpose - should cause relayouts.
function logToDocumentBody(stringOrStrings) {
let div = document.createElement("div");
document.body.appendChild(div);
if (Array.isArray(stringOrStrings)) {
for (let string of stringOrStrings) {
div.innerHTML += string;
}
} else {
div.innerHTML = stringOrStrings;
}
return div;
}
function createIncrementalBarrier(callback) {
let count = 0;
let called = false;
return () => {
if (called)
PerfTestRunner.logFatalError("Barrier already used.");
++count;
return () => {
--count;
if (count === 0) {
if (called)
PerfTestRunner.logFatalError("Barrier already used.");
called = true;
callback();
}
}
}
}
function transactionCompletePromise(txn) {
return new Promise((resolve, reject) => {
txn.oncomplete = resolve;
txn.onabort = reject;
});
}
function reportDone() {
window.parent.postMessage({
message: "done"
}, "*");
}
function reportError(event) {
console.log(event);
window.parent.postMessage({
message: "error",
data: event
}, "*", );
}
if (window.PerfTestRunner) {
// The file loaded here will signal a 'done' or 'error' message (see
// reportDone or reportError) which signifies the end of a test run.
window.PerfTestRunner.measurePageLoadTimeAfterDoneMessage = function(test) {
let isDone = false;
let outerDone = test.done;
test.done = (done) => {
isDone = true;
if (outerDone)
done();
}
test.run = () => {
let file = PerfTestRunner.loadFile(test.path);
let runOnce = function(finishedCallback) {
let startTime;
PerfTestRunner.logInfo("Testing " + file.length + " byte document.");
let iframe = document.createElement("iframe");
test.iframe = iframe;
document.body.appendChild(iframe);
iframe.sandbox = '';
// Prevent external loads which could cause write() to return before
// completing the parse.
iframe.style.width = "600px";
// Have a reasonable size so we're not line-breaking on every
// character.
iframe.style.height = "800px";
iframe.contentDocument.open();
let eventHandler = (event)=>{
if (event.data.message == undefined) {
console.log("Unknown message: ", event);
} else if (event.data.message == "done") {
PerfTestRunner.measureValueAsync(PerfTestRunner.now() - startTime);
PerfTestRunner.addRunTestEndMarker();
document.body.removeChild(test.iframe);
finishedCallback();
} else if (event.data.message == "error") {
console.log("Error in page", event.data.data);
PerfTestRunner.logFatalError("error in page: " + event.data.data.type);
} else {
console.log("Unknown message: ", event);
}
window.removeEventListener("message", eventHandler);
}
window.addEventListener("message", eventHandler, false);
PerfTestRunner.addRunTestStartMarker();
startTime = PerfTestRunner.now();
if (test.params)
iframe.contentWindow.params = test.params;
iframe.contentDocument.write(file);
PerfTestRunner.forceLayout(iframe.contentDocument);
iframe.contentDocument.close();
}
let iterationCallback = () => {
if (!isDone)
runOnce(iterationCallback);
}
runOnce(iterationCallback);
}
PerfTestRunner.startMeasureValuesAsync(test)
}
}