changeset 2385:ef2e0f925be9

Merge branch 'master' of https://github.com/BrechtDeMan/WebAudioEvaluationTool
author www-data <www-data@sucuk.dcs.qmul.ac.uk>
date Fri, 20 May 2016 14:20:56 +0100
parents 0cbff12b2eec (current diff) 2ddc68898dff (diff)
children 7d1466f35a7b
files
diffstat 13 files changed, 136 insertions(+), 55 deletions(-) [+]
line wrap: on
line diff
--- a/index.html	Thu May 19 13:21:03 2016 +0100
+++ b/index.html	Fri May 20 14:20:56 2016 +0100
@@ -17,11 +17,7 @@
 		<!-- Use jQuery hosted from Google CDN -->
 		<!--<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>-->
 		<script type="text/javascript" src="js/jquery-2.1.4.js"></script>
-        <script type="text/javascript" src='js/specification.js'></script>
-		<script type="text/javascript" src='js/core.js'></script>
-		<script type="text/javascript" src='js/loudness.js'></script>
-		<script type="text/javascript" src='js/xmllint.js'></script>
-        <script type="text/javascript" src='js/WAVE.js'></script>
+        <script type="text/javascript" src="js/loader.js"></script>
 	</head>
 
 	<body>
--- a/interfaces/AB.js	Thu May 19 13:21:03 2016 +0100
+++ b/interfaces/AB.js	Fri May 20 14:20:56 2016 +0100
@@ -5,7 +5,7 @@
 	// Get the dimensions of the screen available to the page
 	var width = window.innerWidth;
 	var height = window.innerHeight;
-	interfaceContext.insertPoint.innerHTML = null; // Clear the current schema
+	interfaceContext.insertPoint.innerHTML = ""; // Clear the current schema
 	
 	// Custom comparator Object
 	Interface.prototype.comparator = null;
@@ -325,7 +325,7 @@
 	};
 	
 	this.boxHolders = document.getElementById('box-holders');
-	this.boxHolders.innerHTML = null;
+	this.boxHolders.innerHTML = "";
 	this.comparators = [];
 	this.selected = null;
 	
--- a/interfaces/ABX.js	Thu May 19 13:21:03 2016 +0100
+++ b/interfaces/ABX.js	Fri May 20 14:20:56 2016 +0100
@@ -10,7 +10,7 @@
 	// Use this to do any one-time page / element construction. For instance, placing any stationary text objects,
 	// holding div's, or setting up any nodes which are present for the entire test sequence
     
