Commit ae0dd7ed authored by alph's avatar alph Committed by Commit bot

DevTools: make all timeline trace events use 0-based line numbers

Review-Url: https://codereview.chromium.org/2169153002
Cr-Commit-Position: refs/heads/master@{#407021}
parent be2ed685
......@@ -64,7 +64,7 @@ InspectorTest.formatters.formatAsInvalidationCause = function(cause)
return "<undefined>";
var stackTrace;
if (cause.stackTrace && cause.stackTrace.length)
stackTrace = InspectorTest.formatters.formatAsURL(cause.stackTrace[0].url) + ":" + cause.stackTrace[0].lineNumber;
stackTrace = InspectorTest.formatters.formatAsURL(cause.stackTrace[0].url) + ":" + (cause.stackTrace[0].lineNumber + 1);
return "{reason: " + cause.reason + ", stackTrace: " + stackTrace + "}";
}
......
......@@ -7,9 +7,9 @@ details.textContent for TimerInstall event: 'performActions.js:3'
detailsTextContent for TimerInstall event: 'performActions.js:4'
details.textContent for TimerInstall event: 'performActions.js:4'
detailsTextContent for FunctionCall event: 'performActions.js:7'
details.textContent for FunctionCall event: 'performActions.js:7'
details.textContent for FunctionCall event: 'intervalTimerWork @ performActions.js:7'
detailsTextContent for FunctionCall event: 'performActions.js:7'
details.textContent for FunctionCall event: 'performActions.js:7'
details.textContent for FunctionCall event: 'intervalTimerWork @ performActions.js:7'
detailsTextContent for TimerRemove event: 'performActions.js:11'
details.textContent for TimerRemove event: 'performActions.js:11'
......@@ -38,7 +38,7 @@ function test()
return;
// Here and below: pretend coalesced record are just not there, as coalescation is time dependent and, hence, not stable.
// Filter out InjectedScript function call because they happen out of sync.
if (typesToDump.has(traceEvent.name) && (traceEvent.name !== "FunctionCall" || traceEvent.args["data"].scriptName))
if (typesToDump.has(traceEvent.name) && (traceEvent.name !== "FunctionCall" || traceEvent.args["data"]["url"]))
InspectorTest.addResult(" ".repeat(level - 1) + traceEvent.name);
}
InspectorTest.walkTimelineEventTree(dumpEvent);
......
......@@ -16,6 +16,6 @@ UpdateLayoutTree Properties:
startTime : <number>
type : "UpdateLayoutTree"
}
Text details for UpdateLayoutTree: wrapCallFunctionForTimeline.js:8
Text details for UpdateLayoutTree: wrapCallFunctionForTimeline.js:7
UpdateLayoutTree has a warning
......@@ -87,9 +87,9 @@ FunctionCall Properties:
data : {
frame : <string>
functionName : "intervalTimerWork"
lineNumber : <number>
scriptId : <string>
scriptLine : <number>
scriptName : <string>
url : .../inspector/tracing/timeline-time/timeline-timer.html
}
endTime : <number>
frameId : <string>
......@@ -101,9 +101,9 @@ FunctionCall Properties:
data : {
frame : <string>
functionName : "intervalTimerWork"
lineNumber : <number>
scriptId : <string>
scriptLine : <number>
scriptName : <string>
url : .../inspector/tracing/timeline-time/timeline-timer.html
}
endTime : <number>
frameId : <string>
......
......@@ -35,7 +35,7 @@ function test()
{
if (record.type() === "TimerFire") {
var fnCallSite = record.children()[0].traceEvent().args["data"];
InspectorTest.addResult(record.type() + " " + fnCallSite.scriptName + ":" + fnCallSite.scriptLine);
InspectorTest.addResult(record.type() + " " + fnCallSite.url + ":" + (fnCallSite.lineNumber + 1));
}
}
InspectorTest.printTimelineRecords(null, formatter);
......
......@@ -726,8 +726,8 @@ std::unique_ptr<TracedValue> InspectorFunctionCallEvent::data(ExecutionContext*
value->setString("functionName", toCoreString(functionName.As<v8::String>()));
std::unique_ptr<SourceLocation> location = SourceLocation::fromFunction(originalFunction);
value->setString("scriptId", String::number(location->scriptId()));
value->setString("scriptName", location->url());
value->setInteger("scriptLine", location->lineNumber());
value->setString("url", location->url());
value->setInteger("lineNumber", location->lineNumber());
return value;
}
......
......@@ -223,18 +223,6 @@ WebInspector.Linkifier.prototype = {
return this.maybeLinkifyScriptLocation(target, callFrame.scriptId, callFrame.url, callFrame.lineNumber, callFrame.columnNumber, classes);
},
/**
* @param {?WebInspector.Target} target
* @param {!RuntimeAgent.CallFrame} callFrame
* @param {string=} classes
* @return {?Element}
*/
maybeLinkifyConsoleCallFrameForTracing: function(target, callFrame, classes)
{
// TODO(kozyatinskiy): remove this when tracing will migrate to 0-based lineNumber and columnNumber.
return this.linkifyScriptLocation(target, callFrame.scriptId, callFrame.url, callFrame.lineNumber - 1, callFrame.columnNumber - 1, classes);
},
/**
* @param {!WebInspector.Target} target
* @param {!RuntimeAgent.StackTrace} stackTrace
......
......@@ -221,18 +221,15 @@ WebInspector.SamplingHeapProfileHeader.prototype = {
*/
WebInspector.SamplingHeapProfileNode = function(node)
{
if (node.callFrame) {
WebInspector.ProfileNode.call(this, node.callFrame);
} else {
// Backward compatibility for old SamplingHeapProfileNode format.
var frame = /** @type {!RuntimeAgent.CallFrame} */(node);
WebInspector.ProfileNode.call(this, {
functionName: frame.functionName,
scriptId: frame.scriptId, url: frame.url,
lineNumber: frame.lineNumber - 1,
columnNumber: frame.columnNumber - 1
});
}
var callFrame = node.callFrame || /** @type {!RuntimeAgent.CallFrame} */ ({
// Backward compatibility for old CpuProfileNode format.
functionName: node["functionName"],
scriptId: node["scriptId"],
url: node["url"],
lineNumber: node["lineNumber"] - 1,
columnNumber: node["columnNumber"] - 1
});
WebInspector.ProfileNode.call(this, callFrame);
this.self = node.selfSize;
}
......
......@@ -5,27 +5,24 @@
/**
* @constructor
* @extends {WebInspector.ProfileNode}
* @param {!ProfilerAgent.CPUProfileNode} sourceNode
* @param {!ProfilerAgent.CPUProfileNode} node
* @param {number} sampleTime
*/
WebInspector.CPUProfileNode = function(sourceNode, sampleTime)
WebInspector.CPUProfileNode = function(node, sampleTime)
{
if (sourceNode.callFrame) {
WebInspector.ProfileNode.call(this, sourceNode.callFrame);
} else {
// Backward compatibility for old CPUProfileNode format.
var frame = /** @type {!RuntimeAgent.CallFrame} */(sourceNode);
WebInspector.ProfileNode.call(this, {
functionName: frame.functionName,
scriptId: frame.scriptId, url: frame.url,
lineNumber: frame.lineNumber - 1,
columnNumber: frame.columnNumber - 1
});
}
this.id = sourceNode.id;
this.self = sourceNode.hitCount * sampleTime;
this.positionTicks = sourceNode.positionTicks;
this.deoptReason = sourceNode.deoptReason;
var callFrame = node.callFrame || /** @type {!RuntimeAgent.CallFrame} */ ({
// Backward compatibility for old SamplingHeapProfileNode format.
functionName: node["functionName"],
scriptId: node["scriptId"],
url: node["url"],
lineNumber: node["lineNumber"] - 1,
columnNumber: node["columnNumber"] - 1
});
WebInspector.ProfileNode.call(this, callFrame);
this.id = node.id;
this.self = node.hitCount * sampleTime;
this.positionTicks = node.positionTicks;
this.deoptReason = node.deoptReason;
}
WebInspector.CPUProfileNode.prototype = {
......
......@@ -447,7 +447,7 @@ WebInspector.TracingModel.Event = function(categories, name, phase, startTime, t
this.warning = null;
/** @type {?WebInspector.TracingModel.Event} */
this.initiator = null;
/** @type {?Array.<!RuntimeAgent.CallFrame>} */
/** @type {?Array<!RuntimeAgent.CallFrame>} */
this.stackTrace = null;
/** @type {?Element} */
this.previewElement = null;
......
......@@ -120,7 +120,7 @@ WebInspector.CallStackSidebarPane.prototype = {
},
/**
* @param {!Array.<!RuntimeAgent.CallFrame>} callFrames
* @param {!Array<!RuntimeAgent.CallFrame>} callFrames
* @param {!WebInspector.UIList.Item} asyncCallFrameItem
* @return {!Array<!WebInspector.CallStackSidebarPane.CallFrame>}
*/
......
......@@ -92,9 +92,7 @@ WebInspector.TimelineTreeView.prototype = {
var frame = WebInspector.TimelineProfileTree.eventStackFrame(event);
if (!frame)
return null;
return event.name === WebInspector.TimelineModel.RecordType.JSFrame
? this._linkifier.maybeLinkifyConsoleCallFrame(target, frame)
: this._linkifier.maybeLinkifyConsoleCallFrameForTracing(target, frame);
return this._linkifier.maybeLinkifyConsoleCallFrame(target, frame);
},
/**
......
......@@ -404,8 +404,8 @@ WebInspector.TimelineUIUtils.buildDetailsTextForTraceEvent = function(event, tar
break;
case recordType.FunctionCall:
// Omit internally generated script names.
if (eventData && eventData["scriptName"])
detailsText = linkifyLocationAsText(eventData["scriptId"], eventData["scriptLine"], 0);
if (eventData)
detailsText = linkifyLocationAsText(eventData["scriptId"], eventData["lineNumber"], 0);
break;
case recordType.JSFrame:
detailsText = WebInspector.beautifyFunctionName(eventData["functionName"]);
......@@ -429,7 +429,7 @@ WebInspector.TimelineUIUtils.buildDetailsTextForTraceEvent = function(event, tar
case recordType.EvaluateScript:
var url = eventData["url"];
if (url)
detailsText = WebInspector.displayNameForURL(url) + ":" + eventData["lineNumber"];
detailsText = WebInspector.displayNameForURL(url) + ":" + (eventData["lineNumber"] + 1);
break;
case recordType.ParseScriptOnBackground:
case recordType.XHRReadyStateChange:
......@@ -491,14 +491,15 @@ WebInspector.TimelineUIUtils.buildDetailsTextForTraceEvent = function(event, tar
/**
* @param {string} scriptId
* @param {number} lineNumber
* @param {number=} columnNumber
* @param {number} columnNumber
* @return {?string}
*/
function linkifyLocationAsText(scriptId, lineNumber, columnNumber)
{
// FIXME(62725): stack trace line/column numbers are one-based.
var debuggerModel = WebInspector.DebuggerModel.fromTarget(target);
var rawLocation = target && !target.isDetached() && scriptId && debuggerModel ? debuggerModel.createRawLocationByScriptId(scriptId, lineNumber - 1, (columnNumber || 1) - 1) : null;
if (!target || target.isDetached() || !scriptId || !debuggerModel)
return null;
var rawLocation = debuggerModel.createRawLocationByScriptId(scriptId, lineNumber, columnNumber);
if (!rawLocation)
return null;
var uiLocation = WebInspector.debuggerWorkspaceBinding.rawLocationToUILocation(rawLocation);
......@@ -511,8 +512,10 @@ WebInspector.TimelineUIUtils.buildDetailsTextForTraceEvent = function(event, tar
function linkifyTopCallFrameAsText()
{
var frame = WebInspector.TimelineUIUtils.topStackFrame(event);
var text = frame ? linkifyLocationAsText(frame.scriptId, frame.lineNumber, frame.columnNumber) : null;
if (frame && !text) {
if (!frame)
return null;
var text = linkifyLocationAsText(frame.scriptId, frame.lineNumber, frame.columnNumber);
if (!text) {
text = frame.url;
if (typeof frame.lineNumber === "number")
text += ":" + (frame.lineNumber + 1);
......@@ -565,8 +568,6 @@ WebInspector.TimelineUIUtils.buildDetailsNodeForTraceEvent = function(event, tar
details = WebInspector.linkifyResourceAsNode(event.url);
break;
case recordType.FunctionCall:
details = linkifyLocation(eventData["scriptId"], eventData["scriptName"], eventData["scriptLine"] - 1, 0);
break;
case recordType.JSFrame:
details = createElement("span");
details.createTextChild(WebInspector.beautifyFunctionName(eventData["functionName"]));
......@@ -580,7 +581,7 @@ WebInspector.TimelineUIUtils.buildDetailsNodeForTraceEvent = function(event, tar
case recordType.EvaluateScript:
var url = eventData["url"];
if (url)
details = linkifyLocation("", url, eventData["lineNumber"] - 1, 0);
details = linkifyLocation("", url, eventData["lineNumber"], 0);
break;
case recordType.ParseScriptOnBackground:
var url = eventData["url"];
......@@ -617,7 +618,7 @@ WebInspector.TimelineUIUtils.buildDetailsNodeForTraceEvent = function(event, tar
function linkifyTopCallFrame()
{
var frame = WebInspector.TimelineUIUtils.topStackFrame(event);
return frame ? linkifier.maybeLinkifyConsoleCallFrameForTracing(target, frame, "timeline-details") : null;
return frame ? linkifier.maybeLinkifyConsoleCallFrame(target, frame, "timeline-details") : null;
}
}
......@@ -720,6 +721,7 @@ WebInspector.TimelineUIUtils._buildTraceEventDetailsSynchronously = function(eve
contentHelper.appendTextRow(WebInspector.UIString("Collected"), Number.bytesToString(delta));
break;
case recordTypes.JSFrame:
case recordTypes.FunctionCall:
var detailsNode = WebInspector.TimelineUIUtils.buildDetailsNodeForTraceEvent(event, model.targetByEvent(event), linkifier);
if (detailsNode)
contentHelper.appendElementRow(WebInspector.UIString("Function"), detailsNode);
......@@ -736,12 +738,6 @@ WebInspector.TimelineUIUtils._buildTraceEventDetailsSynchronously = function(eve
case recordTypes.FireAnimationFrame:
contentHelper.appendTextRow(WebInspector.UIString("Callback ID"), eventData["id"]);
break;
case recordTypes.FunctionCall:
if (typeof eventData["functionName"] === "string")
contentHelper.appendTextRow(WebInspector.UIString("Function"), WebInspector.beautifyFunctionName(eventData["functionName"]));
if (eventData["scriptName"])
contentHelper.appendLocationRow(WebInspector.UIString("Location"), eventData["scriptName"], eventData["scriptLine"]);
break;
case recordTypes.ResourceSendRequest:
case recordTypes.ResourceReceiveResponse:
case recordTypes.ResourceReceivedData:
......@@ -829,8 +825,8 @@ WebInspector.TimelineUIUtils._buildTraceEventDetailsSynchronously = function(eve
case recordTypes.ParseHTML:
var beginData = event.args["beginData"];
var url = beginData["url"];
var startLine = beginData["startLine"] + 1;
var endLine = event.args["endData"] ? event.args["endData"]["endLine"] + 1 : 0;
var startLine = beginData["startLine"] - 1;
var endLine = event.args["endData"] ? event.args["endData"]["endLine"] - 1 : undefined;
if (url)
contentHelper.appendLocationRange(WebInspector.UIString("Range"), url, startLine, endLine);
break;
......@@ -994,7 +990,7 @@ WebInspector.TimelineUIUtils.buildNetworkRequestDetails = function(request, mode
var sendRequest = request.children[0];
var topFrame = WebInspector.TimelineUIUtils.topStackFrame(sendRequest);
if (topFrame) {
var link = linkifier.maybeLinkifyConsoleCallFrameForTracing(target, topFrame);
var link = linkifier.maybeLinkifyConsoleCallFrame(target, topFrame);
if (link)
contentHelper.appendElementRow(title, link);
} else if (sendRequest.initiator) {
......@@ -1245,7 +1241,7 @@ WebInspector.TimelineUIUtils.InvalidationsGroupElement.prototype = {
title.createTextChild(WebInspector.UIString(". "));
var stack = title.createChild("span", "monospace");
stack.createChild("span").textContent = WebInspector.beautifyFunctionName(topFrame.functionName);
var link = this._contentHelper.linkifier().maybeLinkifyConsoleCallFrameForTracing(target, topFrame);
var link = this._contentHelper.linkifier().maybeLinkifyConsoleCallFrame(target, topFrame);
if (link) {
stack.createChild("span").textContent = " @ ";
stack.createChild("span").appendChild(link);
......@@ -2057,9 +2053,7 @@ WebInspector.TimelineDetailsContentHelper.prototype = {
{
if (!this._linkifier || !this._target)
return;
if (startColumn)
--startColumn;
var link = this._linkifier.maybeLinkifyScriptLocation(this._target, null, url, startLine - 1, startColumn);
var link = this._linkifier.maybeLinkifyScriptLocation(this._target, null, url, startLine, startColumn);
if (!link)
return;
this.appendElementRow(title, link);
......@@ -2076,11 +2070,11 @@ WebInspector.TimelineDetailsContentHelper.prototype = {
if (!this._linkifier || !this._target)
return;
var locationContent = createElement("span");
var link = this._linkifier.maybeLinkifyScriptLocation(this._target, null, url, startLine - 1);
var link = this._linkifier.maybeLinkifyScriptLocation(this._target, null, url, startLine);
if (!link)
return;
locationContent.appendChild(link);
locationContent.createTextChild(String.sprintf(" [%s\u2026%s]", startLine, endLine || ""));
locationContent.createTextChild(String.sprintf(" [%s\u2026%s]", startLine + 1, endLine + 1 || ""));
this.appendElementRow(title, locationContent);
},
......
......@@ -831,8 +831,16 @@ WebInspector.TimelineModel.prototype = {
this._currentScriptEvent = null;
var eventData = event.args["data"] || event.args["beginData"] || {};
if (eventData && eventData["stackTrace"])
if (eventData["stackTrace"])
event.stackTrace = eventData["stackTrace"];
if (event.stackTrace && event.name !== recordTypes.JSSample) {
// TraceEvents come with 1-based line & column numbers. The frontend code
// requires 0-based ones. Adjust the values.
for (var i = 0; i < event.stackTrace.length; ++i) {
--event.stackTrace[i].lineNumber;
--event.stackTrace[i].columnNumber;
}
}
if (eventStack.length && eventStack.peekLast().name === recordTypes.EventDispatch)
eventStack.peekLast().hasChildren = true;
......@@ -842,12 +850,12 @@ WebInspector.TimelineModel.prototype = {
switch (event.name) {
case recordTypes.ResourceSendRequest:
case recordTypes.WebSocketCreate:
event.url = event.args["data"]["url"];
event.url = eventData["url"];
event.initiator = eventStack.peekLast() || null;
break;
case recordTypes.ScheduleStyleRecalculation:
this._lastScheduleStyleRecalculation[event.args["data"]["frame"]] = event;
this._lastScheduleStyleRecalculation[eventData["frame"]] = event;
break;
case recordTypes.UpdateLayoutTree:
......@@ -874,7 +882,7 @@ WebInspector.TimelineModel.prototype = {
// Consider style recalculation as a reason for layout invalidation,
// but only if we had no earlier layout invalidation records.
var layoutInitator = event;
var frameId = event.args["data"]["frame"];
var frameId = eventData["frame"];
if (!this._layoutInvalidate[frameId] && this._lastRecalculateStylesEvent && this._lastRecalculateStylesEvent.endTime > event.startTime)
layoutInitator = this._lastRecalculateStylesEvent.initiator;
this._layoutInvalidate[frameId] = layoutInitator;
......@@ -894,8 +902,19 @@ WebInspector.TimelineModel.prototype = {
event.warning = WebInspector.TimelineModel.WarningType.ForcedLayout;
break;
case recordTypes.EvaluateScript:
case recordTypes.FunctionCall:
// Compatibility with old format.
if (typeof eventData["scriptName"] === "string")
eventData["url"] = eventData["scriptName"];
if (typeof eventData["scriptLine"] === "number")
eventData["lineNumber"] = eventData["scriptLine"];
// Fallthrough.
case recordTypes.EvaluateScript:
case recordTypes.CompileScript:
if (typeof eventData["lineNumber"] === "number")
--eventData["lineNumber"];
if (typeof eventData["columnNumber"] === "number")
--eventData["columnNumber"];
if (!this._currentScriptEvent)
this._currentScriptEvent = event;
break;
......@@ -906,12 +925,12 @@ WebInspector.TimelineModel.prototype = {
case recordTypes.Paint:
this._invalidationTracker.didPaint(event);
event.highlightQuad = event.args["data"]["clip"];
event.backendNodeId = event.args["data"]["nodeId"];
event.highlightQuad = eventData["clip"];
event.backendNodeId = eventData["nodeId"];
// Only keep layer paint events, skip paints for subframes that get painted to the same layer as parent.
if (!event.args["data"]["layerId"])
if (!eventData["layerId"])
break;
var layerId = event.args["data"]["layerId"];
var layerId = eventData["layerId"];
this._lastPaintForLayer[layerId] = event;
break;
......@@ -926,12 +945,12 @@ WebInspector.TimelineModel.prototype = {
break;
case recordTypes.ScrollLayer:
event.backendNodeId = event.args["data"]["nodeId"];
event.backendNodeId = eventData["nodeId"];
break;
case recordTypes.PaintImage:
event.backendNodeId = event.args["data"]["nodeId"];
event.url = event.args["data"]["url"];
event.backendNodeId = eventData["nodeId"];
event.url = eventData["url"];
break;
case recordTypes.DecodeImage:
......@@ -1447,7 +1466,7 @@ WebInspector.InvalidationTrackingEvent = function(event)
this.cause.reason = "Layout forced";
}
/** @typedef {{reason: string, stackTrace: ?Array.<!RuntimeAgent.CallFrame>}} */
/** @typedef {{reason: string, stackTrace: ?Array<!RuntimeAgent.CallFrame>}} */
WebInspector.InvalidationCause;
/**
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment