1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/toolkit/components/aboutmemory/tests/test_memoryReporters2.xul Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,104 @@ 1.4 +<?xml version="1.0"?> 1.5 +<?xml-stylesheet href="chrome://global/skin" type="text/css"?> 1.6 +<?xml-stylesheet href="chrome://mochikit/content/tests/SimpleTest/test.css" 1.7 + type="text/css"?> 1.8 +<window title="Memory reporters with child processes" 1.9 + xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"> 1.10 + <script type="application/javascript" 1.11 + src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"/> 1.12 + 1.13 + <!-- test results are displayed in the html:body --> 1.14 + <body xmlns="http://www.w3.org/1999/xhtml"> 1.15 + </body> 1.16 + 1.17 + <!-- test code goes here --> 1.18 + <script type="application/javascript"><![CDATA[ 1.19 + 1.20 + const Cc = Components.classes; 1.21 + const Ci = Components.interfaces; 1.22 + 1.23 + SimpleTest.waitForExplicitFinish(); 1.24 + 1.25 + let numRemotes = 3; 1.26 + let numReady = 0; 1.27 + 1.28 + // Create some remote processes, and set up message-passing so that 1.29 + // we know when each child is fully initialized. 1.30 + let remotes = []; 1.31 + SpecialPowers.pushPrefEnv({"set": [["dom.ipc.processCount", 3]]}, function() { 1.32 + for (let i = 0; i < numRemotes; i++) { 1.33 + let w = remotes[i] = window.open("remote.xul", "", "chrome"); 1.34 + 1.35 + w.addEventListener("load", function loadHandler() { 1.36 + w.removeEventListener("load", loadHandler); 1.37 + let remoteBrowser = w.document.getElementById("remote"); 1.38 + let mm = remoteBrowser.messageManager; 1.39 + mm.addMessageListener("test:ready", function readyHandler() { 1.40 + mm.removeMessageListener("test:ready", readyHandler); 1.41 + numReady++; 1.42 + if (numReady == numRemotes) { 1.43 + // All the remote processes are ready. Do memory reporting. 1.44 + doReports(); 1.45 + } 1.46 + }); 1.47 + mm.loadFrameScript("data:," + encodeURI("sendAsyncMessage('test:ready');"), true); 1.48 + }); 1.49 + } 1.50 + }); 1.51 + 1.52 + let mgr = Cc["@mozilla.org/memory-reporter-manager;1"]. 1.53 + getService(Ci.nsIMemoryReporterManager); 1.54 + 1.55 + function doReports() 1.56 + { 1.57 + let residents = {}; 1.58 + 1.59 + let handleReport = function(aProcess, aPath, aKind, aUnits, aAmount, aDesc) { 1.60 + if (aPath === "resident") { 1.61 + ok(100 * 1000 <= aAmount && aAmount <= 10 * 1000 * 1000 * 1000, 1.62 + "resident is reasonable"); 1.63 + residents[aProcess] = aAmount; 1.64 + } 1.65 + } 1.66 + 1.67 + let processReports = function() { 1.68 + // First, test a failure case: calling getReports() before the previous 1.69 + // getReports() has finished should silently abort. (And the arguments 1.70 + // won't be used.) 1.71 + mgr.getReports( 1.72 + () => ok(false, "handleReport called for nested getReports() call"), 1.73 + null, null, null 1.74 + ); 1.75 + 1.76 + // Close the remote processes. 1.77 + for (let i = 0; i < numRemotes; i++) { 1.78 + remotes[i].close(); 1.79 + } 1.80 + 1.81 + // Check the results. 1.82 + 1.83 + let processes = Object.keys(residents); 1.84 + ok(processes.length == numRemotes + 1, "correct resident count"); 1.85 + 1.86 + let numEmptyProcesses = 0, numNonEmptyProcesses = 0; 1.87 + for (let i = 0; i < processes.length; i++) { 1.88 + if (processes[i] == "") { 1.89 + numEmptyProcesses++; 1.90 + } else { 1.91 + ok(processes[i].startsWith("Browser ("), 1.92 + "correct non-empty process name prefix"); 1.93 + numNonEmptyProcesses++; 1.94 + } 1.95 + } 1.96 + ok(numEmptyProcesses == 1, "correct empty process name count"); 1.97 + ok(numNonEmptyProcesses == numRemotes, 1.98 + "correct non-empty process name count"); 1.99 + 1.100 + SimpleTest.finish(); 1.101 + } 1.102 + 1.103 + mgr.getReports(handleReport, null, processReports, null); 1.104 + } 1.105 + 1.106 + ]]></script> 1.107 +</window>