Chromium Code Reviews| Index: Source/devtools/front_end/network/RequestJSONView.js |
| diff --git a/Source/devtools/front_end/network/RequestJSONView.js b/Source/devtools/front_end/network/RequestJSONView.js |
| index 2b972271c3b03b89fdc891b4fb8e8733a5d2e767..e04be41dab11d9bb148da45c3b388c10626440b9 100644 |
| --- a/Source/devtools/front_end/network/RequestJSONView.js |
| +++ b/Source/devtools/front_end/network/RequestJSONView.js |
| @@ -42,6 +42,114 @@ WebInspector.RequestJSONView = function(request, parsedJSON) |
| } |
| /** |
| + * @return {*} |
| + */ |
| +WebInspector.RequestJSONView.buildJSON = function(text) |
|
vsevik
2014/10/16 06:51:35
buildObjectFromJSON
eustas
2014/10/16 14:14:56
Done.
|
| +{ |
| + // Based on https://code.google.com/p/json-sans-eval/ |
| + |
| + var jsonToken = new RegExp('(?:false|true|null|[,\\{\\}\\[\\]]|(?:-?\\b(?:0|[1-9][0-9]*)(?:\\.[0-9]+)?(?:[eE][+-]?[0-9]+)?\\b)|(?:\"(?:[^\\0-\\x08\\x0a-\\x1f\"\\\\]|\\\\(?:[\"/\\\\bfnrt]|u[0-9A-Fa-f]{4}))*\"))', 'g'); |
| + var escapeSequence = new RegExp('\\\\(?:([^u])|u(.{4}))', 'g'); |
| + var escapes = {'"': '"', '/': '/', '\\': '\\', 'b': '\b', 'f': '\f', 'n': '\n', 'r': '\r', 't': '\t'}; |
| + |
| + function unescapeOne(_, ch, hex) |
| + { |
| + return ch ? escapes[ch] : String.fromCharCode(parseInt(hex, 16)); |
| + } |
| + |
| + var emptyString = new String(''); |
| + var slash = '\\'; |
| + var toks = text.match(jsonToken); |
| + var result = []; |
| + var tok = toks[0]; |
| + var topLevelPrimitive = false; |
| + if ('{' === tok) |
| + result = {}; |
| + else if ('[' !== tok) |
| + topLevelPrimitive = true; |
| + |
| + var key; |
| + var noEntry = true; |
| + var stack = [result]; |
| + for (var i = 1 - topLevelPrimitive, n = toks.length; i < n; ++i) { |
| + tok = toks[i]; |
| + var cont; |
| + var wasNoEntry = noEntry; |
| + noEntry = false; |
| + switch (tok.charCodeAt(0)) { |
| + default: // sign or digit |
| + cont = stack[0]; |
| + cont[key || cont.length] = +(tok); |
| + key = void 0; |
| + break; |
| + case 0x22: // " |
| + tok = tok.substring(1, tok.length - 1); |
| + if (tok.indexOf(slash) !== -1) |
| + tok = tok.replace(escapeSequence, unescapeOne); |
| + cont = stack[0]; |
| + if (!key) { |
| + if (cont instanceof Array) { |
| + key = cont.length; |
| + } else { |
| + key = tok || emptyString; |
| + break; |
| + } |
| + } |
| + cont[key] = tok; |
| + key = void 0; |
| + break; |
| + case 0x2C: // " |
| + cont = stack[0]; |
| + if (wasNoEntry && (cont instanceof Array)) |
| + cont[key || cont.length] = undefined; |
| + noEntry = true; |
| + break; |
| + case 0x5b: // [ |
| + cont = stack[0]; |
| + stack.unshift(cont[key || cont.length] = []); |
| + key = void 0; |
| + noEntry = true; |
| + break; |
| + case 0x5d: // ] |
| + stack.shift(); |
| + break; |
| + case 0x66: // f |
| + cont = stack[0]; |
| + cont[key || cont.length] = false; |
| + key = void 0; |
| + break; |
| + case 0x6e: // n |
| + cont = stack[0]; |
| + cont[key || cont.length] = null; |
| + key = void 0; |
| + break; |
| + case 0x74: // t |
| + cont = stack[0]; |
| + cont[key || cont.length] = true; |
| + key = void 0; |
| + break; |
| + case 0x7b: // { |
| + cont = stack[0]; |
| + stack.unshift(cont[key || cont.length] = {}); |
| + key = void 0; |
| + break; |
| + case 0x7d: // } |
| + stack.shift(); |
| + break; |
| + } |
| + } |
| + if (topLevelPrimitive) { |
| + if (stack.length !== 1) |
| + throw new Error(); |
| + result = result[0]; |
| + } else { |
| + if (stack.length) |
| + throw new Error(); |
| + } |
| + return result; |
| +} |
| + |
| +/** |
| * @param {string} text |
| * @return {?WebInspector.ParsedJSON} |
| */ |
| @@ -57,7 +165,7 @@ WebInspector.RequestJSONView.parseJSON = function(text) |
| } |
| try { |
| - return new WebInspector.ParsedJSON(JSON.parse(text), prefix, ""); |
| + return new WebInspector.ParsedJSON(WebInspector.RequestJSONView.buildJSON(text), prefix, ""); |
|
vsevik
2014/10/16 06:51:34
We should make sure this returns correct suffix
eustas
2014/10/16 14:14:56
Done.
|
| } catch (e) { |
| return null; |
| } |
| @@ -80,7 +188,7 @@ WebInspector.RequestJSONView.parseJSONP = function(text) |
| text = text.substring(start + 1, end); |
| try { |
| - return new WebInspector.ParsedJSON(JSON.parse(text), prefix, suffix); |
| + return new WebInspector.ParsedJSON(WebInspector.RequestJSONView.buildJSON(text), prefix, suffix); |
| } catch (e) { |
| return null; |
| } |