/* Any copyright is dedicated to the Public Domain. http://creativecommons.org/publicdomain/zero/1.0/ */ "use strict"; const appDomain = "example.org"; const manifestURL = location.protocol + "//" + appDomain + "/manifest.webapp"; function testSteps() { const objectStoreName = "foo"; const testKey = 1; const testValue = objectStoreName; // Determine whether the app and browser frames should be in or // out-of-process. let remote_app, remote_browser; if (window.location.href.indexOf("inproc_oop") != -1) { remote_app = false; remote_browser = true; } else if (window.location.href.indexOf("oop_inproc") != -1) { remote_app = true; remote_browser = false; } else if (window.location.href.indexOf("inproc_inproc") != -1) { remote_app = false; remote_browser = false; } else { ok(false, "Bad test filename!"); return; } let request = indexedDB.open(window.location.pathname, 1); request.onerror = errorHandler; request.onupgradeneeded = grabEventAndContinueHandler; request.onsuccess = unexpectedSuccessHandler; let event = yield undefined; let db = event.target.result; db.onerror = errorHandler; db.onversionchange = function(event) { event.target.close(); } let objectStore = db.createObjectStore(objectStoreName); objectStore.add(testValue, testKey); request.onsuccess = grabEventAndContinueHandler; event = yield undefined; // We need to send both remote_browser and remote_app in the querystring // because webapp_clearBrowserData_appFrame uses the path + querystring to // create and open a database which it checks no other test has touched. If // we sent only remote_browser, then we wouldn't be able to test both // (remote_app==false, remote_browser==false) and (remote_app==true, // remote_browser==false). let srcURL = location.protocol + "//" + appDomain + location.pathname.substring(0, location.pathname.lastIndexOf('/')) + "/webapp_clearBrowserData_appFrame.html?" + "remote_browser=" + remote_browser + "&" + "remote_app=" + remote_app; let iframe = document.createElement("iframe"); iframe.setAttribute("mozbrowser", ""); iframe.setAttribute("mozapp", manifestURL); iframe.setAttribute("src", srcURL); iframe.setAttribute("remote", remote_app); iframe.addEventListener("mozbrowsershowmodalprompt", function(event) { let message = JSON.parse(event.detail.message); switch (message.type) { case "info": case "ok": window[message.type].apply(window, message.args); break; case "done": continueToNextStepSync(); break; default: throw "unknown message"; } }); info("loading app frame"); document.body.appendChild(iframe); yield undefined; request = indexedDB.open(window.location.pathname, 1); request.onerror = errorHandler; request.onupgradeneeded = unexpectedSuccessHandler; request.onsuccess = grabEventAndContinueHandler; event = yield undefined; db = event.target.result; db.onerror = errorHandler; objectStore = db.transaction(objectStoreName).objectStore(objectStoreName); objectStore.get(testKey).onsuccess = grabEventAndContinueHandler; event = yield undefined; ok(testValue == event.target.result, "data still exists"); finishTest(); yield undefined; } function start() { if (!SpecialPowers.isMainProcess()) { todo(false, "Test disabled in child processes, for now"); SimpleTest.finish(); return; } SpecialPowers.addPermission("browser", true, document); SpecialPowers.addPermission("browser", true, { manifestURL: manifestURL, isInBrowserElement: false }); SpecialPowers.addPermission("embed-apps", true, document); SpecialPowers.setAllAppsLaunchable(true); window.addEventListener("unload", function cleanup(event) { if (event.target == document) { window.removeEventListener("unload", cleanup, false); SpecialPowers.removePermission("browser", location.href); SpecialPowers.removePermission("browser", location.protocol + "//" + appDomain); SpecialPowers.removePermission("embed-apps", location.href); } }, false); SpecialPowers.pushPrefEnv({ "set": [["dom.mozBrowserFramesEnabled", true]] }, runTest); }