summaryrefslogtreecommitdiffstats
path: root/dom/xslt/tests/XSLTMark
diff options
context:
space:
mode:
Diffstat (limited to 'dom/xslt/tests/XSLTMark')
-rw-r--r--dom/xslt/tests/XSLTMark/XSLTMark-static.js49
-rw-r--r--dom/xslt/tests/XSLTMark/XSLTMark-test.js46
-rw-r--r--dom/xslt/tests/XSLTMark/XSLTMark-view.js175
-rw-r--r--dom/xslt/tests/XSLTMark/XSLTMark.css8
-rw-r--r--dom/xslt/tests/XSLTMark/XSLTMark.xul52
5 files changed, 330 insertions, 0 deletions
diff --git a/dom/xslt/tests/XSLTMark/XSLTMark-static.js b/dom/xslt/tests/XSLTMark/XSLTMark-static.js
new file mode 100644
index 000000000..d3284aac8
--- /dev/null
+++ b/dom/xslt/tests/XSLTMark/XSLTMark-static.js
@@ -0,0 +1,49 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 4 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+const enablePrivilege = netscape.security.PrivilegeManager.enablePrivilege;
+const IOSERVICE_CTRID = "@mozilla.org/network/io-service;1";
+const nsIIOService = Components.interfaces.nsIIOService;
+const SIS_CTRID = "@mozilla.org/scriptableinputstream;1";
+const nsISIS = Components.interfaces.nsIScriptableInputStream;
+const nsIFilePicker = Components.interfaces.nsIFilePicker;
+const STDURL_CTRID = "@mozilla.org/network/standard-url;1";
+const nsIURI = Components.interfaces.nsIURI;
+
+Components.utils.import("resource://gre/modules/NetUtil.jsm");
+
+var gStop = false;
+
+function loadFile(aUriSpec)
+{
+ enablePrivilege('UniversalXPConnect');
+ var serv = Components.classes[IOSERVICE_CTRID].
+ getService(nsIIOService);
+ if (!serv) {
+ throw Components.results.ERR_FAILURE;
+ }
+ var chan = NetUtil.newChannel({
+ uri: aUriSpec,
+ loadUsingSystemPrincipal: true
+ });
+ var instream =
+ Components.classes[SIS_CTRID].createInstance(nsISIS);
+ instream.init(chan.open2());
+
+ return instream.read(instream.available());
+}
+
+function dump20(aVal)
+{
+ const pads = ' ';
+ if (typeof(aVal)=='string')
+ out = aVal;
+ else if (typeof(aVal)=='number')
+ out = Number(aVal).toFixed(2);
+ else
+ out = new String(aVal);
+ dump(pads.substring(0, 20 - out.length));
+ dump(out);
+}
diff --git a/dom/xslt/tests/XSLTMark/XSLTMark-test.js b/dom/xslt/tests/XSLTMark/XSLTMark-test.js
new file mode 100644
index 000000000..4037c75e4
--- /dev/null
+++ b/dom/xslt/tests/XSLTMark/XSLTMark-test.js
@@ -0,0 +1,46 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 4 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+var gParser = new DOMParser;
+var gTimeout;
+
+function Test(aTitle, aSourceURL, aStyleURL, aNumber, aObserver)
+{
+ this.mTitle = aTitle;
+ this.mObserver = aObserver;
+ this.mTotal = aNumber;
+ this.mDone = 0;
+ var xmlcontent = loadFile(aSourceURL);
+ var xslcontent = loadFile(aStyleURL);
+ this.mSource = gParser.parseFromString(xmlcontent, 'application/xml');
+ this.mStyle = gParser.parseFromString(xslcontent, 'application/xml');
+}
+
+function runTest(aTitle, aSourceURL, aStyleURL, aNumber, aObserver)
+{
+ test = new Test(aTitle, aSourceURL, aStyleURL, aNumber,
+ aObserver);
+ gTimeout = setTimeout(onNextTransform, 100, test, 0);
+}
+
+function onNextTransform(aTest, aNumber)
+{
+ var proc = new XSLTProcessor;
+ var startTime = Date.now();
+ proc.importStylesheet(aTest.mStyle);
+ var res = proc.transformToDocument(aTest.mSource);
+ var endTime = Date.now();
+ aNumber++;
+ var progress = aNumber / aTest.mTotal * 100;
+ if (aTest.mObserver) {
+ aTest.mObserver.progress(aTest.mTitle, endTime - startTime,
+ progress);
+ }
+ if (aNumber < aTest.mTotal) {
+ gTimeout = setTimeout(onNextTransform, 100, aTest, aNumber);
+ } else if (aTest.mObserver) {
+ aTest.mObserver.done(aTest.mTitle);
+ }
+}
diff --git a/dom/xslt/tests/XSLTMark/XSLTMark-view.js b/dom/xslt/tests/XSLTMark/XSLTMark-view.js
new file mode 100644
index 000000000..7342d0d9a
--- /dev/null
+++ b/dom/xslt/tests/XSLTMark/XSLTMark-view.js
@@ -0,0 +1,175 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 4 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+var view =
+{
+ configUrl: null,
+ testArray: null,
+ mCurrent: null,
+
+ browseForConfig: function()
+ {
+ enablePrivilege('UniversalXPConnect');
+ var fp = Components.classes["@mozilla.org/filepicker;1"].
+ createInstance(nsIFilePicker);
+ fp.init(window,'XSLTMark Description File',nsIFilePicker.modeOpen);
+ fp.appendFilter('*.conf', '*.conf');
+ fp.appendFilters(nsIFilePicker.filterAll);
+ var res = fp.show();
+
+ if (res == nsIFilePicker.returnOK) {
+ this.configUrl = Components.classes[STDURL_CTRID].createInstance(nsIURI);
+ this.configUrl.spec = fp.fileURL.spec;
+ document.getElementById('config').setAttribute('value', this.configUrl.spec);
+ }
+ this.parseConfig();
+ return true;
+ },
+
+ parseConfig: function()
+ {
+ this.testArray = new Array();
+ var test;
+ if (!this.configUrl) {
+ return;
+ }
+
+ var content = loadFile(this.configUrl.spec);
+
+ var lines = content.split("\n");
+ var line, res;
+ var head = /^\[(.+)\]$/;
+ var instruct = /^(.+)=(.+)$/;
+ while (lines.length) {
+ line = lines.shift();
+ if (head.test(line)) {
+ test = new Object;
+ res = head.exec(line);
+ test['title'] = res[1];
+ this.testArray.push(test);
+ }
+ else if (line == '') {
+ test = undefined;
+ }
+ else {
+ res = instruct.exec(line);
+ test[res[1]] = res[2];
+ }
+ }
+ },
+
+ onLoad: function()
+ {
+ this.mCurrentStatus = document.getElementById('currentStatus');
+ this.mCurrentProgress = document.getElementById('currentProgress');
+ this.mTotalProgress = document.getElementById('totalProgress');
+ this.mOutput = document.getElementById('transformOutput');
+ this.mDetailOutput =
+ document.getElementById('transformDetailedOutput');
+ this.mDetail = true;
+ },
+
+ progress: function(aTitle, aTime, aProgress)
+ {
+ // dump20(aTitle);
+ // dump20(aTime);
+ // dump20(aProgress);
+ this.mCurrentProgress.value = aProgress;
+ this.displayDetailTime(aTime);
+ this.mTimes.push(aTime);
+ // dump("\n");
+ },
+
+ done: function(aTitle)
+ {
+ // dump(aTitle + " is finished.\n");
+ this.mCurrent++;
+ this.mCurrentProgress.value = 0;
+ this.displayTotalTime();
+ if (this.mCurrent >= this.testArray.length) {
+ this.mTotalProgress.value = 0;
+ this.mCurrentStatus.value = "done";
+ return;
+ }
+ this.mTotalProgress.value = this.mCurrent*100/this.testArray.length;
+ var test = this.testArray[this.mCurrent];
+ enablePrivilege('UniversalXPConnect');
+ this.displayTest(test.title);
+ runTest(test.title, this.configUrl.resolve(test.input),
+ this.configUrl.resolve(test.stylesheet),
+ test.iterations, this);
+ },
+
+ onStop: function()
+ {
+ clearTimeout(gTimeout);
+ this.mCurrentProgress.value = 0;
+ this.mTotalProgress.value = 0;
+ this.mCurrentStatus.value = "stopped";
+ },
+
+ displayTest: function(aTitle)
+ {
+ this.mTimes = new Array;
+ aTitle += "\t";
+ this.mCurrentStatus.value = aTitle;
+ this.mOutput.value += aTitle;
+ if (this.mDetail) {
+ this.mDetailOutput.value += aTitle;
+ }
+ },
+
+ displayDetailTime: function(aTime)
+ {
+ if (this.mDetail) {
+ this.mDetailOutput.value += aTime + " ms\t";
+ }
+ },
+
+ displayTotalTime: function()
+ {
+ var sum = 0;
+ for (k = 0; k < this.mTimes.length; k++) {
+ sum += this.mTimes[k];
+ }
+ var mean = sum / this.mTimes.length;
+ this.mOutput.value += Number(mean).toFixed(2) + " ms\t" + sum + " ms\t";
+ var variance = 0;
+ for (k = 0; k < this.mTimes.length; k++) {
+ var n = this.mTimes[k] - mean;
+ variance += n*n;
+ }
+ variance = Math.sqrt(variance/this.mTimes.length);
+ this.mOutput.value += Number(variance).toFixed(2)+"\n";
+ if (this.mDetail) {
+ this.mDetailOutput.value += "\n";
+ }
+ },
+
+ runBenchmark: function()
+ {
+ enablePrivilege('UniversalXPConnect');
+ if (!this.testArray) {
+ if (!this.configUrl) {
+ this.configUrl = Components.classes[STDURL_CTRID].createInstance(nsIURI);
+ this.configUrl.spec = document.getElementById('config').value;
+ }
+ this.parseConfig();
+ }
+
+ this.mCurrent = 0;
+ var test = this.testArray[this.mCurrent];
+ this.mOutput.value = '';
+ if (this.mDetail) {
+ this.mDetailOutput.value = '';
+ }
+ this.displayTest(test.title);
+ runTest(test.title, this.configUrl.resolve(test.input),
+ this.configUrl.resolve(test.stylesheet),
+ test.iterations, this);
+ return true;
+ }
+}
+
diff --git a/dom/xslt/tests/XSLTMark/XSLTMark.css b/dom/xslt/tests/XSLTMark/XSLTMark.css
new file mode 100644
index 000000000..80386ae2d
--- /dev/null
+++ b/dom/xslt/tests/XSLTMark/XSLTMark.css
@@ -0,0 +1,8 @@
+/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+textbox.out {
+ white-space: pre;
+}
diff --git a/dom/xslt/tests/XSLTMark/XSLTMark.xul b/dom/xslt/tests/XSLTMark/XSLTMark.xul
new file mode 100644
index 000000000..bc34a7a03
--- /dev/null
+++ b/dom/xslt/tests/XSLTMark/XSLTMark.xul
@@ -0,0 +1,52 @@
+<?xml version="1.0"?><!-- -*- Mode: xml; tab-width: 2; indent-tabs-mode: nil -*- -->
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+
+<?xml-stylesheet href="chrome://communicator/skin/" type="text/css"?>
+<?xml-stylesheet href="XSLTMark.css" type="text/css"?>
+<window id="XSLTMarkHarness"
+ title="XSLTMark"
+ onload="view.onLoad()"
+ xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
+ orient="vertical">
+<script type="application/x-javascript" src="XSLTMark-static.js" />
+<script type="application/x-javascript" src="XSLTMark-test.js" />
+<script type="application/x-javascript" src="XSLTMark-view.js" />
+
+<hbox>
+ <groupbox orient="horizontal">
+ <caption label="test description file" />
+ <label value=""/><!-- needed, otherwise groupbox fucks up :-( -->
+ <textbox id="config" persist="value" readonly="true"/>
+ <button label="browse..." oncommand="view.browseForConfig();" />
+ </groupbox>
+ <groupbox orient="horizontal">
+ <caption label="test control" />
+ <button label="run..."
+ oncommand="setTimeout('view.runBenchmark();', 0);" />
+ <button label="stop" oncommand="view.onStop();" />
+ </groupbox>
+ <groupbox orient="horizontal">
+ <caption label="options" />
+ <label value="responsiveness: "/>
+ <menulist label="sloppy">
+ <menupopup>
+ <menuitem label="sloppy" selected="true"/>
+ <menuitem label="bad"/>
+ </menupopup>
+ </menulist>
+ </groupbox>
+</hbox>
+<hbox>
+ <textbox id="currentStatus" readonly="true" flex="1"/>
+ <progressmeter id="currentProgress" mode="normal" value="0" flex="2"/>
+ <progressmeter id="totalProgress" mode="normal" value="0" flex="2"/>
+</hbox>
+<hbox flex="1">
+ <textbox id="transformOutput" class="out" readonly="true" multiline="true" flex="1"/>
+</hbox>
+<hbox flex="1">
+ <textbox id="transformDetailedOutput" class="out" readonly="true" multiline="true" flex="1"/>
+</hbox>
+</window> \ No newline at end of file