From c4dd6d89b8e10c3c8abb731a2e6cf53c0b2f36d7 Mon Sep 17 00:00:00 2001 From: dosse91 Date: Sun, 23 Oct 2016 19:47:55 +0200 Subject: [PATCH] Now using JSON for handling settings; Minor changes --- README.md | 8 +++---- example1.html | 2 +- example2.html | 5 +---- example3.html | 6 +---- example4.html | 2 +- speedtest_worker.js | 53 +++++++++++++++++++++++---------------------- 6 files changed, 35 insertions(+), 41 deletions(-) diff --git a/README.md b/README.md index f826057..6bcf47a 100644 --- a/README.md +++ b/README.md @@ -2,23 +2,23 @@ No Flash, No Java, No Websocket, No Bullshit. -This is a very small (4k) Speedtest implemented in Javascript, using XMLHttpRequest and Web Workers. +This is a very small Speedtest implemented in Javascript, using XMLHttpRequest and Web Workers. ## Try it [Take a Speedtest](http://speedtest.adolfintel.com) ## Compatibility -Only modern browsers are supported (Edge 12+) +Microsoft Edge, Firefox 10+, Chrome 10+, Opera 15+, Safari 7 (not tested) ## Requirements - - A reasonably fast web server + - A reasonably fast web serve - Some way to generate garbage data using either the included PHP script, a [big file of random data](http://downloads.adolfintel.com/geth.php?r=speedtest-bigfile), or a symlink to /dev/urandom - Your server must not compress the data it sends - Your server must accept large POST requests (up to 10 Megabytes), otherwise the upload test will fail - Client side, there must not be any type of buffering (such as a proxy), or you may get incorrect results ## How to use -See the examples, it's really simple. +See example.html, it's not rocket science. ## License Copyright (C) 2016 Federico Dossena diff --git a/example1.html b/example1.html index a8c2842..04fee37 100644 --- a/example1.html +++ b/example1.html @@ -20,7 +20,7 @@ document.getElementById("upload").innerHTML=data[2]+" Mbit/s"; document.getElementById("ping").innerHTML=data[3]+" ms"; } - w.postMessage("start"); //start the speedtest (default params: garbage.php empty.dat empty.dat) + w.postMessage("start"); //start the speedtest (default params. keep garbage.php and empty.dat in the same directory as the js file) \ No newline at end of file diff --git a/example2.html b/example2.html index 951ac4f..a6aec90 100644 --- a/example2.html +++ b/example2.html @@ -64,10 +64,7 @@ ul.innerHTML=data[2]; ping.innerHTML=data[3]; }.bind(this); - w.postMessage("set url_dl garbage.php"); - w.postMessage("set url_ul empty.dat"); - w.postMessage("set url_ping empty.dat"); - w.postMessage("start"); + w.postMessage('start {"url_dl":"garbage.php","url_ul":"empty.dat","url_ping":"empty.dat","time_dl":"10","time_ul":"15","count_ping":"30"}'); //start with custom parameters. paths are relative to js file. you can omit parameters that you don't want to change \ No newline at end of file diff --git a/example3.html b/example3.html index 0440f8a..5cfe182 100644 --- a/example3.html +++ b/example3.html @@ -50,8 +50,7 @@ var data=event.data.split(";"); var status=Number(data[0]); var dl=document.getElementById("download"),ul=document.getElementById("upload"),ping=document.getElementById("ping"); - // dl.className=status==1?"flash":"";ul.className=status==2?"flash":"";ping.className=status==3?"flash":""; - + dl.className=status==1?"flash":"";ul.className=status==2?"flash":"";ping.className=status==3?"flash":""; if(status>=4){ clearInterval(interval); document.getElementById("abortBtn").style.display="none"; @@ -65,9 +64,6 @@ ul.innerHTML=data[2]; ping.innerHTML=data[3]; }.bind(this); - w.postMessage("set time_dl 10"); // Timeout download - w.postMessage("set time_ul 20"); // Timeout upload - w.postMessage("set count_ping 30"); // Count of pings w.postMessage("start"); } function abortTest(){ diff --git a/example4.html b/example4.html index 9ef3ff6..20068c8 100644 --- a/example4.html +++ b/example4.html @@ -77,7 +77,7 @@ updateGauge(ggul, data[2]); updateGauge(ggping, data[3]); }.bind(this); - w.postMessage("start"); + w.postMessage('start {"time_ul":"5", "time_dl":"5", "count_ping":"10", "url_dl":"garbage.php","url_ul":"empty.dat","url_ping":"empty.dat"}'); } function abortTest(){ if(w)w.postMessage("abort"); diff --git a/speedtest_worker.js b/speedtest_worker.js index 4cbe8e4..8e06358 100644 --- a/speedtest_worker.js +++ b/speedtest_worker.js @@ -1,29 +1,30 @@ var testStatus=0,dlStatus="",ulStatus="",pingStatus=""; -var settings={time_ul : 15, time_dl:15, count_ping: 15, url_dl:"garbage.php",url_ul:"empty.dat",url_ping:"empty.dat"}; +var settings={time_ul:15, time_dl:15, count_ping:35, url_dl:"garbage.php",url_ul:"empty.dat",url_ping:"empty.dat"}; var xhr=null; this.addEventListener('message', function(e){ - var params=e.data.split(" "); - if(params[0]=="set") - { - if(params[1] && settings.hasOwnProperty(params[1]) && params[2]) - { - settings[params[1]]=params[2]; - } - } - if(params[0]=="status"){ - postMessage(testStatus+";"+dlStatus+";"+ulStatus+";"+pingStatus); - } - if(params[0]=="start"){ - if(testStatus==0){ - testStatus=1; - dlTest(function(){testStatus=2;ulTest(function(){testStatus=3;pingTest(function(){testStatus=4;});});}); - } - } - if(params[0]=="abort"){ - console.warn("Aborting test...") - try{if(xhr)xhr.abort();}catch(e){} - testStatus=5;dlStatus="";ulStatus="";pingStatus=""; - } + var params=e.data.split(" "); + if(params[0]=="status"){ + postMessage(testStatus+";"+dlStatus+";"+ulStatus+";"+pingStatus); + } + if(params[0]=="start"){ + if(testStatus==0){ + testStatus=1; + try{ + var s=JSON.parse(e.data.substring(5)); + if(typeof s.url_dl != "undefined") settings.url_dl=s.url_dl; + if(typeof s.url_ul != "undefined") settings.url_ul=s.url_ul; + if(typeof s.url_ping != "undefined") settings.url_ping=s.url_ping; + if(typeof s.time_dl != "undefined") settings.time_dl=s.time_dl; + if(typeof s.time_ul != "undefined") settings.time_ul=s.time_ul; + if(typeof s.count_ping != "undefined") settings.count_ping=s.count_ping; + }catch(e){} + dlTest(function(){testStatus=2;ulTest(function(){testStatus=3;pingTest(function(){testStatus=4;});});}); + } + } + if(params[0]=="abort"){ + try{if(xhr)xhr.abort();}catch(e){} + testStatus=5;dlStatus="";ulStatus="";pingStatus=""; + } }); function dlTest(done){ @@ -41,7 +42,7 @@ function dlTest(done){ prevLoaded=event.loaded; prevT=new Date().getTime(); dlStatus=((speed*8)/1048576.0).toFixed(2); - if(((prevT-startT)/1000.0)>settings.time_dl){;try{xhr.abort();}catch(e){} xhr=null; done();} + if(((prevT-startT)/1000.0)>settings.time_dl){try{xhr.abort();}catch(e){} xhr=null; done();} }.bind(this); xhr.onload=function(){ dlStatus=((speed*8)/1048576.0).toFixed(2); @@ -95,7 +96,7 @@ function pingTest(done){ prevT=new Date().getTime(); }else{ var instspd=new Date().getTime()-prevT; - if(i==1) ping=instspd; else ping=ping*0.9+instspd*0.1; + if(i==1)ping=instspd; else ping=ping*0.9+instspd*0.1; } pingStatus=ping.toFixed(2); i++; @@ -105,7 +106,7 @@ function pingTest(done){ pingStatus="Fail"; done(); }.bind(this); - xhr.open("GET", settings.url_ping+"?r="+Math.random(),true); + xhr.open("GET",settings.url_ping+"?r="+Math.random(),true); xhr.send(); }.bind(this); doPing();