1 /* Any copyright is dedicated to the Public Domain.
2 * http://creativecommons.org/publicdomain/zero/1.0/ */
6 const Cm = Components.manager;
8 const uuidGenerator = Services.uuid;
10 const mockUpdateManager = {
11 contractId: "@mozilla.org/updates/update-manager;1",
13 _mockClassId: uuidGenerator.generateUUID(),
17 QueryInterface: ChromeUtils.generateQI(["nsIUpdateManager"]),
20 return this.QueryInterface(iiD);
24 let registrar = Cm.QueryInterface(Ci.nsIComponentRegistrar);
25 if (!registrar.isCIDRegistered(this._mockClassId)) {
26 this._originalClassId = registrar.contractIDToCID(this.contractId);
27 registrar.registerFactory(
29 "Unregister after testing",
37 let registrar = Cm.QueryInterface(Ci.nsIComponentRegistrar);
38 registrar.unregisterFactory(this._mockClassId, this);
39 registrar.registerFactory(this._originalClassId, "", this.contractId, null);
43 return [...this._updates];
48 name: "Firefox Developer Edition 49.0a2",
49 statusText: "The Update was successfully installed",
50 buildID: "20160728004010",
51 installDate: 1469763105156,
52 detailsURL: "https://www.mozilla.org/firefox/aurora/",
55 name: "Firefox Developer Edition 43.0a2",
56 statusText: "The Update was successfully installed",
57 buildID: "20150929004011",
58 installDate: 1443585886224,
59 detailsURL: "https://www.mozilla.org/firefox/aurora/",
62 name: "Firefox Developer Edition 42.0a2",
63 statusText: "The Update was successfully installed",
64 buildID: "20150920004018",
65 installDate: 1442818147544,
66 detailsURL: "https://www.mozilla.org/firefox/aurora/",
71 function formatInstallDate(sec) {
72 var date = new Date(sec);
81 return date.toLocaleString(undefined, dtOptions);
84 add_task(async function () {
85 await openPreferencesViaOpenPreferencesAPI("general", { leaveOpen: true });
86 let doc = gBrowser.selectedBrowser.contentDocument;
88 let showBtn = doc.getElementById("showUpdateHistory");
89 let dialogOverlay = content.gSubDialog._preloadDialog._overlay;
91 // XXX: For unknown reasons, this mock cannot be loaded by
92 // XPCOMUtils.defineLazyServiceGetter() called in aboutDialog-appUpdater.js.
93 // It is registered here so that we could assert update history subdialog
94 // without stopping the preferences advanced pane from loading.
96 mockUpdateManager.register();
98 // Test the dialog window opens
100 BrowserTestUtils.isHidden(dialogOverlay),
101 "The dialog should be invisible"
103 let promiseSubDialogLoaded = promiseLoadSubDialog(
104 "chrome://mozapps/content/update/history.xhtml"
107 await promiseSubDialogLoaded;
108 ok(!BrowserTestUtils.isHidden(dialogOverlay), "The dialog should be visible");
110 let dialogFrame = dialogOverlay.querySelector(".dialogFrame");
111 let frameDoc = dialogFrame.contentDocument;
112 let updates = frameDoc.querySelectorAll("richlistitem.update");
113 const history = await mockUpdateManager.getHistory();
115 // Test the update history numbers are correct
116 is(updates.length, history.length, "The update count is incorrect.");
118 // Test the updates are displayed correctly
120 let updateData = null;
121 for (let i = 0; i < updates.length; ++i) {
123 updateData = history[i];
127 selector: ".update-name",
128 id: "update-full-build-name",
129 args: { name: updateData.name, buildID: updateData.buildID },
132 selector: ".update-installedOn-label",
133 id: "update-installed-on",
134 args: { date: formatInstallDate(updateData.installDate) },
137 selector: ".update-status-label",
139 args: { status: updateData.statusText },
143 for (let { selector, id, args } of testcases) {
144 const element = update.querySelector(selector);
145 const l10nAttrs = frameDoc.l10n.getAttributes(element);
156 if (update.detailsURL) {
159 update.querySelector(".text-link").href,
165 // Test the dialog window closes
166 let closeBtn = dialogOverlay.querySelector(".dialogClose");
167 closeBtn.doCommand();
169 BrowserTestUtils.isHidden(dialogOverlay),
170 "The dialog should be invisible"
173 mockUpdateManager.unregister();
174 gBrowser.removeCurrentTab();