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

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

Issue 654013003: Implement invalidation tracking in devtools (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Minor cleanup of case statement 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
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 468 matching lines...) Expand 10 before | Expand all | Expand 10 after
479 * @param {!WebInspector.TracingModel.Event} event 479 * @param {!WebInspector.TracingModel.Event} event
480 * @param {!WebInspector.TracingTimelineModel} model 480 * @param {!WebInspector.TracingTimelineModel} model
481 * @param {!WebInspector.Linkifier} linkifier 481 * @param {!WebInspector.Linkifier} linkifier
482 * @param {function(!DocumentFragment)} callback 482 * @param {function(!DocumentFragment)} callback
483 */ 483 */
484 WebInspector.TracingTimelineUIUtils.buildTraceEventDetails = function(event, mod el, linkifier, callback) 484 WebInspector.TracingTimelineUIUtils.buildTraceEventDetails = function(event, mod el, linkifier, callback)
485 { 485 {
486 var target = event.thread.target(); 486 var target = event.thread.target();
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) {
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)
496 target.domModel.pushNodesByBackendIdsToFrontend([event.backendNodeId], b arrier.createCallback(setRelatedNode)); 496 target.domModel.pushNodesByBackendIdsToFrontend([event.backendNodeId], b arrier.createCallback(setRelatedNode));
497 if (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, contentHelper );
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
674 * @param {!WebInspector.TimelineDetailsContentHelper} contentHelper 681 * @param {!WebInspector.TimelineDetailsContentHelper} contentHelper
675 */ 682 */
676 WebInspector.TracingTimelineUIUtils._generateCauses = function(event, contentHel per) 683 WebInspector.TracingTimelineUIUtils._generateCauses = function(event, contentHel per)
677 { 684 {
678 var recordTypes = WebInspector.TracingTimelineModel.RecordType; 685 var recordTypes = WebInspector.TracingTimelineModel.RecordType;
679 686
680 var callSiteStackLabel; 687 var callSiteStackLabel;
681 var stackLabel; 688 var stackLabel;
689 var initiator = event.initiator;
682 690
683 switch (event.name) { 691 switch (event.name) {
684 case recordTypes.TimerFire: 692 case recordTypes.TimerFire:
685 callSiteStackLabel = WebInspector.UIString("Timer installed"); 693 callSiteStackLabel = WebInspector.UIString("Timer installed");
686 break; 694 break;
687 case recordTypes.FireAnimationFrame: 695 case recordTypes.FireAnimationFrame:
688 callSiteStackLabel = WebInspector.UIString("Animation frame requested"); 696 callSiteStackLabel = WebInspector.UIString("Animation frame requested");
689 break; 697 break;
690 case recordTypes.RecalculateStyles: 698 case recordTypes.RecalculateStyles:
691 stackLabel = WebInspector.UIString("Stack when style recalculation was f orced"); 699 stackLabel = WebInspector.UIString("Stack when style recalculation was f orced");
692 break; 700 break;
693 case recordTypes.Layout: 701 case recordTypes.Layout:
694 callSiteStackLabel = WebInspector.UIString("First layout invalidation"); 702 callSiteStackLabel = WebInspector.UIString("First layout invalidation");
695 stackLabel = WebInspector.UIString("Stack when layout was forced"); 703 stackLabel = WebInspector.UIString("Stack when layout was forced");
696 break; 704 break;
697 } 705 }
698 706
699 // Direct cause. 707 // Direct cause.
700 if (event.stackTrace) 708 if (event.stackTrace)
701 contentHelper.appendStackTrace(stackLabel || WebInspector.UIString("Stac k when this event occurred"), event.stackTrace); 709 contentHelper.appendStackTrace(stackLabel || WebInspector.UIString("Stac k when this event occurred"), event.stackTrace);
702 710
703 // Indirect cause / invalidation. 711 // Indirect causes.
704 var initiator = event.initiator; 712 if (event.invalidationTrackingEvents) { // Full invalidation tracking (exper imental).
705 if (initiator && initiator.stackTrace) 713 WebInspector.TracingTimelineUIUtils._generateInvalidations(event, conten tHelper);
714 } else if (initiator && initiator.stackTrace) { // Partial invalidation trac king.
706 contentHelper.appendStackTrace(callSiteStackLabel || WebInspector.UIStri ng("Stack when first invalidated"), initiator.stackTrace); 715 contentHelper.appendStackTrace(callSiteStackLabel || WebInspector.UIStri ng("Stack when first invalidated"), initiator.stackTrace);
716 }
707 } 717 }
708 718
709 /** 719 /**
720 * @param {!WebInspector.TracingModel.Event} event
721 * @param {!WebInspector.TimelineDetailsContentHelper} contentHelper
722 */
723 WebInspector.TracingTimelineUIUtils._generateInvalidations = function(event, con tentHelper)
724 {
725 if (!event.invalidationTrackingEvents)
726 return;
727
728 var target = event.thread.target();
729 var invalidations = {};
730 event.invalidationTrackingEvents.forEach(function(invalidation) {
731 if (invalidations[invalidation.type] === undefined)
732 invalidations[invalidation.type] = [invalidation];
733 else
734 invalidations[invalidation.type].push(invalidation);
735 });
736
737 Object.keys(invalidations).forEach(function(type) {
738 var title;
739 switch (type) {
740 case WebInspector.TracingTimelineModel.RecordType.StyleRecalcInvalidatio nTracking:
741 title = WebInspector.UIString("Style invalidations");
742 break;
743 case WebInspector.TracingTimelineModel.RecordType.LayoutInvalidationTrac king:
744 title = WebInspector.UIString("Layout invalidations");
745 break;
746 default:
747 title = WebInspector.UIString("Other invalidations");
748 break;
749 }
750
751 WebInspector.TracingTimelineUIUtils._generateInvalidation(
752 title, target, invalidations[type], contentHelper);
753 });
754 }
755
756 /**
757 * @param {string} title
758 * @param {?WebInspector.Target} target
759 * @param {!Object} invalidationEvents
760 * @param {!WebInspector.TimelineDetailsContentHelper} contentHelper
761 */
762 WebInspector.TracingTimelineUIUtils._generateInvalidation = function(title, targ et, invalidationEvents, contentHelper)
763 {
764 var detailsNode = document.createElement("div");
765 detailsNode.className = "timeline-details-view-row";
766 var titleElement = detailsNode.createChild("span", "timeline-details-view-ro w-title");
767 titleElement.textContent = WebInspector.UIString("%s: ", title);
768 var eventsList = detailsNode.createChild("ol");
769
770 invalidationEvents.forEach(function(invalidation, idx) {
771 var row = eventsList.createChild("li");
772 var nodeRow = row.createChild("div");
773 var node = target.domModel.nodeForId(invalidation.frontendNodeId);
774 if (node)
775 nodeRow.appendChild(WebInspector.DOMPresentationUtils.linkifyNodeRef erence(node));
776 else if (invalidation.nodeName)
777 nodeRow.textContent = WebInspector.UIString("[ %s ]", invalidation.n odeName);
778 else
779 nodeRow.textContent = WebInspector.UIString("[ unknown node ]");
780
781 if (invalidation.reason) {
782 var reasonRow = row.createChild("div");
783 var reason = invalidation.reason + (invalidation.reason.endsWith('.' ) ? '' : '.');
caseq 2014/10/16 17:08:01 s/'/"/g, though it would be perhaps nice to just m
pdr. 2014/10/17 05:07:04 Done, filed crbug.com/424451 to clean these up, an
784 reasonRow.textContent = WebInspector.UIString("Reason: %s", reason);
785 }
786
787 var callstack = invalidation.callstack ? JSON.parse(invalidation.callsta ck) : [];
788 if (callstack.length)
789 contentHelper.createChildStackTraceElement(row, callstack);
790 });
791
792 contentHelper.element.appendChild(detailsNode);
793 }
794
795 /**
796 * @param {!WebInspector.TracingModel.Event} event
797 * @param {!CallbackBarrier} barrier
798 */
799 WebInspector.TracingTimelineUIUtils._resolveInvalidationTrackingNodeIds = functi on(event, barrier)
800 {
801 var backendNodeIdSet = {};
802 if (event.nodeId)
803 backendNodeIdSet[event.nodeId] = true;
804 event.invalidationTrackingEvents.forEach(function(invalidation) {
805 if (invalidation.nodeId)
806 backendNodeIdSet[invalidation.nodeId] = true;
807 });
808
809 var backendNodeIds = [];
810 Object.keys(backendNodeIdSet).forEach(function(backendNodeId) {
811 backendNodeIds.push(parseInt(backendNodeId));
812 });
813 event.thread.target().domModel.pushNodesByBackendIdsToFrontend(
814 backendNodeIds, barrier.createCallback(updateInvalidationNodeIds));
815
816 function updateInvalidationNodeIds(frontendNodeIds)
817 {
818 if (!frontendNodeIds)
819 return;
820 if (frontendNodeIds.length != backendNodeIds.length) {
821 console.error('Did not resolve the correct number of frontend node i ds.');
caseq 2014/10/16 17:08:01 s/'/"/g
pdr. 2014/10/17 05:07:04 Done
822 return;
823 }
824
825 var backendToFrontendNodeIdMap = {};
826 backendNodeIds.forEach(function(backendNodeId, index) {
827 backendToFrontendNodeIdMap[backendNodeId] = frontendNodeIds[index];
828 });
829
830 if (event.nodeId)
831 event.frontendNodeId = backendToFrontendNodeIdMap[event.nodeId];
832 event.invalidationTrackingEvents.forEach(function(invalidation) {
833 if (invalidation.nodeId)
834 invalidation.frontendNodeId = backendToFrontendNodeIdMap[invalid ation.nodeId];
835 });
836 }
837 }
838
839 /**
710 * @param {!Object} total 840 * @param {!Object} total
711 * @param {!WebInspector.TracingTimelineModel} model 841 * @param {!WebInspector.TracingTimelineModel} model
712 * @param {!WebInspector.TracingModel.Event} event 842 * @param {!WebInspector.TracingModel.Event} event
713 * @return {boolean} 843 * @return {boolean}
714 */ 844 */
715 WebInspector.TracingTimelineUIUtils._aggregatedStatsForTraceEvent = function(tot al, model, event) 845 WebInspector.TracingTimelineUIUtils._aggregatedStatsForTraceEvent = function(tot al, model, event)
716 { 846 {
717 var events = model.inspectedTargetEvents(); 847 var events = model.inspectedTargetEvents();
718 /** 848 /**
719 * @param {number} startTime 849 * @param {number} startTime
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after
835 return result; 965 return result;
836 } 966 }
837 967
838 /** 968 /**
839 * @return {!WebInspector.TracingTimelineModel.Filter} 969 * @return {!WebInspector.TracingTimelineModel.Filter}
840 */ 970 */
841 WebInspector.TracingTimelineUIUtils.hiddenEventsFilter = function() 971 WebInspector.TracingTimelineUIUtils.hiddenEventsFilter = function()
842 { 972 {
843 return new WebInspector.TracingTimelineModel.InclusiveEventNameFilter(WebIns pector.TracingTimelineUIUtils._visibleTypes()); 973 return new WebInspector.TracingTimelineModel.InclusiveEventNameFilter(WebIns pector.TracingTimelineUIUtils._visibleTypes());
844 } 974 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698