-    interfaceContext.insertPoint.innerHTML = null; // Clear the current schema
+    interfaceContext.insertPoint.innerHTML = ""; // Clear the current schema
     
     Interface.prototype.checkScaleRange = function(min, max) {
         var page = testState.getCurrentTestPage();
@@ -126,7 +126,7 @@
 function loadTest(page)
 {
 	// Called each time a new test page is to be build. The page specification node is the only item passed in
-    document.getElementById('box-holders').innerHTML = null;
+    document.getElementById('box-holders').innerHTML = "";
     
     var interfaceObj = page.interfaces;
 	if (interfaceObj.length > 1)
--- a/interfaces/ape.js	Thu May 19 13:21:03 2016 +0100
+++ b/interfaces/ape.js	Fri May 20 14:20:56 2016 +0100
@@ -266,7 +266,7 @@
 	feedbackHolder.id = 'feedbackHolder';
 	
 	testContent.style.zIndex = 1;
-	interfaceContext.insertPoint.innerHTML = null; // Clear the current schema
+	interfaceContext.insertPoint.innerHTML = ""; // Clear the current schema
 	
 	// Inject into HTML
 	testContent.appendChild(title); // Insert the title
@@ -291,8 +291,8 @@
 	
 	var feedbackHolder = document.getElementById('feedbackHolder');
 	var sliderHolder = document.getElementById('slider-holder');
-	feedbackHolder.innerHTML = null;
-	sliderHolder.innerHTML = null;
+	feedbackHolder.innerHTML = "";
+	sliderHolder.innerHTML = "";
 	
 	// Delete outside reference
 	var outsideReferenceHolder = document.getElementById('outside-reference');
--- a/interfaces/discrete.js	Thu May 19 13:21:03 2016 +0100
+++ b/interfaces/discrete.js	Fri May 20 14:20:56 2016 +0100
@@ -92,7 +92,7 @@
 	feedbackHolder.id = 'feedbackHolder';
 	
 	testContent.style.zIndex = 1;
-	interfaceContext.insertPoint.innerHTML = null; // Clear the current schema
+	interfaceContext.insertPoint.innerHTML = ""; // Clear the current schema
 	
 	// Inject into HTML
 	testContent.appendChild(title); // Insert the title
@@ -113,7 +113,7 @@
 	var id = page.id;
 	
 	var feedbackHolder = document.getElementById('feedbackHolder');
-    feedbackHolder.innerHTML = null;
+    feedbackHolder.innerHTML = "";
 	var interfaceObj = page.interfaces;
 	if (interfaceObj.length > 1)
 	{
@@ -170,7 +170,7 @@
 	}
 	
 	var sliderBox = document.getElementById('slider-holder');
-	sliderBox.innerHTML = null;
+	sliderBox.innerHTML = "";
 	
 	var commentBoxPrefix = "Comment on track";
 	if (interfaceObj.commentBoxPrefix != undefined) {
@@ -405,9 +405,15 @@
 	var numObj = document.getElementsByClassName('track-slider').length;
 	var totalHeight = (numObj * 66)-30;
 	document.getElementById('scale-holder').style.width = window.innerWidth-220 + 'px';
+	// Cheers edge for making me delete a canvas every resize.
 	var canvas = document.getElementById('scale-canvas');
-	canvas.width = window.innerWidth-520;
-	canvas.height = totalHeight;
+    var new_canvas = document.createElement("canvas");
+    new_canvas.id = 'scale-canvas';
+    new_canvas.style.marginLeft = "150px";
+    canvas.parentElement.appendChild(new_canvas);
+    canvas.parentElement.removeChild(canvas);
+	new_canvas.width = window.innerWidth-520;
+	new_canvas.height = totalHeight;
 	for (var i in audioEngineContext.audioObjects)
 	{
 		if (audioEngineContext.audioObjects[i].specification.type != 'outside-reference'){
@@ -431,7 +437,7 @@
 	var height = canvas.height;
 	var width = canvas.width;
 	var textHolder = document.getElementById('scale-text-holder');
-	textHolder.innerHTML = null;
+	textHolder.innerHTML = "";
 	ctx.fillStyle = "#000000";
 	ctx.setLineDash([1,4]);
 	for (var scale of scales)
--- a/interfaces/horizontal-sliders.js	Thu May 19 13:21:03 2016 +0100
+++ b/interfaces/horizontal-sliders.js	Fri May 20 14:20:56 2016 +0100
@@ -92,7 +92,7 @@
 	feedbackHolder.id = 'feedbackHolder';
 	
 	testContent.style.zIndex = 1;
-	interfaceContext.insertPoint.innerHTML = null; // Clear the current schema
+	interfaceContext.insertPoint.innerHTML = ""; // Clear the current schema
 	
 	// Inject into HTML
 	testContent.appendChild(title); // Insert the title
@@ -113,7 +113,7 @@
 	var id = page.id;
 	
 	var feedbackHolder = document.getElementById('feedbackHolder');
-    feedbackHolder.innerHTML = null;
+    feedbackHolder.innerHTML = "";
     
 	var interfaceObj = page.interfaces;
 	if (interfaceObj.length > 1)
@@ -171,7 +171,7 @@
 	}
 	
 	var sliderBox = document.getElementById('slider-holder');
-	sliderBox.innerHTML = null;
+	sliderBox.innerHTML = "";
 	
 	var commentBoxPrefix = "Comment on track";
 	if (interfaceObj.commentBoxPrefix != undefined) {
@@ -359,9 +359,15 @@
 	var numObj = document.getElementsByClassName('track-slider').length;
 	var totalHeight = (numObj * 125)-25;
 	document.getElementById('scale-holder').style.width = window.innerWidth-220 + 'px';
+	// Cheers edge for making me delete a canvas every resize.
 	var canvas = document.getElementById('scale-canvas');
-	canvas.width = window.innerWidth-420;
-	canvas.height = totalHeight;
+    var new_canvas = document.createElement("canvas");
+    new_canvas.id = 'scale-canvas';
+    new_canvas.style.marginLeft = "100px";
+    canvas.parentElement.appendChild(new_canvas);
+    canvas.parentElement.removeChild(canvas);
+	new_canvas.width = window.innerWidth-420;
+	new_canvas.height = totalHeight;
 	for (var i in audioEngineContext.audioObjects)
 	{
 		if (audioEngineContext.audioObjects[i].specification.type != 'outside-reference'){
@@ -384,7 +390,7 @@
 	var height = canvas.height;
 	var width = canvas.width;
 	var textHolder = document.getElementById('scale-text-holder');
-	textHolder.innerHTML = null;
+	textHolder.innerHTML = "";
 	ctx.fillStyle = "#000000";
 	ctx.setLineDash([1,4]);
 	for (var scale of scales)
--- a/interfaces/mushra.css	Thu May 19 13:21:03 2016 +0100
+++ b/interfaces/mushra.css	Fri May 20 14:20:56 2016 +0100
@@ -101,6 +101,13 @@
 	border: 1px solid #000;
 }
 
+input[type=range]::-ms-track {
+	cursor: pointer;
+	background: #fff;
+	border-radius: 4px;
+	border: 1px solid #000;
+}
+
 input.track-slider-not-moved[type=range]::-webkit-slider-runnable-track {
 	background: #aaa;
 }
@@ -123,6 +130,16 @@
 	margin-left: -4px;
 }
 
+input[type=range]::-ms-thumb {
+	cursor: pointer;
+	margin-top: -1px;
+	margin-left: -4px;
+}
+
+input[type=range]::-ms-tooltip {
+	visibility:hidden;
+}
+
 div#page-count {
     float: left;
     margin: 0px 5px;
--- a/interfaces/mushra.js	Thu May 19 13:21:03 2016 +0100
+++ b/interfaces/mushra.js	Fri May 20 14:20:56 2016 +0100
@@ -94,7 +94,7 @@
 	feedbackHolder.id = 'feedbackHolder';
 	
 	testContent.style.zIndex = 1;
-	interfaceContext.insertPoint.innerHTML = null; // Clear the current schema
+	interfaceContext.insertPoint.innerHTML = ""; // Clear the current schema
 	
 	// Inject into HTML
 	testContent.appendChild(title); // Insert the title
@@ -114,7 +114,7 @@
 	var id = audioHolderObject.id;
 	
 	var feedbackHolder = document.getElementById('feedbackHolder');
-    feedbackHolder.innerHTML = null;
+    feedbackHolder.innerHTML = "";
 	var interfaceObj = audioHolderObject.interfaces;
 	if (interfaceObj.length > 1)
 	{
@@ -170,7 +170,7 @@
 	}
 	
 	var sliderBox = document.getElementById('slider-holder');
-	sliderBox.innerHTML = null;
+	sliderBox.innerHTML = "";
 	
 	var commentBoxPrefix = "Comment on track";
 	if (interfaceObj.commentBoxPrefix != undefined) {
@@ -390,9 +390,14 @@
 	}
 	document.getElementById('scale-holder').style.marginLeft = (diff-100) + 'px';
 	document.getElementById('scale-text-holder').style.height = window.innerHeight-194 + 'px';
+    // Cheers edge for making me delete a canvas every resize.
 	var canvas = document.getElementById('scale-canvas');
-	canvas.width = totalWidth;
-	canvas.height = window.innerHeight-194;
+    var new_canvas = document.createElement("canvas");
+    new_canvas.id = 'scale-canvas';
+    canvas.parentElement.appendChild(new_canvas);
+    canvas.parentElement.removeChild(canvas);
+	new_canvas.width = totalWidth;
+	new_canvas.height = window.innerHeight-194;
 	drawScale();
 }
 
@@ -407,9 +412,10 @@
 	var ctx = canvas.getContext("2d");
 	var height = canvas.height;
 	var width = canvas.width;
+    ctx.clearRect(0,0,canvas.width,canvas.height);
 	var draw_heights = [24, height-34];
 	var textHolder = document.getElementById('scale-text-holder');
-	textHolder.innerHTML = null;
+	textHolder.innerHTML = "";
 	var lastHeight = 0;
 	for (var scale of scales)
 	{
--- a/js/core.js	Thu May 19 13:21:03 2016 +0100
+++ b/js/core.js	Fri May 20 14:20:56 2016 +0100
@@ -116,7 +116,7 @@
     }
 }
 
-window.onload = function() {
+var onload = function() {
 	// Function called once the browser has loaded all files.
 	// This should perform any initial commands such as structure / loading documents
 	
@@ -562,7 +562,13 @@
 }
 
 function randomString(length) {
-    return Math.round((Math.pow(36, length + 1) - Math.random() * Math.pow(36, length))).toString(36).slice(1);
+    var str = ""
+    for (var i=0; i<length; i+=2) {
+        var num = Math.floor(Math.random()*1295);
+        str += num.toString(36);
+    }
+    return str;
+    //return Math.round((Math.pow(36, length + 1) - Math.random() * Math.pow(36, length))).toString(36).slice(1);
 }
 
 function randomiseOrder(input)
@@ -673,7 +679,7 @@
 	this.postNode = function() {
 		// This will take the node from the popupOptions and display it
 		var node = this.popupOptions[this.currentIndex];
-		this.popupResponse.innerHTML = null;
+		this.popupResponse.innerHTML = "";
 		this.popupTitle.textContent = node.specification.statement;
 		if (node.specification.type == 'question') {
 			var textArea = document.createElement('textarea');
@@ -2995,7 +3001,7 @@
         if (existingStore == undefined) {
             // We need to get the sessionKey
             this.SessionKey.generateKey();
-            this.document = document.implementation.createDocument(null,"waetresult");
+            this.document = document.implementation.createDocument(null,"waetresult",null);
             this.root = this.document.childNodes[0];
             var projectDocument = specification.projectXML;
             projectDocument.setAttribute('file-name',url);
@@ -3020,8 +3026,12 @@
             var parse = new DOMParser();
             var xml = parse.parseFromString(this.request.response,"text/xml");
             var shouldGenerateKey = true;
-            if(xml.getAllElementsByTagName("state").length > 0){
-				if (xml.getAllElementsByTagName("state")[0].textContent == "OK") {
+            if (this.request.response.length == 0) {
+                console.log("Error: Server did not respond");
+                return;
+            }
+            if(xml.getElementsByTagName("state").length > 0){
+				if (xml.getElementsByTagName("state")[0].textContent == "OK") {
 					this.key = xml.getAllElementsByTagName("key")[0].textContent;
 					this.parent.root.setAttribute("key",this.key);
 					this.parent.root.setAttribute("state","empty");
@@ -3215,3 +3225,5 @@
 		return this.root;
 	};
 }
+
+onload();
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/js/loader.js	Fri May 20 14:20:56 2016 +0100
@@ -0,0 +1,29 @@
+// Script to load the relevant JS files if the system supports it
+
+window.onload = function() {
+    // First check if the Web Audio API is supported
+    if (window.AudioContext == undefined && window.webkitAudioContext == undefined) {
+        // Display unsuported error message
+        var body = document.getElementsByTagName("body")[0];
+        body.innerHTML = "<h1>Sorry! Your browser is not supported :(</h1><p>Your browser does not support the HTML5 Web Audio API. Please use one of the following supported browsers instead.<p>";
+        var table = document.createElement("table");
+        table.border = "0";
+        table.innerHTML = "<tr><td>Chrome</td><td>v10 or newer</td></tr>";
+        table.innerHTML += "<tr><td>Firefox</td><td>v25 or newer</td></tr><tr><td>Safari (OSX)</td><td> v6 or newer, OSX only</td></tr>";
+        table.innerHTML += "<tr><td>Safari (iOS)</td><td>iOS 6.1 or newer</td></tr>";
+        table.innerHTML += "<tr><td>Edge</td><td>12 or newer</td></tr>";
+        body.appendChild(table);
+    } else {
+        var head = document.getElementsByTagName("head")[0];
+        var src_list = ['js/specification.js', 'js/core.js', 'js/loudness.js', 'js/xmllint.js', 'js/WAVE.js'];
+        for (var i=0; i<src_list.length; i++) {
+            var src = src_list[i];
+            var script = document.createElement("script");
+            script.type = "text/javascript";
+            script.async = false;
+            script.defer = true;
+            script.src = src;
+            head.appendChild(script);
+        }
+    }
+}
\ No newline at end of file
--- a/js/specification.js	Thu May 19 13:21:03 2016 +0100
+++ b/js/specification.js	Fri May 20 14:20:56 2016 +0100
@@ -1,15 +1,25 @@
 function Specification() {
 	// Handles the decoding of the project specification XML into a simple JavaScript Object.
 	
+    // <setup> attributes
 	this.interface = null;
 	this.projectReturn = null;
     this.returnURL = null;
 	this.randomiseOrder = null;
-	this.testPages = null;
+	this.poolSize = null;
+    this.loudness = null;
+    this.sampleRate = null;
+    this.calibration = null;
+    this.crossFade = null;
+    this.preSilence = null;
+    this.postSilence = null;
+    
+    // nodes
+    this.metrics = null;
+    this.preTest = undefined;
+    this.postTest = undefined;
 	this.pages = [];
-	this.metrics = null;
 	this.interfaces = null;
-	this.loudness = null;
 	this.errors = [];
 	this.schema = null;
     this.exitText = "Thank you.";
@@ -75,9 +85,8 @@
 		var schemaSetup = this.schema.getAllElementsByName('setup')[0];
 		// First decode the attributes
 		var attributes = schemaSetup.getAllElementsByTagName('xs:attribute');
-		for (var i in attributes)
+		for (var i=0; i<attributes.length; i++)
 		{
-			if (isNaN(Number(i)) == true){break;}
 			var attributeName = attributes[i].getAttribute('name') || attributes[i].getAttribute('ref');
 			var projectAttr = setupNode.getAttribute(attributeName);
 			projectAttr = this.processAttribute(projectAttr,attributes[i],this.schema);
@@ -105,8 +114,7 @@
 		
 		// Now process the survey node options
 		var survey = setupNode.getElementsByTagName('survey');
-		for (var i in survey) {
-			if (isNaN(Number(i)) == true){break;}
+		for (var i=0; i<survey.length; i++){
 			var location = survey[i].getAttribute('location');
             switch(location)
             {
@@ -240,9 +248,8 @@
 						this.type = 'statement';
 					} else {
 						this.options = [];
-						for (var i in children)
+						for (var i=0; i<children.length; i++)
 						{
-							if (isNaN(Number(i))==true){break;}
 							this.options.push({
 								name: children[i].getAttribute('name'),
 								text: children[i].textContent
@@ -488,8 +495,7 @@
 			// Now process the survey node options
 			var survey = xml.getElementsByTagName('survey');
 			var surveySchema = parent.schema.getAllElementsByName('survey')[0];
-			for (var i in survey) {
-				if (isNaN(Number(i)) == true){break;}
+			for (var i=0; i<survey.length; i++){
 				var location = survey[i].getAttribute('location');
 				if (location == 'pre' || location == 'before')
 				{
--- a/python/pythonServer.py	Thu May 19 13:21:03 2016 +0100
+++ b/python/pythonServer.py	Fri May 20 14:20:56 2016 +0100
@@ -122,7 +122,10 @@
 	s.send_response(200)
 	s.send_header("Content-type", "application/xml")
 	s.end_headers()
-	s.wfile.write(reply)
+	if sys.version_info[0] == 2:
+		s.wfile.write(reply)
+	elif sys.version_info[0] == 3:
+		s.wfile.write(bytes(reply, "utf-8"))
 	file = open("../saves/save-"+key+".xml",'w')
 	file.write("<waetresult key="+key+"/>")
 	file.close();
@@ -136,7 +139,7 @@
     varLen = int(self.headers['Content-Length'])
     postVars = self.rfile.read(varLen)
     print("Saving file key "+key)
-    file = open('../saves/save-'+key+'.xml','w')
+    file = open('../saves/save-'+key+'.xml','wb')
     file.write(postVars)
     file.close()
     try:
@@ -149,7 +152,11 @@
     self.send_response(200)
     self.send_header("Content-type", "text/xml")
     self.end_headers()
-    self.wfile.write('<response state="OK"><message>OK</message><file bytes="'+str(wbytes)+'">"saves/'+curFileName+'"</file></response>')
+    reply = '<response state="OK"><message>OK</message><file bytes="'+str(wbytes)+'">"saves/'+curFileName+'"</file></response>'
+    if sys.version_info[0] == 2:
+        self.wfile.write(reply)
+    elif sys.version_info[0] == 3:
+        self.wfile.write(bytes(reply, "utf-8"))
     curSaveIndex += 1
     curFileName = 'test-'+str(curSaveIndex)+'.xml'
 
--- a/test.html	Thu May 19 13:21:03 2016 +0100
+++ b/test.html	Fri May 20 14:20:56 2016 +0100
@@ -17,11 +17,7 @@
 		<!-- Use jQuery hosted from Google CDN -->
 		<!--<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>-->
 		<script type="text/javascript" src="js/jquery-2.1.4.js"></script>
-        <script type="text/javascript" src='js/specification.js'></script>
-		<script type="text/javascript" src='js/core.js'></script>
-		<script type="text/javascript" src='js/loudness.js'></script>
-		<script type="text/javascript" src='js/xmllint.js'></script>
-        <script type="text/javascript" src='js/WAVE.js'></script>
+        <script type="text/javascript" src="js/loader.js"></script>
 	</head>
 
 	<body>