Mercurial > hg > config
changeset 209:e39d514d0eff
wtf, pt2
author | Jeff Hammel <jhammel@mozilla.com> |
---|---|
date | Mon, 13 Feb 2012 16:24:40 -0800 |
parents | 3f290bcae11a |
children | 836cfff3e821 |
files | README chrome.manifest chrome/MozillaFileLogger.js chrome/memory.js chrome/pageloader.js chrome/pageloader.xul chrome/quit.js chrome/report.js components/tp-cmdline.js install.rdf |
diffstat | 10 files changed, 0 insertions(+), 1691 deletions(-) [+] |
line wrap: on
line diff
--- a/README Mon Feb 13 16:24:06 2012 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,81 +0,0 @@ -Pageload Test Component -======================= - -Usage: - - ./firefox -tp file:///path/to/manifest.txt [-tpargs...] - -See ./firefox -help for other arguments. - - -Manifest file format -==================== - -Comments in the manifest file start with a #. Each line may be: - -* a URL (absolute or relative to the manifest) - -This URL is added to the list of tests. - -* one or more flags, followed by whitespace, followed by a URL - -The only flag supported currently is '%', which indicates that -a test will do its own timing. (See Self-timing Tests below.) - -* "include" followed by whitespace, followed by a URL - -Parse the given manifest file. - -Self-timing Tests -================= - -Most timing tests are interested in timing how long it takes the page -to load; that is, from the start of page loading until the 'load' -event is dispatched. By default, this is what the pageloader will -time. However, if a test URL has the % flag, the test is expected to -report its own timing. For this purpose, the pageloader will provide -a function named "tpRecordTime" in the test's global object that it -should call once it has performed whatever timing it wants to do. -The given value will be used as the timing result for this test. - -Output format -============= - -The result is a dump to stdout via dump() -- -browser.dom.window.dump.enabled must be set to true in the profile. A -number of output formats can be specified via the -tpformat command -line option, currently 'js', 'text', and 'tinderbox' are supported. - -Sample 'js' format output: - -([({page:"1280x1024-PNG/index.html", value:133, stddev:20.049937655763422}),({page:"bugzilla.mozilla.org/index.html", value:233, stddev:36.66606060105176}),({page:"espn.go.com/index.html", value:117.6, stddev:1.2}),({page:"home.netscape.com/index.html", value:97.8, stddev:47.41898354035017}),]) - -Sample 'text' format output: - -============================================================ - Page mean stdd min max raw - 0 1280x1024-PNG/index.html 133 20 121 297 297,173,122,121,124,125 - 1 bugzilla.mozilla.org/index.html 233 37 192 395 395,273,223,192,198,279 - 2 espn.go.com/index.html 118 1 116 254 254,117,116,119,119,117 - 3 home.netscape.com/index.html 98 47 3 124 3,121,120,124,124,121 -============================================================ - -Sample 'tinderbox' format output: - -__start_tp_report -_x_x_mozilla_page_load,778.5,NaN,NaN -_x_x_mozilla_page_load_details,avgmedian|778.5|average|766.75|minimum|NaN|maximum|NaN|stddev|NaN|0;file:///c:/proj/mozilla-cvs/perf/tp2/base/www.cnn.com/index.html;778.5;766.75;722;1027;1027;788;777;722;780|... -__end_tp_report - -Note that the minimum, maximum, stddev are not calculated; they're -always reported as NaN. (They were the minimum and maximum values of -any sampled value, and the standard deviation across all sampled -values -- not very useful.) - -TODO -==== - -* Command line option to choose whether to run with or without browser chrome. Currently runs without. - -* Tinderbox-dropping style output - * better yet would be to teach tinderbox about JSON
--- a/chrome.manifest Mon Feb 13 16:24:06 2012 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,4 +0,0 @@ -content pageloader chrome/ -component {8AF052F5-8EFE-4359-8266-E16498A82E8B} components/tp-cmdline.js -contract @mozilla.org/commandlinehandler/general-startup;1?type=tp {8AF052F5-8EFE-4359-8266-E16498A82E8B} -category command-line-handler m-tp @mozilla.org/commandlinehandler/general-startup;1?type=tp
--- a/chrome/MozillaFileLogger.js Mon Feb 13 16:24:06 2012 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,153 +0,0 @@ -/** - * MozillaFileLogger, a log listener that can write to a local file. - */ - -var ipcMode = false; // running in e10s build and need to use IPC? -try { - netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect"); - var ipcsanity = Components.classes["@mozilla.org/preferences-service;1"] - .getService(Components.interfaces.nsIPrefBranch); - ipcsanity.setIntPref("mochitest.ipcmode", 0); -} catch (e) { - ipcMode = true; -} - -function contentDispatchEvent(type, data, sync) { - if (typeof(data) === "undefined") { - data = {}; - } - - var element = document.createEvent("datacontainerevent"); - element.initEvent("contentEvent", true, false); - element.setData("sync", sync); - element.setData("type", type); - element.setData("data", JSON.stringify(data)); - document.dispatchEvent(element); -} - -function contentSyncEvent(type, data) { - contentDispatchEvent(type, data, 1); -} - -function contentAsyncEvent(type, data) { - contentDispatchEvent(type, data, 0); -} - -try { - netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect"); - - if (Cc === undefined) { - var Cc = Components.classes; - var Ci = Components.interfaces; - } -} catch (ex) {} //running in ipcMode-chrome - -try { - const FOSTREAM_CID = "@mozilla.org/network/file-output-stream;1"; - const LF_CID = "@mozilla.org/file/local;1"; - - // File status flags. It is a bitwise OR of the following bit flags. - // Only one of the first three flags below may be used. - const PR_READ_ONLY = 0x01; // Open for reading only. - const PR_WRITE_ONLY = 0x02; // Open for writing only. - const PR_READ_WRITE = 0x04; // Open for reading and writing. - - // If the file does not exist, the file is created. - // If the file exists, this flag has no effect. - const PR_CREATE_FILE = 0x08; - - // The file pointer is set to the end of the file prior to each write. - const PR_APPEND = 0x10; - - // If the file exists, its length is truncated to 0. - const PR_TRUNCATE = 0x20; - - // If set, each write will wait for both the file data - // and file status to be physically updated. - const PR_SYNC = 0x40; - - // If the file does not exist, the file is created. If the file already - // exists, no action and NULL is returned. - const PR_EXCL = 0x80; -} catch (ex) { - // probably not running in the test harness -} - -/** Init the file logger with the absolute path to the file. - It will create and append if the file already exists **/ -var MozillaFileLogger = {}; - - -MozillaFileLogger.init = function(path) { - if (ipcMode) { - contentAsyncEvent("LoggerInit", {"filename": path}); - return; - } - - try { - netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect"); - } catch (ex) {} //running in ipcMode-chrome - - MozillaFileLogger._file = Cc[LF_CID].createInstance(Ci.nsILocalFile); - MozillaFileLogger._file.initWithPath(path); - MozillaFileLogger._foStream = Cc[FOSTREAM_CID].createInstance(Ci.nsIFileOutputStream); - MozillaFileLogger._foStream.init(this._file, PR_WRITE_ONLY | PR_CREATE_FILE | PR_APPEND, - 0664, 0); -} - -MozillaFileLogger.getLogCallback = function() { - if (ipcMode) { - return function(msg) { - contentAsyncEvent("Logger", {"num": msg.num, "level": msg.level, "info": msg.info.join(' ')}); - } - } - - return function (msg) { - try { - netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect"); - } catch(ex) {} //running in ipcMode-chrome - - var data = msg.num + " " + msg.level + " " + msg.info.join(' ') + "\n"; - if (MozillaFileLogger._foStream) - MozillaFileLogger._foStream.write(data, data.length); - - if (data.indexOf("SimpleTest FINISH") >= 0) { - MozillaFileLogger.close(); - } - } -} - -// This is only used from chrome space by the reftest harness -MozillaFileLogger.log = function(msg) { - netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect"); - if (MozillaFileLogger._foStream) - MozillaFileLogger._foStream.write(msg, msg.length); -} - -MozillaFileLogger.close = function() { - if (ipcMode) { - contentAsyncEvent("LoggerClose"); - return; - } - - try { - netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect"); - } catch(ex) {} //running in ipcMode-chrome - - if(MozillaFileLogger._foStream) - MozillaFileLogger._foStream.close(); - - MozillaFileLogger._foStream = null; - MozillaFileLogger._file = null; -} - -if (ipcMode == false) { - try { - var prefs = Components.classes['@mozilla.org/preferences-service;1'] - .getService(Components.interfaces.nsIPrefBranch2); - var filename = prefs.getCharPref('talos.logfile'); - MozillaFileLogger.init(filename); - } catch (ex) {} //pref does not exist, return empty string -} - -
--- a/chrome/memory.js Mon Feb 13 16:24:06 2012 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,95 +0,0 @@ - -var gChildProcess = true; -var gMemCallback = null; - - -/* - * Initialize memory collector. Determine if we have a child process. - */ -function initializeMemoryCollector(callback, args) { - gMemCallback = function() { return callback(args); }; - - var os = Components.classes["@mozilla.org/observer-service;1"]. - getService(Components.interfaces.nsIObserverService); - - os.addObserver(function () { - var os = Components.classes["@mozilla.org/observer-service;1"]. - getService(Components.interfaces.nsIObserverService); - - memTimer.cancel(); - memTimer = null; - - os.removeObserver(arguments.callee, "child-memory-reporter-update", false); - os.addObserver(collectAndReport, "child-memory-reporter-update", false); - gMemCallback(); - }, "child-memory-reporter-update", false); - - /* - * Assume we have a child process, but if timer fires before we call the observer - * we will assume there is no child process. - */ - var event = { - notify: function(timer) { - memTimer = null; - gChildProcess = false; - gMemCallback(); - } - } - - memTimer = Components.classes["@mozilla.org/timer;1"].createInstance(Components.interfaces.nsITimer); - memTimer.initWithCallback(event, 10000, Components.interfaces.nsITimer.TYPE_ONE_SHOT); - - os.notifyObservers(null, "child-memory-reporter-request", null); -} - -/* - * Collect memory from all processes and callback when done collecting. - */ -function collectMemory(callback, args) { - gMemCallback = function() { return callback(args); }; - - if (gChildProcess) { - var os = Components.classes["@mozilla.org/observer-service;1"]. - getService(Components.interfaces.nsIObserverService); - - os.notifyObservers(null, "child-memory-reporter-request", null); - } else { - collectAndReport(null, null, null); - } -} - -function collectAndReport(aSubject, aTopic, aData) { - dumpLine(collectRSS()); - gMemCallback(); -} - -function collectRSS() { - var mgr = Components.classes["@mozilla.org/memory-reporter-manager;1"]. - getService(Components.interfaces.nsIMemoryReporterManager); - var e = mgr.enumerateReporters(); - text = ""; - while (e.hasMoreElements()) { - var reporter = e.getNext().QueryInterface(Components.interfaces.nsIMemoryReporter); - if (reporter.path == 'resident') { - procName = reporter.process; - if (procName == '') - procName = "Main"; - - //For content process it is in the format "Content (<PID>)", we just want Content - procName = procName.split(' ')[0]; - text += "RSS: " + procName + ": " + reporter.amount + "\n"; - } - } - return text; -} - -/* - * Cleanup and stop memory collector. - */ -function stopMemCollector() { - if (gChildProcess) { - var os = Cc["@mozilla.org/observer-service;1"]. - getService(Ci.nsIObserverService); - os.removeObserver(collectAndReport, "child-memory-reporter-update"); - } -}
--- a/chrome/pageloader.js Mon Feb 13 16:24:06 2012 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,706 +0,0 @@ -/* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: MPL 1.1/GPL 2.0/LGPL 2.1 - * - * The contents of this file are subject to the Mozilla Public License Version - * 1.1 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * Software distributed under the License is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License - * for the specific language governing rights and limitations under the - * License. - * - * The Original Code is tp. - * - * The Initial Developer of the Original Code is - * Mozilla Corporation. - * Portions created by the Initial Developer are Copyright (C) 2007 - * the Initial Developer. All Rights Reserved. - * - * Contributor(s): - * Rob Helmer <rhelmer@mozilla.com> - * Vladimir Vukicevic <vladimir@mozilla.com> - * - * Alternatively, the contents of this file may be used under the terms of - * either the GNU General Public License Version 2 or later (the "GPL"), or - * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), - * in which case the provisions of the GPL or the LGPL are applicable instead - * of those above. If you wish to allow use of your version of this file only - * under the terms of either the GPL or the LGPL, and not to allow others to - * use your version of this file under the terms of the MPL, indicate your - * decision by deleting the provisions above and replace them with the notice - * and other provisions required by the GPL or the LGPL. If you do not delete - * the provisions above, a recipient may use your version of this file under - * the terms of any one of the MPL, the GPL or the LGPL. - * - * ***** END LICENSE BLOCK ***** */ - -try { - if (Cc === undefined) { - var Cc = Components.classes; - var Ci = Components.interfaces; - } -} catch (ex) {} - -var NUM_CYCLES = 5; - -var pageFilterRegexp = null; -var reportFormat = "js"; -var useBrowser = true; -var winWidth = 1024; -var winHeight = 768; - -var doRenderTest = false; - -var pages; -var pageIndex; -var start_time; -var cycle; -var report; -var renderReport; -var noisy = false; -var timeout = -1; -var delay = 250; -var timeoutEvent = -1; -var running = false; -var forceCC = true; -var reportRSS = false; - -var useMozAfterPaint = false; -var gPaintWindow = window; -var gPaintListener = false; - -//when TEST_DOES_OWN_TIMING, we need to store the time from the page as MozAfterPaint can be slower than pageload -var gTime = -1; -var gStartTime = -1; - -var content; - -var TEST_DOES_OWN_TIMING = 1; - -var browserWindow = null; - -// the io service -var gIOS = null; - -function plInit() { - if (running) { - return; - } - running = true; - - cycle = 0; - - try { - var args = window.arguments[0].wrappedJSObject; - - var manifestURI = args.manifest; - var startIndex = 0; - var endIndex = -1; - if (args.startIndex) startIndex = parseInt(args.startIndex); - if (args.endIndex) endIndex = parseInt(args.endIndex); - if (args.numCycles) NUM_CYCLES = parseInt(args.numCycles); - if (args.format) reportFormat = args.format; - if (args.width) winWidth = parseInt(args.width); - if (args.height) winHeight = parseInt(args.height); - if (args.filter) pageFilterRegexp = new RegExp(args.filter); - if (args.noisy) noisy = true; - if (args.timeout) timeout = parseInt(args.timeout); - if (args.delay) delay = parseInt(args.delay); - if (args.mozafterpaint) useMozAfterPaint = true; - if (args.rss) reportRSS = true; - - forceCC = !args.noForceCC; - doRenderTest = args.doRender; - - if (forceCC && - !window.QueryInterface(Components.interfaces.nsIInterfaceRequestor) - .getInterface(Components.interfaces.nsIDOMWindowUtils) - .garbageCollect) { - forceCC = false; - } - - gIOS = Cc["@mozilla.org/network/io-service;1"] - .getService(Ci.nsIIOService); - if (args.offline) - gIOS.offline = true; - var fileURI = gIOS.newURI(manifestURI, null, null); - pages = plLoadURLsFromURI(fileURI); - - if (!pages) { - dumpLine('tp: could not load URLs, quitting'); - plStop(true); - } - - if (pages.length == 0) { - dumpLine('tp: no pages to test, quitting'); - plStop(true); - } - - if (startIndex < 0) - startIndex = 0; - if (endIndex == -1 || endIndex >= pages.length) - endIndex = pages.length-1; - if (startIndex > endIndex) { - dumpLine("tp: error: startIndex >= endIndex"); - plStop(true); - } - - pages = pages.slice(startIndex,endIndex+1); - var pageUrls = pages.map(function(p) { return p.url.spec.toString(); }); - report = new Report(pageUrls); - - if (doRenderTest) - renderReport = new Report(pageUrls); - - pageIndex = 0; - - if (args.useBrowserChrome) { - var wwatch = Cc["@mozilla.org/embedcomp/window-watcher;1"] - .getService(Ci.nsIWindowWatcher); - var blank = Cc["@mozilla.org/supports-string;1"] - .createInstance(Ci.nsISupportsString); - blank.data = "about:blank"; - browserWindow = wwatch.openWindow - (null, "chrome://browser/content/", "_blank", - "chrome,all,dialog=no,width=" + winWidth + ",height=" + winHeight, blank); - - gPaintWindow = browserWindow; - // get our window out of the way - window.resizeTo(10,10); - - var browserLoadFunc = function (ev) { - browserWindow.removeEventListener('load', browserLoadFunc, true); - - // do this half a second after load, because we need to be - // able to resize the window and not have it get clobbered - // by the persisted values - setTimeout(function () { - browserWindow.resizeTo(winWidth, winHeight); - browserWindow.moveTo(0, 0); - browserWindow.focus(); - - content = browserWindow.getBrowser(); - - // Load the frame script for e10s / IPC message support - if (content.getAttribute("remote") == "true") { - let contentScript = "data:,function _contentLoadHandler(e) { " + - " if (e.originalTarget.defaultView == content) { " + - " content.wrappedJSObject.tpRecordTime = function(t, s) { sendAsyncMessage('PageLoader:RecordTime', { time: t, startTime: s }); }; "; - if (useMozAfterPaint) { - contentScript += "" + - "function _contentPaintHandler() { " + - " var utils = content.QueryInterface(Components.interfaces.nsIInterfaceRequestor).getInterface(Components.interfaces.nsIDOMWindowUtils); " + - " if (utils.isMozAfterPaintPending) { " + - " addEventListener('MozAfterPaint', function(e) { " + - " removeEventListener('MozAfterPaint', arguments.callee, true); " + - " sendAsyncMessage('PageLoader:MozAfterPaint', {}); " + - " }, true); " + - " } else { " + - " sendAsyncMessage('PageLoader:MozAfterPaint', {}); " + - " } " + - "}; " + - "content.wrappedJSObject.setTimeout(_contentPaintHandler, 0); "; - } else { - contentScript += " sendAsyncMessage('PageLoader:Load', {}); "; - } - contentScript += "" + - " }" + - "} " + - "addEventListener('load', _contentLoadHandler, true); "; - content.messageManager.loadFrameScript(contentScript, false); - } - if (reportRSS) { - initializeMemoryCollector(plLoadPage, 100); - } else { - setTimeout(plLoadPage, 100); - } - }, 500); - }; - - browserWindow.addEventListener('load', browserLoadFunc, true); - } else { - gPaintWindow = window; - window.resizeTo(winWidth, winHeight); - - content = document.getElementById('contentPageloader'); - - if (reportRSS) { - initializeMemoryCollector(plLoadPage, delay); - } else { - setTimeout(plLoadPage, delay); - } - } - } catch(e) { - dumpLine(e); - plStop(true); - } -} - -function plPageFlags() { - return pages[pageIndex].flags; -} - -// load the current page, start timing -var removeLastAddedListener = null; -var removeLastAddedMsgListener = null; -function plLoadPage() { - var pageName = pages[pageIndex].url.spec; - - if (removeLastAddedListener) - removeLastAddedListener(); - - if (removeLastAddedMsgListener) - removeLastAddedMsgListener(); - - if (plPageFlags() & TEST_DOES_OWN_TIMING) { - // if the page does its own timing, use a capturing handler - // to make sure that we can set up the function for content to call - - content.addEventListener('load', plLoadHandlerCapturing, true); - removeLastAddedListener = function() { - content.removeEventListener('load', plLoadHandlerCapturing, true); - if (useMozAfterPaint) { - content.removeEventListener("MozAfterPaint", plPaintedCapturing, true); - gPaintHandler = false; - } - }; - } else { - // if the page doesn't do its own timing, use a bubbling handler - // to make sure that we're called after the page's own onload() handling - - // XXX we use a capturing event here too -- load events don't bubble up - // to the <browser> element. See bug 390263. - content.addEventListener('load', plLoadHandler, true); - removeLastAddedListener = function() { - content.removeEventListener('load', plLoadHandler, true); - if (useMozAfterPaint) { - gPaintWindow.removeEventListener("MozAfterPaint", plPainted, true); - gPaintHandler = false; - } - }; - } - - // If the test browser is remote (e10s / IPC) we need to use messages to watch for page load - if (content.getAttribute("remote") == "true") { - content.messageManager.addMessageListener('PageLoader:Load', plLoadHandlerMessage); - content.messageManager.addMessageListener('PageLoader:RecordTime', plRecordTimeMessage); - if (useMozAfterPaint) - content.messageManager.addMessageListener('PageLoader:MozAfterPaint', plPaintHandler); - removeLastAddedMsgListener = function() { - content.messageManager.removeMessageListener('PageLoader:Load', plLoadHandlerMessage); - content.messageManager.removeMessageListener('PageLoader:RecordTime', plRecordTimeMessage); - if (useMozAfterPaint) - content.messageManager.removeMessageListener('PageLoader:MozAfterPaint', plPaintHandler); - }; - } - - if (timeout > 0) { - timeoutEvent = setTimeout('loadFail()', timeout); - } - if (reportRSS) { - collectMemory(startAndLoadURI, pageName); - } else { - startAndLoadURI(pageName); - } -} - -function startAndLoadURI(pageName) { - start_time = Date.now(); - content.loadURI(pageName); -} - -function loadFail() { - var pageName = pages[pageIndex].url.spec; - dumpLine("__FAILTimeout exceeded on " + pageName + "__FAIL") - plStop(true); -} - -function plNextPage() { - if (pageIndex < pages.length-1) { - pageIndex++; - - if (forceCC) { - var tccstart = new Date(); - window.QueryInterface(Components.interfaces.nsIInterfaceRequestor) - .getInterface(Components.interfaces.nsIDOMWindowUtils) - .garbageCollect(); - var tccend = new Date(); - report.recordCCTime(tccend - tccstart); - } - - setTimeout(plLoadPage, delay); - } else { - plStop(false); - } -} - -function plRecordTime(time) { - var pageName = pages[pageIndex].url.spec; - var i = pageIndex - if (i < pages.length-1) { - i++; - } else { - i = 0; - } - var nextName = pages[i].url.spec; - report.recordTime(pageIndex, time); - if (noisy) { - dumpLine("Cycle " + (cycle+1) + ": loaded " + pageName + " (next: " + nextName + ")"); - } -} - -function plLoadHandlerCapturing(evt) { - // make sure we pick up the right load event - if (evt.type != 'load' || - evt.originalTarget.defaultView.frameElement) - return; - - //set the tpRecordTime function (called from test pages we load to store a global time. - content.contentWindow.wrappedJSObject.tpRecordTime = function (time, startTime) { - gTime = time; - gStartTime = startTime; - setTimeout(plWaitForPaintingCapturing, 0); - } - - content.removeEventListener('load', plLoadHandlerCapturing, true); - - setTimeout(plWaitForPaintingCapturing, 0); -} - -function plWaitForPaintingCapturing() { - if (gPaintListener) - return; - - var utils = gPaintWindow.QueryInterface(Components.interfaces.nsIInterfaceRequestor) - .getInterface(Components.interfaces.nsIDOMWindowUtils); - - if (utils.isMozAfterPaintPending && useMozAfterPaint) { - if (gPaintListener == false) - gPaintWindow.addEventListener("MozAfterPaint", plPaintedCapturing, true); - gPaintListener = true; - return; - } - - _loadHandlerCapturing(); -} - -function plPaintedCapturing() { - gPaintWindow.removeEventListener("MozAfterPaint", plPaintedCapturing, true); - gPaintListener = false; - _loadHandlerCapturing(); -} - -function _loadHandlerCapturing() { - if (timeout > 0) { - clearTimeout(timeoutEvent); - } - - if (!(plPageFlags() & TEST_DOES_OWN_TIMING)) { - dumpLine("tp: Capturing onload handler used with page that doesn't do its own timing?"); - plStop(true); - } - - if (useMozAfterPaint) { - if (gStartTime != null && gStartTime >= 0) { - gTime = (new Date()) - gStartTime; - gStartTime = -1; - } - } - - // set up the function for content to call - if (gTime >= 0) { - plRecordTime(gTime); - gTime = -1; - setTimeout(plNextPage, delay); - }; -} - -// the onload handler -function plLoadHandler(evt) { - // make sure we pick up the right load event - if (evt.type != 'load' || - evt.originalTarget.defaultView.frameElement) - return; - - content.removeEventListener('load', plLoadHandler, true); - setTimeout(waitForPainted, 0); -} - -// This is called after we have received a load event, now we wait for painted -function waitForPainted() { - - var utils = gPaintWindow.QueryInterface(Components.interfaces.nsIInterfaceRequestor) - .getInterface(Components.interfaces.nsIDOMWindowUtils); - - if (!utils.isMozAfterPaintPending || !useMozAfterPaint) { - _loadHandler(); - return; - } - - if (gPaintListener == false) - gPaintWindow.addEventListener("MozAfterPaint", plPainted, true); - gPaintListener = true; -} - -function plPainted() { - gPaintWindow.removeEventListener("MozAfterPaint", plPainted, true); - gPaintListener = false; - _loadHandler(); -} - -function _loadHandler() { - if (timeout > 0) { - clearTimeout(timeoutEvent); - } - var docElem; - if (browserWindow) - docElem = browserWindow.frames["content"].document.documentElement; - else - docElem = content.contentDocument.documentElement; - var width; - if ("getBoundingClientRect" in docElem) { - width = docElem.getBoundingClientRect().width; - } else if ("offsetWidth" in docElem) { - width = docElem.offsetWidth; - } - - var end_time = Date.now(); - var time = (end_time - start_time); - - // does this page want to do its own timing? - // if so, we shouldn't be here - if (plPageFlags() & TEST_DOES_OWN_TIMING) { - dumpLine("tp: Bubbling onload handler used with page that does its own timing?"); - plStop(true); - } - - plRecordTime(time); - - if (doRenderTest) - runRenderTest(); - - plNextPage(); -} - -// the onload handler used for remote (e10s) browser -function plLoadHandlerMessage(message) { - _loadHandlerMessage(); -} - -// the mozafterpaint handler for remote (e10s) browser -function plPaintHandler(message) { - _loadHandlerMessage(); -} - -// the core handler for remote (e10s) browser -function _loadHandlerMessage() { - if (timeout > 0) { - clearTimeout(timeoutEvent); - } - - var time = -1; - - // does this page want to do its own timing? - if ((plPageFlags() & TEST_DOES_OWN_TIMING)) { - if (typeof(gStartTime) != "number") - gStartTime = Date.parse(gStartTime); - - if (gTime >= 0) { - if (useMozAfterPaint && gStartTime >= 0) { - gTime = Date.now() - gStartTime; - gStartTime = -1; - } else if (useMozAfterPaint) { - gTime = -1; - } - time = gTime; - gTime = -1; - } - - } else { - var end_time = Date.now(); - time = (end_time - start_time); - } - - if (time >= 0) { - plRecordTime(time); - if (doRenderTest) - runRenderTest(); - - plNextPage(); - } -} - -// the record time handler used for remote (e10s) browser -function plRecordTimeMessage(message) { - gTime = message.json.time; - if (useMozAfterPaint) { - gStartTime = message.json.startTime; - } - _loadHandlerMessage(); -} - -function runRenderTest() { - const redrawsPerSample = 500; - - if (!Ci.nsIDOMWindowUtils) - return; - - var win; - - if (browserWindow) - win = content.contentWindow; - else - win = window; - var wu = win.QueryInterface(Ci.nsIInterfaceRequestor).getInterface(Ci.nsIDOMWindowUtils); - - var start = Date.now(); - for (var j = 0; j < redrawsPerSample; j++) - wu.redraw(); - var end = Date.now(); - - renderReport.recordTime(pageIndex, end - start); -} - -function plStop(force) { - if (reportRSS) { - collectMemory(plStopAll, force); - } else { - plStopAll(force); - } -} - -function plStopAll(force) { - try { - if (force == false) { - pageIndex = 0; - if (cycle < NUM_CYCLES-1) { - cycle++; - setTimeout(plLoadPage, delay); - return; - } - - var formats = reportFormat.split(","); - - if (!renderReport) { - for each (var fmt in formats) - dumpLine(report.getReport(fmt)); - } - else { - dumpLine ("*************** Render report *******************"); - for each (var fmt in formats) - dumpLine(renderReport.getReport(fmt)); - } - } - } catch (e) { - dumpLine(e); - } - - if (reportRSS) { - stopMemCollector(); - } - - if (content) { - content.removeEventListener('load', plLoadHandlerCapturing, true); - content.removeEventListener('load', plLoadHandler, true); - if (useMozAfterPaint) - content.removeEventListener("MozAfterPaint", plPaintedCapturing, true); - content.removeEventListener("MozAfterPaint", plPainted, true); - - if (content.getAttribute("remote") == "true") { - content.messageManager.removeMessageListener('PageLoader:Load', plLoadHandlerMessage); - content.messageManager.removeMessageListener('PageLoader:RecordTime', plRecordTimeMessage); - if (useMozAfterPaint) - content.messageManager.removeMessageListener('PageLoader:MozAfterPaint', plPaintHandler); - - content.messageManager.loadFrameScript("data:,removeEventListener('load', _contentLoadHandler, true);", false); - } - } - - if (MozillaFileLogger) - MozillaFileLogger.close(); - - goQuitApplication(); -} - -/* Returns array */ -function plLoadURLsFromURI(manifestUri) { - var fstream = Cc["@mozilla.org/network/file-input-stream;1"] - .createInstance(Ci.nsIFileInputStream); - var uriFile = manifestUri.QueryInterface(Ci.nsIFileURL); - - fstream.init(uriFile.file, -1, 0, 0); - var lstream = fstream.QueryInterface(Ci.nsILineInputStream); - - var d = []; - - var lineNo = 0; - var line = {value:null}; - var more; - do { - lineNo++; - more = lstream.readLine(line); - var s = line.value; - - // strip comments - s = s.replace(/#.*/, ''); - - // strip leading and trailing whitespace - s = s.replace(/^\s*/, '').replace(/\s*$/, ''); - - if (!s) - continue; - - var flags = 0; - var urlspec = s; - - // split on whitespace, and figure out if we have any flags - var items = s.split(/\s+/); - if (items[0] == "include") { - if (items.length != 2) { - dumpLine("tp: Error on line " + lineNo + " in " + manifestUri.spec + ": include must be followed by the manifest to include!"); - return null; - } - - var subManifest = gIOS.newURI(items[1], null, manifestUri); - if (subManifest == null) { - dumpLine("tp: invalid URI on line " + manifestUri.spec + ":" + lineNo + " : '" + line.value + "'"); - return null; - } - - var subItems = plLoadURLsFromURI(subManifest); - if (subItems == null) - return null; - d = d.concat(subItems); - } else { - if (items.length == 2) { - if (items[0].indexOf("%") != -1) - flags |= TEST_DOES_OWN_TIMING; - - urlspec = items[1]; - } else if (items.length != 1) { - dumpLine("tp: Error on line " + lineNo + " in " + manifestUri.spec + ": whitespace must be %-escaped!"); - return null; - } - - var url = gIOS.newURI(urlspec, null, manifestUri); - - if (pageFilterRegexp && !pageFilterRegexp.test(url.spec)) - continue; - - d.push({ url: url, - flags: flags }); - } - } while (more); - - return d; -} - -function dumpLine(str) { - if (MozillaFileLogger) - MozillaFileLogger.log(str + "\n"); - dump(str); - dump("\n"); -}
--- a/chrome/pageloader.xul Mon Feb 13 16:24:06 2012 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,57 +0,0 @@ -<?xml version="1.0"?> -<!-- ***** BEGIN LICENSE BLOCK ***** - - Version: MPL 1.1/GPL 2.0/LGPL 2.1 - - - - The contents of this file are subject to the Mozilla Public License Version - - 1.1 (the "License"); you may not use this file except in compliance with - - the License. You may obtain a copy of the License at - - http://www.mozilla.org/MPL/ - - - - Software distributed under the License is distributed on an "AS IS" basis, - - WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License - - for the specific language governing rights and limitations under the - - License. - - - - The Original Code is tp. - - - - The Initial Developer of the Original Code is the Mozilla Corporation. - - Portions created by the Initial Developer are Copyright (C) 2007 - - the Initial Developer. All Rights Reserved. - - - - Contributor(s): - - Rob Helmer <rhelmer@mozilla.com> - - Vladimir Vukicevic <vladimir@mozilla.com> - - - - Alternatively, the contents of this file may be used under the terms of - - either the GNU General Public License Version 2 or later (the "GPL"), or - - the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), - - in which case the provisions of the GPL or the LGPL are applicable instead - - of those above. If you wish to allow use of your version of this file only - - under the terms of either the GPL or the LGPL, and not to allow others to - - use your version of this file under the terms of the MPL, indicate your - - decision by deleting the provisions above and replace them with the notice - - and other provisions required by the LGPL or the GPL. If you do not delete - - the provisions above, a recipient may use your version of this file under - - the terms of any one of the MPL, the GPL or the LGPL. - - - - ***** END LICENSE BLOCK ***** --> - -<?xml-stylesheet href="chrome://global/skin/" type="text/css"?> - -<window - xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" - title="pageloader" - screenX="0" screenY="0" - onload="plInit()"> - - <script type="application/x-javascript" - src="chrome://global/content/globalOverlay.js"/> - <script type="application/x-javascript" src="MozillaFileLogger.js"></script> - <script type="application/x-javascript" src="report.js"></script> - <script type="application/x-javascript" src="pageloader.js"></script> - <script type="application/x-javascript" src="quit.js"></script> - <script type="application/x-javascript" src="memory.js"></script> - - <browser id="contentPageloader" src="about:blank" - type="content" flex="1"/> -</window>
--- a/chrome/quit.js Mon Feb 13 16:24:06 2012 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,110 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; -*- */ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: MPL 1.1/GPL 2.0/LGPL 2.1 - * - * The contents of this file are subject to the Mozilla Public License Version - * 1.1 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * Software distributed under the License is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License - * for the specific language governing rights and limitations under the - * License. - * - * The Original Code is The Original Code is Mozilla Automated Testing Code - * - * The Initial Developer of the Original Code is - * Mozilla Corporation. - * Portions created by the Initial Developer are Copyright (C) 2005 - * the Initial Developer. All Rights Reserved. - * - * Contributor(s): Bob Clary <bob@bclary.com> - * - * Alternatively, the contents of this file may be used under the terms of - * either the GNU General Public License Version 2 or later (the "GPL"), or - * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), - * in which case the provisions of the GPL or the LGPL are applicable instead - * of those above. If you wish to allow use of your version of this file only - * under the terms of either the GPL or the LGPL, and not to allow others to - * use your version of this file under the terms of the MPL, indicate your - * decision by deleting the provisions above and replace them with the notice - * and other provisions required by the GPL or the LGPL. If you do not delete - * the provisions above, a recipient may use your version of this file under - * the terms of any one of the MPL, the GPL or the LGPL. - * - * ***** END LICENSE BLOCK ***** */ - -/* - From mozilla/toolkit/content - These files did not have a license -*/ - -function canQuitApplication() -{ - var os = Components.classes["@mozilla.org/observer-service;1"] - .getService(Components.interfaces.nsIObserverService); - if (!os) - { - return true; - } - - try - { - var cancelQuit = Components.classes["@mozilla.org/supports-PRBool;1"] - .createInstance(Components.interfaces.nsISupportsPRBool); - os.notifyObservers(cancelQuit, "quit-application-requested", null); - - // Something aborted the quit process. - if (cancelQuit.data) - { - return false; - } - } - catch (ex) - { - } - return true; -} - -function goQuitApplication() -{ - if (!canQuitApplication()) - { - return false; - } - - const kAppStartup = '@mozilla.org/toolkit/app-startup;1'; - const kAppShell = '@mozilla.org/appshell/appShellService;1'; - var appService; - var forceQuit; - - if (kAppStartup in Components.classes) - { - appService = Components.classes[kAppStartup]. - getService(Components.interfaces.nsIAppStartup); - forceQuit = Components.interfaces.nsIAppStartup.eForceQuit; - } - else if (kAppShell in Components.classes) - { - appService = Components.classes[kAppShell]. - getService(Components.interfaces.nsIAppShellService); - forceQuit = Components.interfaces.nsIAppShellService.eForceQuit; - } - else - { - throw 'goQuitApplication: no AppStartup/appShell'; - } - - try - { - appService.quit(forceQuit); - } - catch(ex) - { - throw('goQuitApplication: ' + ex); - } - - return true; -} -
--- a/chrome/report.js Mon Feb 13 16:24:06 2012 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,268 +0,0 @@ -/* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: MPL 1.1/GPL 2.0/LGPL 2.1 - * - * The contents of this file are subject to the Mozilla Public License Version - * 1.1 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * Software distributed under the License is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License - * for the specific language governing rights and limitations under the - * License. - * - * The Original Code is tp. - * - * The Initial Developer of the Original Code is - * Mozilla Corporation. - * Portions created by the Initial Developer are Copyright (C) 2007 - * the Initial Developer. All Rights Reserved. - * - * Contributor(s): - * Darin Fisher <darin@meer.net> - * Rob Helmer <rhelmer@mozilla.com> - * Vladimir Vukicevic <vladimir@mozilla.com> - * - * Alternatively, the contents of this file may be used under the terms of - * either the GNU General Public License Version 2 or later (the "GPL"), or - * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), - * in which case the provisions of the GPL or the LGPL are applicable instead - * of those above. If you wish to allow use of your version of this file only - * under the terms of either the GPL or the LGPL, and not to allow others to - * use your version of this file under the terms of the MPL, indicate your - * decision by deleting the provisions above and replace them with the notice - * and other provisions required by the GPL or the LGPL. If you do not delete - * the provisions above, a recipient may use your version of this file under - * the terms of any one of the MPL, the GPL or the LGPL. - * - * ***** END LICENSE BLOCK ***** */ - -// Constructor -function Report(pages) { - this.pages = pages; - this.timeVals = new Array(pages.length); // matrix of times - for (var i = 0; i < this.timeVals.length; ++i) { - this.timeVals[i] = new Array(); - } - this.totalCCTime = 0; - this.showTotalCCTime = false; -} - -// given an array of strings, finds the longest common prefix -function findCommonPrefixLength(strs) { - if (strs.length < 2) - return 0; - - var len = 0; - do { - var newlen = len + 1; - var newprefix = null; - var failed = false; - for (var i = 0; i < strs.length; i++) { - if (newlen > strs[i].length) { - failed = true; - break; - } - - var s = strs[i].substr(0, newlen); - if (newprefix == null) { - newprefix = s; - } else if (newprefix != s) { - failed = true; - break; - } - } - - if (failed) - break; - - len++; - } while (true); - return len; -} - -function compareNumbers(a, b) { - return a - b; -} - -// returns an object with the following properties: -// min : min value of array elements -// max : max value of array elements -// mean : mean value of array elements -// vari : variance computation -// stdd : standard deviation, sqrt(vari) -// indexOfMax : index of max element (the element that is -// removed from the mean computation) -function getArrayStats(ary) { - var r = {}; - r.min = ary[0]; - r.max = ary[0]; - r.indexOfMax = 0; - var sum = 0; - for (var i = 0; i < ary.length; ++i) { - if (ary[i] < r.min) { - r.min = ary[i]; - } else if (ary[i] > r.max) { - r.max = ary[i]; - r.indexOfMax = i; - } - sum = sum + ary[i]; - } - - // median - if (ary.length > 1) { - sorted_ary = ary.concat(); - sorted_ary.sort(compareNumbers); - // remove longest run - sorted_ary.pop(); - if (sorted_ary.length%2) { - r.median = sorted_ary[(sorted_ary.length-1)/2]; - }else{ - var n = Math.floor(sorted_ary.length / 2); - if (n >= sorted_ary.length) - r.median = sorted_ary[n]; - else - r.median = (sorted_ary[n-1] + sorted_ary[n]) / 2; - } - }else{ - r.median = ary[0]; - } - - // ignore max value when computing mean and stddev - if (ary.length > 1) - r.mean = (sum - r.max) / (ary.length - 1); - else - r.mean = ary[0]; - - r.vari = 0; - for (var i = 0; i < ary.length; ++i) { - if (i == r.indexOfMax) - continue; - var d = r.mean - ary[i]; - r.vari = r.vari + d * d; - } - - if (ary.length > 1) { - r.vari = r.vari / (ary.length - 1); - r.stdd = Math.sqrt(r.vari); - } else { - r.vari = 0.0; - r.stdd = 0.0; - } - return r; -} - -function strPad(o, len, left) { - var str = o.toString(); - if (!len) - len = 6; - if (left == null) - left = true; - - if (str.length < len) { - len -= str.length; - while (--len) { - if (left) - str = " " + str; - else - str += " "; - } - } - - str += " "; - return str; -} - -function strPadFixed(n, len, left) { - return strPad(n.toFixed(0), len, left); -} - -Report.prototype.getReport = function(format) { - // avg and avg median are cumulative for all the pages - var avgs = new Array(); - var medians = new Array(); - for (var i = 0; i < this.timeVals.length; ++i) { - avgs[i] = getArrayStats(this.timeVals[i]).mean; - medians[i] = getArrayStats(this.timeVals[i]).median; - } - var avg = getArrayStats(avgs).mean; - var avgmed = getArrayStats(medians).mean; - - var report; - - var prefixLen = findCommonPrefixLength(this.pages); - - if (format == "js") { - // output "simple" js format; - // array of { page: "str", value: 123.4, stddev: 23.3 } objects - report = "(["; - for (var i = 0; i < this.timeVals.length; i++) { - var stats = getArrayStats(this.timeVals[i]); - report += uneval({ page: this.pages[i].substr(prefixLen), value: stats.mean, stddev: stats.stdd}); - report += ","; - } - report += "])"; - } else if (format == "jsfull") { - // output "full" js format, with raw values - } else if (format == "text") { - // output text format suitable for dumping - report = "============================================================\n"; - report += " " + strPad("Page", 40, false) + strPad("mean") + strPad("stdd") + strPad("min") + strPad("max") + "raw" + "\n"; - for (var i = 0; i < this.timeVals.length; i++) { - var stats = getArrayStats(this.timeVals[i]); - report += - strPad(i, 4, true) + - strPad(this.pages[i].substr(prefixLen), 40, false) + - strPadFixed(stats.mean) + - strPadFixed(stats.stdd) + - strPadFixed(stats.min) + - strPadFixed(stats.max) + - this.timeVals[i] + - "\n"; - } - if (this.showTotalCCTime) { - report += "Cycle collection: " + this.totalCCTime + "\n" - } - report += "============================================================\n"; - } else if (format == "tinderbox") { - report = "__start_tp_report\n"; - report += "_x_x_mozilla_page_load,"+avgmed+",NaN,NaN\n"; // max and min are just 0, ignored - report += "_x_x_mozilla_page_load_details,avgmedian|"+avgmed+"|average|"+avg.toFixed(2)+"|minimum|NaN|maximum|NaN|stddev|NaN\n"; - report += "|i|pagename|median|mean|min|max|runs|\n"; - - for (var i = 0; i < this.timeVals.length; i++) { - var r = getArrayStats(this.timeVals[i]); - report += '|'+ - i + ';'+ - this.pages[i].substr(prefixLen) + ';'+ - r.median + ';'+ - r.mean + ';'+ - r.min + ';'+ - r.max + ';'+ - this.timeVals[i].join(";") + - "\n"; - } - report += "__end_tp_report\n"; - if (this.showTotalCCTime) { - report += "__start_cc_report\n"; - report += "_x_x_mozilla_cycle_collect," + this.totalCCTime + "\n"; - report += "__end_cc_report\n"; - } - var now = (new Date()).getTime(); - report += "__startTimestamp" + now + "__endTimestamp\n"; //timestamp for determning shutdown time, used by talos - } else { - report = "Unknown report format"; - } - - return report; -} - -Report.prototype.recordTime = function(pageIndex, ms) { - this.timeVals[pageIndex].push(ms); -} - -Report.prototype.recordCCTime = function(ms) { - this.totalCCTime += ms; - this.showTotalCCTime = true; -}
--- a/components/tp-cmdline.js Mon Feb 13 16:24:06 2012 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,197 +0,0 @@ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: MPL 1.1/GPL 2.0/LGPL 2.1 - * - * The contents of this file are subject to the Mozilla Public License Version - * 1.1 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * Software distributed under the License is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License - * for the specific language governing rights and limitations under the - * License. - * - * The Original Code is DOM Inspector. - * - * The Initial Developer of the Original Code is - * Christopher A. Aillon <christopher@aillon.com>. - * Portions created by the Initial Developer are Copyright (C) 2003 - * the Initial Developer. All Rights Reserved. - * - * Contributor(s): - * Christopher A. Aillon <christopher@aillon.com> - * L. David Baron, Mozilla Corporation <dbaron@dbaron.org> (modified for reftest) - * Vladimir Vukicevic, Mozilla Corporation <dbaron@dbaron.org> (modified for tp) - * - * Alternatively, the contents of this file may be used under the terms of - * either the GNU General Public License Version 2 or later (the "GPL"), or - * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), - * in which case the provisions of the GPL or the LGPL are applicable instead - * of those above. If you wish to allow use of your version of this file only - * under the terms of either the GPL or the LGPL, and not to allow others to - * use your version of this file under the terms of the MPL, indicate your - * decision by deleting the provisions above and replace them with the notice - * and other provisions required by the GPL or the LGPL. If you do not delete - * the provisions above, a recipient may use your version of this file under - * the terms of any one of the MPL, the GPL or the LGPL. - * - * ***** END LICENSE BLOCK ***** */ - -// This only implements nsICommandLineHandler, since it needs -// to handle multiple arguments. - -const TP_CMDLINE_CONTRACTID = "@mozilla.org/commandlinehandler/general-startup;1?type=tp"; -const TP_CMDLINE_CLSID = Components.ID('{8AF052F5-8EFE-4359-8266-E16498A82E8B}'); -const CATMAN_CONTRACTID = "@mozilla.org/categorymanager;1"; -const nsISupports = Components.interfaces.nsISupports; - -const nsICategoryManager = Components.interfaces.nsICategoryManager; -const nsICommandLine = Components.interfaces.nsICommandLine; -const nsICommandLineHandler = Components.interfaces.nsICommandLineHandler; -const nsIComponentRegistrar = Components.interfaces.nsIComponentRegistrar; -const nsISupportsString = Components.interfaces.nsISupportsString; -const nsIWindowWatcher = Components.interfaces.nsIWindowWatcher; - -function PageLoaderCmdLineHandler() {} -PageLoaderCmdLineHandler.prototype = -{ - /* nsISupports */ - QueryInterface : function handler_QI(iid) { - if (iid.equals(nsISupports)) - return this; - - if (nsICommandLineHandler && iid.equals(nsICommandLineHandler)) - return this; - - throw Components.results.NS_ERROR_NO_INTERFACE; - }, - - /* nsICommandLineHandler */ - handle : function handler_handle(cmdLine) { - var args = {}; - try { - var uristr = cmdLine.handleFlagWithParam("tp", false); - if (uristr == null) - return; - try { - args.manifest = cmdLine.resolveURI(uristr).spec; - } catch (e) { - return; - } - - args.numCycles = cmdLine.handleFlagWithParam("tpcycles", false); - args.startIndex = cmdLine.handleFlagWithParam("tpstart", false); - args.endIndex = cmdLine.handleFlagWithParam("tpend", false); - args.filter = cmdLine.handleFlagWithParam("tpfilter", false); - args.format = cmdLine.handleFlagWithParam("tpformat", false); - args.useBrowserChrome = cmdLine.handleFlag("tpchrome", false); - args.doRender = cmdLine.handleFlag("tprender", false); - args.width = cmdLine.handleFlagWithParam("tpwidth", false); - args.height = cmdLine.handleFlagWithParam("tpheight", false); - args.offline = cmdLine.handleFlag("tpoffline", false); - args.noisy = cmdLine.handleFlag("tpnoisy", false); - args.timeout = cmdLine.handleFlagWithParam("tptimeout", false); - args.delay = cmdLine.handleFlagWithParam("tpdelay", false); - args.noForceCC = cmdLine.handleFlag("tpnoforcecc", false); - args.mozafterpaint = cmdLine.handleFlag("tpmozafterpaint", false); - args.rss = cmdLine.handleFlag("rss", false); - } - catch (e) { - return; - } - - // get our data through xpconnect - args.wrappedJSObject = args; - - var wwatch = Components.classes["@mozilla.org/embedcomp/window-watcher;1"] - .getService(nsIWindowWatcher); - wwatch.openWindow(null, "chrome://pageloader/content/pageloader.xul", "_blank", - "chrome,dialog=no,all", args); - cmdLine.preventDefault = true; - }, - - helpInfo : - " -tp <file> Run pageload perf tests on given manifest\n" + - " -tpfilter str Only include pages from manifest that contain str (regexp)\n" + - " -tpcycles n Loop through pages n times\n" + - " -tpstart n Start at index n in the manifest\n" + - " -tpend n End with index n in the manifest\n" + - " -tpformat f1,f2,.. Report format(s) to use\n" + - " -tpchrome Test with normal browser chrome\n" + - " -tprender Run render-only benchmark for each page\n" + - " -tpwidth width Width of window\n" + - " -tpheight height Height of window\n" + - " -tpoffline Force offline mode\n" + - " -tpnoisy Dump the name of the last loaded page to console\n" + - " -tptimeout Max amount of time given for a page to load, quit if exceeded\n" + - " -tpdelay Amount of time to wait between each pageload\n" + - " -tpnoforcecc Don't force cycle collection between each pageload\n" + - " -tpmozafterpaint Measure Time after recieving MozAfterPaint event instead of load event\n" + - " -rss Dump RSS after each page is loaded\n" - -}; - - -var PageLoaderCmdLineFactory = -{ - createInstance : function(outer, iid) - { - if (outer != null) { - throw Components.results.NS_ERROR_NO_AGGREGATION; - } - - return new PageLoaderCmdLineHandler().QueryInterface(iid); - } -}; - -function NSGetFactory(cid) { - if (!cid.equals(TP_CMDLINE_CLSID)) - throw Components.results.NS_ERROR_NOT_IMPLEMENTED; - - return PageLoaderCmdLineFactory; -} - -var PageLoaderCmdLineModule = -{ - registerSelf : function(compMgr, fileSpec, location, type) - { - compMgr = compMgr.QueryInterface(nsIComponentRegistrar); - - compMgr.registerFactoryLocation(TP_CMDLINE_CLSID, - "PageLoader CommandLine Service", - TP_CMDLINE_CONTRACTID, - fileSpec, - location, - type); - - var catman = Components.classes[CATMAN_CONTRACTID].getService(nsICategoryManager); - catman.addCategoryEntry("command-line-handler", - "m-tp", - TP_CMDLINE_CONTRACTID, true, true); - }, - - unregisterSelf : function(compMgr, fileSpec, location) - { - compMgr = compMgr.QueryInterface(nsIComponentRegistrar); - - compMgr.unregisterFactoryLocation(TP_CMDLINE_CLSID, fileSpec); - catman = Components.classes[CATMAN_CONTRACTID].getService(nsICategoryManager); - catman.deleteCategoryEntry("command-line-handler", - "m-tp", true); - }, - - getClassObject : function(compMgr, cid, iid) - { - return NSGetFactory(cid); - }, - - canUnload : function(compMgr) - { - return true; - } -}; - - -function NSGetModule(compMgr, fileSpec) { - return PageLoaderCmdLineModule; -}
--- a/install.rdf Mon Feb 13 16:24:06 2012 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,20 +0,0 @@ -<?xml version="1.0"?> - -<RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:em="http://www.mozilla.org/2004/em-rdf#"> - <Description about="urn:mozilla:install-manifest"> - <em:id>pageloader@mozilla.org</em:id> - <em:version>1.0</em:version> - <em:targetApplication> - <Description> - <em:id>toolkit@mozilla.org</em:id> - <em:minVersion>2.0b3pre</em:minVersion> - <em:maxVersion>*</em:maxVersion> - </Description> - </em:targetApplication> - <!-- Front End MetaData --> - <em:name>PageLoader extension</em:name> - <em:description>Cycles through pages and measures load times</em:description> - <em:creator>Vladimir Vukicevic</em:creator> - </Description> -</RDF>