forked from mirrors/gecko-dev
		
	
		
			
				
	
	
		
			95 lines
		
	
	
	
		
			3.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			95 lines
		
	
	
	
		
			3.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| /* Any copyright is dedicated to the Public Domain.
 | |
|    http://creativecommons.org/publicdomain/zero/1.0/ */
 | |
| 
 | |
| /* This test records which services, JS components and JS modules are loaded
 | |
|  * when creating a new content process.
 | |
|  *
 | |
|  * If you made changes that cause this test to fail, it's likely because you
 | |
|  * are loading more JS code during content process startup.
 | |
|  *
 | |
|  * If your code isn't strictly required to show a page, consider loading it
 | |
|  * lazily. If you can't, consider delaying its load until after we have started
 | |
|  * handling user events.
 | |
|  */
 | |
| 
 | |
| "use strict";
 | |
| 
 | |
| /* Set this to true only for debugging purpose; it makes the output noisy. */
 | |
| const kDumpAllStacks = false;
 | |
| 
 | |
| const blacklist = {
 | |
|   components: new Set([
 | |
|     "PushComponents.js",
 | |
|     "TelemetryStartup.js",
 | |
|   ]),
 | |
|   modules: new Set([
 | |
|     "resource:///modules/ContentWebRTC.jsm",
 | |
|     "resource://gre/modules/InlineSpellChecker.jsm",
 | |
|     "resource://gre/modules/InlineSpellCheckerContent.jsm",
 | |
|     "resource://gre/modules/Promise.jsm",
 | |
|     "resource://gre/modules/Task.jsm",
 | |
|     "resource://gre/modules/debug.js",
 | |
|     "resource://gre/modules/osfile.jsm",
 | |
|   ]),
 | |
|   services: new Set([
 | |
|     "@mozilla.org/base/telemetry-startup;1",
 | |
|     "@mozilla.org/push/Service;1",
 | |
|   ])
 | |
| };
 | |
| 
 | |
| add_task(async function() {
 | |
|   SimpleTest.requestCompleteLog();
 | |
| 
 | |
|   let tab = await BrowserTestUtils.openNewForegroundTab({gBrowser,
 | |
|                                                          forceNewProcess: true});
 | |
| 
 | |
|   let mm = gBrowser.selectedBrowser.messageManager;
 | |
|   let promise = BrowserTestUtils.waitForMessage(mm, "Test:LoadedScripts");
 | |
| 
 | |
|   // Load a custom frame script to avoid using ContentTask which loads Task.jsm
 | |
|   mm.loadFrameScript("data:text/javascript,(" + function() {
 | |
|     /* eslint-env mozilla/frame-script */
 | |
|     const {classes: Cc, interfaces: Ci, manager: Cm, utils: Cu} = Components;
 | |
|     Cm.QueryInterface(Ci.nsIServiceManager);
 | |
|     Cu.import("resource://gre/modules/AppConstants.jsm");
 | |
|     let collectStacks = AppConstants.NIGHTLY_BUILD || AppConstants.DEBUG;
 | |
|     let loader = Cc["@mozilla.org/moz/jsloader;1"].getService(Ci.xpcIJSModuleLoader);
 | |
|     let components = {};
 | |
|     for (let component of loader.loadedComponents()) {
 | |
|       /* Keep only the file name for components, as the path is an absolute file
 | |
|          URL rather than a resource:// URL like for modules. */
 | |
|       components[component.replace(/.*\//, "")] =
 | |
|         collectStacks ? loader.getComponentLoadStack(component) : "";
 | |
|     }
 | |
|     let modules = {};
 | |
|     for (let module of loader.loadedModules()) {
 | |
|       modules[module] = collectStacks ? loader.getModuleImportStack(module) : "";
 | |
|     }
 | |
|     let services = {};
 | |
|     for (let contractID in Object.keys(Cc)) {
 | |
|       try {
 | |
|         if (Cm.isServiceInstantiatedByContractID(contractID, Ci.nsISupports))
 | |
|           services[contractID] = "";
 | |
|       } catch (e) {}
 | |
|     }
 | |
|     sendAsyncMessage("Test:LoadedScripts", {components, modules, services});
 | |
|   } + ")()", false);
 | |
| 
 | |
|   let loadedList = await promise;
 | |
|   for (let scriptType in blacklist) {
 | |
|     info(scriptType);
 | |
|     for (let file of blacklist[scriptType]) {
 | |
|       let loaded = file in loadedList[scriptType];
 | |
|       ok(!loaded, `${file} is not allowed`);
 | |
|       if (loaded && loadedList[scriptType][file])
 | |
|         info(loadedList[scriptType][file]);
 | |
|     }
 | |
|     for (let file in loadedList[scriptType]) {
 | |
|       info(file);
 | |
|       if (kDumpAllStacks && loadedList[scriptType][file])
 | |
|         info(loadedList[scriptType][file]);
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   await BrowserTestUtils.removeTab(tab);
 | |
| });
 | 
