Changeset 238168 in webkit
- Timestamp:
- Nov 14, 2018 1:26:23 AM (5 years ago)
- Location:
- trunk/Source/WebInspectorUI
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebInspectorUI/ChangeLog
r238140 r238168 1 2018-11-14 Devin Rousso <drousso@apple.com> 2 3 Web Inspector: Network Graphs are missing minimum sizes, might have no graph at all 4 https://bugs.webkit.org/show_bug.cgi?id=191208 5 6 Reviewed by Joseph Pecoraro. 7 8 `WI.NetworkTableContentView` used to rely on the `WI.timelineManager.persistentNetworkTimeline` 9 for events when a new resource is added. It also listened for `WI.Frame.Event.MainResourceDidChange` 10 on it's own, which was also listened to by `WI.timelineManager.persistentNetworkTimeline`. 11 Due to the order in which these listeners are added, the new main resource would get added 12 to the `WI.timelineManager.persistentNetworkTimeline` (and the `WI.NetworkTableContentView` 13 shortly after), and right after that the `WI.NetworkTableContentView` would reset the graph 14 in it's own listener for `WI.Frame.Event.MainResourceDidChange`. 15 16 This patch removes `WI.timelineManager.persistentNetworkTimeline` and instead makes it so 17 that `WI.NetworkTableContentView` listens for resource added and main frame changed events 18 on its own (similar to other views that follow this pattern), ensuring that there are no 19 event races. 20 21 Also relaxes the "requirement" that prevented 0 width blocks from being drawn, allowing 22 requests served from memory/disk to appear in the graph (their time is effectively 0). 23 24 * UserInterface/Views/NetworkTableContentView.js: 25 (WI.NetworkTableContentView): 26 (WI.NetworkTableContentView.prototype.closed): 27 (WI.NetworkTableContentView.prototype._populateWaterfallGraph): 28 (WI.NetworkTableContentView.prototype._populateWaterfallGraph.appendBlock): 29 (WI.NetworkTableContentView.prototype._updateWaterfallTimeRange): Added. 30 (WI.NetworkTableContentView.prototype._resourceLoadingDidFinish): 31 (WI.NetworkTableContentView.prototype._resourceLoadingDidFail): 32 (WI.NetworkTableContentView.prototype._handleResourceAdded): Added. 33 (WI.NetworkTableContentView.prototype._insertResourceAndReloadTable): 34 (WI.NetworkTableContentView.prototype._handleNodeDidFireEvent): 35 (WI.NetworkTableContentView.prototype._handleNodeLowPowerChanged): 36 * UserInterface/Views/NetworkTableContentView.css: 37 (.network-table .waterfall .block:matches(.mouse-tracking, .filler) + .block:not(.mouse-tracking, .filler)): Added. 38 (.network-table .waterfall .block.filler + .block): Deleted. 39 40 * UserInterface/Controllers/TimelineManager.js: 41 (WI.TimelineManager): 42 (WI.TimelineManager.prototype._mainResourceDidChange): 43 (WI.TimelineManager.prototype._resourceWasAdded): 44 (WI.TimelineManager.prototype.get persistentNetworkTimeline): Deleted. 45 1 46 2018-11-13 Matt Baker <mattbaker@apple.com> 2 47 -
trunk/Source/WebInspectorUI/UserInterface/Controllers/TimelineManager.js
r238048 r238168 42 42 this._enabledTimelineTypesSetting = new WI.Setting("enabled-instrument-types", WI.TimelineManager.defaultTimelineTypes()); 43 43 44 this._persistentNetworkTimeline = new WI.NetworkTimeline;45 46 44 this._isCapturing = false; 47 45 this._initiatedByBackendStart = false; … … 136 134 console.assert(this._activeRecording || !this._isCapturing); 137 135 return this._activeRecording; 138 }139 140 get persistentNetworkTimeline()141 {142 return this._persistentNetworkTimeline;143 136 } 144 137 … … 822 815 _mainResourceDidChange(event) 823 816 { 824 let frame = event.target;825 if (frame.isMainFrame() && WI.settings.clearNetworkOnNavigate.value)826 this._persistentNetworkTimeline.reset();827 828 let mainResource = frame.mainResource;829 let record = new WI.ResourceTimelineRecord(mainResource);830 if (!isNaN(record.startTime))831 this._persistentNetworkTimeline.addRecord(record);832 833 817 // Ignore resource events when there isn't a main frame yet. Those events are triggered by 834 818 // loading the cached resources when the inspector opens, and they do not have timing information. … … 836 820 return; 837 821 822 let frame = event.target; 838 823 if (this._attemptAutoCapturingForFrame(frame)) 839 824 return; … … 842 827 return; 843 828 829 let mainResource = frame.mainResource; 844 830 if (mainResource === this._mainResourceForAutoCapturing) 845 831 return; 846 832 847 this._addRecord( record);833 this._addRecord(new WI.ResourceTimelineRecord(mainResource)); 848 834 } 849 835 850 836 _resourceWasAdded(event) 851 837 { 852 var record = new WI.ResourceTimelineRecord(event.data.resource);853 if (!isNaN(record.startTime))854 this._persistentNetworkTimeline.addRecord(record);855 838 856 839 // Ignore resource events when there isn't a main frame yet. Those events are triggered by … … 862 845 return; 863 846 864 this._addRecord( record);847 this._addRecord(new WI.ResourceTimelineRecord(event.data.resource)); 865 848 } 866 849 -
trunk/Source/WebInspectorUI/UserInterface/Views/NetworkTableContentView.css
r237708 r238168 250 250 } 251 251 252 .network-table .waterfall .block .filler + .block,252 .network-table .waterfall .block:matches(.mouse-tracking, .filler) + .block:not(.mouse-tracking, .filler), 253 253 .network-table .waterfall .block:not(.request, .response) + :matches(.request, .response) { 254 254 --start-radius: 2px; -
trunk/Source/WebInspectorUI/UserInterface/Views/NetworkTableContentView.js
r237720 r238168 131 131 this._clearNetworkItemsNavigationItem.addEventListener(WI.ButtonNavigationItem.Event.Clicked, () => { this.reset(); }); 132 132 133 WI.Target.addEventListener(WI.Target.Event.ResourceAdded, this._handleResourceAdded, this); 133 134 WI.Frame.addEventListener(WI.Frame.Event.MainResourceDidChange, this._mainResourceDidChange, this); 135 WI.Frame.addEventListener(WI.Frame.Event.ResourceWasAdded, this._handleResourceAdded, this); 134 136 WI.Resource.addEventListener(WI.Resource.Event.LoadingDidFinish, this._resourceLoadingDidFinish, this); 135 137 WI.Resource.addEventListener(WI.Resource.Event.LoadingDidFail, this._resourceLoadingDidFail, this); 136 138 WI.Resource.addEventListener(WI.Resource.Event.TransferSizeDidChange, this._resourceTransferSizeDidChange, this); 137 139 WI.networkManager.addEventListener(WI.NetworkManager.Event.MainFrameDidChange, this._mainFrameDidChange, this); 138 WI.timelineManager.persistentNetworkTimeline.addEventListener(WI.Timeline.Event.RecordAdded, this._networkTimelineRecordAdded, this);139 140 140 141 this._needsInitialPopulate = true; … … 251 252 this._hideDetailView(); 252 253 254 WI.Target.removeEventListener(null, null, this); 253 255 WI.Frame.removeEventListener(null, null, this); 254 256 WI.Resource.removeEventListener(null, null, this); … … 256 258 WI.settings.clearNetworkOnNavigate.removeEventListener(null, null, this); 257 259 WI.networkManager.removeEventListener(WI.NetworkManager.Event.MainFrameDidChange, this._mainFrameDidChange, this); 258 WI.timelineManager.persistentNetworkTimeline.removeEventListener(WI.Timeline.Event.RecordAdded, this._networkTimelineRecordAdded, this);259 260 260 261 super.closed(); … … 764 765 765 766 let {startTime, redirectStart, redirectEnd, fetchStart, domainLookupStart, domainLookupEnd, connectStart, connectEnd, secureConnectionStart, requestStart, responseStart, responseEnd} = resource.timingData; 766 if (isNaN(startTime) || isNaN(responseEnd) || startTime > =responseEnd) {767 if (isNaN(startTime) || isNaN(responseEnd) || startTime > responseEnd) { 767 768 cell.textContent = zeroWidthSpace; 768 769 return; … … 782 783 let lastEndTimestamp = NaN; 783 784 function appendBlock(startTimestamp, endTimestamp, className) { 784 if (isNaN(startTimestamp) || isNaN(endTimestamp) || endTimestamp - startTimestamp <= 0)785 if (isNaN(startTimestamp) || isNaN(endTimestamp)) 785 786 return null; 786 787 … … 808 809 let totalWidth = (responseEnd - startTime) / secondsPerPixel; 809 810 if (totalWidth <= 3) { 810 appendBlock(startTime, requestStart, "queue"); 811 appendBlock(startTime, responseEnd, "response"); 811 let twoPixels = secondsPerPixel * 2; 812 appendBlock(startTime, startTime + twoPixels, "queue"); 813 appendBlock(startTime + twoPixels, startTime + (2 * twoPixels), "response"); 812 814 return; 813 815 } … … 1112 1114 // Private 1113 1115 1116 _updateWaterfallTimeRange(startTimestamp, endTimestamp) 1117 { 1118 if (isNaN(this._waterfallStartTime) || startTimestamp < this._waterfallStartTime) 1119 this._waterfallStartTime = startTimestamp; 1120 1121 if (isNaN(this._waterfallEndTime) || endTimestamp > this._waterfallEndTime) 1122 this._waterfallEndTime = endTimestamp; 1123 } 1124 1114 1125 _updateWaterfallTimelineRuler() 1115 1126 { … … 1415 1426 this._pendingUpdates.push(resource); 1416 1427 1417 if (resource.firstTimestamp < this._waterfallStartTime) 1418 this._waterfallStartTime = resource.firstTimestamp; 1419 if (resource.timingData.responseEnd > this._waterfallEndTime) 1420 this._waterfallEndTime = resource.timingData.responseEnd; 1428 this._updateWaterfallTimeRange(resource.firstTimestamp, resource.timingData.responseEnd); 1421 1429 1422 1430 if (this._hasURLFilter()) … … 1431 1439 this._pendingUpdates.push(resource); 1432 1440 1433 if (resource.firstTimestamp < this._waterfallStartTime) 1434 this._waterfallStartTime = resource.firstTimestamp; 1435 if (resource.timingData.responseEnd > this._waterfallEndTime) 1436 this._waterfallEndTime = resource.timingData.responseEnd; 1441 this._updateWaterfallTimeRange(resource.firstTimestamp, resource.timingData.responseEnd); 1437 1442 1438 1443 if (this._hasURLFilter()) … … 1470 1475 } 1471 1476 1472 _networkTimelineRecordAdded(event) 1473 { 1474 let resourceTimelineRecord = event.data.record; 1475 console.assert(resourceTimelineRecord instanceof WI.ResourceTimelineRecord); 1476 1477 let resource = resourceTimelineRecord.resource; 1478 if (isNaN(this._waterfallStartTime)) 1479 this._waterfallStartTime = this._waterfallEndTime = resource.firstTimestamp; 1480 1481 this._insertResourceAndReloadTable(resource); 1477 _handleResourceAdded(event) 1478 { 1479 this._insertResourceAndReloadTable(event.data.resource); 1482 1480 } 1483 1481 … … 1489 1487 _insertResourceAndReloadTable(resource) 1490 1488 { 1489 this._updateWaterfallTimeRange(resource.firstTimestamp, resource.timingData.responseEnd); 1490 1491 1491 if (!this._table || !(WI.tabBrowser.selectedTabContentView instanceof WI.NetworkTabContentView)) { 1492 1492 this._pendingInsertions.push(resource); … … 1610 1610 this._pendingUpdates.push(domNode); 1611 1611 1612 if (domEvent.timestamp > this._waterfallEndTime) 1613 this._waterfallEndTime = domEvent.timestamp + (this._waterfallTimelineRuler.secondsPerPixel * 10); 1612 this._updateWaterfallTimeRange(NaN, domEvent.timestamp + (this._waterfallTimelineRuler.secondsPerPixel * 10)); 1614 1613 1615 1614 this.needsLayout(); … … 1623 1622 this._pendingUpdates.push(domNode); 1624 1623 1625 if (timestamp > this._waterfallEndTime) 1626 this._waterfallEndTime = timestamp + (this._waterfallTimelineRuler.secondsPerPixel * 10); 1624 this._updateWaterfallTimeRange(NaN, timestamp + (this._waterfallTimelineRuler.secondsPerPixel * 10)); 1627 1625 1628 1626 this.needsLayout();
Note: See TracChangeset
for help on using the changeset viewer.