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

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

Issue 465223002: [ Do not submit ] Prototype for invalidation analysis Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Update for review: cleanup sloppy algorithms, update tests Created 6 years, 2 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 | « Source/devtools/front_end/timeline/TracingTimelineModel.js ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 /** 5 /**
6 * @constructor 6 * @constructor
7 * @extends {WebInspector.TimelineUIUtils} 7 * @extends {WebInspector.TimelineUIUtils}
8 */ 8 */
9 WebInspector.TracingTimelineUIUtils = function() 9 WebInspector.TracingTimelineUIUtils = function()
10 { 10 {
(...skipping 476 matching lines...) Expand 10 before | Expand all | Expand 10 after
487 var relatedNode = null; 487 var relatedNode = null;
488 var barrier = new CallbackBarrier(); 488 var barrier = new CallbackBarrier();
489 if (!event.previewElement && target) { 489 if (!event.previewElement && target) {
490 if (event.imageURL) 490 if (event.imageURL)
491 WebInspector.DOMPresentationUtils.buildImagePreviewContents(target, event.imageURL, false, barrier.createCallback(saveImage)); 491 WebInspector.DOMPresentationUtils.buildImagePreviewContents(target, event.imageURL, false, barrier.createCallback(saveImage));
492 else if (event.picture) 492 else if (event.picture)
493 WebInspector.TracingTimelineUIUtils.buildPicturePreviewContent(event , barrier.createCallback(saveImage)); 493 WebInspector.TracingTimelineUIUtils.buildPicturePreviewContent(event , barrier.createCallback(saveImage));
494 } 494 }
495 if (event.backendNodeId && target) 495 if (event.backendNodeId && target)
496 target.domModel.pushNodesByBackendIdsToFrontend([event.backendNodeId], b arrier.createCallback(setRelatedNode)); 496 target.domModel.pushNodesByBackendIdsToFrontend([event.backendNodeId], b arrier.createCallback(setRelatedNode));
497 if (target && event.invalidationTrackingEvents)
498 WebInspector.TracingTimelineUIUtils._resolveInvalidationTrackingNodeIds( event, barrier);
497 barrier.callWhenDone(callbackWrapper); 499 barrier.callWhenDone(callbackWrapper);
498 500
499 /** 501 /**
500 * @param {!Element=} element 502 * @param {!Element=} element
501 */ 503 */
502 function saveImage(element) 504 function saveImage(element)
503 { 505 {
504 event.previewElement = element || null; 506 event.previewElement = element || null;
505 } 507 }
506 508
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after
605 case recordTypes.PaintImage: 607 case recordTypes.PaintImage:
606 case recordTypes.DecodeLazyPixelRef: 608 case recordTypes.DecodeLazyPixelRef:
607 case recordTypes.DecodeImage: 609 case recordTypes.DecodeImage:
608 case recordTypes.ResizeImage: 610 case recordTypes.ResizeImage:
609 case recordTypes.DrawLazyPixelRef: 611 case recordTypes.DrawLazyPixelRef:
610 relatedNodeLabel = WebInspector.UIString("Image element"); 612 relatedNodeLabel = WebInspector.UIString("Image element");
611 if (event.imageURL) 613 if (event.imageURL)
612 contentHelper.appendElementRow(WebInspector.UIString("Image URL"), W ebInspector.linkifyResourceAsNode(event.imageURL)); 614 contentHelper.appendElementRow(WebInspector.UIString("Image URL"), W ebInspector.linkifyResourceAsNode(event.imageURL));
613 break; 615 break;
614 case recordTypes.RecalculateStyles: // We don't want to see default details. 616 case recordTypes.RecalculateStyles: // We don't want to see default details.
617 // FIXME: Show invalidation tracking for updating style.
615 contentHelper.appendTextRow(WebInspector.UIString("Elements affected"), event.args["elementCount"]); 618 contentHelper.appendTextRow(WebInspector.UIString("Elements affected"), event.args["elementCount"]);
616 break; 619 break;
617 case recordTypes.Layout: 620 case recordTypes.Layout:
618 var beginData = event.args["beginData"]; 621 var beginData = event.args["beginData"];
619 contentHelper.appendTextRow(WebInspector.UIString("Nodes that need layou t"), beginData["dirtyObjects"]); 622 contentHelper.appendTextRow(WebInspector.UIString("Nodes that need layou t"), beginData["dirtyObjects"]);
620 contentHelper.appendTextRow(WebInspector.UIString("Layout tree size"), b eginData["totalObjects"]); 623 contentHelper.appendTextRow(WebInspector.UIString("Layout tree size"), b eginData["totalObjects"]);
621 contentHelper.appendTextRow(WebInspector.UIString("Layout scope"), 624 contentHelper.appendTextRow(WebInspector.UIString("Layout scope"),
622 beginData["partialLayout"] ? WebInspector.UI String("Partial") : WebInspector.UIString("Whole document")); 625 beginData["partialLayout"] ? WebInspector.UI String("Partial") : WebInspector.UIString("Whole document"));
623 relatedNodeLabel = WebInspector.UIString("Layout root"); 626 relatedNodeLabel = WebInspector.UIString("Layout root");
627 // FIXME: Show invalidation tracking for updating layout.
628 break;
629 case recordTypes.UpdateLayerTree:
630 // FIXME: Show invalidation tracking for updating the layer tree.
624 break; 631 break;
625 case recordTypes.ConsoleTime: 632 case recordTypes.ConsoleTime:
626 contentHelper.appendTextRow(WebInspector.UIString("Message"), event.name ); 633 contentHelper.appendTextRow(WebInspector.UIString("Message"), event.name );
627 break; 634 break;
628 case recordTypes.WebSocketCreate: 635 case recordTypes.WebSocketCreate:
629 case recordTypes.WebSocketSendHandshakeRequest: 636 case recordTypes.WebSocketSendHandshakeRequest:
630 case recordTypes.WebSocketReceiveHandshakeResponse: 637 case recordTypes.WebSocketReceiveHandshakeResponse:
631 case recordTypes.WebSocketDestroy: 638 case recordTypes.WebSocketDestroy:
632 var initiatorData = initiator ? initiator.args["data"] : eventData; 639 var initiatorData = initiator ? initiator.args["data"] : eventData;
633 if (typeof initiatorData["webSocketURL"] !== "undefined") 640 if (typeof initiatorData["webSocketURL"] !== "undefined")
(...skipping 21 matching lines...) Expand all
655 662
656 var warning = event.warning; 663 var warning = event.warning;
657 if (warning) { 664 if (warning) {
658 var div = document.createElement("div"); 665 var div = document.createElement("div");
659 div.textContent = warning; 666 div.textContent = warning;
660 contentHelper.appendElementRow(WebInspector.UIString("Warning"), div); 667 contentHelper.appendElementRow(WebInspector.UIString("Warning"), div);
661 } 668 }
662 if (event.previewElement) 669 if (event.previewElement)
663 contentHelper.appendElementRow(WebInspector.UIString("Preview"), event.p reviewElement); 670 contentHelper.appendElementRow(WebInspector.UIString("Preview"), event.p reviewElement);
664 671
665 if (event.stackTrace || (event.initiator && event.initiator.stackTrace)) 672 if (event.stackTrace || (event.initiator && event.initiator.stackTrace) || e vent.invalidationTrackingEvents)
666 WebInspector.TracingTimelineUIUtils._generateCauses(event, contentHelper ); 673 WebInspector.TracingTimelineUIUtils._generateCauses(event, linkifier, co ntentHelper);
667 674
668 fragment.appendChild(contentHelper.element); 675 fragment.appendChild(contentHelper.element);
669 return fragment; 676 return fragment;
670 } 677 }
671 678
672 /** 679 /**
673 * @param {!WebInspector.TracingModel.Event} event 680 * @param {!WebInspector.TracingModel.Event} event
681 * @param {!WebInspector.Linkifier} linkifier
674 * @param {!WebInspector.TimelineDetailsContentHelper} contentHelper 682 * @param {!WebInspector.TimelineDetailsContentHelper} contentHelper
675 */ 683 */
676 WebInspector.TracingTimelineUIUtils._generateCauses = function(event, contentHel per) 684 WebInspector.TracingTimelineUIUtils._generateCauses = function(event, linkifier, contentHelper)
677 { 685 {
678 var recordTypes = WebInspector.TracingTimelineModel.RecordType; 686 var recordTypes = WebInspector.TracingTimelineModel.RecordType;
679 687
680 var callSiteStackLabel; 688 var callSiteStackLabel;
681 var stackLabel; 689 var stackLabel;
690 var initiator = event.initiator;
682 691
683 switch (event.name) { 692 switch (event.name) {
684 case recordTypes.TimerFire: 693 case recordTypes.TimerFire:
685 callSiteStackLabel = WebInspector.UIString("Timer installed"); 694 callSiteStackLabel = WebInspector.UIString("Timer installed");
686 break; 695 break;
687 case recordTypes.FireAnimationFrame: 696 case recordTypes.FireAnimationFrame:
688 callSiteStackLabel = WebInspector.UIString("Animation frame requested"); 697 callSiteStackLabel = WebInspector.UIString("Animation frame requested");
689 break; 698 break;
690 case recordTypes.RecalculateStyles: 699 case recordTypes.RecalculateStyles:
691 stackLabel = WebInspector.UIString("Stack when style recalculation was f orced"); 700 stackLabel = WebInspector.UIString("Stack when style recalculation was f orced");
692 break; 701 break;
693 case recordTypes.Layout: 702 case recordTypes.Layout:
694 callSiteStackLabel = WebInspector.UIString("First layout invalidation"); 703 callSiteStackLabel = WebInspector.UIString("First layout invalidation");
695 stackLabel = WebInspector.UIString("Stack when layout was forced"); 704 stackLabel = WebInspector.UIString("Stack when layout was forced");
696 break; 705 break;
697 } 706 }
698 707
699 // Direct cause. 708 // Direct cause.
700 if (event.stackTrace) 709 if (event.stackTrace)
701 contentHelper.appendStackTrace(stackLabel || WebInspector.UIString("Stac k when this event occurred"), event.stackTrace); 710 contentHelper.appendStackTrace(stackLabel || WebInspector.UIString("Stac k when this event occurred"), event.stackTrace);
702 711
703 // Indirect cause / invalidation. 712 // Indirect causes.
704 var initiator = event.initiator; 713 if (event.invalidationTrackingEvents) { // Full invalidation tracking (exper imental).
705 if (initiator && initiator.stackTrace) 714 WebInspector.TracingTimelineUIUtils._generateInvalidations(event, linkif ier, contentHelper);
715 } else if (initiator && initiator.stackTrace) { // Partial invalidation trac king.
706 contentHelper.appendStackTrace(callSiteStackLabel || WebInspector.UIStri ng("Stack when first invalidated"), initiator.stackTrace); 716 contentHelper.appendStackTrace(callSiteStackLabel || WebInspector.UIStri ng("Stack when first invalidated"), initiator.stackTrace);
717 }
707 } 718 }
708 719
709 /** 720 /**
721 * @param {!WebInspector.TracingModel.Event} event
722 * @param {!WebInspector.Linkifier} linkifier
723 * @param {!WebInspector.TimelineDetailsContentHelper} contentHelper
724 */
725 WebInspector.TracingTimelineUIUtils._generateInvalidations = function(event, lin kifier, contentHelper)
726 {
727 if (!event.invalidationTrackingEvents)
728 return;
729
730 var target = event.thread.target();
731 var styleInvalidations = [];
732 var layoutInvalidations = [];
733 var layerInvalidations = [];
734 event.invalidationTrackingEvents.forEach(function(invalidation) {
735 switch (invalidation.type) {
736 case WebInspector.TracingTimelineModel.RecordType.StyleRecalcInvalidatio nTracking:
737 styleInvalidations.push(invalidation);
738 break;
739 case WebInspector.TracingTimelineModel.RecordType.LayoutInvalidationTrac king:
740 layoutInvalidations.push(invalidation);
741 break;
742 case WebInspector.TracingTimelineModel.RecordType.LayerInvalidationTrack ing:
743 layerInvalidations.push(invalidation);
744 break;
745 default:
746 console.error("Unknown invalidation tracking event.");
747 console.error(invalidation);
748 }
749 });
750 if (styleInvalidations.length)
751 contentHelper.element.appendChild(
752 WebInspector.TracingTimelineUIUtils._buildInvalidationDetailsNode(We bInspector.UIString("Style invalidations"), linkifier, target, styleInvalidation s));
753 if (layoutInvalidations.length)
754 contentHelper.element.appendChild(
755 WebInspector.TracingTimelineUIUtils._buildInvalidationDetailsNode(We bInspector.UIString("Layout invalidations"), linkifier, target, layoutInvalidati ons));
756 if (layerInvalidations.length)
757 contentHelper.element.appendChild(
758 WebInspector.TracingTimelineUIUtils._buildInvalidationDetailsNode(We bInspector.UIString("Layer invalidations"), linkifier, target, layerInvalidation s));
759 }
760
761 /**
762 * @param {string} title
763 * @param {!WebInspector.Linkifier} linkifier
764 * @param {?WebInspector.Target} target
765 * @param {!WebInspector.TimelineDetailsContentHelper} contentHelper
766 */
767 WebInspector.TracingTimelineUIUtils._buildInvalidationDetailsNode = function(tit le, linkifier, target, invalidationEvents)
768 {
769 var detailsNode = document.createElement("div");
770 detailsNode.className = "timeline-details-view-row";
771 var titleElement = document.createElement("span");
772 titleElement.className = "timeline-details-view-row-title";
773 titleElement.textContent = WebInspector.UIString("%s: ", title);
774 detailsNode.appendChild(titleElement);
775 var eventsList = document.createElement("ol");
776 detailsNode.appendChild(eventsList);
777
778 invalidationEvents.forEach(function(invalidation, idx) {
779 var row = document.createElement("li");
780 eventsList.appendChild(row);
781
782 var nodeRow = document.createElement("div");
783 row.appendChild(nodeRow);
784 var node = target.domModel.nodeForId(invalidation.frontendNodeId);
785 if (node)
786 nodeRow.appendChild(WebInspector.DOMPresentationUtils.linkifyNodeRef erence(node));
787 else if (invalidation.nodeName)
788 nodeRow.textContent = '[' + invalidation.nodeName + ']';
789 else
790 nodeRow.textContent = '[ unknown node ]';
791
792 if (invalidation.reason) {
793 var reasonRow = document.createElement("div");
794 reasonRow.textContent = 'Reason: ' + invalidation.reason + (invalida tion.reason.endsWith('.') ? '' : '.');
795 row.appendChild(reasonRow);
796 }
797
798 var callstack = invalidation.callstack ? JSON.parse(invalidation.callsta ck) : [];
799 if (callstack.length > 0) {
800 var callstackRow = document.createElement("div");
801 row.appendChild(callstackRow);
802 callstack.forEach(function(stackFrame) {
803 var frameRow = document.createElement("div");
804 frameRow.className = "timeline-details-view-row monospace";
805 callstackRow.appendChild(frameRow);
806 frameRow.textContent = stackFrame.functionName || WebInspector.U IString("(anonymous function)");
807 frameRow.textContent += " @ ";
808 var urlElement = linkifier.linkifyScriptLocation(target, stackFr ame.scriptId, stackFrame.url, stackFrame.lineNumber - 1, stackFrame.columnNumber - 1);
809 frameRow.appendChild(urlElement);
810 });
811 }
812 });
813
814 return detailsNode;
815 }
816
817 /**
818 * @param {!WebInspector.TracingModel.Event} event
819 * @param {!CallbackBarrier} barrier
820 */
821 WebInspector.TracingTimelineUIUtils._resolveInvalidationTrackingNodeIds = functi on(event, barrier)
822 {
823 var backendNodeIdSet = {};
824 if (event.nodeId)
825 backendNodeIdSet[event.nodeId] = true;
826 event.invalidationTrackingEvents.forEach(function(invalidation) {
827 if (invalidation.nodeId)
828 backendNodeIdSet[invalidation.nodeId] = true;
829 });
830
831 var backendNodeIds = [];
832 Object.keys(backendNodeIdSet).forEach(function(backendNodeId) {
833 backendNodeIds.push(parseInt(backendNodeId));
834 });
835 event.thread.target().domModel.pushNodesByBackendIdsToFrontend(
836 backendNodeIds, barrier.createCallback(updateInvalidationNodeIds));
837
838 function updateInvalidationNodeIds(frontendNodeIds)
839 {
840 if (!frontendNodeIds)
841 return;
842 if (frontendNodeIds.length != backendNodeIds.length) {
843 console.error('Did not resolve the correct number of frontend node i ds.');
844 return;
845 }
846
847 var backendToFrontendNodeIdMap = {};
848 backendNodeIds.forEach(function(backendNodeId, index) {
849 backendToFrontendNodeIdMap[backendNodeId] = frontendNodeIds[index];
850 });
851
852 if (event.nodeId)
853 event.frontendNodeId = backendToFrontendNodeIdMap[event.nodeId];
854 event.invalidationTrackingEvents.forEach(function(invalidation) {
855 if (invalidation.nodeId)
856 invalidation.frontendNodeId = backendToFrontendNodeIdMap[invalid ation.nodeId];
857 });
858 }
859 }
860
861 /**
710 * @param {!Object} total 862 * @param {!Object} total
711 * @param {!WebInspector.TracingTimelineModel} model 863 * @param {!WebInspector.TracingTimelineModel} model
712 * @param {!WebInspector.TracingModel.Event} event 864 * @param {!WebInspector.TracingModel.Event} event
713 * @return {boolean} 865 * @return {boolean}
714 */ 866 */
715 WebInspector.TracingTimelineUIUtils._aggregatedStatsForTraceEvent = function(tot al, model, event) 867 WebInspector.TracingTimelineUIUtils._aggregatedStatsForTraceEvent = function(tot al, model, event)
716 { 868 {
717 var events = model.inspectedTargetEvents(); 869 var events = model.inspectedTargetEvents();
718 /** 870 /**
719 * @param {number} startTime 871 * @param {number} startTime
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after
835 return result; 987 return result;
836 } 988 }
837 989
838 /** 990 /**
839 * @return {!WebInspector.TracingTimelineModel.Filter} 991 * @return {!WebInspector.TracingTimelineModel.Filter}
840 */ 992 */
841 WebInspector.TracingTimelineUIUtils.hiddenEventsFilter = function() 993 WebInspector.TracingTimelineUIUtils.hiddenEventsFilter = function()
842 { 994 {
843 return new WebInspector.TracingTimelineModel.InclusiveEventNameFilter(WebIns pector.TracingTimelineUIUtils._visibleTypes()); 995 return new WebInspector.TracingTimelineModel.InclusiveEventNameFilter(WebIns pector.TracingTimelineUIUtils._visibleTypes());
844 } 996 }
OLDNEW
« no previous file with comments | « Source/devtools/front_end/timeline/TracingTimelineModel.js ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698