forked from mirrors/gecko-dev
		
	 2efeea8d73
			
		
	
	
		2efeea8d73
		
	
	
	
	
		
			
			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
		
			
				
	
	
		
			190 lines
		
	
	
	
		
			5.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			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();
 | |
| });
 |