Ver código fonte

Added options for managing errors during test (abort/retry/ignore)

dosse91 9 anos atrás
pai
commit
710887f400
3 arquivos alterados com 29 adições e 12 exclusões
  1. 8 2
      doc.md
  2. 21 10
      speedtest_worker.js
  3. 0 0
      speedtest_worker.min.js

+ 8 - 2
doc.md

@@ -1,7 +1,7 @@
 # HTML5 Speedtest
 # HTML5 Speedtest
 
 
 > by Federico Dossena  
 > by Federico Dossena  
-> Version 4.2.1, May 15 2017  
+> Version 4.2.2, June 13 2017  
 > [https://github.com/adolfintel/speedtest/](https://github.com/adolfintel/speedtest/)
 > [https://github.com/adolfintel/speedtest/](https://github.com/adolfintel/speedtest/)
 
 
 
 
@@ -164,6 +164,12 @@ w.postMessage('start {"param1": "value1", "param2": "value2", ...}')
     * Recommended: `>=1`
     * Recommended: `>=1`
     * Default override: 1 on Firefox if enable_quirks is true
     * Default override: 1 on Firefox if enable_quirks is true
     * Default override: 10 on Safari if enable_quirks is true
     * Default override: 10 on Safari if enable_quirks is true
+* __xhr_ignoreErrors__: how to react to errors in download/upload streams and the ping test
+    * `0`: Fail test on error (behaviour of previous versions of this test)
+    * `1`: Restart a stream/ping when it fails
+    * `2`: Ignore all errors
+    * Default: `1`
+    * Recommended: `1`
 * __allow_fetchAPI__: allow the use of Fetch API for the download test instead of regular XHR. Experimental, not recommended.
 * __allow_fetchAPI__: allow the use of Fetch API for the download test instead of regular XHR. Experimental, not recommended.
     * Default: `false`
     * Default: `false`
 * __force_fetchAPI__: forces the use of Fetch API on all browsers that support it
 * __force_fetchAPI__: forces the use of Fetch API on all browsers that support it
@@ -182,7 +188,7 @@ w.postMessage('abort')
 
 
 This will terminate all network activity and stop the worker.
 This will terminate all network activity and stop the worker.
 
 
-__Important:__ do not simply kill the worker while it's running, as it will leave pending XHR requests!
+__Important:__ do not simply kill the worker while it's running, as it may leave pending XHR requests!
 
 
 
 
 ## Using the test without PHP
 ## Using the test without PHP

+ 21 - 10
speedtest_worker.js

@@ -1,5 +1,5 @@
 /*
 /*
-	HTML5 Speedtest v4.2.1
+	HTML5 Speedtest v4.2.2
 	by Federico Dossena
 	by Federico Dossena
 	https://github.com/adolfintel/speedtest/
 	https://github.com/adolfintel/speedtest/
 	GNU LGPLv3 License
 	GNU LGPLv3 License
@@ -24,6 +24,7 @@ var settings = {
   url_getIp: 'getIP.php', // path to getIP.php relative to this js file, or a similar thing that outputs the client's ip
   url_getIp: 'getIP.php', // path to getIP.php relative to this js file, or a similar thing that outputs the client's ip
   xhr_dlMultistream: 10, // number of download streams to use (can be different if enable_quirks is active)
   xhr_dlMultistream: 10, // number of download streams to use (can be different if enable_quirks is active)
   xhr_ulMultistream: 3, // number of upload streams to use (can be different if enable_quirks is active)
   xhr_ulMultistream: 3, // number of upload streams to use (can be different if enable_quirks is active)
+  xhr_ignoreErrors: 1, // 0=fail on errors, 1=attempt to restart a stream if it fails, 2=ignore all errors
   xhr_dlUseBlob: false, // if set to true, it reduces ram usage but uses the hard drive (useful with large garbagePhp_chunkSize and/or high xhr_dlMultistream)
   xhr_dlUseBlob: false, // if set to true, it reduces ram usage but uses the hard drive (useful with large garbagePhp_chunkSize and/or high xhr_dlMultistream)
   garbagePhp_chunkSize: 20, // size of chunks sent by garbage.php (can be different if enable_quirks is active)
   garbagePhp_chunkSize: 20, // size of chunks sent by garbage.php (can be different if enable_quirks is active)
   enable_quirks: true, // enable quirks for specific browsers. currently it overrides settings to optimize for specific browsers, unless they are already being overridden with the start command
   enable_quirks: true, // enable quirks for specific browsers. currently it overrides settings to optimize for specific browsers, unless they are already being overridden with the start command
@@ -180,10 +181,11 @@ function dlTest (done) {
           testStream(i, 0)
           testStream(i, 0)
         }.bind(this)
         }.bind(this)
         xhr[i].onerror = function () {
         xhr[i].onerror = function () {
-          // error, abort
-          failed = true
+          // error
+          if (settings.xhr_ignoreErrors === 0) failed=true //abort
           try { xhr[i].abort() } catch (e) { }
           try { xhr[i].abort() } catch (e) { }
           delete (xhr[i])
           delete (xhr[i])
+          if (settings.xhr_ignoreErrors === 1) testStream(i, 100) //restart stream after 100ms
         }.bind(this)
         }.bind(this)
         // send xhr
         // send xhr
         try { if (settings.xhr_dlUseBlob) xhr[i].responseType = 'blob'; else xhr[i].responseType = 'arraybuffer' } catch (e) { }
         try { if (settings.xhr_dlUseBlob) xhr[i].responseType = 'blob'; else xhr[i].responseType = 'arraybuffer' } catch (e) { }
@@ -251,9 +253,10 @@ function ulTest (done) {
         }
         }
         xhr[i].onerror = function () {
         xhr[i].onerror = function () {
           // error, abort
           // error, abort
-          failed = true
+          if (settings.xhr_ignoreErrors === 0) failed = true //abort
           try { xhr[i].abort() } catch (e) { }
           try { xhr[i].abort() } catch (e) { }
           delete (xhr[i])
           delete (xhr[i])
+          if (settings.xhr_ignoreErrors === 1) testStatus(i,100); //restart stream after 100ms
         }
         }
         xhr[i].open('POST', settings.url_ul + '?r=' + Math.random(), true) // random string to prevent caching
         xhr[i].open('POST', settings.url_ul + '?r=' + Math.random(), true) // random string to prevent caching
         xhr[i].setRequestHeader('Content-Encoding', 'identity') // disable compression (some browsers may refuse it, but data is incompressible anyway)
         xhr[i].setRequestHeader('Content-Encoding', 'identity') // disable compression (some browsers may refuse it, but data is incompressible anyway)
@@ -273,10 +276,10 @@ function ulTest (done) {
           testStream(i, 0)
           testStream(i, 0)
         }.bind(this)
         }.bind(this)
         xhr[i].upload.onerror = function () {
         xhr[i].upload.onerror = function () {
-          // error, abort
-          failed = true
+          if (settings.xhr_ignoreErrors === 0) failed=true //abort
           try { xhr[i].abort() } catch (e) { }
           try { xhr[i].abort() } catch (e) { }
           delete (xhr[i])
           delete (xhr[i])
+          if (settings.xhr_ignoreErrors === 1) testStream(i, 100) //restart stream after 100ms
         }.bind(this)
         }.bind(this)
         // send xhr
         // send xhr
         xhr[i].open('POST', settings.url_ul + '?r=' + Math.random(), true) // random string to prevent caching
         xhr[i].open('POST', settings.url_ul + '?r=' + Math.random(), true) // random string to prevent caching
@@ -337,10 +340,18 @@ function pingTest (done) {
     }.bind(this)
     }.bind(this)
     xhr[0].onerror = function () {
     xhr[0].onerror = function () {
       // a ping failed, cancel test
       // a ping failed, cancel test
-      pingStatus = 'Fail'
-      jitterStatus = 'Fail'
-      clearRequests()
-      done()
+      if (settings.xhr_ignoreErrors === 0) { //abort
+        pingStatus = 'Fail'
+        jitterStatus = 'Fail'
+        clearRequests()
+        done()
+      }
+      if (settings.xhr_ignoreErrors === 1) doPing() //retry ping
+
+      if(settings.xhr_ignoreErrors === 2){ //ignore failed ping
+        i++
+        if (i < settings.count_ping) doPing(); else done() // more pings to do?
+      }
     }.bind(this)
     }.bind(this)
     // sent xhr
     // sent xhr
     xhr[0].open('GET', settings.url_ping + '?r=' + Math.random(), true) // random string to prevent caching
     xhr[0].open('GET', settings.url_ping + '?r=' + Math.random(), true) // random string to prevent caching

Diferenças do arquivo suprimidas por serem muito extensas
+ 0 - 0
speedtest_worker.min.js


Alguns arquivos não foram mostrados porque muitos arquivos mudaram nesse diff