123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491 |
- if (window["dojo"]) {
- dojo.provide("doh._browserRunner");
- }
- // FIXME: need to add prompting for monkey-do testing
- // FIXME: need to implement progress bar
- // FIXME: need to implement errors in progress bar
- (function() {
- if (window.parent == window) {
- // we're the top-dog window.
- // borrowed from Dojo, etc.
- var byId = function(id) {
- return document.getElementById(id);
- }
- var _addOnEvt = function(type, // string
- refOrName, // function or string
- scope) { // object, defaults is window
- if (!scope) {
- scope = window;
- }
- var funcRef = refOrName;
- if (typeof refOrName == "string") {
- funcRef = scope[refOrName];
- }
- var enclosedFunc = function() {
- return funcRef.apply(scope, arguments);
- };
- if ((window["dojo"]) && (type == "load")) {
- dojo.addOnLoad(enclosedFunc);
- } else {
- if (window["attachEvent"]) {
- window.attachEvent("on" + type, enclosedFunc);
- } else if (window["addEventListener"]) {
- window.addEventListener(type, enclosedFunc, false);
- } else if (document["addEventListener"]) {
- document.addEventListener(type, enclosedFunc, false);
- }
- }
- };
- //
- // Over-ride or implement base runner.js-provided methods
- //
- var _logBacklog = [];
- var sendToLogPane = function(args, skip) {
- var msg = "";
- for (var x = 0; x < args.length; x++) {
- msg += " " + args[x];
- }
- // workarounds for IE. Wheeee!!!
- msg = msg.replace("\t", " ");
- msg = msg.replace(" ", " ");
- msg = msg.replace("\n", "<br> ");
- if (!byId("logBody")) {
- _logBacklog.push(msg);
- return;
- } else if ((_logBacklog.length) && (!skip)) {
- var tm;
- while (tm = _logBacklog.shift()) {
- sendToLogPane(tm, true);
- }
- }
- var tn = document.createElement("div");
- tn.innerHTML = msg;
- byId("logBody").appendChild(tn);
- }
- doh._init = (function(oi) {
- return function() {
- var lb = byId("logBody");
- if (lb) {
- // clear the console before each run
- while (lb.firstChild) {
- lb.removeChild(lb.firstChild);
- }
- }
- oi.apply(doh, arguments);
- }
- })(doh._init);
- if (this["opera"] && opera.postError) {
- doh.debug = function() {
- var msg = "";
- for (var x = 0; x < arguments.length; x++) {
- msg += " " + arguments[x];
- }
- sendToLogPane([msg]);
- opera.postError("DEBUG:" + msg);
- }
- } else if (window["console"]) {
- if (console.info) {
- doh.debug = function() {
- sendToLogPane.call(window, arguments);
- console.debug.apply(console, arguments);
- }
- } else {
- doh.debug = function() {
- var msg = "";
- for (var x = 0; x < arguments.length; x++) {
- msg += " " + arguments[x];
- }
- sendToLogPane([msg]);
- console.log("DEBUG:" + msg);
- }
- }
- } else {
- doh.debug = function() {
- sendToLogPane.call(window, arguments);
- }
- }
- var loaded = false;
- var groupTemplate = null;
- var testTemplate = null;
- var groupNodes = {};
- var _groupTogglers = {};
- var _getGroupToggler = function(group, toggle) {
- if (_groupTogglers[group]) {
- return _groupTogglers[group];
- }
- var rolledUp = true;
- return _groupTogglers[group] = function(evt, forceOpen) {
- var nodes = groupNodes[group].__items;
- if (rolledUp || forceOpen) {
- rolledUp = false;
- for (var x = 0; x < nodes.length; x++) {
- nodes[x].style.display = "";
- }
- toggle.innerHTML = "6";
- } else {
- rolledUp = true;
- for (var x = 0; x < nodes.length; x++) {
- nodes[x].style.display = "none";
- }
- toggle.innerHTML = "4";
- }
- };
- }
- var addGroupToList = function(group) {
- if (!byId("testList")) {
- return;
- }
- var tb = byId("testList").tBodies[0];
- var tg = groupTemplate.cloneNode(true);
- var tds = tg.getElementsByTagName("td");
- var toggle = tds[0];
- toggle.onclick = _getGroupToggler(group, toggle);
- var cb = tds[1].getElementsByTagName("input")[0];
- cb.group = group;
- cb.onclick = function(evt) {
- doh._groups[group].skip = (!this.checked);
- }
- tds[2].innerHTML = group;
- tds[3].innerHTML = "";
- tb.appendChild(tg);
- return tg;
- }
- var addFixtureToList = function(group, fixture) {
- if (!testTemplate) {
- return;
- }
- var cgn = groupNodes[group];
- if (!cgn["__items"]) {
- cgn.__items = [];
- }
- var tn = testTemplate.cloneNode(true);
- var tds = tn.getElementsByTagName("td");
- tds[2].innerHTML = fixture.name;
- tds[3].innerHTML = "";
- var nn = (cgn.__lastFixture || cgn.__groupNode).nextSibling;
- if (nn) {
- nn.parentNode.insertBefore(tn, nn);
- } else {
- cgn.__groupNode.parentNode.appendChild(tn);
- }
- // FIXME: need to make group display toggleable!!
- tn.style.display = "none";
- cgn.__items.push(tn);
- return cgn.__lastFixture = tn;
- }
- var getFixtureNode = function(group, fixture) {
- if (groupNodes[group]) {
- return groupNodes[group][fixture.name];
- }
- return null;
- }
- var getGroupNode = function(group) {
- if (groupNodes[group]) {
- return groupNodes[group].__groupNode;
- }
- return null;
- }
- var updateBacklog = [];
- doh._updateTestList = function(group, fixture, unwindingBacklog) {
- if (!loaded) {
- if (group && fixture) {
- updateBacklog.push([group, fixture]);
- }
- return;
- } else if ((updateBacklog.length) && (!unwindingBacklog)) {
- var tr;
- while (tr = updateBacklog.shift()) {
- doh._updateTestList(tr[0], tr[1], true);
- }
- }
- if (group && fixture) {
- if (!groupNodes[group]) {
- groupNodes[group] = {
- "__groupNode" : addGroupToList(group)
- };
- }
- if (!groupNodes[group][fixture.name]) {
- groupNodes[group][fixture.name] = addFixtureToList(group,
- fixture)
- }
- }
- }
- doh._testRegistered = doh._updateTestList;
- doh._groupStarted = function(group) {
- // console.debug("_groupStarted", group);
- var gn = getGroupNode(group);
- if (gn) {
- gn.className = "inProgress";
- }
- }
- doh._groupFinished = function(group, success) {
- // console.debug("_groupFinished", group);
- var gn = getGroupNode(group);
- if (gn) {
- gn.className = (success) ? "success" : "failure";
- }
- }
- doh._testStarted = function(group, fixture) {
- // console.debug("_testStarted", group, fixture.name);
- var fn = getFixtureNode(group, fixture);
- if (fn) {
- fn.className = "inProgress";
- }
- }
- var _nameTimes = {};
- var _playSound = function(name) {
- if (byId("hiddenAudio") && byId("audio") && byId("audio").checked) {
- // console.debug("playing:", name);
- var nt = _nameTimes[name];
- // only play sounds once every second or so
- if ((!nt) || (((new Date) - nt) > 700)) {
- _nameTimes[name] = allGetServerTime();
- var tc = document.createElement("span");
- byId("hiddenAudio").appendChild(tc);
- tc.innerHTML = '<embed src="_sounds/'
- + name
- + '.wav" autostart="true" loop="false" hidden="true" width="1" height="1"></embed>';
- }
- }
- }
- doh._testFinished = function(group, fixture, success) {
- var fn = getFixtureNode(group, fixture);
- if (fn) {
- fn.getElementsByTagName("td")[3].innerHTML = (fixture.endTime - fixture.startTime)
- + "ms";
- fn.className = (success) ? "success" : "failure";
- if (!success) {
- _playSound("doh");
- var gn = getGroupNode(group);
- if (gn) {
- gn.className = "failure";
- _getGroupToggler(group)(null, true);
- }
- }
- }
- this
- .debug(((success) ? "PASSED" : "FAILED"), "test:",
- fixture.name);
- }
- // FIXME: move implementation to _browserRunner?
- doh.registerUrl = function( /* String */group,
- /* String */url,
- /* Integer */timeout) {
- var tg = new String(group);
- this.register(group, {
- name : url,
- setUp : function() {
- doh.currentGroupName = tg;
- doh.currentGroup = this;
- doh.currentUrl = url;
- this.d = new doh.Deferred();
- doh.currentTestDeferred = this.d;
- showTestPage();
- byId("testBody").src = url;
- },
- timeout : timeout || 10000, // 10s
- // timeout: timeout||1000, // 10s
- runTest : function() {
- // FIXME: implement calling into the url's groups
- // here!!
- return this.d;
- },
- tearDown : function() {
- doh.currentGroupName = null;
- doh.currentGroup = null;
- doh.currentTestDeferred = null;
- doh.currentUrl = null;
- // this.d.errback(false);
- // byId("testBody").src = "about:blank";
- showLogPage();
- }
- });
- }
- //
- // Utility code for runner.html
- //
- // var isSafari = navigator.appVersion.indexOf("Safari") >= 0;
- var tabzidx = 1;
- var _showTab = function(toShow, toHide) {
- // FIXME: I don't like hiding things this way.
- byId(toHide).style.display = "none";
- with (byId(toShow).style) {
- display = "";
- zIndex = ++tabzidx;
- }
- }
- showTestPage = function() {
- _showTab("testBody", "logBody");
- }
- showLogPage = function() {
- _showTab("logBody", "testBody");
- }
- var runAll = true;
- toggleRunAll = function() {
- // would be easier w/ query...sigh
- runAll = (!runAll);
- if (!byId("testList")) {
- return;
- }
- var tb = byId("testList").tBodies[0];
- var inputs = tb.getElementsByTagName("input");
- var x = 0;
- var tn;
- while (tn = inputs[x++]) {
- tn.checked = runAll;
- doh._groups[tn.group].skip = (!runAll);
- }
- }
- var listHeightTimer = null;
- var setListHeight = function() {
- if (listHeightTimer) {
- clearTimeout(listHeightTimer);
- }
- var tl = byId("testList");
- if (!tl) {
- return;
- }
- listHeightTimer = setTimeout(function() {
- tl.style.display = "none";
- tl.style.display = "";
- }, 10);
- }
- _addOnEvt("resize", setListHeight);
- _addOnEvt("load", setListHeight);
- _addOnEvt("load", function() {
- if (loaded) {
- return;
- }
- loaded = true;
- groupTemplate = byId("groupTemplate");
- if (!groupTemplate) {
- // make sure we've got an ammenable DOM structure
- return;
- }
- groupTemplate.parentNode.removeChild(groupTemplate);
- groupTemplate.style.display = "";
- testTemplate = byId("testTemplate");
- testTemplate.parentNode.removeChild(testTemplate);
- testTemplate.style.display = "";
- doh._updateTestList();
- });
- _addOnEvt("load", function() {
- doh._onEnd = function() {
- if (doh._failureCount == 0) {
- doh.debug("WOOHOO!!");
- _playSound("woohoo");
- } else {
- console.debug("doh._failureCount:", doh._failureCount);
- }
- if (byId("play")) {
- toggleRunning();
- }
- }
- if (!byId("play")) {
- // make sure we've got an ammenable DOM structure
- return;
- }
- var isRunning = false;
- var toggleRunning = function() {
- // ugg, this would be so much better w/ dojo.query()
- if (isRunning) {
- byId("play").style.display = byId("pausedMsg").style.display = "";
- byId("playingMsg").style.display = byId("pause").style.display = "none";
- isRunning = false;
- } else {
- byId("play").style.display = byId("pausedMsg").style.display = "none";
- byId("playingMsg").style.display = byId("pause").style.display = "";
- isRunning = true;
- }
- }
- doh.run = (function(oldRun) {
- return function() {
- if (!doh._currentGroup) {
- toggleRunning();
- }
- return oldRun.apply(doh, arguments);
- }
- })(doh.run);
- var btns = byId("toggleButtons").getElementsByTagName("span");
- var node;
- var idx = 0;
- while (node = btns[idx++]) {
- node.onclick = toggleRunning;
- }
- });
- } else {
- // we're in an iframe environment. Time to mix it up a bit.
- _doh = window.parent.doh;
- var _thisGroup = _doh.currentGroupName;
- var _thisUrl = _doh.currentUrl;
- if (_thisGroup) {
- doh._testRegistered = function(group, tObj) {
- _doh._updateTestList(_thisGroup, tObj);
- }
- doh._onEnd = function() {
- _doh._errorCount += doh._errorCount;
- _doh._failureCount += doh._failureCount;
- _doh._testCount += doh._testCount;
- // should we be really adding raw group counts?
- _doh._groupCount += doh._groupCount;
- _doh.currentTestDeferred.callback(true);
- }
- var otr = doh._getTestObj;
- doh._getTestObj = function() {
- var tObj = otr.apply(doh, arguments);
- tObj.name = _thisUrl + "::" + arguments[0] + "::" + tObj.name;
- return tObj;
- }
- doh.debug = doh.hitch(_doh, "debug");
- doh.registerUrl = doh.hitch(_doh, "registerUrl");
- doh._testStarted = function(group, fixture) {
- _doh._testStarted(_thisGroup, fixture);
- }
- doh._testFinished = function(g, f, s) {
- _doh._testFinished(_thisGroup, f, s);
- }
- doh._report = function() {
- };
- }
- }
- })();
|