| // Installs a script which has already been downloaded (usually because the |
| // script contents are combined with the bootstrap script in cases like SSSS). |
| // Since the script contents are wrapped in a call to onScriptDownloaded, all |
| // we do here is set up that function, which will install the contents in |
| // a script tag appended to the install location. |
| 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); |
| }); |
| }; |
| } |