fune/browser/components/preferences/tests/browser_advanced_update.js
Emilio Cobos Álvarez 2efeea8d73 Bug 1674135 - Don't destroy frames from hideDialog() as we rely on printing hidden frames. r=Gijs,preferences-reviewers
Using `visibility` preserves frames of the content inside the dialog,
which we rely on to print the preview `<browser>` element.

This was working before bug 1662336 mostly by chance, because we were
doing an extra clone and that happened to mostly not rely on the cloned
document being rendered.

I'd rather fix it in the front-end (by not trying to print a
`display: none` <browser>) than going back to do a separate clone,
because that can get expensive (specially with fission).

It's not super-clear to me how to best test the "print from system
dialog" case, but ideas certainly welcome.

Differential Revision: https://phabricator.services.mozilla.com/D95501
2020-11-04 11:03:48 +00:00

190 lines
5.1 KiB
JavaScript

/* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/publicdomain/zero/1.0/ */
"use strict";
const Cm = Components.manager;
const uuidGenerator = Cc["@mozilla.org/uuid-generator;1"].getService(
Ci.nsIUUIDGenerator
);
const mockUpdateManager = {
contractId: "@mozilla.org/updates/update-manager;1",
_mockClassId: uuidGenerator.generateUUID(),
_originalClassId: "",
QueryInterface: ChromeUtils.generateQI(["nsIUpdateManager"]),
createInstance(outer, iiD) {
if (outer) {
throw Components.Exception("", Cr.NS_ERROR_NO_AGGREGATION);
}
return this.QueryInterface(iiD);
},
register() {
let registrar = Cm.QueryInterface(Ci.nsIComponentRegistrar);
if (!registrar.isCIDRegistered(this._mockClassId)) {
this._originalClassId = registrar.contractIDToCID(this.contractId);
registrar.registerFactory(
this._mockClassId,
"Unregister after testing",
this.contractId,
this
);
}
},
unregister() {
let registrar = Cm.QueryInterface(Ci.nsIComponentRegistrar);
registrar.unregisterFactory(this._mockClassId, this);
registrar.registerFactory(this._originalClassId, "", this.contractId, null);
},
getUpdateCount() {
return this._updates.length;
},
getUpdateAt(index) {
return this._updates[index];
},
_updates: [
{
name: "Firefox Developer Edition 49.0a2",
statusText: "The Update was successfully installed",
buildID: "20160728004010",
installDate: 1469763105156,
detailsURL: "https://www.mozilla.org/firefox/aurora/",
},
{
name: "Firefox Developer Edition 43.0a2",
statusText: "The Update was successfully installed",
buildID: "20150929004011",
installDate: 1443585886224,
detailsURL: "https://www.mozilla.org/firefox/aurora/",
},
{
name: "Firefox Developer Edition 42.0a2",
statusText: "The Update was successfully installed",
buildID: "20150920004018",
installDate: 1442818147544,
detailsURL: "https://www.mozilla.org/firefox/aurora/",
},
],
};
function formatInstallDate(sec) {
var date = new Date(sec);
const dtOptions = {
year: "numeric",
month: "long",
day: "numeric",
hour: "numeric",
minute: "numeric",
second: "numeric",
};
return date.toLocaleString(undefined, dtOptions);
}
add_task(async function() {
await openPreferencesViaOpenPreferencesAPI("general", { leaveOpen: true });
let doc = gBrowser.selectedBrowser.contentDocument;
let showBtn = doc.getElementById("showUpdateHistory");
let dialogOverlay = content.gSubDialog._preloadDialog._overlay;
// XXX: For unknown reasons, this mock cannot be loaded by
// XPCOMUtils.defineLazyServiceGetter() called in aboutDialog-appUpdater.js.
// It is registered here so that we could assert update history subdialog
// without stopping the preferences advanced pane from loading.
// See bug 1361929.
mockUpdateManager.register();
// Test the dialog window opens
ok(
BrowserTestUtils.is_hidden(dialogOverlay),
"The dialog should be invisible"
);
let promiseSubDialogLoaded = promiseLoadSubDialog(
"chrome://mozapps/content/update/history.xhtml"
);
showBtn.doCommand();
await promiseSubDialogLoaded;
ok(
!BrowserTestUtils.is_hidden(dialogOverlay),
"The dialog should be visible"
);
let dialogFrame = dialogOverlay.querySelector(".dialogFrame");
let frameDoc = dialogFrame.contentDocument;
let updates = frameDoc.querySelectorAll("richlistitem.update");
// Test the update history numbers are correct
is(
updates.length,
mockUpdateManager.getUpdateCount(),
"The update count is incorrect."
);
// Test the updates are displayed correctly
let update = null;
let updateData = null;
for (let i = 0; i < updates.length; ++i) {
update = updates[i];
updateData = mockUpdateManager.getUpdateAt(i);
let testcases = [
{
selector: ".update-name",
id: "update-full-build-name",
args: { name: updateData.name, buildID: updateData.buildID },
},
{
selector: ".update-installedOn-label",
id: "update-installed-on",
args: { date: formatInstallDate(updateData.installDate) },
},
{
selector: ".update-status-label",
id: "update-status",
args: { status: updateData.statusText },
},
];
for (let { selector, id, args } of testcases) {
const element = update.querySelector(selector);
const l10nAttrs = frameDoc.l10n.getAttributes(element);
Assert.deepEqual(
l10nAttrs,
{
id,
args,
},
"Wrong " + id
);
}
if (update.detailsURL) {
is(
update.detailsURL,
update.querySelector(".text-link").href,
"Wrong detailsURL"
);
}
}
// Test the dialog window closes
let closeBtn = dialogOverlay.querySelector(".dialogClose");
closeBtn.doCommand();
ok(
BrowserTestUtils.is_hidden(dialogOverlay),
"The dialog should be invisible"
);
mockUpdateManager.unregister();
gBrowser.removeCurrentTab();
});