mirror of
https://repo.dactyloidae.xyz/Dactyloidae/UXP.git
synced 2026-08-18 10:23:08 +09:00
258 lines
8.1 KiB
HTML
258 lines
8.1 KiB
HTML
<!DOCTYPE HTML>
|
|
<html>
|
|
<!--
|
|
This test reports Firefox memory use to Perfherder.
|
|
|
|
Inspired by https://areweslimyet.com/mobile
|
|
|
|
https://bugzilla.mozilla.org/show_bug.cgi?id=1233220
|
|
-->
|
|
<head>
|
|
<meta charset="utf-8">
|
|
<title>Test for Bug 1233220</title>
|
|
<script type="application/javascript" src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
|
|
<script type="application/javascript" src="chrome://mochikit/content/tests/SimpleTest/MemoryStats.js"></script>
|
|
<link rel="stylesheet" type="text/css" href="chrome://global/skin"/>
|
|
<link rel="stylesheet" type="text/css" href="chrome://mochikit/content/tests/SimpleTest/test.css"/>
|
|
<script type="application/javascript;version=1.8" src="head.js"></script>
|
|
<script type="application/javascript;version=1.8">
|
|
|
|
"use strict";
|
|
|
|
const { interfaces: Ci, utils: Cu, classes: Cc } = Components;
|
|
|
|
var kUrls = [
|
|
"http://mochi.test:8888/chrome/mobile/android/tests/browser/chrome/tp5/baidu.com/www.baidu.com/s@wd=mozilla.html",
|
|
"http://mochi.test:8888/chrome/mobile/android/tests/browser/chrome/tp5/twitter.com/twitter.com/ICHCheezburger.html",
|
|
"http://mochi.test:8888/chrome/mobile/android/tests/browser/chrome/tp5/msn.com/www.msn.com/index.html",
|
|
"http://mochi.test:8888/chrome/mobile/android/tests/browser/chrome/tp5/163.com/www.163.com/index.html",
|
|
"http://mochi.test:8888/chrome/mobile/android/tests/browser/chrome/tp5/bbc.co.uk/www.bbc.co.uk/news/index.html"
|
|
];
|
|
|
|
var gTabsOpened = 0;
|
|
var gWindow = null;
|
|
var gLastTab = null;
|
|
var gResults = [];
|
|
|
|
Cu.import("resource://gre/modules/Services.jsm");
|
|
|
|
var BrowserApp = Services.wm.getMostRecentWindow("navigator:browser").BrowserApp;
|
|
SimpleTest.waitForExplicitFinish();
|
|
SimpleTest.requestLongerTimeout(3); // several long waits and GCs make for a long-running test
|
|
SimpleTest.requestCompleteLog(); // so that "PERFHERDER_DATA" can be scraped from the log
|
|
|
|
function checkpoint(aName) {
|
|
var mrm = Cc["@mozilla.org/memory-reporter-manager;1"].getService(Ci.nsIMemoryReporterManager);
|
|
gResults.push( { name: aName, resident: mrm.resident } );
|
|
info(`${aName} | Resident Memory: ${mrm.resident}`);
|
|
}
|
|
|
|
var browserListener = {
|
|
onOpenWindow: function(aWindow) {
|
|
var win = aWindow.QueryInterface(Ci.nsIInterfaceRequestor).getInterface(Ci.nsIDOMWindow);
|
|
win.addEventListener("UIReady", function listener(aEvent) {
|
|
win.removeEventListener("UIReady", listener, false);
|
|
attachTo(win);
|
|
}, false);
|
|
},
|
|
|
|
onCloseWindow: function(aWindow) {
|
|
detachFrom(aWindow);
|
|
},
|
|
|
|
onWindowTitleChange: function(aWindow, aTitle) {
|
|
}
|
|
};
|
|
|
|
function doFullGc(aCallback, aIterations) {
|
|
var threadMan = Cc["@mozilla.org/thread-manager;1"].getService(Ci.nsIThreadManager);
|
|
var domWindowUtils = gWindow.QueryInterface(Components.interfaces.nsIInterfaceRequestor).getInterface(Components.interfaces.nsIDOMWindowUtils);
|
|
|
|
function runSoon(f) {
|
|
threadMan.mainThread.dispatch({ run: f }, Ci.nsIThread.DISPATCH_NORMAL);
|
|
}
|
|
|
|
function cc() {
|
|
if (domWindowUtils.cycleCollect) {
|
|
domWindowUtils.cycleCollect();
|
|
}
|
|
Services.obs.notifyObservers(null, "child-cc-request", null);
|
|
}
|
|
|
|
function minimizeInner() {
|
|
// In order of preference: schedulePreciseShrinkingGC, schedulePreciseGC
|
|
// garbageCollect
|
|
if (++j <= aIterations) {
|
|
var schedGC = Cu.schedulePreciseShrinkingGC;
|
|
if (!schedGC) {
|
|
schedGC = Cu.schedulePreciseGC;
|
|
}
|
|
|
|
Services.obs.notifyObservers(null, "child-gc-request", null);
|
|
|
|
if (schedGC) {
|
|
schedGC.call(Cu, { callback: function () {
|
|
runSoon(function () { cc(); runSoon(minimizeInner); });
|
|
} });
|
|
} else {
|
|
if (domWindowUtils.garbageCollect) {
|
|
domWindowUtils.garbageCollect();
|
|
}
|
|
runSoon(function () { cc(); runSoon(minimizeInner); });
|
|
}
|
|
} else {
|
|
runSoon(aCallback);
|
|
}
|
|
}
|
|
|
|
var j = 0;
|
|
minimizeInner();
|
|
}
|
|
|
|
function attachTo(aWindow) {
|
|
if (gWindow != null) {
|
|
info("attempting to attach to a second window [" + aWindow + "] while already attached to one window [" + gWindow + "]");
|
|
return;
|
|
}
|
|
gWindow = aWindow;
|
|
setTimeout(startTest, 0);
|
|
}
|
|
|
|
function detachFrom(aWindow) {
|
|
if (gWindow == aWindow) {
|
|
gWindow = null;
|
|
}
|
|
}
|
|
|
|
function startup() {
|
|
var enumerator = Services.wm.getEnumerator("navigator:browser");
|
|
while (enumerator.hasMoreElements()) {
|
|
// potential race condition here - the window may not be ready yet at
|
|
// this point, so ideally we would test for that. but i can't find a
|
|
// property that reflects whether or not UIReady has been fired, so
|
|
// for now just assume the window is ready
|
|
attachTo(enumerator.getNext().QueryInterface(Ci.nsIDOMWindow));
|
|
}
|
|
Services.wm.addListener(browserListener);
|
|
}
|
|
|
|
function startTest() {
|
|
checkpoint("Fresh start");
|
|
setTimeout(settle, 30000);
|
|
}
|
|
|
|
function settle() {
|
|
checkpoint("Fresh start [+30s]");
|
|
openTab();
|
|
}
|
|
|
|
function openTab() {
|
|
var urlIndex = gTabsOpened++;
|
|
if (urlIndex >= kUrls.length) {
|
|
checkpoint("After tabs");
|
|
setTimeout(postOpening, 30000);
|
|
return;
|
|
}
|
|
|
|
info("opening tab with url [" + kUrls[urlIndex] + "]");
|
|
gLastTab = BrowserApp.addTab(kUrls[urlIndex], { selected: true });
|
|
setTimeout(waitForTab, 10000);
|
|
}
|
|
|
|
function waitForTab() {
|
|
if (gLastTab.browser.contentDocument.readyState === "complete") {
|
|
gLastTab = null;
|
|
openTab();
|
|
} else {
|
|
setTimeout(waitForTab, 10000);
|
|
}
|
|
}
|
|
|
|
function postOpening() {
|
|
checkpoint("After tabs [+30s]");
|
|
doFullGc(() => closeTabs());
|
|
}
|
|
|
|
function closeTabs() {
|
|
checkpoint("After tabs [+30s, forced GC]");
|
|
var tabCount = BrowserApp.tabs.length;
|
|
for (var i = 1; i < tabCount; i++) {
|
|
BrowserApp.closeTab(BrowserApp.tabs[i]);
|
|
}
|
|
|
|
var closeListener = {
|
|
observe: function(aSubject, aTopic, aData) {
|
|
tabCount--;
|
|
dump("tab count dropped to [" + tabCount + "]");
|
|
if (tabCount == 1) {
|
|
Services.obs.removeObserver(this, "Tab:Closed", false);
|
|
setTimeout(tabsClosed, 0);
|
|
}
|
|
}
|
|
};
|
|
Services.obs.addObserver(closeListener, "Tab:Closed", false);
|
|
}
|
|
|
|
function tabsClosed() {
|
|
checkpoint("Tabs closed");
|
|
setTimeout(postClosing, 30000);
|
|
}
|
|
|
|
function postClosing() {
|
|
checkpoint("Tabs closed [+30s]");
|
|
doFullGc(() => {
|
|
checkpoint("Tabs closed [+30s, forced GC]");
|
|
finalReport();
|
|
ok(true, "memory logging complete -- view results in Perfherder");
|
|
SimpleTest.finish();
|
|
});
|
|
}
|
|
|
|
function geomean(aProperty) {
|
|
// https://en.wikipedia.org/wiki/Geometric_mean#Relationship_with_arithmetic_mean_of_logarithms
|
|
var logsum = 0;
|
|
var i;
|
|
for (i = 0; i < gResults.length; i++) {
|
|
var result = gResults[i];
|
|
logsum += Math.log(result[aProperty]);
|
|
}
|
|
return Math.round(Math.exp(logsum/gResults.length));
|
|
}
|
|
|
|
function finalReport() {
|
|
var i;
|
|
var perfherder = "PERFHERDER_DATA: ";
|
|
perfherder += "{\"framework\": {\"name\": \"awsy\"}, ";
|
|
perfherder += "\"suites\": [";
|
|
perfherder += "{\"name\": \"Resident Memory\", ";
|
|
perfherder += "\"subtests\": [";
|
|
for (i = 0; i < gResults.length; i++) {
|
|
var result = gResults[i];
|
|
if (i > 0) {
|
|
perfherder += ", ";
|
|
}
|
|
perfherder += `{\"name\": \"${result.name}\", \"value\": ${result.resident}}`;
|
|
}
|
|
perfherder += "], "; // end subtests
|
|
perfherder += "\"value\": "+geomean("resident");
|
|
perfherder += "}"; // end Resident Memory suite
|
|
perfherder += "]"; // end suites
|
|
perfherder += "}"; // end PERFHERDER_DATA
|
|
info(perfherder);
|
|
}
|
|
|
|
startup();
|
|
|
|
</script>
|
|
</head>
|
|
<body>
|
|
<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1233220">Mozilla Bug 1233220</a>
|
|
<br>
|
|
<p id="display"></p>
|
|
<div id="content" style="display: none">
|
|
|
|
</div>
|
|
<pre id="test">
|
|
</pre>
|
|
</body>
|
|
</html>
|