Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2039)

Unified Diff: Source/devtools/front_end/network/RequestJSONView.js

Issue 654083006: DevTools: NetworkPanel: use optimistic JSON parser for response preview. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Created 6 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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;
}
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698