diff --git a/index.html b/index.html index f088a91ac..de9e5aad5 100644 --- a/index.html +++ b/index.html @@ -28,9 +28,90 @@ && criticalFiles.some( function(file) { return fileRef.indexOf(file) !== -1 })) { window.onload = function() { + // The whole complex part below implements page reloads with + // "exponential backoff". The retry attempt is passes as + // "rCounter" query parameter + var href = window.location.href; + + var retryMatch = href.match(/.+(\?|&)rCounter=(\d+)/); + var retryCountStr = retryMatch ? retryMatch[2] : "0"; + var retryCount = Number.parseInt(retryCountStr); + + if (retryMatch == null) { + var separator = href.indexOf("?") === -1 ? "?" : "&"; + var hashIdx = href.indexOf("#"); + + if (hashIdx === -1) { + href += separator + "rCounter=1"; + } else { + var hashPart = href.substr(hashIdx); + + href = href.substr(0, hashIdx) + + separator + "rCounter=1" + hashPart; + } + } else { + var separator = retryMatch[1]; + + href = href.replace( + /(\?|&)rCounter=(\d+)/, + separator + "rCounter=" + (retryCount + 1)); + } + + var delay = Math.pow(2, retryCount) * 2000; + if (isNaN(delay) || delay < 2000 || delay > 60000) + delay = 10000; + + var showMoreText = "show more"; + var showLessText = "show less"; + document.body.innerHTML - = "The application failed to load, missing file: " - + fileRef; + = "
" + + "Uh oh! We couldn't fully download everything we needed :(" // jshint ignore:line + + "
" + + "We will try again shortly. In the mean time, check for problems with your Internet connection!" // jshint ignore:line + + "

" + + "
" + "Missing " + fileRef + + "

" + + "" + showMoreText + "" + + "   " + + "reload now" + + "
"; + + var showMoreElem = document.getElementById("showMore"); + showMoreElem.addEventListener('click', function () { + var moreInfoElem + = document.getElementById("moreInfo"); + + if (showMoreElem.innerHTML === showMoreText) { + moreInfoElem.setAttribute( + "style", + "display: block;" + + "color:#FF991F;" + + "font-size:small;" + + "user-select:text;"); + showMoreElem.innerHTML = showLessText; + } + else { + moreInfoElem.setAttribute( + "style", "display: none;"); + showMoreElem.innerHTML = showMoreText; + } + }); + + window.setTimeout( + function () { window.location.replace(href); }, delay); }; window.removeEventListener( 'error', loadErrHandler, true /* capture phase */);