Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(13)

Side by Side Diff: Source/devtools/front_end/timeline/TimelineFlameChart.js

Issue 391373008: DevTools: Show JS callstacks on tracing-based timeline (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Added JSDoc Created 6 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | Source/devtools/front_end/timeline/TracingTimelineUIUtils.js » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2014 Google Inc. All rights reserved. 2 * Copyright (C) 2014 Google Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are 5 * modification, are permitted provided that the following conditions are
6 * met: 6 * met:
7 * 7 *
8 * * Redistributions of source code must retain the above copyright 8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above 10 * * Redistributions in binary form must reproduce the above
(...skipping 443 matching lines...) Expand 10 before | Expand all | Expand 10 after
454 this._target = target; 454 this._target = target;
455 this._font = "12px " + WebInspector.fontFamily(); 455 this._font = "12px " + WebInspector.fontFamily();
456 this._linkifier = new WebInspector.Linkifier(); 456 this._linkifier = new WebInspector.Linkifier();
457 this._palette = new WebInspector.TraceViewPalette(); 457 this._palette = new WebInspector.TraceViewPalette();
458 this._entryIndexToTitle = {}; 458 this._entryIndexToTitle = {};
459 this._filters = []; 459 this._filters = [];
460 this.addFilter(WebInspector.TracingTimelineUIUtils.hiddenEventsFilter()); 460 this.addFilter(WebInspector.TracingTimelineUIUtils.hiddenEventsFilter());
461 this.addFilter(new WebInspector.TracingTimelineModel.ExclusiveEventNameFilte r([WebInspector.TracingTimelineModel.RecordType.Program])); 461 this.addFilter(new WebInspector.TracingTimelineModel.ExclusiveEventNameFilte r([WebInspector.TracingTimelineModel.RecordType.Program]));
462 } 462 }
463 463
464 WebInspector.TracingBasedTimelineFlameChartDataProvider.InstantEventVisibleDurat ionMs = 0.01;
465
464 WebInspector.TracingBasedTimelineFlameChartDataProvider.prototype = { 466 WebInspector.TracingBasedTimelineFlameChartDataProvider.prototype = {
465 /** 467 /**
466 * @return {number} 468 * @return {number}
467 */ 469 */
468 barHeight: function() 470 barHeight: function()
469 { 471 {
470 return 20; 472 return 20;
471 }, 473 },
472 474
473 /** 475 /**
(...skipping 25 matching lines...) Expand all
499 * @param {number} entryIndex 501 * @param {number} entryIndex
500 * @return {?string} 502 * @return {?string}
501 */ 503 */
502 entryTitle: function(entryIndex) 504 entryTitle: function(entryIndex)
503 { 505 {
504 var event = this._entryEvents[entryIndex]; 506 var event = this._entryEvents[entryIndex];
505 if (event) { 507 if (event) {
506 var name = WebInspector.TracingTimelineUIUtils.styleForTraceEvent(ev ent.name).title; 508 var name = WebInspector.TracingTimelineUIUtils.styleForTraceEvent(ev ent.name).title;
507 // TODO(yurys): support event dividers 509 // TODO(yurys): support event dividers
508 var details = WebInspector.TracingTimelineUIUtils.buildDetailsNodeFo rTraceEvent(event, this._linkifier, false, this._target); 510 var details = WebInspector.TracingTimelineUIUtils.buildDetailsNodeFo rTraceEvent(event, this._linkifier, false, this._target);
511 if (event.name === WebInspector.TracingTimelineModel.RecordType.JSFr ame && details)
512 return details.textContent;
509 return details ? WebInspector.UIString("%s (%s)", name, details.text Content) : name; 513 return details ? WebInspector.UIString("%s (%s)", name, details.text Content) : name;
510 } 514 }
511 var title = this._entryIndexToTitle[entryIndex]; 515 var title = this._entryIndexToTitle[entryIndex];
512 if (!title) { 516 if (!title) {
513 title = WebInspector.UIString("Unexpected entryIndex %d", entryIndex ); 517 title = WebInspector.UIString("Unexpected entryIndex %d", entryIndex );
514 console.error(title); 518 console.error(title);
515 } 519 }
516 return title; 520 return title;
517 }, 521 },
518 522
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
564 }, 568 },
565 569
566 /** 570 /**
567 * @param {string} headerName 571 * @param {string} headerName
568 * @param {!Array.<!WebInspector.TracingModel.Event>} events 572 * @param {!Array.<!WebInspector.TracingModel.Event>} events
569 */ 573 */
570 _appendThreadTimelineData: function(headerName, events) 574 _appendThreadTimelineData: function(headerName, events)
571 { 575 {
572 var maxStackDepth = 0; 576 var maxStackDepth = 0;
573 var openEvents = []; 577 var openEvents = [];
578 var heights = [];
574 var headerAppended = false; 579 var headerAppended = false;
580 var level = 0;
575 for (var i = 0; i < events.length; ++i) { 581 for (var i = 0; i < events.length; ++i) {
576 var e = events[i]; 582 var e = events[i];
577 if (!e.endTime && e.phase !== WebInspector.TracingModel.Phase.Instan t) 583 if (!e.endTime && e.phase !== WebInspector.TracingModel.Phase.Instan t)
578 continue; 584 continue;
579 if (!this._isVisible(e)) 585 if (!this._isVisible(e))
580 continue; 586 continue;
581 while (openEvents.length && openEvents.peekLast().endTime <= e.start Time) 587 while (openEvents.length && openEvents.peekLast().endTime <= e.start Time) {
582 openEvents.pop(); 588 openEvents.pop();
589 level = heights.pop();
590 }
583 if (!headerAppended) { 591 if (!headerAppended) {
584 this._appendHeaderRecord(headerName, this._currentLevel++); 592 this._appendHeaderRecord(headerName, this._currentLevel);
593 ++level;
585 headerAppended = true; 594 headerAppended = true;
586 } 595 }
587 this._appendEvent(e, this._currentLevel + openEvents.length); 596 var height = this._processEvent(e, this._currentLevel + level);
588 maxStackDepth = Math.max(maxStackDepth, openEvents.length + 1); 597 if (e.endTime) {
589 if (e.endTime)
590 openEvents.push(e); 598 openEvents.push(e);
599 heights.push(level)
600 }
601 level += height;
602 maxStackDepth = Math.max(maxStackDepth, level);
591 } 603 }
592 this._currentLevel += maxStackDepth + (headerAppended ? 1 : 0); 604 this._currentLevel += maxStackDepth;
593 }, 605 },
594 606
595 /** 607 /**
608 * @param {!WebInspector.TracingModel.Event} event
609 * @param {number} baseLevel
610 * @return {number}
611 */
612 _processEvent: function(event, baseLevel)
613 {
614 var level = baseLevel;
615 if (event.stackTrace && WebInspector.experimentsSettings.timelineJSCPUPr ofile.isEnabled()) {
616 for (var i = event.stackTrace.length - 1; i >= 0; --i) {
617 var payload = /** @type {!WebInspector.TracingModel.EventPayload } */ ({
618 ph: WebInspector.TracingModel.Phase.Complete,
619 cat: WebInspector.TracingModel.DevToolsMetadataEventCategory ,
620 name: WebInspector.TracingTimelineModel.RecordType.JSFrame,
621 ts: event.startTime * 1000,
622 dur: event.duration * 1000,
623 args: {
624 data: event.stackTrace[i]
625 }
626 });
627 var jsFrameEvent = new WebInspector.TracingModel.Event(payload, 0, event.thread);
628 this._appendEvent(jsFrameEvent, level++);
629 }
630 }
631 this._appendEvent(event, level++)
632 return level - baseLevel;
633 },
634
635 /**
596 * @param {!WebInspector.TracingTimelineModel.Filter} filter 636 * @param {!WebInspector.TracingTimelineModel.Filter} filter
597 */ 637 */
598 addFilter: function(filter) 638 addFilter: function(filter)
599 { 639 {
600 this._filters.push(filter); 640 this._filters.push(filter);
601 }, 641 },
602 642
603 /** 643 /**
604 * @param {!WebInspector.TracingModel.Event} event 644 * @param {!WebInspector.TracingModel.Event} event
605 * @return {boolean} 645 * @return {boolean}
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
653 693
654 /** 694 /**
655 * @param {number} entryIndex 695 * @param {number} entryIndex
656 * @return {string} 696 * @return {string}
657 */ 697 */
658 entryColor: function(entryIndex) 698 entryColor: function(entryIndex)
659 { 699 {
660 var event = this._entryEvents[entryIndex]; 700 var event = this._entryEvents[entryIndex];
661 if (!event) 701 if (!event)
662 return "#555"; 702 return "#555";
703 if (event.name === WebInspector.TracingTimelineModel.RecordType.JSFrame)
704 return WebInspector.TimelineFlameChartDataProvider.jsFrameColorGener ator().colorForID(event.args.data["functionName"]);
663 var style = WebInspector.TracingTimelineUIUtils.styleForTraceEvent(event .name); 705 var style = WebInspector.TracingTimelineUIUtils.styleForTraceEvent(event .name);
664 return style.category.fillColorStop1; 706 return style.category.fillColorStop1;
665 }, 707 },
666 708
667 /** 709 /**
668 * @param {number} entryIndex 710 * @param {number} entryIndex
669 * @param {!CanvasRenderingContext2D} context 711 * @param {!CanvasRenderingContext2D} context
670 * @param {?string} text 712 * @param {?string} text
671 * @param {number} barX 713 * @param {number} barX
672 * @param {number} barY 714 * @param {number} barY
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
730 * @param {number} entryIndex 772 * @param {number} entryIndex
731 * @return {?{startTime: number, endTime: number}} 773 * @return {?{startTime: number, endTime: number}}
732 */ 774 */
733 highlightTimeRange: function(entryIndex) 775 highlightTimeRange: function(entryIndex)
734 { 776 {
735 var event = this._entryEvents[entryIndex]; 777 var event = this._entryEvents[entryIndex];
736 if (!event) 778 if (!event)
737 return null; 779 return null;
738 return { 780 return {
739 startTime: event.startTime, 781 startTime: event.startTime,
740 endTime: event.endTime 782 endTime: event.endTime || event.startTime + WebInspector.TracingBase dTimelineFlameChartDataProvider.InstantEventVisibleDurationMs
741 } 783 }
742 }, 784 },
743 785
744 /** 786 /**
745 * @return {number} 787 * @return {number}
746 */ 788 */
747 paddingLeft: function() 789 paddingLeft: function()
748 { 790 {
749 return 0; 791 return 0;
750 }, 792 },
(...skipping 23 matching lines...) Expand all
774 816
775 /** 817 /**
776 * @param {!WebInspector.TracingModel.Event} event 818 * @param {!WebInspector.TracingModel.Event} event
777 * @param {number} level 819 * @param {number} level
778 */ 820 */
779 _appendEvent: function(event, level) 821 _appendEvent: function(event, level)
780 { 822 {
781 var index = this._entryEvents.length; 823 var index = this._entryEvents.length;
782 this._entryEvents.push(event); 824 this._entryEvents.push(event);
783 this._timelineData.entryLevels[index] = level; 825 this._timelineData.entryLevels[index] = level;
784 this._timelineData.entryTotalTimes[index] = event.duration || 1; 826 this._timelineData.entryTotalTimes[index] = event.duration || WebInspect or.TracingBasedTimelineFlameChartDataProvider.InstantEventVisibleDurationMs;
785 this._timelineData.entryStartTimes[index] = event.startTime; 827 this._timelineData.entryStartTimes[index] = event.startTime;
786 }, 828 },
787 829
788 /** 830 /**
789 * @param {number} entryIndex 831 * @param {number} entryIndex
790 * @return {?WebInspector.TimelineSelection} 832 * @return {?WebInspector.TimelineSelection}
791 */ 833 */
792 createSelection: function(entryIndex) 834 createSelection: function(entryIndex)
793 { 835 {
794 var event = this._entryEvents[entryIndex]; 836 var event = this._entryEvents[entryIndex];
(...skipping 217 matching lines...) Expand 10 before | Expand all | Expand 10 after
1012 * @param {number} entryIndex 1054 * @param {number} entryIndex
1013 * @return {?WebInspector.TimelineSelection} 1055 * @return {?WebInspector.TimelineSelection}
1014 */ 1056 */
1015 createSelection: function(entryIndex) { }, 1057 createSelection: function(entryIndex) { },
1016 /** 1058 /**
1017 * @param {?WebInspector.TimelineSelection} selection 1059 * @param {?WebInspector.TimelineSelection} selection
1018 * @return {number} 1060 * @return {number}
1019 */ 1061 */
1020 entryIndexForSelection: function(selection) { } 1062 entryIndexForSelection: function(selection) { }
1021 } 1063 }
OLDNEW
« no previous file with comments | « no previous file | Source/devtools/front_end/timeline/TracingTimelineUIUtils.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698