| // Installs the script by immediately appending a script tag to the body head |
| // with the src set, to get the script contents. The script contents are then |
| // installed into a script tag which is added to the install location (because |
| // the script contents will be wrapped in a call to onScriptDownloaded()). |
| function installScript(filename) { |
| // Provides the setupWaitForBodyLoad() function |
| __WAIT_FOR_BODY_LOADED__ |
| |
| function installCode(code) { |
| function removeScript(body, element) { |
| // Unless we're in pretty mode, remove the tags to shrink the DOM a little. |
| // It should have installed its code immediately after being added. |
| |
| __START_OBFUSCATED_ONLY__ |
| body.removeChild(element); |
| __END_OBFUSCATED_ONLY__ |
| } |
| |
| var doc = getInstallLocationDoc(); |
| var docbody = doc.body; |
| var script; |
| // for sourcemaps, we inject textNodes into the script element on Chrome |
| if (navigator.userAgent.indexOf("Chrome") > -1 && window.JSON) { |
| var scriptFrag = doc.createDocumentFragment() |
| // surround code with eval until crbug #90707 |
| scriptFrag.appendChild(doc.createTextNode("eval(\"")); |
| for (var i = 0; i < code.length; i++) { |
| // escape newlines, backslashes, and quotes with JSON.stringify |
| // rather than create multiple script tags which mess up line numbers, we use 1 tag, multiple text nodes |
| var c = window.JSON.stringify(code[i]); |
| // trim beginning/end quotes |
| scriptFrag.appendChild(doc.createTextNode(c.substring(1, c.length - 1))); |
| } |
| // close the eval |
| scriptFrag.appendChild(doc.createTextNode("\");")); |
| script = doc.createElement('script'); |
| script.language='javascript'; |
| script.appendChild(scriptFrag); |
| docbody.appendChild(script); |
| removeScript(docbody, script); |
| } else { |
| for (var i = 0; i < code.length; i++) { |
| script = doc.createElement('script'); |
| script.language='javascript'; |
| script.text = code[i]; |
| docbody.appendChild(script); |
| removeScript(docbody, script); |
| } |
| } |
| } |
| |
| // Set up a script tag to start downloading immediately, as well as a |
| // callback to install the code once it is downloaded and the body is loaded. |
| __MODULE_FUNC__.onScriptDownloaded = function(code) { |
| setupWaitForBodyLoad(function() { |
| installCode(code); |
| }); |
| }; |
| sendStats('moduleStartup', 'moduleRequested'); |
| var script = $doc.createElement('script'); |
| script.src = filename; |
| if (__MODULE_FUNC__.__errFn) { |
| script.onerror = function() { |
| __MODULE_FUNC__.__errFn('__MODULE_FUNC__', new Error("Failed to load " + code)); |
| } |
| } |
| $doc.getElementsByTagName('head')[0].appendChild(script); |
| } |