diff options
author | Nathan Gass | 2012-03-22 18:18:42 +0000 |
---|---|---|
committer | Nathan Gass | 2012-03-22 18:18:42 +0000 |
commit | d59a4921188753dbe4c0161081755a28112c3ef6 (patch) | |
tree | 81496414d988f37f1db9d92c9750d888ffa13746 /devel-utf8/itjs/boot.js | |
parent | ca11771e8fad5fef96615df4c44e04b8fb60ac31 (diff) | |
download | itools-d59a4921188753dbe4c0161081755a28112c3ef6.tar.gz itools-d59a4921188753dbe4c0161081755a28112c3ef6.tar.bz2 itools-d59a4921188753dbe4c0161081755a28112c3ef6.zip |
Branch itools/devel-utf8 created
Diffstat (limited to 'devel-utf8/itjs/boot.js')
-rw-r--r-- | devel-utf8/itjs/boot.js | 253 |
1 files changed, 253 insertions, 0 deletions
diff --git a/devel-utf8/itjs/boot.js b/devel-utf8/itjs/boot.js new file mode 100644 index 0000000..059bd78 --- /dev/null +++ b/devel-utf8/itjs/boot.js @@ -0,0 +1,253 @@ +// $Id$ + +var it_boot_status = "boot"; +var it_panictimer = window.setTimeout("it_panic({reason:it_boot_status})", 31337), it_domtimer; +var it_starttime = new Date().getTime(); + +function it_stacktrace() +{ + var stacktrace = ""; + var callstack_done = false; + + try { i.dont.exist += 0; } // does not exist - that's the point + catch (e) + { + if (e.stack) // Firefox + { + stacktrace = e.stack.replace(/^[^\n]*\n/,'').replace(/(\n@)?\s+$/,'$1').replace(/^\(/g,'{anonymous}(') + ';'; + callstack_done = true; + } + else if (window.opera && e.message) // Opera + { + var entry, lines = e.message.split("\n"); + for (var i=1, len=lines.length; i < len; i++) + { + if (lines[i].match(/^\s*[A-Za-z0-9\-_\$]+\(/)) + { + entry = lines[i]; + // append next line also since it has the file info + if (lines[i+1]) + { + entry += " at " + lines[i+1]; + i++; + } + stacktrace += entry + ','; + } + } + callstack_done = true; + } + } + + if (!callstack_done) // IE and Safari + { + var fname, current_func = arguments.callee.caller; + while (current_func) + { + fname = /function\s*([\w\-$]+)?\s*\(/.test(current_func.toString()) ? RegExp.$1 || 'anonymous' : 'anonymous'; + stacktrace += fname + ','; + current_func = current_func.caller; + } + } + + return stacktrace; +} + +function it_catcherr(msg, url, line) +{ + var stacktrace = it_stacktrace(); + + if (typeof it_boot.sequence != 'undefined') + { + // trigger it_boot retry if error occured while evaluating loaded script + if (it_boot.sequence == 'ble' && it_boot.file) + { + it_boot(it_boot.file, true); + return true; + } + + stacktrace += "it_boot=" + it_boot.sequence + ";it_boot_file=" + it_boot.file; + } + if (typeof window.it_loader != 'undefined' && it_loader.sequence) + stacktrace += "it_loader=" + it_loader.sequence + ";"; + + it_boot_report({msg:msg, url:url, line:line, stacktrace:stacktrace}); + + return !window.env || !!window.env.is_live_server; // No env or live server -> suppress error +} + +window.onerror = it_catcherr; + +function it_boot_addparam(url, param) +{ + return url + (url.match(/\?/) ? "&" : "?") + param; +} + +function it_panic(p) +{ + if (!document.location.href.match(/[?&]static=/)) // Avoid loop + window.setTimeout("document.location.href = it_boot_addparam(document.location.href, 'static=" + p.reason + "')", 500); + + p.type = "panic"; + p.stacktrace = it_stacktrace(); + return it_boot_report(p); +} + +function it_boot_report(p) +{ + window.clearTimeout(window.it_domtimer); + window.clearTimeout(window.it_panictimer); + var loader = null; + var data = ""; + var postdata = p.data; + delete p.data; + p.time = new Date().getTime() - it_starttime; + + for (var k in p) + data += (data ? '&' : '') + k + "=" + escape(p[k]).replace(/\+/g, "%2B"); + + var url = "/itjs/error.gif?" + data; + + if (postdata) + { + loader = it_boot_getloader(); + for (var k in postdata) + data += (data ? '&' : '') + k + "=" + escape(postdata[k]).replace(/\+/g, "%2B"); + } + + try + { + loader.open('POST', url); + loader.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); + loader.send(data); + } + catch (e) + { + new Image().src = url; + } +} + +function it_boot_checkcss(style, key, value) +{ + return navigator.userAgent.match(/konqueror/i) || (style && style.getPropertyValue && (style.getPropertyValue(key) == value)); +} + +function it_boot_init() +{ + it_boot.sequence += "i"; + window.it_domtimer = null; + var konqueror = navigator.userAgent.match(/konqueror/i); + var doc = document; + var dom = doc && (dom = doc.getElementById('it_boot_dom')); // HTML has been rendered + var view = dom && doc.defaultView; // We can check if stylesheet is active + var style = view && view.getComputedStyle && view.getComputedStyle(dom, ''); + var css = window.it_boot_checkcss(style, "visibility", "hidden"); // CSS active (inline style on tag) + var stylesheet = window.it_boot_checkcss(style, "display", "none"); // External stylesheet loaded + + if (!(doc || !(it_boot_status = "doc")) || !(dom || !(it_boot_status = "dom")) || (style && !(stylesheet || !(it_boot_status = "stylesheet")))) + { + window.it_domtimer = window.setTimeout("it_boot_init()" , 42); + + if (style && !css) + it_panic({reason:"css"}); + + return; + } + + window.clearTimeout(window.it_panictimer); + it_boot.sequence += "s"; + window.it_boot_start(); + it_boot.sequence = ""; +} + +function it_boot_getloader() +{ + var result = null; + + if (!navigator.userAgent.match(/iPhone|iP.d/)) // Do not use XMLHttpRequest on iOS devices as it does not use cache + { + try + { + result = new XMLHttpRequest(); + } + catch (e) + { + var classnames = [ 'MSXML2.XMLHTTP', 'Microsoft.XMLHTTP' ]; + + for (var i in classnames) + try { result = new ActiveXObject(classnames[i]); break; } catch (e) {} + } + } + + return result; +} + +function it_boot(file, isretry) +{ + it_boot.file = file; + it_boot.sequence = isretry ? "r" : "b"; + var loader = it_boot_getloader(); + + if (loader) + { + it_boot.sequence += "l"; + loader.open("GET", it_boot_addparam(file, "boot=1" + (isretry ? "&retry=1" : ""))); + loader.onreadystatechange = function() + { + var error = "", code = ""; + + if (loader.readyState == 4) + { + if (loader.status < 400) // Opera gives back 304 if from cache + { + // check length cookie + var ln = String(loader.responseText).match(/\*sln:([0-9]+)[^\n]*\n([\s\S]*\n)\/\*eln:\1/); + code = ln ? unescape(ln[2]) : loader.responseText; + if (ln && ln[1]-0 == code.length) + { + it_boot.sequence += "e"; + if (!window.env || !!window.env.is_live_server) + code = "try {" + code + "} catch (e) { it_catcherr(e.message, it_boot.file, -1); }"; // Wrapped in try/catch as Konqueror does not support window.onerror + if (window.execScript) + window.execScript(code, "javascript"); // IE work-around to get script executed in global scope + else + window.setTimeout(code, 0); // Standard compliant version + } + else + error = (ln ? "length mismatch: " + ln[1] + " != " + code.length : "no length cookie"); + } + else + error = loader.statusText; + + if (error) + { + if (isretry) + it_panic({reason:'load', error:error, data:{code:code}}); + else + it_boot(file, true); + } + } + } + loader.send(null); + } + else + { + var doc = document; + var dom = doc && (dom = doc.getElementById('it_boot_dom')); // HTML has been rendered + it_boot.sequence += "n"; + + if (window.opera || (document.all && navigator.platform.indexOf("Mac") >= 0)) + document.write('<sc'+'ript type="text/javascript" src="'+it_boot_addparam(file, 'boot=1&script=1')+'"><\/sc'+'ript>'); + else if (dom) + { + var tag = doc.createElement("script"); + tag.src = it_boot_addparam(file, 'boot=1&script=1&retry=1'); + dom.appendChild(tag); + } + else + window.it_domtimer = window.setTimeout("it_boot('" + file + "')" , 42); + } +} + +if (document.documentElement) + document.documentElement.className += ' js'; + |