Index: third_party/WebKit/Source/devtools/front_end/network/JSONView.js |
diff --git a/third_party/WebKit/Source/devtools/front_end/network/JSONView.js b/third_party/WebKit/Source/devtools/front_end/network/JSONView.js |
index a0f135d877e1bd0745f070c7b8df93a30b812de6..20f9c5c9f6119dbb3a6ca78d7cac365e74b2332a 100644 |
--- a/third_party/WebKit/Source/devtools/front_end/network/JSONView.js |
+++ b/third_party/WebKit/Source/devtools/front_end/network/JSONView.js |
@@ -40,100 +40,47 @@ WebInspector.JSONView = function(parsedJSON) |
this.element.classList.add("json-view"); |
} |
-// "false", "true", "null", ",", "{", "}", "[", "]", number, double-quoted string. |
-WebInspector.JSONView._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"); |
- |
-// Escaped unicode char. |
-WebInspector.JSONView._escapedUnicode = new RegExp("\\\\(?:([^u])|u(.{4}))", "g"); |
- |
-// Map from escaped char to its literal value. |
-WebInspector.JSONView._standardEscapes = {'"': '"', "/": "/", "\\": "\\", "b": "\b", "f": "\f", "n": "\n", "r": "\r", "t": "\t"}; |
- |
-/** |
- * @param {string} full |
- * @param {string} standard |
- * @param {string} unicode |
- * @return {string} |
- */ |
-WebInspector.JSONView._unescape = function(full, standard, unicode) |
-{ |
- return standard ? WebInspector.JSONView._standardEscapes[standard] : String.fromCharCode(parseInt(unicode, 16)); |
-} |
- |
-/** |
- * @param {string} text |
- * @return {string} |
- */ |
-WebInspector.JSONView._unescapeString = function(text) |
-{ |
- return text.indexOf("\\") === -1 ? text : text.replace(WebInspector.JSONView._escapedUnicode, WebInspector.JSONView._unescape); |
-} |
- |
/** |
- * @return {*} |
+ * @param {?string} text |
+ * @return {!Promise<?WebInspector.ParsedJSON>} |
*/ |
-WebInspector.JSONView._buildObjectFromJSON = function(text) |
+WebInspector.JSONView.parseJSON = function(text) |
{ |
- var regExp = WebInspector.JSONView._jsonToken; |
- regExp.lastIndex = 0; |
- var result = []; |
- var tip = result; |
- var stack = []; |
- var key = undefined; |
- var token = undefined; |
- var lastToken = undefined; |
- while (true) { |
- var match = regExp.exec(text); |
- if (match === null) |
- break; |
- lastToken = token; |
- token = match[0]; |
- var code = token.charCodeAt(0); |
- if ((code === 0x5b) || (code === 0x7b)) { // [ or { |
- var newTip = (code === 0x5b) ? [] : {}; |
- tip[key || tip.length] = newTip; |
- stack.push(tip); |
- tip = newTip; |
- } else if ((code === 0x5d) || (code === 0x7d)) { // ] or } |
- tip = stack.pop(); |
- if (!tip) |
- break; |
- } else if (code === 0x2C) { // , |
- if (Array.isArray(tip) && (lastToken === undefined || lastToken === "[" || lastToken === ",")) |
- tip[tip.length] = undefined; |
- } else if (code === 0x22) { // " |
- token = WebInspector.JSONView._unescapeString(token.substring(1, token.length - 1)); |
- if (!key) { |
- if (Array.isArray(tip)) { |
- key = tip.length; |
- } else { |
- key = token || ""; |
- continue; |
- } |
+ var returnObj = null; |
+ if (text) |
+ returnObj = WebInspector.JSONView._extractJSON(/** @type {string} */ (text)); |
+ if (!returnObj) |
+ return Promise.resolve(/** @type {?WebInspector.ParsedJSON} */ (null)); |
+ return new Promise(runParser); |
+ |
+ /** |
+ * @param {function(*)} success |
+ */ |
+ function runParser(success) { |
+ var worker = new WorkerRuntime.Worker("formatter_worker"); |
+ worker.onmessage = /** @type function(!MessageEvent) */ (handleReturnedJSON); |
+ worker.postMessage({method: "relaxedJSONParser", params:{content: returnObj.data}}); |
+ |
+ /** |
+ * @param {!MessageEvent} event |
+ */ |
+ function handleReturnedJSON(event) { |
+ worker.terminate(); |
+ if (!event.data) { |
+ success(null); |
+ return; |
} |
- tip[key] = token; |
- } else if (code === 0x66) { // f |
- tip[key || tip.length] = false; |
- } else if (code === 0x6e) { // n |
- tip[key || tip.length] = null; |
- } else if (code === 0x74) { // t |
- tip[key || tip.length] = true; |
- } else if (code === 0x2f || code === 0x2a || code === 0x26 || code === 0x7c || code === 0x3b || code === 0x3d || code === 0x28 || code === 0x29) { // /*&|;=() |
- // Looks like JavaScript |
- throw "Invalid JSON"; |
- } else { // sign or digit |
- tip[key || tip.length] = +(token); |
+ returnObj.data = event.data; |
+ success(returnObj); |
} |
- key = undefined; |
} |
- return (result.length > 1) ? result : result[0]; |
} |
/** |
* @param {string} text |
* @return {?WebInspector.ParsedJSON} |
*/ |
-WebInspector.JSONView.parseJSON = function(text) |
+WebInspector.JSONView._extractJSON = function(text) |
{ |
// Do not treat HTML as JSON. |
if (text.startsWith("<")) |
@@ -154,11 +101,7 @@ WebInspector.JSONView.parseJSON = function(text) |
if (suffix.trim().length && !(suffix.trim().startsWith(")") && prefix.trim().endsWith("("))) |
return null; |
- try { |
- return new WebInspector.ParsedJSON(WebInspector.JSONView._buildObjectFromJSON(text), prefix, suffix); |
- } catch (e) { |
- return null; |
- } |
+ return new WebInspector.ParsedJSON(text, prefix, suffix); |
} |
/** |
@@ -192,8 +135,8 @@ WebInspector.JSONView.prototype = { |
var obj = WebInspector.RemoteObject.fromLocalObject(this._parsedJSON.data); |
var title = this._parsedJSON.prefix + obj.description + this._parsedJSON.suffix; |
var section = new WebInspector.ObjectPropertiesSection(obj, title); |
+ section.setEditable(false); |
section.expand(); |
- section.editable = false; |
this.element.appendChild(section.element); |
}, |