| Index: third_party/WebKit/Source/devtools/front_end/sources/SourceMapNamesResolver.js
|
| diff --git a/third_party/WebKit/Source/devtools/front_end/sources/SourceMapNamesResolver.js b/third_party/WebKit/Source/devtools/front_end/sources/SourceMapNamesResolver.js
|
| index ee283853cc3d3042df80b0b1ebe41ba0526169cf..8f3e29746880d34eeff8b6d20bc3b3bcd1bc4b8c 100644
|
| --- a/third_party/WebKit/Source/devtools/front_end/sources/SourceMapNamesResolver.js
|
| +++ b/third_party/WebKit/Source/devtools/front_end/sources/SourceMapNamesResolver.js
|
| @@ -1,221 +1,217 @@
|
| // Copyright 2016 The Chromium Authors. All rights reserved.
|
| // Use of this source code is governed by a BSD-style license that can be
|
| // found in the LICENSE file.
|
| -
|
| WebInspector.SourceMapNamesResolver = {};
|
|
|
| -WebInspector.SourceMapNamesResolver._cachedMapSymbol = Symbol("cache");
|
| -WebInspector.SourceMapNamesResolver._cachedIdentifiersSymbol = Symbol("cachedIdentifiers");
|
| +WebInspector.SourceMapNamesResolver._cachedMapSymbol = Symbol('cache');
|
| +WebInspector.SourceMapNamesResolver._cachedIdentifiersSymbol = Symbol('cachedIdentifiers');
|
|
|
| /**
|
| - * @constructor
|
| - * @param {string} name
|
| - * @param {number} lineNumber
|
| - * @param {number} columnNumber
|
| + * @unrestricted
|
| */
|
| -WebInspector.SourceMapNamesResolver.Identifier = function(name, lineNumber, columnNumber)
|
| -{
|
| +WebInspector.SourceMapNamesResolver.Identifier = class {
|
| + /**
|
| + * @param {string} name
|
| + * @param {number} lineNumber
|
| + * @param {number} columnNumber
|
| + */
|
| + constructor(name, lineNumber, columnNumber) {
|
| this.name = name;
|
| this.lineNumber = lineNumber;
|
| this.columnNumber = columnNumber;
|
| + }
|
| };
|
|
|
| /**
|
| * @param {!WebInspector.DebuggerModel.Scope} scope
|
| * @return {!Promise<!Array<!WebInspector.SourceMapNamesResolver.Identifier>>}
|
| */
|
| -WebInspector.SourceMapNamesResolver._scopeIdentifiers = function(scope)
|
| -{
|
| - var startLocation = scope.startLocation();
|
| - var endLocation = scope.endLocation();
|
| -
|
| - if (scope.type() === DebuggerAgent.ScopeType.Global || !startLocation || !endLocation || !startLocation.script().sourceMapURL || (startLocation.script() !== endLocation.script()))
|
| - return Promise.resolve(/** @type {!Array<!WebInspector.SourceMapNamesResolver.Identifier>}*/([]));
|
| -
|
| - var script = startLocation.script();
|
| - return script.requestContent().then(onContent);
|
| -
|
| - /**
|
| - * @param {?string} content
|
| - * @return {!Promise<!Array<!WebInspector.SourceMapNamesResolver.Identifier>>}
|
| - */
|
| - function onContent(content)
|
| - {
|
| - if (!content)
|
| - return Promise.resolve(/** @type {!Array<!WebInspector.SourceMapNamesResolver.Identifier>}*/([]));
|
| -
|
| - var text = new WebInspector.Text(content);
|
| - var scopeRange = new WebInspector.TextRange(startLocation.lineNumber, startLocation.columnNumber, endLocation.lineNumber, endLocation.columnNumber);
|
| - var scopeText = text.extract(scopeRange);
|
| - var scopeStart = text.toSourceRange(scopeRange).offset;
|
| - var prefix = "function fui";
|
| - return WebInspector.formatterWorkerPool.runTask("javaScriptIdentifiers", {content: prefix + scopeText})
|
| - .then(onIdentifiers.bind(null, text, scopeStart, prefix));
|
| - }
|
| -
|
| - /**
|
| - * @param {!WebInspector.Text} text
|
| - * @param {number} scopeStart
|
| - * @param {string} prefix
|
| - * @param {?MessageEvent} event
|
| - * @return {!Array<!WebInspector.SourceMapNamesResolver.Identifier>}
|
| - */
|
| - function onIdentifiers(text, scopeStart, prefix, event)
|
| - {
|
| - var identifiers = event ? /** @type {!Array<!{name: string, offset: number}>} */(event.data) : [];
|
| - var result = [];
|
| - var cursor = new WebInspector.TextCursor(text.lineEndings());
|
| - var promises = [];
|
| - for (var i = 0; i < identifiers.length; ++i) {
|
| - var id = identifiers[i];
|
| - if (id.offset < prefix.length)
|
| - continue;
|
| - var start = scopeStart + id.offset - prefix.length;
|
| - cursor.resetTo(start);
|
| - result.push(new WebInspector.SourceMapNamesResolver.Identifier(id.name, cursor.lineNumber(), cursor.columnNumber()));
|
| - }
|
| - return result;
|
| +WebInspector.SourceMapNamesResolver._scopeIdentifiers = function(scope) {
|
| + var startLocation = scope.startLocation();
|
| + var endLocation = scope.endLocation();
|
| +
|
| + if (scope.type() === DebuggerAgent.ScopeType.Global || !startLocation || !endLocation ||
|
| + !startLocation.script().sourceMapURL || (startLocation.script() !== endLocation.script()))
|
| + return Promise.resolve(/** @type {!Array<!WebInspector.SourceMapNamesResolver.Identifier>}*/ ([]));
|
| +
|
| + var script = startLocation.script();
|
| + return script.requestContent().then(onContent);
|
| +
|
| + /**
|
| + * @param {?string} content
|
| + * @return {!Promise<!Array<!WebInspector.SourceMapNamesResolver.Identifier>>}
|
| + */
|
| + function onContent(content) {
|
| + if (!content)
|
| + return Promise.resolve(/** @type {!Array<!WebInspector.SourceMapNamesResolver.Identifier>}*/ ([]));
|
| +
|
| + var text = new WebInspector.Text(content);
|
| + var scopeRange = new WebInspector.TextRange(
|
| + startLocation.lineNumber, startLocation.columnNumber, endLocation.lineNumber, endLocation.columnNumber);
|
| + var scopeText = text.extract(scopeRange);
|
| + var scopeStart = text.toSourceRange(scopeRange).offset;
|
| + var prefix = 'function fui';
|
| + return WebInspector.formatterWorkerPool.runTask('javaScriptIdentifiers', {content: prefix + scopeText})
|
| + .then(onIdentifiers.bind(null, text, scopeStart, prefix));
|
| + }
|
| +
|
| + /**
|
| + * @param {!WebInspector.Text} text
|
| + * @param {number} scopeStart
|
| + * @param {string} prefix
|
| + * @param {?MessageEvent} event
|
| + * @return {!Array<!WebInspector.SourceMapNamesResolver.Identifier>}
|
| + */
|
| + function onIdentifiers(text, scopeStart, prefix, event) {
|
| + var identifiers = event ? /** @type {!Array<!{name: string, offset: number}>} */ (event.data) : [];
|
| + var result = [];
|
| + var cursor = new WebInspector.TextCursor(text.lineEndings());
|
| + var promises = [];
|
| + for (var i = 0; i < identifiers.length; ++i) {
|
| + var id = identifiers[i];
|
| + if (id.offset < prefix.length)
|
| + continue;
|
| + var start = scopeStart + id.offset - prefix.length;
|
| + cursor.resetTo(start);
|
| + result.push(
|
| + new WebInspector.SourceMapNamesResolver.Identifier(id.name, cursor.lineNumber(), cursor.columnNumber()));
|
| }
|
| + return result;
|
| + }
|
| };
|
|
|
| /**
|
| * @param {!WebInspector.DebuggerModel.Scope} scope
|
| * @return {!Promise.<!Map<string, string>>}
|
| */
|
| -WebInspector.SourceMapNamesResolver._resolveScope = function(scope)
|
| -{
|
| - var identifiersPromise = scope[WebInspector.SourceMapNamesResolver._cachedIdentifiersSymbol];
|
| - if (identifiersPromise)
|
| - return identifiersPromise;
|
| -
|
| - var script = scope.callFrame().script;
|
| - var sourceMap = WebInspector.debuggerWorkspaceBinding.sourceMapForScript(script);
|
| - if (!sourceMap)
|
| - return Promise.resolve(new Map());
|
| -
|
| - /** @type {!Map<string, !WebInspector.Text>} */
|
| - var textCache = new Map();
|
| - identifiersPromise = WebInspector.SourceMapNamesResolver._scopeIdentifiers(scope).then(onIdentifiers);
|
| - scope[WebInspector.SourceMapNamesResolver._cachedIdentifiersSymbol] = identifiersPromise;
|
| +WebInspector.SourceMapNamesResolver._resolveScope = function(scope) {
|
| + var identifiersPromise = scope[WebInspector.SourceMapNamesResolver._cachedIdentifiersSymbol];
|
| + if (identifiersPromise)
|
| return identifiersPromise;
|
|
|
| - /**
|
| - * @param {!Array<!WebInspector.SourceMapNamesResolver.Identifier>} identifiers
|
| - * @return {!Promise<!Map<string, string>>}
|
| - */
|
| - function onIdentifiers(identifiers)
|
| - {
|
| - var namesMapping = new Map();
|
| - // Extract as much as possible from SourceMap.
|
| - for (var i = 0; i < identifiers.length; ++i) {
|
| - var id = identifiers[i];
|
| - var entry = sourceMap.findEntry(id.lineNumber, id.columnNumber);
|
| - if (entry && entry.name)
|
| - namesMapping.set(id.name, entry.name);
|
| - }
|
| -
|
| - // Resolve missing identifier names from sourcemap ranges.
|
| - var promises = [];
|
| - for (var i = 0; i < identifiers.length; ++i) {
|
| - var id = identifiers[i];
|
| - if (namesMapping.has(id.name))
|
| - continue;
|
| - var promise = resolveSourceName(id).then(onSourceNameResolved.bind(null, namesMapping, id));
|
| - promises.push(promise);
|
| - }
|
| - return Promise.all(promises)
|
| - .then(() => WebInspector.SourceMapNamesResolver._scopeResolvedForTest())
|
| - .then(() => namesMapping);
|
| - }
|
| -
|
| - /**
|
| - * @param {!Map<string, string>} namesMapping
|
| - * @param {!WebInspector.SourceMapNamesResolver.Identifier} id
|
| - * @param {?string} sourceName
|
| - */
|
| - function onSourceNameResolved(namesMapping, id, sourceName)
|
| - {
|
| - if (!sourceName)
|
| - return;
|
| - namesMapping.set(id.name, sourceName);
|
| + var script = scope.callFrame().script;
|
| + var sourceMap = WebInspector.debuggerWorkspaceBinding.sourceMapForScript(script);
|
| + if (!sourceMap)
|
| + return Promise.resolve(new Map());
|
| +
|
| + /** @type {!Map<string, !WebInspector.Text>} */
|
| + var textCache = new Map();
|
| + identifiersPromise = WebInspector.SourceMapNamesResolver._scopeIdentifiers(scope).then(onIdentifiers);
|
| + scope[WebInspector.SourceMapNamesResolver._cachedIdentifiersSymbol] = identifiersPromise;
|
| + return identifiersPromise;
|
| +
|
| + /**
|
| + * @param {!Array<!WebInspector.SourceMapNamesResolver.Identifier>} identifiers
|
| + * @return {!Promise<!Map<string, string>>}
|
| + */
|
| + function onIdentifiers(identifiers) {
|
| + var namesMapping = new Map();
|
| + // Extract as much as possible from SourceMap.
|
| + for (var i = 0; i < identifiers.length; ++i) {
|
| + var id = identifiers[i];
|
| + var entry = sourceMap.findEntry(id.lineNumber, id.columnNumber);
|
| + if (entry && entry.name)
|
| + namesMapping.set(id.name, entry.name);
|
| }
|
|
|
| - /**
|
| - * @param {!WebInspector.SourceMapNamesResolver.Identifier} id
|
| - * @return {!Promise<?string>}
|
| - */
|
| - function resolveSourceName(id)
|
| - {
|
| - var startEntry = sourceMap.findEntry(id.lineNumber, id.columnNumber);
|
| - var endEntry = sourceMap.findEntry(id.lineNumber, id.columnNumber + id.name.length);
|
| - if (!startEntry || !endEntry || !startEntry.sourceURL || startEntry.sourceURL !== endEntry.sourceURL
|
| - || !startEntry.sourceLineNumber || !startEntry.sourceColumnNumber
|
| - || !endEntry.sourceLineNumber || !endEntry.sourceColumnNumber)
|
| - return Promise.resolve(/** @type {?string} */(null));
|
| - var sourceTextRange = new WebInspector.TextRange(startEntry.sourceLineNumber, startEntry.sourceColumnNumber, endEntry.sourceLineNumber, endEntry.sourceColumnNumber);
|
| - var uiSourceCode = WebInspector.networkMapping.uiSourceCodeForScriptURL(startEntry.sourceURL, script);
|
| - if (!uiSourceCode)
|
| - return Promise.resolve(/** @type {?string} */(null));
|
| -
|
| - return uiSourceCode.requestContent()
|
| - .then(onSourceContent.bind(null, sourceTextRange));
|
| + // Resolve missing identifier names from sourcemap ranges.
|
| + var promises = [];
|
| + for (var i = 0; i < identifiers.length; ++i) {
|
| + var id = identifiers[i];
|
| + if (namesMapping.has(id.name))
|
| + continue;
|
| + var promise = resolveSourceName(id).then(onSourceNameResolved.bind(null, namesMapping, id));
|
| + promises.push(promise);
|
| }
|
| -
|
| - /**
|
| - * @param {!WebInspector.TextRange} sourceTextRange
|
| - * @param {?string} content
|
| - * @return {?string}
|
| - */
|
| - function onSourceContent(sourceTextRange, content)
|
| - {
|
| - if (!content)
|
| - return null;
|
| - var text = textCache.get(content);
|
| - if (!text) {
|
| - text = new WebInspector.Text(content);
|
| - textCache.set(content, text);
|
| - }
|
| - var originalIdentifier = text.extract(sourceTextRange).trim();
|
| - return /[a-zA-Z0-9_$]+/.test(originalIdentifier) ? originalIdentifier : null;
|
| + return Promise.all(promises)
|
| + .then(() => WebInspector.SourceMapNamesResolver._scopeResolvedForTest())
|
| + .then(() => namesMapping);
|
| + }
|
| +
|
| + /**
|
| + * @param {!Map<string, string>} namesMapping
|
| + * @param {!WebInspector.SourceMapNamesResolver.Identifier} id
|
| + * @param {?string} sourceName
|
| + */
|
| + function onSourceNameResolved(namesMapping, id, sourceName) {
|
| + if (!sourceName)
|
| + return;
|
| + namesMapping.set(id.name, sourceName);
|
| + }
|
| +
|
| + /**
|
| + * @param {!WebInspector.SourceMapNamesResolver.Identifier} id
|
| + * @return {!Promise<?string>}
|
| + */
|
| + function resolveSourceName(id) {
|
| + var startEntry = sourceMap.findEntry(id.lineNumber, id.columnNumber);
|
| + var endEntry = sourceMap.findEntry(id.lineNumber, id.columnNumber + id.name.length);
|
| + if (!startEntry || !endEntry || !startEntry.sourceURL || startEntry.sourceURL !== endEntry.sourceURL ||
|
| + !startEntry.sourceLineNumber || !startEntry.sourceColumnNumber || !endEntry.sourceLineNumber ||
|
| + !endEntry.sourceColumnNumber)
|
| + return Promise.resolve(/** @type {?string} */ (null));
|
| + var sourceTextRange = new WebInspector.TextRange(
|
| + startEntry.sourceLineNumber, startEntry.sourceColumnNumber, endEntry.sourceLineNumber,
|
| + endEntry.sourceColumnNumber);
|
| + var uiSourceCode = WebInspector.networkMapping.uiSourceCodeForScriptURL(startEntry.sourceURL, script);
|
| + if (!uiSourceCode)
|
| + return Promise.resolve(/** @type {?string} */ (null));
|
| +
|
| + return uiSourceCode.requestContent().then(onSourceContent.bind(null, sourceTextRange));
|
| + }
|
| +
|
| + /**
|
| + * @param {!WebInspector.TextRange} sourceTextRange
|
| + * @param {?string} content
|
| + * @return {?string}
|
| + */
|
| + function onSourceContent(sourceTextRange, content) {
|
| + if (!content)
|
| + return null;
|
| + var text = textCache.get(content);
|
| + if (!text) {
|
| + text = new WebInspector.Text(content);
|
| + textCache.set(content, text);
|
| }
|
| + var originalIdentifier = text.extract(sourceTextRange).trim();
|
| + return /[a-zA-Z0-9_$]+/.test(originalIdentifier) ? originalIdentifier : null;
|
| + }
|
| };
|
|
|
| -WebInspector.SourceMapNamesResolver._scopeResolvedForTest = function() { };
|
| +WebInspector.SourceMapNamesResolver._scopeResolvedForTest = function() {};
|
|
|
| /**
|
| * @param {!WebInspector.DebuggerModel.CallFrame} callFrame
|
| * @return {!Promise.<!Map<string, string>>}
|
| */
|
| -WebInspector.SourceMapNamesResolver._allVariablesInCallFrame = function(callFrame)
|
| -{
|
| - var cached = callFrame[WebInspector.SourceMapNamesResolver._cachedMapSymbol];
|
| - if (cached)
|
| - return Promise.resolve(cached);
|
| -
|
| - var promises = [];
|
| - var scopeChain = callFrame.scopeChain();
|
| - for (var i = 0; i < scopeChain.length; ++i)
|
| - promises.push(WebInspector.SourceMapNamesResolver._resolveScope(scopeChain[i]));
|
| -
|
| - return Promise.all(promises).then(mergeVariables);
|
| -
|
| - /**
|
| - * @param {!Array<!Map<string, string>>} nameMappings
|
| - * @return {!Map<string, string>}
|
| - */
|
| - function mergeVariables(nameMappings)
|
| - {
|
| - var reverseMapping = new Map();
|
| - for (var map of nameMappings) {
|
| - for (var compiledName of map.keys()) {
|
| - var originalName = map.get(compiledName);
|
| - if (!reverseMapping.has(originalName))
|
| - reverseMapping.set(originalName, compiledName);
|
| - }
|
| - }
|
| - callFrame[WebInspector.SourceMapNamesResolver._cachedMapSymbol] = reverseMapping;
|
| - return reverseMapping;
|
| +WebInspector.SourceMapNamesResolver._allVariablesInCallFrame = function(callFrame) {
|
| + var cached = callFrame[WebInspector.SourceMapNamesResolver._cachedMapSymbol];
|
| + if (cached)
|
| + return Promise.resolve(cached);
|
| +
|
| + var promises = [];
|
| + var scopeChain = callFrame.scopeChain();
|
| + for (var i = 0; i < scopeChain.length; ++i)
|
| + promises.push(WebInspector.SourceMapNamesResolver._resolveScope(scopeChain[i]));
|
| +
|
| + return Promise.all(promises).then(mergeVariables);
|
| +
|
| + /**
|
| + * @param {!Array<!Map<string, string>>} nameMappings
|
| + * @return {!Map<string, string>}
|
| + */
|
| + function mergeVariables(nameMappings) {
|
| + var reverseMapping = new Map();
|
| + for (var map of nameMappings) {
|
| + for (var compiledName of map.keys()) {
|
| + var originalName = map.get(compiledName);
|
| + if (!reverseMapping.has(originalName))
|
| + reverseMapping.set(originalName, compiledName);
|
| + }
|
| }
|
| + callFrame[WebInspector.SourceMapNamesResolver._cachedMapSymbol] = reverseMapping;
|
| + return reverseMapping;
|
| + }
|
| };
|
|
|
| /**
|
| @@ -227,24 +223,24 @@ WebInspector.SourceMapNamesResolver._allVariablesInCallFrame = function(callFram
|
| * @param {number} endColumnNumber
|
| * @return {!Promise<string>}
|
| */
|
| -WebInspector.SourceMapNamesResolver.resolveExpression = function(callFrame, originalText, uiSourceCode, lineNumber, startColumnNumber, endColumnNumber)
|
| -{
|
| - if (!Runtime.experiments.isEnabled("resolveVariableNames") || !uiSourceCode.contentType().isFromSourceMap())
|
| - return Promise.resolve("");
|
| -
|
| - return WebInspector.SourceMapNamesResolver._allVariablesInCallFrame(callFrame).then(findCompiledName);
|
| -
|
| - /**
|
| - * @param {!Map<string, string>} reverseMapping
|
| - * @return {!Promise<string>}
|
| - */
|
| - function findCompiledName(reverseMapping)
|
| - {
|
| - if (reverseMapping.has(originalText))
|
| - return Promise.resolve(reverseMapping.get(originalText) || "");
|
| -
|
| - return WebInspector.SourceMapNamesResolver._resolveExpression(callFrame, uiSourceCode, lineNumber, startColumnNumber, endColumnNumber);
|
| - }
|
| +WebInspector.SourceMapNamesResolver.resolveExpression = function(
|
| + callFrame, originalText, uiSourceCode, lineNumber, startColumnNumber, endColumnNumber) {
|
| + if (!Runtime.experiments.isEnabled('resolveVariableNames') || !uiSourceCode.contentType().isFromSourceMap())
|
| + return Promise.resolve('');
|
| +
|
| + return WebInspector.SourceMapNamesResolver._allVariablesInCallFrame(callFrame).then(findCompiledName);
|
| +
|
| + /**
|
| + * @param {!Map<string, string>} reverseMapping
|
| + * @return {!Promise<string>}
|
| + */
|
| + function findCompiledName(reverseMapping) {
|
| + if (reverseMapping.has(originalText))
|
| + return Promise.resolve(reverseMapping.get(originalText) || '');
|
| +
|
| + return WebInspector.SourceMapNamesResolver._resolveExpression(
|
| + callFrame, uiSourceCode, lineNumber, startColumnNumber, endColumnNumber);
|
| + }
|
| };
|
|
|
| /**
|
| @@ -255,326 +251,304 @@ WebInspector.SourceMapNamesResolver.resolveExpression = function(callFrame, orig
|
| * @param {number} endColumnNumber
|
| * @return {!Promise<string>}
|
| */
|
| -WebInspector.SourceMapNamesResolver._resolveExpression = function(callFrame, uiSourceCode, lineNumber, startColumnNumber, endColumnNumber)
|
| -{
|
| - var target = callFrame.target();
|
| - var rawLocation = WebInspector.debuggerWorkspaceBinding.uiLocationToRawLocation(target, uiSourceCode, lineNumber, startColumnNumber);
|
| - if (!rawLocation)
|
| - return Promise.resolve("");
|
| -
|
| - var script = rawLocation.script();
|
| - if (!script)
|
| - return Promise.resolve("");
|
| - var sourceMap = WebInspector.debuggerWorkspaceBinding.sourceMapForScript(script);
|
| - if (!sourceMap)
|
| - return Promise.resolve("");
|
| -
|
| - return script.requestContent().then(onContent);
|
| -
|
| - /**
|
| - * @param {?string} content
|
| - * @return {!Promise<string>}
|
| - */
|
| - function onContent(content)
|
| - {
|
| - if (!content)
|
| - return Promise.resolve("");
|
| -
|
| - var text = new WebInspector.Text(content);
|
| - var textRange = sourceMap.reverseMapTextRange(uiSourceCode.url(), new WebInspector.TextRange(lineNumber, startColumnNumber, lineNumber, endColumnNumber));
|
| - var originalText = text.extract(textRange);
|
| - if (!originalText)
|
| - return Promise.resolve("");
|
| - return WebInspector.formatterWorkerPool.runTask("evaluatableJavaScriptSubstring", {content: originalText})
|
| - .then(onResult);
|
| - }
|
| -
|
| - /**
|
| - * @param {?MessageEvent} event
|
| - * @return {string}
|
| - */
|
| - function onResult(event)
|
| - {
|
| - return event ? /** @type {string} */(event.data) : "";
|
| - }
|
| +WebInspector.SourceMapNamesResolver._resolveExpression = function(
|
| + callFrame, uiSourceCode, lineNumber, startColumnNumber, endColumnNumber) {
|
| + var target = callFrame.target();
|
| + var rawLocation = WebInspector.debuggerWorkspaceBinding.uiLocationToRawLocation(
|
| + target, uiSourceCode, lineNumber, startColumnNumber);
|
| + if (!rawLocation)
|
| + return Promise.resolve('');
|
| +
|
| + var script = rawLocation.script();
|
| + if (!script)
|
| + return Promise.resolve('');
|
| + var sourceMap = WebInspector.debuggerWorkspaceBinding.sourceMapForScript(script);
|
| + if (!sourceMap)
|
| + return Promise.resolve('');
|
| +
|
| + return script.requestContent().then(onContent);
|
| +
|
| + /**
|
| + * @param {?string} content
|
| + * @return {!Promise<string>}
|
| + */
|
| + function onContent(content) {
|
| + if (!content)
|
| + return Promise.resolve('');
|
| +
|
| + var text = new WebInspector.Text(content);
|
| + var textRange = sourceMap.reverseMapTextRange(
|
| + uiSourceCode.url(), new WebInspector.TextRange(lineNumber, startColumnNumber, lineNumber, endColumnNumber));
|
| + var originalText = text.extract(textRange);
|
| + if (!originalText)
|
| + return Promise.resolve('');
|
| + return WebInspector.formatterWorkerPool.runTask('evaluatableJavaScriptSubstring', {content: originalText})
|
| + .then(onResult);
|
| + }
|
| +
|
| + /**
|
| + * @param {?MessageEvent} event
|
| + * @return {string}
|
| + */
|
| + function onResult(event) {
|
| + return event ? /** @type {string} */ (event.data) : '';
|
| + }
|
| };
|
|
|
| /**
|
| * @param {?WebInspector.DebuggerModel.CallFrame} callFrame
|
| * @return {!Promise<?WebInspector.RemoteObject>}
|
| */
|
| -WebInspector.SourceMapNamesResolver.resolveThisObject = function(callFrame)
|
| -{
|
| - if (!callFrame)
|
| - return Promise.resolve(/** @type {?WebInspector.RemoteObject} */(null));
|
| - if (!Runtime.experiments.isEnabled("resolveVariableNames") || !callFrame.scopeChain().length)
|
| - return Promise.resolve(callFrame.thisObject());
|
| -
|
| - return WebInspector.SourceMapNamesResolver._resolveScope(callFrame.scopeChain()[0])
|
| - .then(onScopeResolved);
|
| -
|
| - /**
|
| - * @param {!Map<string, string>} namesMapping
|
| - * @return {!Promise<?WebInspector.RemoteObject>}
|
| - */
|
| - function onScopeResolved(namesMapping)
|
| - {
|
| - var thisMappings = namesMapping.inverse().get("this");
|
| - if (!thisMappings || thisMappings.size !== 1)
|
| - return Promise.resolve(callFrame.thisObject());
|
| -
|
| - var thisMapping = thisMappings.valuesArray()[0];
|
| - var callback;
|
| - var promise = new Promise(fulfill => callback = fulfill);
|
| - callFrame.evaluate(thisMapping, "backtrace", false, true, false, true, onEvaluated.bind(null, callback));
|
| - return promise;
|
| - }
|
| -
|
| - /**
|
| - * @param {function(!WebInspector.RemoteObject)} callback
|
| - * @param {?RuntimeAgent.RemoteObject} evaluateResult
|
| - */
|
| - function onEvaluated(callback, evaluateResult)
|
| - {
|
| - var remoteObject = evaluateResult ? callFrame.target().runtimeModel.createRemoteObject(evaluateResult) : callFrame.thisObject();
|
| - callback(remoteObject);
|
| - }
|
| +WebInspector.SourceMapNamesResolver.resolveThisObject = function(callFrame) {
|
| + if (!callFrame)
|
| + return Promise.resolve(/** @type {?WebInspector.RemoteObject} */ (null));
|
| + if (!Runtime.experiments.isEnabled('resolveVariableNames') || !callFrame.scopeChain().length)
|
| + return Promise.resolve(callFrame.thisObject());
|
| +
|
| + return WebInspector.SourceMapNamesResolver._resolveScope(callFrame.scopeChain()[0]).then(onScopeResolved);
|
| +
|
| + /**
|
| + * @param {!Map<string, string>} namesMapping
|
| + * @return {!Promise<?WebInspector.RemoteObject>}
|
| + */
|
| + function onScopeResolved(namesMapping) {
|
| + var thisMappings = namesMapping.inverse().get('this');
|
| + if (!thisMappings || thisMappings.size !== 1)
|
| + return Promise.resolve(callFrame.thisObject());
|
| +
|
| + var thisMapping = thisMappings.valuesArray()[0];
|
| + var callback;
|
| + var promise = new Promise(fulfill => callback = fulfill);
|
| + callFrame.evaluate(thisMapping, 'backtrace', false, true, false, true, onEvaluated.bind(null, callback));
|
| + return promise;
|
| + }
|
| +
|
| + /**
|
| + * @param {function(!WebInspector.RemoteObject)} callback
|
| + * @param {?RuntimeAgent.RemoteObject} evaluateResult
|
| + */
|
| + function onEvaluated(callback, evaluateResult) {
|
| + var remoteObject =
|
| + evaluateResult ? callFrame.target().runtimeModel.createRemoteObject(evaluateResult) : callFrame.thisObject();
|
| + callback(remoteObject);
|
| + }
|
| };
|
|
|
| /**
|
| * @param {!WebInspector.DebuggerModel.Scope} scope
|
| * @return {!WebInspector.RemoteObject}
|
| */
|
| -WebInspector.SourceMapNamesResolver.resolveScopeInObject = function(scope)
|
| -{
|
| - if (!Runtime.experiments.isEnabled("resolveVariableNames"))
|
| - return scope.object();
|
| +WebInspector.SourceMapNamesResolver.resolveScopeInObject = function(scope) {
|
| + if (!Runtime.experiments.isEnabled('resolveVariableNames'))
|
| + return scope.object();
|
|
|
| - var startLocation = scope.startLocation();
|
| - var endLocation = scope.endLocation();
|
| + var startLocation = scope.startLocation();
|
| + var endLocation = scope.endLocation();
|
|
|
| - if (scope.type() === DebuggerAgent.ScopeType.Global || !startLocation || !endLocation || !startLocation.script().sourceMapURL || startLocation.script() !== endLocation.script())
|
| - return scope.object();
|
| + if (scope.type() === DebuggerAgent.ScopeType.Global || !startLocation || !endLocation ||
|
| + !startLocation.script().sourceMapURL || startLocation.script() !== endLocation.script())
|
| + return scope.object();
|
|
|
| - return new WebInspector.SourceMapNamesResolver.RemoteObject(scope);
|
| + return new WebInspector.SourceMapNamesResolver.RemoteObject(scope);
|
| };
|
|
|
| /**
|
| - * @constructor
|
| - * @extends {WebInspector.RemoteObject}
|
| - * @param {!WebInspector.DebuggerModel.Scope} scope
|
| + * @unrestricted
|
| */
|
| -WebInspector.SourceMapNamesResolver.RemoteObject = function(scope)
|
| -{
|
| - WebInspector.RemoteObject.call(this);
|
| +WebInspector.SourceMapNamesResolver.RemoteObject = class extends WebInspector.RemoteObject {
|
| + /**
|
| + * @param {!WebInspector.DebuggerModel.Scope} scope
|
| + */
|
| + constructor(scope) {
|
| + super();
|
| this._scope = scope;
|
| this._object = scope.object();
|
| -};
|
| -
|
| -WebInspector.SourceMapNamesResolver.RemoteObject.prototype = {
|
| - /**
|
| - * @override
|
| - * @return {?RuntimeAgent.CustomPreview}
|
| - */
|
| - customPreview: function()
|
| - {
|
| - return this._object.customPreview();
|
| - },
|
| -
|
| - /**
|
| - * @override
|
| - * @return {string}
|
| - */
|
| - get type()
|
| - {
|
| - return this._object.type;
|
| - },
|
| -
|
| - /**
|
| - * @override
|
| - * @return {string|undefined}
|
| - */
|
| - get subtype()
|
| - {
|
| - return this._object.subtype;
|
| - },
|
| -
|
| - /**
|
| - * @override
|
| - * @return {string|undefined}
|
| - */
|
| - get description()
|
| - {
|
| - return this._object.description;
|
| - },
|
| -
|
| - /**
|
| - * @override
|
| - * @return {boolean}
|
| - */
|
| - get hasChildren()
|
| - {
|
| - return this._object.hasChildren;
|
| - },
|
| -
|
| - /**
|
| - * @override
|
| - * @return {number}
|
| - */
|
| - arrayLength: function()
|
| - {
|
| - return this._object.arrayLength();
|
| - },
|
| -
|
| - /**
|
| - * @override
|
| - * @param {function(?Array.<!WebInspector.RemoteObjectProperty>, ?Array.<!WebInspector.RemoteObjectProperty>)} callback
|
| - */
|
| - getOwnProperties: function(callback)
|
| - {
|
| - this._object.getOwnProperties(callback);
|
| - },
|
| -
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @return {?RuntimeAgent.CustomPreview}
|
| + */
|
| + customPreview() {
|
| + return this._object.customPreview();
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @return {string}
|
| + */
|
| + get type() {
|
| + return this._object.type;
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @return {string|undefined}
|
| + */
|
| + get subtype() {
|
| + return this._object.subtype;
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @return {string|undefined}
|
| + */
|
| + get description() {
|
| + return this._object.description;
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @return {boolean}
|
| + */
|
| + get hasChildren() {
|
| + return this._object.hasChildren;
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @return {number}
|
| + */
|
| + arrayLength() {
|
| + return this._object.arrayLength();
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @param {function(?Array.<!WebInspector.RemoteObjectProperty>, ?Array.<!WebInspector.RemoteObjectProperty>)} callback
|
| + */
|
| + getOwnProperties(callback) {
|
| + this._object.getOwnProperties(callback);
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @param {boolean} accessorPropertiesOnly
|
| + * @param {function(?Array<!WebInspector.RemoteObjectProperty>, ?Array<!WebInspector.RemoteObjectProperty>)} callback
|
| + */
|
| + getAllProperties(accessorPropertiesOnly, callback) {
|
| /**
|
| - * @override
|
| - * @param {boolean} accessorPropertiesOnly
|
| - * @param {function(?Array<!WebInspector.RemoteObjectProperty>, ?Array<!WebInspector.RemoteObjectProperty>)} callback
|
| + * @param {?Array.<!WebInspector.RemoteObjectProperty>} properties
|
| + * @param {?Array.<!WebInspector.RemoteObjectProperty>} internalProperties
|
| + * @this {WebInspector.SourceMapNamesResolver.RemoteObject}
|
| */
|
| - getAllProperties: function(accessorPropertiesOnly, callback)
|
| - {
|
| - /**
|
| - * @param {?Array.<!WebInspector.RemoteObjectProperty>} properties
|
| - * @param {?Array.<!WebInspector.RemoteObjectProperty>} internalProperties
|
| - * @this {WebInspector.SourceMapNamesResolver.RemoteObject}
|
| - */
|
| - function wrappedCallback(properties, internalProperties)
|
| - {
|
| - WebInspector.SourceMapNamesResolver._resolveScope(this._scope).then(resolveNames.bind(null, properties, internalProperties));
|
| - }
|
| -
|
| - /**
|
| - * @param {?Array.<!WebInspector.RemoteObjectProperty>} properties
|
| - * @param {?Array.<!WebInspector.RemoteObjectProperty>} internalProperties
|
| - * @param {!Map<string, string>} namesMapping
|
| - */
|
| - function resolveNames(properties, internalProperties, namesMapping)
|
| - {
|
| - var newProperties = [];
|
| - if (properties) {
|
| - for (var i = 0; i < properties.length; ++i) {
|
| - var property = properties[i];
|
| - var name = namesMapping.get(property.name) || properties[i].name;
|
| - newProperties.push(new WebInspector.RemoteObjectProperty(name, property.value, property.enumerable, property.writable, property.isOwn, property.wasThrown, property.symbol, property.synthetic));
|
| - }
|
| - }
|
| -
|
| - callback(newProperties, internalProperties);
|
| - }
|
| -
|
| - this._object.getAllProperties(accessorPropertiesOnly, wrappedCallback.bind(this));
|
| - },
|
| + function wrappedCallback(properties, internalProperties) {
|
| + WebInspector.SourceMapNamesResolver._resolveScope(this._scope)
|
| + .then(resolveNames.bind(null, properties, internalProperties));
|
| + }
|
|
|
| /**
|
| - * @override
|
| - * @param {string|!RuntimeAgent.CallArgument} argumentName
|
| - * @param {string} value
|
| - * @param {function(string=)} callback
|
| + * @param {?Array.<!WebInspector.RemoteObjectProperty>} properties
|
| + * @param {?Array.<!WebInspector.RemoteObjectProperty>} internalProperties
|
| + * @param {!Map<string, string>} namesMapping
|
| */
|
| - setPropertyValue: function(argumentName, value, callback)
|
| - {
|
| - WebInspector.SourceMapNamesResolver._resolveScope(this._scope).then(resolveName.bind(this));
|
| -
|
| - /**
|
| - * @param {!Map<string, string>} namesMapping
|
| - * @this {WebInspector.SourceMapNamesResolver.RemoteObject}
|
| - */
|
| - function resolveName(namesMapping)
|
| - {
|
| - var name;
|
| - if (typeof argumentName === "string")
|
| - name = argumentName;
|
| - else
|
| - name = /** @type {string} */ (argumentName.value);
|
| -
|
| - var actualName = name;
|
| - for (var compiledName of namesMapping.keys()) {
|
| - if (namesMapping.get(compiledName) === name) {
|
| - actualName = compiledName;
|
| - break;
|
| - }
|
| - }
|
| - this._object.setPropertyValue(actualName, value, callback);
|
| + function resolveNames(properties, internalProperties, namesMapping) {
|
| + var newProperties = [];
|
| + if (properties) {
|
| + for (var i = 0; i < properties.length; ++i) {
|
| + var property = properties[i];
|
| + var name = namesMapping.get(property.name) || properties[i].name;
|
| + newProperties.push(new WebInspector.RemoteObjectProperty(
|
| + name, property.value, property.enumerable, property.writable, property.isOwn, property.wasThrown,
|
| + property.symbol, property.synthetic));
|
| }
|
| - },
|
| -
|
| - /**
|
| - * @override
|
| - * @return {!Promise<?Array<!WebInspector.EventListener>>}
|
| - */
|
| - eventListeners: function()
|
| - {
|
| - return this._object.eventListeners();
|
| - },
|
| -
|
| - /**
|
| - * @override
|
| - * @param {!RuntimeAgent.CallArgument} name
|
| - * @param {function(string=)} callback
|
| - */
|
| - deleteProperty: function(name, callback)
|
| - {
|
| - this._object.deleteProperty(name, callback);
|
| - },
|
| -
|
| - /**
|
| - * @override
|
| - * @param {function(this:Object, ...)} functionDeclaration
|
| - * @param {!Array<!RuntimeAgent.CallArgument>=} args
|
| - * @param {function(?WebInspector.RemoteObject, boolean=)=} callback
|
| - */
|
| - callFunction: function(functionDeclaration, args, callback)
|
| - {
|
| - this._object.callFunction(functionDeclaration, args, callback);
|
| - },
|
| + }
|
|
|
| - /**
|
| - * @override
|
| - * @param {function(this:Object, ...)} functionDeclaration
|
| - * @param {!Array<!RuntimeAgent.CallArgument>|undefined} args
|
| - * @param {function(*)} callback
|
| - */
|
| - callFunctionJSON: function(functionDeclaration, args, callback)
|
| - {
|
| - this._object.callFunctionJSON(functionDeclaration, args, callback);
|
| - },
|
| + callback(newProperties, internalProperties);
|
| + }
|
|
|
| - /**
|
| - * @override
|
| - * @return {!WebInspector.Target}
|
| - */
|
| - target: function()
|
| - {
|
| - return this._object.target();
|
| - },
|
| + this._object.getAllProperties(accessorPropertiesOnly, wrappedCallback.bind(this));
|
| + }
|
|
|
| - /**
|
| - * @override
|
| - * @return {?WebInspector.DebuggerModel}
|
| - */
|
| - debuggerModel: function()
|
| - {
|
| - return this._object.debuggerModel();
|
| - },
|
| + /**
|
| + * @override
|
| + * @param {string|!RuntimeAgent.CallArgument} argumentName
|
| + * @param {string} value
|
| + * @param {function(string=)} callback
|
| + */
|
| + setPropertyValue(argumentName, value, callback) {
|
| + WebInspector.SourceMapNamesResolver._resolveScope(this._scope).then(resolveName.bind(this));
|
|
|
| /**
|
| - * @override
|
| - * @return {boolean}
|
| + * @param {!Map<string, string>} namesMapping
|
| + * @this {WebInspector.SourceMapNamesResolver.RemoteObject}
|
| */
|
| - isNode: function()
|
| - {
|
| - return this._object.isNode();
|
| - },
|
| -
|
| - __proto__: WebInspector.RemoteObject.prototype
|
| + function resolveName(namesMapping) {
|
| + var name;
|
| + if (typeof argumentName === 'string')
|
| + name = argumentName;
|
| + else
|
| + name = /** @type {string} */ (argumentName.value);
|
| +
|
| + var actualName = name;
|
| + for (var compiledName of namesMapping.keys()) {
|
| + if (namesMapping.get(compiledName) === name) {
|
| + actualName = compiledName;
|
| + break;
|
| + }
|
| + }
|
| + this._object.setPropertyValue(actualName, value, callback);
|
| + }
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @return {!Promise<?Array<!WebInspector.EventListener>>}
|
| + */
|
| + eventListeners() {
|
| + return this._object.eventListeners();
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @param {!RuntimeAgent.CallArgument} name
|
| + * @param {function(string=)} callback
|
| + */
|
| + deleteProperty(name, callback) {
|
| + this._object.deleteProperty(name, callback);
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @param {function(this:Object, ...)} functionDeclaration
|
| + * @param {!Array<!RuntimeAgent.CallArgument>=} args
|
| + * @param {function(?WebInspector.RemoteObject, boolean=)=} callback
|
| + */
|
| + callFunction(functionDeclaration, args, callback) {
|
| + this._object.callFunction(functionDeclaration, args, callback);
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @param {function(this:Object, ...)} functionDeclaration
|
| + * @param {!Array<!RuntimeAgent.CallArgument>|undefined} args
|
| + * @param {function(*)} callback
|
| + */
|
| + callFunctionJSON(functionDeclaration, args, callback) {
|
| + this._object.callFunctionJSON(functionDeclaration, args, callback);
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @return {!WebInspector.Target}
|
| + */
|
| + target() {
|
| + return this._object.target();
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @return {?WebInspector.DebuggerModel}
|
| + */
|
| + debuggerModel() {
|
| + return this._object.debuggerModel();
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @return {boolean}
|
| + */
|
| + isNode() {
|
| + return this._object.isNode();
|
| + }
|
| };
|
| -
|
|
|