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; |
} |