OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2013 Google Inc. All rights reserved. | 2 * Copyright (C) 2013 Google Inc. All rights reserved. |
3 * Copyright (C) 2012 Intel Inc. All rights reserved. | 3 * Copyright (C) 2012 Intel Inc. All rights reserved. |
4 * | 4 * |
5 * Redistribution and use in source and binary forms, with or without | 5 * Redistribution and use in source and binary forms, with or without |
6 * modification, are permitted provided that the following conditions are | 6 * modification, are permitted provided that the following conditions are |
7 * met: | 7 * met: |
8 * | 8 * |
9 * * Redistributions of source code must retain the above copyright | 9 * * Redistributions of source code must retain the above copyright |
10 * notice, this list of conditions and the following disclaimer. | 10 * notice, this list of conditions and the following disclaimer. |
(...skipping 650 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
661 /** | 661 /** |
662 * @param {!Array.<number>} quad | 662 * @param {!Array.<number>} quad |
663 * @return {number} | 663 * @return {number} |
664 */ | 664 */ |
665 WebInspector.TimelineUIUtils._quadWidth = function(quad) | 665 WebInspector.TimelineUIUtils._quadWidth = function(quad) |
666 { | 666 { |
667 return Math.round(Math.sqrt(Math.pow(quad[0] - quad[2], 2) + Math.pow(quad[1
] - quad[3], 2))); | 667 return Math.round(Math.sqrt(Math.pow(quad[0] - quad[2], 2) + Math.pow(quad[1
] - quad[3], 2))); |
668 } | 668 } |
669 | 669 |
670 /** | 670 /** |
671 * @param {!WebInspector.TracingModel.Event} event | |
672 * @param {!WebInspector.TracingTimelineModel} model | |
673 * @param {!WebInspector.Linkifier} linkifier | |
674 * @param {function(!DocumentFragment)} callback | |
675 * @param {boolean} loadedFromFile | |
676 * @param {!WebInspector.Target} target | |
677 */ | |
678 WebInspector.TimelineUIUtils.buildTraceEventDetails = function(event, model, lin
kifier, callback, loadedFromFile, target) | |
679 { | |
680 var relatedNode = null; | |
681 var barrier = new CallbackBarrier(); | |
682 if (event.imageURL && !event.previewElement) | |
683 WebInspector.DOMPresentationUtils.buildImagePreviewContents(target, even
t.imageURL, false, barrier.createCallback(saveImage)); | |
684 if (event.backendNodeId) | |
685 target.domModel.pushNodesByBackendIdsToFrontend([event.backendNodeId], b
arrier.createCallback(setRelatedNode)); | |
686 barrier.callWhenDone(callbackWrapper); | |
687 | |
688 /** | |
689 * @param {!Element=} element | |
690 */ | |
691 function saveImage(element) | |
692 { | |
693 event.previewElement = element || null; | |
694 } | |
695 | |
696 /** | |
697 * @param {?Array.<!DOMAgent.NodeId>} nodeIds | |
698 */ | |
699 function setRelatedNode(nodeIds) | |
700 { | |
701 if (nodeIds) | |
702 relatedNode = target.domModel.nodeForId(nodeIds[0]); | |
703 } | |
704 | |
705 function callbackWrapper() | |
706 { | |
707 callback(WebInspector.TimelineUIUtils._buildTraceEventDetailsSynchronous
ly(event, model, linkifier, relatedNode, loadedFromFile, target)); | |
708 } | |
709 } | |
710 | |
711 /** | |
712 * @param {!WebInspector.TracingModel.Event} event | |
713 * @param {!WebInspector.TracingTimelineModel} model | |
714 * @param {!WebInspector.Linkifier} linkifier | |
715 * @param {?WebInspector.DOMNode} relatedNode | |
716 * @param {boolean} loadedFromFile | |
717 * @param {!WebInspector.Target} target | |
718 * @return {!DocumentFragment} | |
719 */ | |
720 WebInspector.TimelineUIUtils._buildTraceEventDetailsSynchronously = function(eve
nt, model, linkifier, relatedNode, loadedFromFile, target) | |
721 { | |
722 var fragment = document.createDocumentFragment(); | |
723 var stats = WebInspector.TimelineUIUtils._aggregatedStatsForTraceEvent(model
, event); | |
724 var pieChart = stats.hasChildren ? | |
725 WebInspector.TimelineUIUtils.generatePieChart(stats.aggregatedStats, Web
Inspector.TimelineUIUtils.styleForTimelineEvent(event.name).category, event.self
Time / 1000) : | |
726 WebInspector.TimelineUIUtils.generatePieChart(stats.aggregatedStats); | |
727 fragment.appendChild(pieChart); | |
728 | |
729 var recordTypes = WebInspector.TracingTimelineModel.RecordType; | |
730 | |
731 // The messages may vary per event.name; | |
732 var callSiteStackTraceLabel; | |
733 var callStackLabel; | |
734 var relatedNodeLabel; | |
735 | |
736 var contentHelper = new WebInspector.TimelineDetailsContentHelper(target, li
nkifier, true); | |
737 contentHelper.appendTextRow(WebInspector.UIString("Self Time"), Number.milli
sToString(event.selfTime / 1000, true)); | |
738 contentHelper.appendTextRow(WebInspector.UIString("Start Time"), Number.mill
isToString((event.startTime - model.minimumRecordTime()) / 1000)); | |
739 var eventData = event.args.data; | |
740 var initiator = event.initiator; | |
741 | |
742 switch (event.name) { | |
743 case recordTypes.GCEvent: | |
744 var delta = event.args["usedHeapSizeBefore"] - event.args["usedHeapSizeA
fter"]; | |
745 contentHelper.appendTextRow(WebInspector.UIString("Collected"), Number.b
ytesToString(delta)); | |
746 break; | |
747 case recordTypes.TimerFire: | |
748 callSiteStackTraceLabel = WebInspector.UIString("Timer installed"); | |
749 // Fall-through intended. | |
750 | |
751 case recordTypes.TimerInstall: | |
752 case recordTypes.TimerRemove: | |
753 contentHelper.appendTextRow(WebInspector.UIString("Timer ID"), eventData
["timerId"]); | |
754 if (event.name === recordTypes.TimerInstall) { | |
755 contentHelper.appendTextRow(WebInspector.UIString("Timeout"), Number
.millisToString(eventData["timeout"])); | |
756 contentHelper.appendTextRow(WebInspector.UIString("Repeats"), !event
Data["singleShot"]); | |
757 } | |
758 break; | |
759 case recordTypes.FireAnimationFrame: | |
760 callSiteStackTraceLabel = WebInspector.UIString("Animation frame request
ed"); | |
761 contentHelper.appendTextRow(WebInspector.UIString("Callback ID"), eventD
ata["id"]); | |
762 break; | |
763 case recordTypes.FunctionCall: | |
764 if (eventData["scriptName"]) | |
765 contentHelper.appendLocationRow(WebInspector.UIString("Location"), e
ventData["scriptName"], eventData["scriptLine"]); | |
766 break; | |
767 case recordTypes.ResourceSendRequest: | |
768 case recordTypes.ResourceReceiveResponse: | |
769 case recordTypes.ResourceReceivedData: | |
770 case recordTypes.ResourceFinish: | |
771 var url = (event.name === recordTypes.ResourceSendRequest) ? eventData["
url"] : initiator.args.data["url"]; | |
772 if (url) | |
773 contentHelper.appendElementRow(WebInspector.UIString("Resource"), We
bInspector.linkifyResourceAsNode(url)); | |
774 if (event.previewElement) | |
775 contentHelper.appendElementRow(WebInspector.UIString("Preview"), eve
nt.previewElement); | |
776 if (eventData["requestMethod"]) | |
777 contentHelper.appendTextRow(WebInspector.UIString("Request Method"),
eventData["requestMethod"]); | |
778 if (typeof eventData["statusCode"] === "number") | |
779 contentHelper.appendTextRow(WebInspector.UIString("Status Code"), ev
entData["statusCode"]); | |
780 if (eventData["mimeType"]) | |
781 contentHelper.appendTextRow(WebInspector.UIString("MIME Type"), even
tData["mimeType"]); | |
782 if (eventData["encodedDataLength"]) | |
783 contentHelper.appendTextRow(WebInspector.UIString("Encoded Data Leng
th"), WebInspector.UIString("%d Bytes", eventData["encodedDataLength"])); | |
784 break; | |
785 case recordTypes.EvaluateScript: | |
786 var url = eventData["url"]; | |
787 if (url) | |
788 contentHelper.appendLocationRow(WebInspector.UIString("Script"), url
, eventData["lineNumber"]); | |
789 break; | |
790 case recordTypes.Paint: | |
791 var clip = eventData["clip"]; | |
792 contentHelper.appendTextRow(WebInspector.UIString("Location"), WebInspec
tor.UIString("(%d, %d)", clip[0], clip[1])); | |
793 var clipWidth = WebInspector.TimelineUIUtils._quadWidth(clip); | |
794 var clipHeight = WebInspector.TimelineUIUtils._quadHeight(clip); | |
795 contentHelper.appendTextRow(WebInspector.UIString("Dimensions"), WebInsp
ector.UIString("%d × %d", clipWidth, clipHeight)); | |
796 // Fall-through intended. | |
797 | |
798 case recordTypes.PaintSetup: | |
799 case recordTypes.Rasterize: | |
800 case recordTypes.ScrollLayer: | |
801 relatedNodeLabel = WebInspector.UIString("Layer root"); | |
802 break; | |
803 case recordTypes.PaintImage: | |
804 case recordTypes.DecodeLazyPixelRef: | |
805 case recordTypes.DecodeImage: | |
806 case recordTypes.ResizeImage: | |
807 case recordTypes.DrawLazyPixelRef: | |
808 relatedNodeLabel = WebInspector.UIString("Image element"); | |
809 if (event.imageURL) | |
810 contentHelper.appendElementRow(WebInspector.UIString("Image URL"), W
ebInspector.linkifyResourceAsNode(event.imageURL)); | |
811 if (event.previewElement) | |
812 contentHelper.appendElementRow(WebInspector.UIString("Preview"), eve
nt.previewElement); | |
813 break; | |
814 case recordTypes.RecalculateStyles: // We don't want to see default details. | |
815 contentHelper.appendTextRow(WebInspector.UIString("Elements affected"),
event.args["elementCount"]); | |
816 callStackLabel = WebInspector.UIString("Styles recalculation forced"); | |
817 break; | |
818 case recordTypes.Layout: | |
819 var beginData = event.args["beginData"]; | |
820 contentHelper.appendTextRow(WebInspector.UIString("Nodes that need layou
t"), beginData["dirtyObjects"]); | |
821 contentHelper.appendTextRow(WebInspector.UIString("Layout tree size"), b
eginData["totalObjects"]); | |
822 contentHelper.appendTextRow(WebInspector.UIString("Layout scope"), | |
823 beginData["partialLayout"] ? WebInspector.UI
String("Partial") : WebInspector.UIString("Whole document")); | |
824 callSiteStackTraceLabel = WebInspector.UIString("Layout invalidated"); | |
825 callStackLabel = WebInspector.UIString("Layout forced"); | |
826 relatedNodeLabel = WebInspector.UIString("Layout root"); | |
827 break; | |
828 case recordTypes.ConsoleTime: | |
829 contentHelper.appendTextRow(WebInspector.UIString("Message"), eventData[
"message"]); | |
830 break; | |
831 case recordTypes.WebSocketCreate: | |
832 case recordTypes.WebSocketSendHandshakeRequest: | |
833 case recordTypes.WebSocketReceiveHandshakeResponse: | |
834 case recordTypes.WebSocketDestroy: | |
835 var initiatorData = initiator ? initiator.args.data : eventData; | |
836 if (typeof initiatorData["webSocketURL"] !== "undefined") | |
837 contentHelper.appendTextRow(WebInspector.UIString("URL"), initiatorD
ata["webSocketURL"]); | |
838 if (typeof initiatorData["webSocketProtocol"] !== "undefined") | |
839 contentHelper.appendTextRow(WebInspector.UIString("WebSocket Protoco
l"), initiatorData["webSocketProtocol"]); | |
840 if (typeof eventData["message"] !== "undefined") | |
841 contentHelper.appendTextRow(WebInspector.UIString("Message"), eventD
ata["message"]); | |
842 break; | |
843 case recordTypes.EmbedderCallback: | |
844 contentHelper.appendTextRow(WebInspector.UIString("Callback Function"),
eventData["callbackName"]); | |
845 break; | |
846 default: | |
847 var detailsNode = WebInspector.TimelineUIUtils.buildDetailsNodeForTraceE
vent(event, linkifier, loadedFromFile, target); | |
848 if (detailsNode) | |
849 contentHelper.appendElementRow(WebInspector.UIString("Details"), det
ailsNode); | |
850 break; | |
851 } | |
852 | |
853 if (relatedNode) | |
854 contentHelper.appendElementRow(relatedNodeLabel || WebInspector.UIString
("Related node"), WebInspector.DOMPresentationUtils.linkifyNodeReference(related
Node)); | |
855 | |
856 if (eventData && eventData["scriptName"] && event.name !== recordTypes.Funct
ionCall) | |
857 contentHelper.appendLocationRow(WebInspector.UIString("Function Call"),
eventData["scriptName"], eventData["scriptLine"]); | |
858 | |
859 if (initiator) { | |
860 var callSiteStackTrace = initiator.stackTrace; | |
861 if (callSiteStackTrace) | |
862 contentHelper.appendStackTrace(callSiteStackTraceLabel || WebInspect
or.UIString("Call Site stack"), callSiteStackTrace); | |
863 } | |
864 var eventStackTrace = event.stackTrace; | |
865 if (eventStackTrace) | |
866 contentHelper.appendStackTrace(callStackLabel || WebInspector.UIString("
Call Stack"), eventStackTrace); | |
867 | |
868 var warning = event.warning; | |
869 if (warning) { | |
870 var div = document.createElement("div"); | |
871 div.textContent = warning; | |
872 contentHelper.appendElementRow(WebInspector.UIString("Warning"), div); | |
873 } | |
874 fragment.appendChild(contentHelper.element); | |
875 return fragment; | |
876 } | |
877 | |
878 /** | |
879 * @param {!WebInspector.TracingTimelineModel} model | |
880 * @param {!WebInspector.TracingModel.Event} event | |
881 * @return {!{ aggregatedStats: !Object, hasChildren: boolean }} | |
882 */ | |
883 WebInspector.TimelineUIUtils._aggregatedStatsForTraceEvent = function(model, eve
nt) | |
884 { | |
885 var events = model.inspectedTargetEvents(); | |
886 /** | |
887 * @param {number} startTime | |
888 * @param {!WebInspector.TracingModel.Event} e | |
889 * @return {number} | |
890 */ | |
891 function eventComparator(startTime, e) | |
892 { | |
893 return startTime - e.startTime; | |
894 } | |
895 var index = events.binaryIndexOf(event.startTime, eventComparator); | |
896 var hasChildren = false; | |
897 var aggregatedStats = {}; | |
898 var endTime = event.endTime; | |
899 if (endTime) { | |
900 for (var i = index; i < events.length; i++) { | |
901 var nextEvent = events[i]; | |
902 if (nextEvent.startTime >= endTime) | |
903 break; | |
904 if (!nextEvent.selfTime) | |
905 continue; | |
906 if (i > index) | |
907 hasChildren = true; | |
908 var category = WebInspector.TimelineUIUtils.styleForTimelineEvent(ne
xtEvent.name).category.name; | |
909 aggregatedStats[category] = (aggregatedStats[category] || 0) + nextE
vent.selfTime / 1000; | |
910 } | |
911 } | |
912 return { aggregatedStats: aggregatedStats, hasChildren: hasChildren }; | |
913 } | |
914 | |
915 /** | |
916 * @param {!Array.<number>} quad | 671 * @param {!Array.<number>} quad |
917 * @return {number} | 672 * @return {number} |
918 */ | 673 */ |
919 WebInspector.TimelineUIUtils._quadHeight = function(quad) | 674 WebInspector.TimelineUIUtils._quadHeight = function(quad) |
920 { | 675 { |
921 return Math.round(Math.sqrt(Math.pow(quad[0] - quad[6], 2) + Math.pow(quad[1
] - quad[7], 2))); | 676 return Math.round(Math.sqrt(Math.pow(quad[0] - quad[6], 2) + Math.pow(quad[1
] - quad[7], 2))); |
922 } | 677 } |
923 | 678 |
924 /** | 679 /** |
925 * @param {!WebInspector.TimelineModel.Record} record | 680 * @param {!WebInspector.TimelineModel.Record} record |
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1047 { | 802 { |
1048 if (record.stackTrace()) | 803 if (record.stackTrace()) |
1049 return linkifyCallFrame(record.stackTrace()[0]); | 804 return linkifyCallFrame(record.stackTrace()[0]); |
1050 if (record.callSiteStackTrace()) | 805 if (record.callSiteStackTrace()) |
1051 return linkifyCallFrame(record.callSiteStackTrace()[0]); | 806 return linkifyCallFrame(record.callSiteStackTrace()[0]); |
1052 return null; | 807 return null; |
1053 } | 808 } |
1054 } | 809 } |
1055 | 810 |
1056 /** | 811 /** |
1057 * @param {!WebInspector.TracingModel.Event} event | |
1058 * @param {!WebInspector.Linkifier} linkifier | |
1059 * @param {boolean} loadedFromFile | |
1060 * @param {!WebInspector.Target} target | |
1061 * @return {?Node} | |
1062 */ | |
1063 WebInspector.TimelineUIUtils.buildDetailsNodeForTraceEvent = function(event, lin
kifier, loadedFromFile, target) | |
1064 { | |
1065 var recordType = WebInspector.TracingTimelineModel.RecordType; | |
1066 | |
1067 var details; | |
1068 var detailsText; | |
1069 var eventData = event.args.data; | |
1070 switch (event.name) { | |
1071 case recordType.GCEvent: | |
1072 var delta = event.args["usedHeapSizeBefore"] - event.args["usedHeapSizeA
fter"]; | |
1073 detailsText = WebInspector.UIString("%s collected", Number.bytesToString
(delta)); | |
1074 break; | |
1075 case recordType.TimerFire: | |
1076 detailsText = eventData["timerId"]; | |
1077 break; | |
1078 case recordType.FunctionCall: | |
1079 details = linkifyLocation(eventData["scriptId"], eventData["scriptName"]
, eventData["scriptLine"], 0); | |
1080 break; | |
1081 case recordType.FireAnimationFrame: | |
1082 detailsText = eventData["id"]; | |
1083 break; | |
1084 case recordType.EventDispatch: | |
1085 detailsText = eventData ? eventData["type"] : null; | |
1086 break; | |
1087 case recordType.Paint: | |
1088 var width = WebInspector.TimelineUIUtils._quadWidth(eventData.clip); | |
1089 var height = WebInspector.TimelineUIUtils._quadHeight(eventData.clip); | |
1090 if (width && height) | |
1091 detailsText = WebInspector.UIString("%d\u2009\u00d7\u2009%d", width,
height); | |
1092 break; | |
1093 case recordType.TimerInstall: | |
1094 case recordType.TimerRemove: | |
1095 details = linkifyTopCallFrame(); | |
1096 detailsText = eventData["timerId"]; | |
1097 break; | |
1098 case recordType.RequestAnimationFrame: | |
1099 case recordType.CancelAnimationFrame: | |
1100 details = linkifyTopCallFrame(); | |
1101 detailsText = eventData["id"]; | |
1102 break; | |
1103 case recordType.ParseHTML: | |
1104 case recordType.RecalculateStyles: | |
1105 details = linkifyTopCallFrame(); | |
1106 break; | |
1107 case recordType.EvaluateScript: | |
1108 var url = eventData["url"]; | |
1109 if (url) | |
1110 details = linkifyLocation("", url, eventData["lineNumber"], 0); | |
1111 break; | |
1112 case recordType.XHRReadyStateChange: | |
1113 case recordType.XHRLoad: | |
1114 case recordType.ResourceSendRequest: | |
1115 case recordType.DecodeImage: | |
1116 case recordType.ResizeImage: | |
1117 var url = eventData["url"]; | |
1118 if (url) | |
1119 detailsText = WebInspector.displayNameForURL(url); | |
1120 break; | |
1121 case recordType.ResourceReceivedData: | |
1122 case recordType.ResourceReceiveResponse: | |
1123 case recordType.ResourceFinish: | |
1124 var initiator = event.initiator; | |
1125 if (initiator) { | |
1126 var url = initiator.args.data["url"]; | |
1127 if (url) | |
1128 detailsText = WebInspector.displayNameForURL(url); | |
1129 } | |
1130 break; | |
1131 case recordType.ConsoleTime: | |
1132 detailsText = eventData["message"]; | |
1133 break; | |
1134 case recordType.EmbedderCallback: | |
1135 detailsText = eventData["callbackName"]; | |
1136 break; | |
1137 | |
1138 case recordType.PaintImage: | |
1139 case recordType.DecodeImage: | |
1140 case recordType.ResizeImage: | |
1141 case recordType.DecodeLazyPixelRef: | |
1142 var url = event.imageURL; | |
1143 if (url) | |
1144 detailsText = WebInspector.displayNameForURL(url); | |
1145 break; | |
1146 | |
1147 default: | |
1148 details = linkifyTopCallFrame(); | |
1149 break; | |
1150 } | |
1151 | |
1152 if (!details && detailsText) | |
1153 details = document.createTextNode(detailsText); | |
1154 return details; | |
1155 | |
1156 /** | |
1157 * @param {string} scriptId | |
1158 * @param {string} url | |
1159 * @param {number} lineNumber | |
1160 * @param {number=} columnNumber | |
1161 */ | |
1162 function linkifyLocation(scriptId, url, lineNumber, columnNumber) | |
1163 { | |
1164 if (!loadedFromFile && scriptId !== "0") { | |
1165 var location = new WebInspector.DebuggerModel.Location( | |
1166 target, | |
1167 scriptId, | |
1168 lineNumber - 1, | |
1169 (columnNumber || 1) - 1); | |
1170 return linkifier.linkifyRawLocation(location, "timeline-details"); | |
1171 } | |
1172 | |
1173 if (!url) | |
1174 return null; | |
1175 | |
1176 // FIXME(62725): stack trace line/column numbers are one-based. | |
1177 columnNumber = columnNumber ? columnNumber - 1 : 0; | |
1178 return linkifier.linkifyLocation(target, url, lineNumber - 1, columnNumb
er, "timeline-details"); | |
1179 } | |
1180 | |
1181 /** | |
1182 * @param {!ConsoleAgent.CallFrame} callFrame | |
1183 */ | |
1184 function linkifyCallFrame(callFrame) | |
1185 { | |
1186 return linkifyLocation(callFrame.scriptId, callFrame.url, callFrame.line
Number, callFrame.columnNumber); | |
1187 } | |
1188 | |
1189 /** | |
1190 * @return {?Element} | |
1191 */ | |
1192 function linkifyTopCallFrame() | |
1193 { | |
1194 var stackTrace = event.stackTrace; | |
1195 if (!stackTrace) { | |
1196 var initiator = event.initiator; | |
1197 if (initiator) | |
1198 stackTrace = initiator.stackTrace; | |
1199 } | |
1200 if (!stackTrace || !stackTrace.length) | |
1201 return null; | |
1202 return linkifyCallFrame(stackTrace[0]); | |
1203 } | |
1204 } | |
1205 | |
1206 /** | |
1207 * @constructor | 812 * @constructor |
1208 * @extends {WebInspector.Object} | 813 * @extends {WebInspector.Object} |
1209 * @param {string} name | 814 * @param {string} name |
1210 * @param {string} title | 815 * @param {string} title |
1211 * @param {number} overviewStripGroupIndex | 816 * @param {number} overviewStripGroupIndex |
1212 * @param {string} borderColor | 817 * @param {string} borderColor |
1213 * @param {string} backgroundColor | 818 * @param {string} backgroundColor |
1214 * @param {string} fillColorStop0 | 819 * @param {string} fillColorStop0 |
1215 * @param {string} fillColorStop1 | 820 * @param {string} fillColorStop1 |
1216 */ | 821 */ |
(...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1389 for (var i = 0; i < stackTrace.length; ++i) { | 994 for (var i = 0; i < stackTrace.length; ++i) { |
1390 var stackFrame = stackTrace[i]; | 995 var stackFrame = stackTrace[i]; |
1391 var row = stackTraceElement.createChild("div"); | 996 var row = stackTraceElement.createChild("div"); |
1392 row.createTextChild(stackFrame.functionName || WebInspector.UIString
("(anonymous function)")); | 997 row.createTextChild(stackFrame.functionName || WebInspector.UIString
("(anonymous function)")); |
1393 row.createTextChild(" @ "); | 998 row.createTextChild(" @ "); |
1394 var urlElement = this._linkifier.linkifyLocation(this._target, stack
Frame.url, stackFrame.lineNumber - 1); | 999 var urlElement = this._linkifier.linkifyLocation(this._target, stack
Frame.url, stackFrame.lineNumber - 1); |
1395 row.appendChild(urlElement); | 1000 row.appendChild(urlElement); |
1396 } | 1001 } |
1397 } | 1002 } |
1398 } | 1003 } |
OLD | NEW |