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