diff options
Diffstat (limited to 'browser/base/content/test/performance/StartupContentSubframe.jsm')
-rw-r--r-- | browser/base/content/test/performance/StartupContentSubframe.jsm | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/browser/base/content/test/performance/StartupContentSubframe.jsm b/browser/base/content/test/performance/StartupContentSubframe.jsm new file mode 100644 index 0000000000..79cd01d542 --- /dev/null +++ b/browser/base/content/test/performance/StartupContentSubframe.jsm @@ -0,0 +1,68 @@ +/* Any copyright is dedicated to the Public Domain. + http://creativecommons.org/publicdomain/zero/1.0/ */ + +/** + * test helper JSWindowActors used by the browser_startup_content_subframe.js test. + */ +const { Services } = ChromeUtils.import("resource://gre/modules/Services.jsm"); + +var EXPORTED_SYMBOLS = [ + "StartupContentSubframeParent", + "StartupContentSubframeChild", +]; + +class StartupContentSubframeParent extends JSWindowActorParent { + receiveMessage(msg) { + // Tell the test about the data we received from the content process. + Services.obs.notifyObservers( + msg.data, + "startup-content-subframe-loaded-scripts" + ); + } +} + +class StartupContentSubframeChild extends JSWindowActorChild { + async handleEvent(event) { + // When the remote subframe is loaded, an event will be fired to this actor, + // which will cause us to send the `LoadedScripts` message to the parent + // process. + // Wait a spin of the event loop before doing so to ensure we don't + // miss any scripts loaded immediately after the load event. + await new Promise(resolve => Services.tm.dispatchToMainThread(resolve)); + + const Cm = Components.manager; + Cm.QueryInterface(Ci.nsIServiceManager); + const { AppConstants } = ChromeUtils.import( + "resource://gre/modules/AppConstants.jsm" + ); + let collectStacks = AppConstants.NIGHTLY_BUILD || AppConstants.DEBUG; + + let components = {}; + for (let component of Cu.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 + ? Cu.getComponentLoadStack(component) + : ""; + } + + let modules = {}; + for (let module of Cu.loadedModules) { + modules[module] = collectStacks ? Cu.getModuleImportStack(module) : ""; + } + + let services = {}; + for (let contractID of Object.keys(Cc)) { + try { + if (Cm.isServiceInstantiatedByContractID(contractID, Ci.nsISupports)) { + services[contractID] = ""; + } + } catch (e) {} + } + this.sendAsyncMessage("LoadedScripts", { + components, + modules, + services, + }); + } +} |