Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 } |
| OLD | NEW |