Source code

Revision control

Copy as Markdown

Other Tools

Test Info: Warnings

/* Any copyright is dedicated to the Public Domain.
"use strict";
add_task(async function elevation_dialog() {
await SpecialPowers.pushPrefEnv({
set: [[PREF_APP_UPDATE_DISABLEDFORTESTING, false]],
});
// Create a mock of nsIAppStartup's quit method so clicking the restart button
// won't restart the application.
let { startup } = Services;
let appStartup = {
QueryInterface: ChromeUtils.generateQI(["nsIAppStartup"]),
quit(_mode) {
if (elevationDialog) {
elevationDialog.close();
elevationDialog = null;
}
},
};
Services.startup = appStartup;
registerCleanupFunction(() => {
Services.startup = startup;
});
registerCleanupFunction(async () => {
let win = Services.wm.getMostRecentWindow("Update:Elevation");
if (win) {
win.close();
await TestUtils.waitForCondition(
() => !Services.wm.getMostRecentWindow("Update:Elevation"),
"The Update Elevation dialog should have closed"
);
}
});
// Test clicking the "Restart Later" button
let elevationDialog = await waitForElevationDialog();
await TestUtils.waitForTick();
elevationDialog.document.getElementById("elevateExtra2").click();
await TestUtils.waitForCondition(
() => !Services.wm.getMostRecentWindow("Update:Elevation"),
"The Update Elevation dialog should have closed"
);
ok(!!gUpdateManager.readyUpdate, "There should be a ready update");
is(
gUpdateManager.readyUpdate.state,
STATE_PENDING_ELEVATE,
"The ready update state should equal " + STATE_PENDING_ELEVATE
);
is(
readStatusFile(),
STATE_PENDING_ELEVATE,
"The status file state should equal " + STATE_PENDING_ELEVATE
);
// Test clicking the "No Thanks" button
elevationDialog = await waitForElevationDialog();
await TestUtils.waitForTick();
elevationDialog.document.getElementById("elevateExtra1").click();
await TestUtils.waitForCondition(
() => !Services.wm.getMostRecentWindow("Update:Elevation"),
"The Update Elevation dialog should have closed"
);
ok(!gUpdateManager.readyUpdate, "There should not be a ready update");
is(
readStatusFile(),
STATE_NONE,
"The status file state should equal " + STATE_NONE
);
// Test clicking the "Restart <brandShortName>" button
elevationDialog = await waitForElevationDialog();
await TestUtils.waitForTick();
elevationDialog.document.getElementById("elevateAccept").click();
await TestUtils.waitForCondition(
() => !Services.wm.getMostRecentWindow("Update:Elevation"),
"The Update Elevation dialog should have closed"
);
ok(!!gUpdateManager.readyUpdate, "There should be a ready update");
is(
gUpdateManager.readyUpdate.state,
STATE_PENDING_ELEVATE,
"The active update state should equal " + STATE_PENDING_ELEVATE
);
is(
readStatusFile(),
STATE_PENDING,
"The status file state should equal " + STATE_PENDING
);
});
/**
* Waits for the Update Elevation Dialog to load.
*
* @return A promise that returns the domWindow for the Update Elevation Dialog
* and resolves when the Update Elevation Dialog loads.
*/
function waitForElevationDialog() {
return new Promise(resolve => {
var listener = {
onOpenWindow: aXULWindow => {
debugDump("Update Elevation dialog shown...");
Services.wm.removeListener(listener);
async function elevationDialogOnLoad() {
domwindow.removeEventListener("load", elevationDialogOnLoad, true);
let chromeURI =
is(
domwindow.document.location.href,
chromeURI,
"Update Elevation appeared"
);
resolve(domwindow);
}
var domwindow = aXULWindow.docShell.domWindow;
domwindow.addEventListener("load", elevationDialogOnLoad, true);
},
onCloseWindow: _aXULWindow => {},
};
Services.wm.addListener(listener);
// Add the active-update.xml and update.status files used for these tests,
// reload the update manager, and then simulate startup so the Update
// Elevation Dialog is opened.
let patchProps = { state: STATE_PENDING_ELEVATE };
let patches = getLocalPatchString(patchProps);
let updateProps = { checkInterval: "1" };
let updates = getLocalUpdateString(updateProps, patches);
writeUpdatesToXMLFile(getLocalUpdatesXMLString(updates), true);
writeStatusFile(STATE_PENDING_ELEVATE);
reloadUpdateManagerData();
testPostUpdateProcessing();
});
}