Source code

Revision control

Copy as Markdown

Other Tools

Test Info:

<title>Check StartupCache</title>
<meta charset="utf-8">
<script src="/tests/SimpleTest/SimpleTest.js"></script>
<script type="text/javascript" src="head.js"></script>
<link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
<script type="text/javascript">
"use strict";
// The startup canary file is removed sometime after the startup, with a delay,
// e.g. 30 seconds on desktop:
// e.g. up to 15 seconds (as an idle timeout) on Android:
// This test completes quickly if run sequentially after the many tests in this
// directory. Otherwise the test may wait for up to MAX_DELAY_SEC seconds.
const MAX_DELAY_SEC = 30;
SimpleTest.requestFlakyTimeout("trackStartupCrashEnd() is called with a delay");
// This test is not extension-specific, but placed in the extensions/ directory
// because it complements the test_check_startupcache.html test, and because
// the directory has many other tests, to minimize the amount of time wasted on
// waiting.
add_task(async function check_startup_canary() {
// The ".startup-incomplete" file is created at the startup, and supposedly
// cleared "soon" after startup (when the application knows that the startup
// succeeded without crash). Bug 1624724 and bug 1728461 show that this has
// not always been the case, so this regression test verifies that the file
// is actually non-existent when this test start, see
// This test is opened as a web page in the browser, so that should have been
// a point where the startup should have been considered done.
async function canaryExists() {
let chromeScript = loadChromeScript(async () => {
// This file is called FILE_STARTUP_INCOMPLETE in nsAppRunner.cpp and
// referenced via mozilla::startup::GetIncompleteStartupFile:
let file = Services.dirsvc.get("ProfLD", Ci.nsIFile);
this.sendAsyncMessage("canary_exists", file.exists());
let exists = await chromeScript.promiseOneMessage("canary_exists");
return exists;
info("Checking if startup canary exists");
let i = 0;
while (await canaryExists()) {
if (i++ > MAX_DELAY_SEC) {
info("Canary still exists, giving up on waiting");
info(`Startup canary exists, will retry ${i} / ${MAX_DELAY_SEC}.`);
await new Promise(resolve => setTimeout(resolve, 1000));
await canaryExists(),
"Startup canary should have been removed after early startup"