| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2014 Google Inc. All rights reserved. | 2 * Copyright (C) 2014 Google Inc. All rights reserved. |
| 3 * | 3 * |
| 4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
| 5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
| 6 * met: | 6 * met: |
| 7 * | 7 * |
| 8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
| 9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
| 10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
| (...skipping 29 matching lines...) Expand all Loading... |
| 40 xhr.open("GET", url, false); | 40 xhr.open("GET", url, false); |
| 41 try { | 41 try { |
| 42 xhr.send(null); | 42 xhr.send(null); |
| 43 } catch (e) { | 43 } catch (e) { |
| 44 console.error(url + " -> " + new Error().stack); | 44 console.error(url + " -> " + new Error().stack); |
| 45 throw e; | 45 throw e; |
| 46 } | 46 } |
| 47 return xhr.responseText; | 47 return xhr.responseText; |
| 48 } | 48 } |
| 49 | 49 |
| 50 |
| 51 /** |
| 52 * http://tools.ietf.org/html/rfc3986#section-5.2.4 |
| 53 * @param {string} path |
| 54 * @return {string} |
| 55 */ |
| 56 function normalizePath(path) |
| 57 { |
| 58 if (path.indexOf("..") === -1 && path.indexOf('.') === -1) |
| 59 return path; |
| 60 |
| 61 var normalizedSegments = []; |
| 62 var segments = path.split("/"); |
| 63 for (var i = 0; i < segments.length; i++) { |
| 64 var segment = segments[i]; |
| 65 if (segment === ".") |
| 66 continue; |
| 67 else if (segment === "..") |
| 68 normalizedSegments.pop(); |
| 69 else if (segment) |
| 70 normalizedSegments.push(segment); |
| 71 } |
| 72 var normalizedPath = normalizedSegments.join("/"); |
| 73 if (normalizedPath[normalizedPath.length - 1] === "/") |
| 74 return normalizedPath; |
| 75 if (path[0] === "/" && normalizedPath) |
| 76 normalizedPath = "/" + normalizedPath; |
| 77 if ((path[path.length - 1] === "/") || (segments[segments.length - 1] === ".
") || (segments[segments.length - 1] === "..")) |
| 78 normalizedPath = normalizedPath + "/"; |
| 79 |
| 80 return normalizedPath; |
| 81 } |
| 82 |
| 50 /** | 83 /** |
| 51 * This function behavior depends on the "debug_devtools" flag value. | 84 * This function behavior depends on the "debug_devtools" flag value. |
| 52 * - In debug mode it loads scripts synchronously via xhr request. | 85 * - In debug mode it loads scripts synchronously via xhr request. |
| 53 * - In release mode every occurrence of "importScript" in the js files | 86 * - In release mode every occurrence of "importScript" in the js files |
| 54 * that have been whitelisted in the build system gets replaced with | 87 * that have been whitelisted in the build system gets replaced with |
| 55 * the script source code on the compilation phase. | 88 * the script source code on the compilation phase. |
| 56 * The build system will throw an exception if it finds an importScript() call | 89 * The build system will throw an exception if it finds an importScript() call |
| 57 * in other files. | 90 * in other files. |
| 58 * | 91 * |
| 59 * To load scripts lazily in release mode call "loadScript" function. | 92 * To load scripts lazily in release mode call "loadScript" function. |
| 60 * @param {string} scriptName | 93 * @param {string} scriptName |
| 61 */ | 94 */ |
| 62 function importScript(scriptName) | 95 function importScript(scriptName) |
| 63 { | 96 { |
| 64 var sourceURL = self._importScriptPathPrefix + scriptName; | 97 var sourceURL = self._importScriptPathPrefix + scriptName; |
| 98 var schemaIndex = sourceURL.indexOf("://") + 3; |
| 99 sourceURL = sourceURL.substring(0, schemaIndex) + normalizePath(sourceURL.su
bstring(schemaIndex)); |
| 65 if (_importedScripts[sourceURL]) | 100 if (_importedScripts[sourceURL]) |
| 66 return; | 101 return; |
| 67 _importedScripts[sourceURL] = true; | 102 _importedScripts[sourceURL] = true; |
| 68 var scriptSource = loadResource(sourceURL); | 103 var scriptSource = loadResource(sourceURL); |
| 69 if (!scriptSource) | 104 if (!scriptSource) |
| 70 throw "empty response arrived for script '" + sourceURL + "'"; | 105 throw "empty response arrived for script '" + sourceURL + "'"; |
| 71 var oldPrefix = self._importScriptPathPrefix; | 106 var oldPrefix = self._importScriptPathPrefix; |
| 72 self._importScriptPathPrefix += scriptName.substring(0, scriptName.lastIndex
Of("/") + 1); | 107 self._importScriptPathPrefix += scriptName.substring(0, scriptName.lastIndex
Of("/") + 1); |
| 73 try { | 108 try { |
| 74 self.eval(scriptSource + "\n//# sourceURL=" + sourceURL); | 109 self.eval(scriptSource + "\n//# sourceURL=" + sourceURL); |
| (...skipping 448 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 523 this._instance = new constructorFunction(); | 558 this._instance = new constructorFunction(); |
| 524 } | 559 } |
| 525 return this._instance; | 560 return this._instance; |
| 526 } | 561 } |
| 527 } | 562 } |
| 528 | 563 |
| 529 /** | 564 /** |
| 530 * @type {!Runtime} | 565 * @type {!Runtime} |
| 531 */ | 566 */ |
| 532 var runtime; | 567 var runtime; |
| OLD | NEW |