forked from mirrors/gecko-dev
		
	 93a0510070
			
		
	
	
		93a0510070
		
	
	
	
	
		
			
			With the patches of bug 1815229, these errors appear: browser/base/content/test/performance/browser_startup_images.js | Loaded image resource://gre-resources/loading-image.png should have been shown It's a real issue, where we eagerly load the broken image icon and so on even though we don't use them. This fixes it by lazily-loading the icon once, only when needed. Differential Revision: https://phabricator.services.mozilla.com/D170159
		
			
				
	
	
		
			136 lines
		
	
	
	
		
			4.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			136 lines
		
	
	
	
		
			4.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| /* Any copyright is dedicated to the Public Domain.
 | |
|    http://creativecommons.org/publicdomain/zero/1.0/ */
 | |
| 
 | |
| "use strict";
 | |
| 
 | |
| /**
 | |
|  * This test checks that any images we load on startup are actually used,
 | |
|  * so we don't waste IO and cycles loading images the user doesn't see.
 | |
|  * It has a list of known problematic images that we aim to reduce to
 | |
|  * empty.
 | |
|  */
 | |
| 
 | |
| /* A list of images that are loaded at startup but not shown.
 | |
|  * List items support the following attributes:
 | |
|  *  - file: The location of the loaded image file.
 | |
|  *  - hidpi: An alternative hidpi file location for retina screens, if one exists.
 | |
|  *           May be the magic string <not loaded> in strange cases where
 | |
|  *           only the low-resolution image is loaded but not shown.
 | |
|  *  - platforms: An array of the platforms where the issue is occurring.
 | |
|  *               Possible values are linux, win, macosx.
 | |
|  *  - intermittentNotLoaded: an array of platforms where this image is
 | |
|  *                           intermittently not loaded, e.g. because it is
 | |
|  *                           loaded during the time we stop recording.
 | |
|  *  - intermittentShown: An array of platforms where this image is
 | |
|  *                       intermittently shown, even though the list implies
 | |
|  *                       it might not be shown.
 | |
|  *
 | |
|  * PLEASE do not add items to this list.
 | |
|  *
 | |
|  * PLEASE DO remove items from this list.
 | |
|  */
 | |
| const knownUnshownImages = [
 | |
|   {
 | |
|     file: "chrome://global/skin/icons/arrow-left.svg",
 | |
|     platforms: ["linux", "win", "macosx"],
 | |
|   },
 | |
| 
 | |
|   {
 | |
|     file: "chrome://browser/skin/toolbar-drag-indicator.svg",
 | |
|     platforms: ["linux", "win", "macosx"],
 | |
|   },
 | |
| 
 | |
|   {
 | |
|     file: "chrome://global/skin/icons/chevron.svg",
 | |
|     platforms: ["win", "linux", "macosx"],
 | |
|     intermittentShown: ["win", "linux"],
 | |
|   },
 | |
| 
 | |
|   {
 | |
|     file: "chrome://browser/skin/window-controls/maximize.svg",
 | |
|     platforms: ["win"],
 | |
|     // This is to prevent perma-fails in case Windows machines
 | |
|     // go back to running tests in non-maximized windows.
 | |
|     intermittentShown: ["win"],
 | |
|     // This file is not loaded on Windows 7/8.
 | |
|     intermittentNotLoaded: ["win"],
 | |
|   },
 | |
| ];
 | |
| 
 | |
| add_task(async function() {
 | |
|   if (!AppConstants.DEBUG) {
 | |
|     ok(false, "You need to run this test on a debug build.");
 | |
|   }
 | |
| 
 | |
|   let startupRecorder = Cc["@mozilla.org/test/startuprecorder;1"].getService()
 | |
|     .wrappedJSObject;
 | |
|   await startupRecorder.done;
 | |
| 
 | |
|   let data = Cu.cloneInto(startupRecorder.data.images, {});
 | |
|   let knownImagesForPlatform = knownUnshownImages.filter(el => {
 | |
|     return el.platforms.includes(AppConstants.platform);
 | |
|   });
 | |
| 
 | |
|   {
 | |
|     let results = await PerfTestHelpers.throttledMapPromises(
 | |
|       knownImagesForPlatform,
 | |
|       async image => ({
 | |
|         uri: image.file,
 | |
|         exists: await PerfTestHelpers.checkURIExists(image.file),
 | |
|       })
 | |
|     );
 | |
|     for (let { uri, exists } of results) {
 | |
|       ok(exists, `Unshown image entry ${uri} must exist`);
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   let loadedImages = data["image-loading"];
 | |
|   let shownImages = data["image-drawing"];
 | |
| 
 | |
|   for (let loaded of loadedImages.values()) {
 | |
|     let knownImage = knownImagesForPlatform.find(el => {
 | |
|       if (window.devicePixelRatio >= 2 && el.hidpi && el.hidpi == loaded) {
 | |
|         return true;
 | |
|       }
 | |
|       return el.file == loaded;
 | |
|     });
 | |
|     if (knownImage) {
 | |
|       if (
 | |
|         !knownImage.intermittentShown ||
 | |
|         !knownImage.intermittentShown.includes(AppConstants.platform)
 | |
|       ) {
 | |
|         todo(
 | |
|           shownImages.has(loaded),
 | |
|           `Image ${loaded} should not have been shown.`
 | |
|         );
 | |
|       }
 | |
|       continue;
 | |
|     }
 | |
|     ok(
 | |
|       shownImages.has(loaded),
 | |
|       `Loaded image ${loaded} should have been shown.`
 | |
|     );
 | |
|   }
 | |
| 
 | |
|   // Check for known images that are no longer used.
 | |
|   for (let item of knownImagesForPlatform) {
 | |
|     if (
 | |
|       !item.intermittentNotLoaded ||
 | |
|       !item.intermittentNotLoaded.includes(AppConstants.platform)
 | |
|     ) {
 | |
|       if (window.devicePixelRatio >= 2 && item.hidpi) {
 | |
|         if (item.hidpi != "<not loaded>") {
 | |
|           ok(
 | |
|             loadedImages.has(item.hidpi),
 | |
|             `Image ${item.hidpi} should have been loaded.`
 | |
|           );
 | |
|         }
 | |
|       } else {
 | |
|         ok(
 | |
|           loadedImages.has(item.file),
 | |
|           `Image ${item.file} should have been loaded.`
 | |
|         );
 | |
|       }
 | |
|     }
 | |
|   }
 | |
| });
 |