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

Side by Side Diff: Source/devtools/front_end/TimelineView.js

Issue 180273023: DevTools: encapsulate presentation model in timeline view. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: For landing Created 6 years, 9 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/TimelinePresentationModel.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 /* 1 /*
2 * Copyright (C) 2013 Google Inc. All rights reserved. 2 * Copyright (C) 2013 Google Inc. All rights reserved.
3 * Copyright (C) 2012 Intel Inc. All rights reserved. 3 * Copyright (C) 2012 Intel Inc. All rights reserved.
4 * 4 *
5 * Redistribution and use in source and binary forms, with or without 5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are 6 * modification, are permitted provided that the following conditions are
7 * met: 7 * met:
8 * 8 *
9 * * Redistributions of source code must retain the above copyright 9 * * Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer. 10 * notice, this list of conditions and the following disclaimer.
(...skipping 17 matching lines...) Expand all
28 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 28 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30 */ 30 */
31 31
32 /** 32 /**
33 * @constructor 33 * @constructor
34 * @extends {WebInspector.View} 34 * @extends {WebInspector.View}
35 * @implements {WebInspector.TimelineModeView} 35 * @implements {WebInspector.TimelineModeView}
36 * @param {!WebInspector.TimelineModeViewDelegate} delegate 36 * @param {!WebInspector.TimelineModeViewDelegate} delegate
37 * @param {!WebInspector.TimelineModel} model 37 * @param {!WebInspector.TimelineModel} model
38 * @param {!WebInspector.TimelinePresentationModel} presentationModel
39 * @param {?WebInspector.TimelineFrameModel} frameModel
40 */ 38 */
41 WebInspector.TimelineView = function(delegate, model, presentationModel, frameMo del) 39 WebInspector.TimelineView = function(delegate, model)
42 { 40 {
43 WebInspector.View.call(this); 41 WebInspector.View.call(this);
44 this.element.classList.add("timeline-view"); 42 this.element.classList.add("timeline-view");
45 this.element.classList.add("hbox"); 43 this.element.classList.add("hbox");
46 44
47 this._delegate = delegate; 45 this._delegate = delegate;
48 this._model = model; 46 this._model = model;
49 this._presentationModel = presentationModel; 47 this._presentationModel = new WebInspector.TimelinePresentationModel(model);
50 this._frameModel = frameModel;
51 this._calculator = new WebInspector.TimelineCalculator(model); 48 this._calculator = new WebInspector.TimelineCalculator(model);
52 this._linkifier = new WebInspector.Linkifier(); 49 this._linkifier = new WebInspector.Linkifier();
53 50
54 this._boundariesAreValid = true; 51 this._boundariesAreValid = true;
55 this._scrollTop = 0; 52 this._scrollTop = 0;
56 53
57 this._recordsView = this._createRecordsView(); 54 this._recordsView = this._createRecordsView();
58 this._recordsView.addEventListener(WebInspector.SplitView.Events.SidebarSize Changed, this._sidebarResized, this); 55 this._recordsView.addEventListener(WebInspector.SplitView.Events.SidebarSize Changed, this._sidebarResized, this);
59 this._recordsView.show(this.element); 56 this._recordsView.show(this.element);
60 this.element.appendChild(this._timelineGrid.gridHeaderElement); 57 this.element.appendChild(this._timelineGrid.gridHeaderElement);
61 58
62 this._popoverHelper = new WebInspector.PopoverHelper(this.element, this._get PopoverAnchor.bind(this), this._showPopover.bind(this)); 59 this._popoverHelper = new WebInspector.PopoverHelper(this.element, this._get PopoverAnchor.bind(this), this._showPopover.bind(this));
63 60
64 this.element.addEventListener("mousemove", this._mouseMove.bind(this), false ); 61 this.element.addEventListener("mousemove", this._mouseMove.bind(this), false );
65 this.element.addEventListener("mouseout", this._mouseOut.bind(this), false); 62 this.element.addEventListener("mouseout", this._mouseOut.bind(this), false);
66 this.element.addEventListener("keydown", this._keyDown.bind(this), false); 63 this.element.addEventListener("keydown", this._keyDown.bind(this), false);
67 64
68 this._expandOffset = 15; 65 this._expandOffset = 15;
69 } 66 }
70 67
71 WebInspector.TimelineView.prototype = { 68 WebInspector.TimelineView.prototype = {
72 /** 69 /**
70 * @param {?WebInspector.TimelineFrameModel} frameModel
71 */
72 setFrameModel: function(frameModel)
73 {
74 this._frameModel = frameModel;
75 },
76
77 /**
73 * @return {!WebInspector.SplitView} 78 * @return {!WebInspector.SplitView}
74 */ 79 */
75 _createRecordsView: function() 80 _createRecordsView: function()
76 { 81 {
77 var recordsView = new WebInspector.SplitView(true, false, "timelinePanel RecorsSplitViewState"); 82 var recordsView = new WebInspector.SplitView(true, false, "timelinePanel RecorsSplitViewState");
78 this._containerElement = recordsView.element; 83 this._containerElement = recordsView.element;
79 this._containerElement.tabIndex = 0; 84 this._containerElement.tabIndex = 0;
80 this._containerElement.id = "timeline-container"; 85 this._containerElement.id = "timeline-container";
81 this._containerElement.addEventListener("scroll", this._onScroll.bind(th is), false); 86 this._containerElement.addEventListener("scroll", this._onScroll.bind(th is), false);
82 87
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
114 _rootRecord: function() 119 _rootRecord: function()
115 { 120 {
116 return this._presentationModel.rootRecord(); 121 return this._presentationModel.rootRecord();
117 }, 122 },
118 123
119 _updateEventDividers: function() 124 _updateEventDividers: function()
120 { 125 {
121 this._timelineGrid.removeEventDividers(); 126 this._timelineGrid.removeEventDividers();
122 var clientWidth = this._graphRowsElementWidth; 127 var clientWidth = this._graphRowsElementWidth;
123 var dividers = []; 128 var dividers = [];
124 var eventDividerRecords = this._presentationModel.eventDividerRecords(); 129 var eventDividerRecords = this._model.eventDividerRecords();
125 130
126 for (var i = 0; i < eventDividerRecords.length; ++i) { 131 for (var i = 0; i < eventDividerRecords.length; ++i) {
127 var record = eventDividerRecords[i]; 132 var record = eventDividerRecords[i];
128 var positions = this._calculator.computeBarGraphWindowPosition(recor d); 133 var positions = this._calculator.computeBarGraphWindowPosition(recor d);
129 var dividerPosition = Math.round(positions.left); 134 var dividerPosition = Math.round(positions.left);
130 if (dividerPosition < 0 || dividerPosition >= clientWidth || divider s[dividerPosition]) 135 if (dividerPosition < 0 || dividerPosition >= clientWidth || divider s[dividerPosition])
131 continue; 136 continue;
132 var divider = WebInspector.TimelineUIUtils.createEventDivider(record .type, WebInspector.TimelineUIUtils.recordTitle(record)); 137 var divider = WebInspector.TimelineUIUtils.createEventDivider(record .type, WebInspector.TimelineUIUtils.recordTitle(record));
133 divider.style.left = dividerPosition + "px"; 138 divider.style.left = dividerPosition + "px";
134 dividers[dividerPosition] = divider; 139 dividers[dividerPosition] = divider;
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
187 if (!frameBar) 192 if (!frameBar)
188 return; 193 return;
189 this._delegate.requestWindowTimes(frameBar._frame.startTime, frameBar._f rame.endTime); 194 this._delegate.requestWindowTimes(frameBar._frame.startTime, frameBar._f rame.endTime);
190 }, 195 },
191 196
192 /** 197 /**
193 * @param {!WebInspector.TimelineModel.Record} record 198 * @param {!WebInspector.TimelineModel.Record} record
194 */ 199 */
195 addRecord: function(record) 200 addRecord: function(record)
196 { 201 {
197 if (this._innerAddRecordToTimeline(record)) 202 this._presentationModel.addRecord(record);
198 this._invalidateAndScheduleRefresh(false, false); 203 this._invalidateAndScheduleRefresh(false, false);
199 }, 204 },
200 205
201 /** 206 /**
202 * @param {!WebInspector.TimelineModel.Record} record
203 * @return {boolean}
204 */
205 _innerAddRecordToTimeline: function(record)
206 {
207 if (record.type === WebInspector.TimelineModel.RecordType.GPUTask)
208 return record.startTime < this._windowEndTime;
209
210 var hasVisibleRecords = false;
211 var presentationModel = this._presentationModel;
212 function checkVisible(record)
213 {
214 hasVisibleRecords |= presentationModel.isVisible(record);
215 }
216 WebInspector.TimelineModel.forAllRecords([record], checkVisible);
217 return hasVisibleRecords;
218 },
219
220 /**
221 * @param {number} width 207 * @param {number} width
222 */ 208 */
223 setSidebarSize: function(width) 209 setSidebarSize: function(width)
224 { 210 {
225 this._recordsView.setSidebarSize(width); 211 this._recordsView.setSidebarSize(width);
226 }, 212 },
227 213
228 /** 214 /**
229 * @param {!WebInspector.Event} event 215 * @param {!WebInspector.Event} event
230 */ 216 */
(...skipping 22 matching lines...) Expand all
253 239
254 _resetView: function() 240 _resetView: function()
255 { 241 {
256 this._windowStartTime = -1; 242 this._windowStartTime = -1;
257 this._windowEndTime = -1; 243 this._windowEndTime = -1;
258 this._boundariesAreValid = false; 244 this._boundariesAreValid = false;
259 this._adjustScrollPosition(0); 245 this._adjustScrollPosition(0);
260 this._linkifier.reset(); 246 this._linkifier.reset();
261 this._closeRecordDetails(); 247 this._closeRecordDetails();
262 this._automaticallySizeWindow = true; 248 this._automaticallySizeWindow = true;
249 this._presentationModel.reset();
263 }, 250 },
264 251
265 reset: function() 252 reset: function()
266 { 253 {
267 this._resetView(); 254 this._resetView();
268 this._invalidateAndScheduleRefresh(true, true); 255 this._invalidateAndScheduleRefresh(true, true);
269 }, 256 },
270 257
271 /** 258 /**
272 * @return {!Array.<!Element>} 259 * @return {!Array.<!Element>}
273 */ 260 */
274 elementsToRestoreScrollPositionsFor: function() 261 elementsToRestoreScrollPositionsFor: function()
275 { 262 {
276 return [this._containerElement]; 263 return [this._containerElement];
277 }, 264 },
278 265
279 refreshRecords: function() 266 /**
267 * @param {?RegExp} textFilter
268 */
269 refreshRecords: function(textFilter)
280 { 270 {
271 this._presentationModel.reset();
272 var records = this._model.records();
273 for (var i = 0; i < records.length; ++i)
274 this.addRecord(records[i]);
281 this._automaticallySizeWindow = false; 275 this._automaticallySizeWindow = false;
276 this._presentationModel.setTextFilter(textFilter);
282 this._invalidateAndScheduleRefresh(false, true); 277 this._invalidateAndScheduleRefresh(false, true);
283 }, 278 },
284 279
285 wasShown: function() 280 wasShown: function()
286 { 281 {
287 WebInspector.View.prototype.wasShown.call(this); 282 WebInspector.View.prototype.wasShown.call(this);
288 283
289 if (!WebInspector.TimelinePanel._categoryStylesInitialized) { 284 if (!WebInspector.TimelinePanel._categoryStylesInitialized) {
290 WebInspector.TimelinePanel._categoryStylesInitialized = true; 285 WebInspector.TimelinePanel._categoryStylesInitialized = true;
291 this._injectCategoryStyles(); 286 this._injectCategoryStyles();
(...skipping 194 matching lines...) Expand 10 before | Expand all | Expand 10 after
486 var headerHeight = WebInspector.TimelinePanel.headerHeight; 481 var headerHeight = WebInspector.TimelinePanel.headerHeight;
487 482
488 // Convert visible area to visible indexes. Always include top-level rec ord for a visible nested record. 483 // Convert visible area to visible indexes. Always include top-level rec ord for a visible nested record.
489 var startIndex = Math.max(0, Math.min(Math.floor((visibleTop - headerHei ght) / rowHeight), recordsInWindow.length - 1)); 484 var startIndex = Math.max(0, Math.min(Math.floor((visibleTop - headerHei ght) / rowHeight), recordsInWindow.length - 1));
490 var endIndex = Math.min(recordsInWindow.length, Math.ceil(visibleBottom / rowHeight)); 485 var endIndex = Math.min(recordsInWindow.length, Math.ceil(visibleBottom / rowHeight));
491 var lastVisibleLine = Math.max(0, Math.floor((visibleBottom - headerHeig ht) / rowHeight)); 486 var lastVisibleLine = Math.max(0, Math.floor((visibleBottom - headerHeig ht) / rowHeight));
492 if (this._automaticallySizeWindow && recordsInWindow.length > lastVisibl eLine) { 487 if (this._automaticallySizeWindow && recordsInWindow.length > lastVisibl eLine) {
493 this._automaticallySizeWindow = false; 488 this._automaticallySizeWindow = false;
494 this._selectRecord(null); 489 this._selectRecord(null);
495 // If we're at the top, always use real timeline start as a left win dow bound so that expansion arrow padding logic works. 490 // If we're at the top, always use real timeline start as a left win dow bound so that expansion arrow padding logic works.
496 var windowStartTime = startIndex ? recordsInWindow[startIndex].recor d().startTime : this._presentationModel.minimumRecordTime(); 491 var windowStartTime = startIndex ? recordsInWindow[startIndex].recor d().startTime : this._model.minimumRecordTime();
497 var windowEndTime = recordsInWindow[Math.max(0, lastVisibleLine - 1) ].record().endTime; 492 var windowEndTime = recordsInWindow[Math.max(0, lastVisibleLine - 1) ].record().endTime;
498 this._delegate.requestWindowTimes(windowStartTime, windowEndTime); 493 this._delegate.requestWindowTimes(windowStartTime, windowEndTime);
499 recordsInWindow = this._presentationModel.filteredRecords(); 494 recordsInWindow = this._presentationModel.filteredRecords();
500 endIndex = Math.min(recordsInWindow.length, lastVisibleLine); 495 endIndex = Math.min(recordsInWindow.length, lastVisibleLine);
501 } 496 }
502 497
503 // Resize gaps first. 498 // Resize gaps first.
504 this._topGapElement.style.height = (startIndex * rowHeight) + "px"; 499 this._topGapElement.style.height = (startIndex * rowHeight) + "px";
505 this._recordsView.sidebarElement().firstElementChild.style.flexBasis = ( startIndex * rowHeight + headerHeight) + "px"; 500 this._recordsView.sidebarElement().firstElementChild.style.flexBasis = ( startIndex * rowHeight + headerHeight) + "px";
506 this._bottomGapElement.style.height = (recordsInWindow.length - endIndex ) * rowHeight + "px"; 501 this._bottomGapElement.style.height = (recordsInWindow.length - endIndex ) * rowHeight + "px";
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
567 562
568 this._itemsGraphsElement.insertBefore(this._graphRowsElement, this._bott omGapElement); 563 this._itemsGraphsElement.insertBefore(this._graphRowsElement, this._bott omGapElement);
569 this._itemsGraphsElement.appendChild(this._expandElements); 564 this._itemsGraphsElement.appendChild(this._expandElements);
570 this._adjustScrollPosition(recordsInWindow.length * rowHeight + headerHe ight); 565 this._adjustScrollPosition(recordsInWindow.length * rowHeight + headerHe ight);
571 566
572 return recordsInWindow.length; 567 return recordsInWindow.length;
573 }, 568 },
574 569
575 _refreshAllUtilizationBars: function() 570 _refreshAllUtilizationBars: function()
576 { 571 {
577 this._refreshUtilizationBars(WebInspector.UIString("CPU"), this._present ationModel.mainThreadTasks(), this._cpuBarsElement); 572 this._refreshUtilizationBars(WebInspector.UIString("CPU"), this._model.m ainThreadTasks(), this._cpuBarsElement);
578 if (WebInspector.experimentsSettings.gpuTimeline.isEnabled()) 573 if (WebInspector.experimentsSettings.gpuTimeline.isEnabled())
579 this._refreshUtilizationBars(WebInspector.UIString("GPU"), this._pre sentationModel.gpuThreadTasks(), this._gpuBarsElement); 574 this._refreshUtilizationBars(WebInspector.UIString("GPU"), this._mod el.gpuThreadTasks(), this._gpuBarsElement);
580 }, 575 },
581 576
582 /** 577 /**
583 * @param {string} name 578 * @param {string} name
584 * @param {!Array.<!WebInspector.TimelineModel.Record>} tasks 579 * @param {!Array.<!WebInspector.TimelineModel.Record>} tasks
585 * @param {?Element} container 580 * @param {?Element} container
586 */ 581 */
587 _refreshUtilizationBars: function(name, tasks, container) 582 _refreshUtilizationBars: function(name, tasks, container)
588 { 583 {
589 if (!container) 584 if (!container)
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after
718 if (index === -1) 713 if (index === -1)
719 index = 0; 714 index = 0;
720 715
721 switch (event.keyIdentifier) { 716 switch (event.keyIdentifier) {
722 case "Left": 717 case "Left":
723 if (record.presentationParent()) { 718 if (record.presentationParent()) {
724 if ((!record.expandable() || record.collapsed()) && record.prese ntationParent() !== this._presentationModel.rootRecord()) { 719 if ((!record.expandable() || record.collapsed()) && record.prese ntationParent() !== this._presentationModel.rootRecord()) {
725 this._selectRecord(record.presentationParent()); 720 this._selectRecord(record.presentationParent());
726 } else { 721 } else {
727 record.setCollapsed(true); 722 record.setCollapsed(true);
728 record.clicked = true;
729 this._invalidateAndScheduleRefresh(true, true); 723 this._invalidateAndScheduleRefresh(true, true);
730 } 724 }
731 } 725 }
732 event.consume(true); 726 event.consume(true);
733 break; 727 break;
734 case "Up": 728 case "Up":
735 if (--index < 0) 729 if (--index < 0)
736 break; 730 break;
737 this._selectRecord(recordsInWindow[index]); 731 this._selectRecord(recordsInWindow[index]);
738 event.consume(true); 732 event.consume(true);
739 break; 733 break;
740 case "Right": 734 case "Right":
741 if (record.expandable() && record.collapsed()) { 735 if (record.expandable() && record.collapsed()) {
742 record.setCollapsed(false); 736 record.setCollapsed(false);
743 record.clicked = true;
744 this._invalidateAndScheduleRefresh(true, true); 737 this._invalidateAndScheduleRefresh(true, true);
745 } else { 738 } else {
746 if (++index >= recordsInWindow.length) 739 if (++index >= recordsInWindow.length)
747 break; 740 break;
748 this._selectRecord(recordsInWindow[index]); 741 this._selectRecord(recordsInWindow[index]);
749 } 742 }
750 event.consume(true); 743 event.consume(true);
751 break; 744 break;
752 case "Down": 745 case "Down":
753 if (++index >= recordsInWindow.length) 746 if (++index >= recordsInWindow.length)
(...skipping 293 matching lines...) Expand 10 before | Expand all | Expand 10 after
1047 } else { 1040 } else {
1048 var detailsNode = WebInspector.TimelineUIUtils.buildDetailsNode(reco rd, this._linkifier); 1041 var detailsNode = WebInspector.TimelineUIUtils.buildDetailsNode(reco rd, this._linkifier);
1049 if (detailsNode) { 1042 if (detailsNode) {
1050 this._dataElement.appendChild(document.createTextNode("(")); 1043 this._dataElement.appendChild(document.createTextNode("("));
1051 this._dataElement.appendChild(detailsNode); 1044 this._dataElement.appendChild(detailsNode);
1052 this._dataElement.appendChild(document.createTextNode(")")); 1045 this._dataElement.appendChild(document.createTextNode(")"));
1053 } 1046 }
1054 } 1047 }
1055 1048
1056 this._expandArrowElement.enableStyleClass("parent", presentationRecord.h asPresentationChildren()); 1049 this._expandArrowElement.enableStyleClass("parent", presentationRecord.h asPresentationChildren());
1057 this._expandArrowElement.enableStyleClass("expanded", presentationRecord .visibleChildrenCount()); 1050 this._expandArrowElement.enableStyleClass("expanded", !!presentationReco rd.visibleChildrenCount());
1058 this._record.setListRow(this); 1051 this._record.setListRow(this);
1059 }, 1052 },
1060 1053
1061 highlight: function(regExp, domChanges) 1054 highlight: function(regExp, domChanges)
1062 { 1055 {
1063 var matchInfo = this.element.textContent.match(regExp); 1056 var matchInfo = this.element.textContent.match(regExp);
1064 if (matchInfo) 1057 if (matchInfo)
1065 WebInspector.highlightSearchResult(this.element, matchInfo.index, ma tchInfo[0].length, domChanges); 1058 WebInspector.highlightSearchResult(this.element, matchInfo.index, ma tchInfo[0].length, domChanges);
1066 }, 1059 },
1067 1060
1068 dispose: function() 1061 dispose: function()
1069 { 1062 {
1070 this.element.remove(); 1063 this.element.remove();
1071 }, 1064 },
1072 1065
1073 /** 1066 /**
1074 * @param {!Event} event 1067 * @param {!Event} event
1075 */ 1068 */
1076 _onExpandClick: function(event) 1069 _onExpandClick: function(event)
1077 { 1070 {
1078 this._record.setCollapsed(!this._record.collapsed()); 1071 this._record.setCollapsed(!this._record.collapsed());
1079 this._record.clicked = true;
1080 this._scheduleRefresh(); 1072 this._scheduleRefresh();
1081 event.consume(true); 1073 event.consume(true);
1082 }, 1074 },
1083 1075
1084 /** 1076 /**
1085 * @param {?Event} event 1077 * @param {?Event} event
1086 */ 1078 */
1087 _onClick: function(event) 1079 _onClick: function(event)
1088 { 1080 {
1089 this._selectRecord(this._record); 1081 this._selectRecord(this._record);
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after
1197 * @param {boolean} selected 1189 * @param {boolean} selected
1198 */ 1190 */
1199 renderAsSelected: function(selected) 1191 renderAsSelected: function(selected)
1200 { 1192 {
1201 this.element.enableStyleClass("selected", selected); 1193 this.element.enableStyleClass("selected", selected);
1202 }, 1194 },
1203 1195
1204 _expand: function() 1196 _expand: function()
1205 { 1197 {
1206 this._record.setCollapsed(!this._record.collapsed()); 1198 this._record.setCollapsed(!this._record.collapsed());
1207 this._record.clicked = true;
1208 this._scheduleRefresh(); 1199 this._scheduleRefresh();
1209 }, 1200 },
1210 1201
1211 /** 1202 /**
1212 * @param {?Event} event 1203 * @param {?Event} event
1213 */ 1204 */
1214 _onMouseOver: function(event) 1205 _onMouseOver: function(event)
1215 { 1206 {
1216 this.element.classList.add("hovered"); 1207 this.element.classList.add("hovered");
1217 if (this._record.listRow()) 1208 if (this._record.listRow())
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
1268 this._element.classList.remove("hidden"); 1259 this._element.classList.remove("hidden");
1269 } else 1260 } else
1270 this._element.classList.add("hidden"); 1261 this._element.classList.add("hidden");
1271 }, 1262 },
1272 1263
1273 _dispose: function() 1264 _dispose: function()
1274 { 1265 {
1275 this._element.remove(); 1266 this._element.remove();
1276 } 1267 }
1277 } 1268 }
OLDNEW
« no previous file with comments | « Source/devtools/front_end/TimelinePresentationModel.js ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698