/// Copyright (c) 2009 Microsoft Corporation
///
/// Redistribution and use in source and binary forms, with or without modification, are permitted provided
/// that the following conditions are met:
/// * Redistributions of source code must retain the above copyright notice, this list of conditions and
/// the following disclaimer.
/// * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and
/// the following disclaimer in the documentation and/or other materials provided with the distribution.
/// * Neither the name of Microsoft nor the names of its contributors may be used to
/// endorse or promote products derived from this software without specific prior written permission.
///
/// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
/// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
/// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
/// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
/// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
/// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
/// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
/// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
/* Handles updating the page with information from the runner. */
function Presenter() {
var altStyle = '',
logger,
progressBar,
date,
version,
table,
backLink,
globalSection = new Section(null, "0", "ECMA-262"),
currentSection = globalSection,
tests = {},
totalTests = 0;
TOCFILEPATH = "resources/scripts/global/ecma-262-toc.xml";
/* Load the table of contents xml to populate the sections. */
function loadSections() {
var sectionsLoader = new XMLHttpRequest();
sectionsLoader.open("GET", TOCFILEPATH, false);
sectionsLoader.send();
var xmlDoc = sectionsLoader.responseXML;
var nodes = xmlDoc.documentElement.childNodes;
addSectionsFromXML(nodes, globalSection);
}
/* Recursively parses the TOC xml, producing nested sections. */
function addSectionsFromXML(nodes, parentSection){
var subsection;
for (var i = 0; i < nodes.length; i++) {
if (nodes[i].nodeName === "sec") {
subsection = new Section(parentSection, nodes[i].getAttribute('id'), nodes[i].getAttribute('name'));
parentSection.subsections[subsection.id.match(/\d+$/)] = subsection;
addSectionsFromXML(nodes[i].childNodes, subsection);
}
}
}
/* Renders the current section into the report window. */
function renderCurrentSection() {
renderBreadcrumbs();
if(globalSection.totalTests === 0) {
$('#resultMessage').show();
} else {
$('#resultMessage').hide();
}
$('.totalCases').text(currentSection.totalTests);
$('.passedCases').text(currentSection.totalPassed);
$('.failedCases').text(currentSection.totalFailed);
$('#failedToLoadCounterDetails').text(currentSection.totalFailedToLoad);
table.empty();
table.append(currentSection.toHTML());
// Observe section selection and show source links
$('a.section', table).click(sectionSelected);
$('a.showSource', table).click(openSourceWindow);
}
/* Renders the breadcrumbs for report navigation. */
function renderBreadcrumbs() {
var container = $('div.crumbContainer div.crumbs');
var sectionChain = [];
var current = currentSection;
// Walk backwards until we reach the global section.
while(current !== globalSection && current.parentSection !== globalSection) {
sectionChain.push(current);
current = current.parentSection;
}
// Reverse the array since we want to print earlier sections first.
sectionChain.reverse();
// Empty any existing breadcrumbs.
container.empty();
// Static first link to go back to the root.
var link = $("Test Report > ");
link.bind('click', {sectionId: 0}, sectionSelected)
container.append(link);
for(var i = 0; i < sectionChain.length;i++) {
link = $("Section " + sectionChain[i].id + ": " + sectionChain[i].name + " > ");
link.bind('click', sectionSelected)
container.append(link);
}
// If we can go back, show the back link.
if(sectionChain.length > 0) {
backLink.show();
} else {
backLink.hide();
}
}
/* Opens a window with a test's source code. */
function openSourceWindow(e) {
var test = tests[e.target.href.match(/#(.+)$/)[1]],
popWnd = window.open("", "", "scrollbars=1, resizable=1"),
innerHTML = '';
innerHTML += 'Test ';
innerHTML += '' + test.id + '
';
if (test.description) {
innerHTML += 'Description';
innerHTML += '
' + test.description.replace(//g, '>'); +''; } innerHTML += '
' + test.code + ''; if (test.pre) { innerHTML += 'Precondition'; innerHTML += '
' + test.pre + ''; } innerHTML += 'Path'; innerHTML += '
' + test.path + ' '; popWnd.document.write(innerHTML); } /* Pops up a window with an xml dump of the results of a test. */ function createXMLReportWindow() { var reportWindow; //window that will output the xml data var xmlData; //array instead of string concatenation var dateNow; var xml; // stop condition of for loop stored in a local variable to improve performance dateNow = new Date(); xml = '