| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2014 Google Inc. All rights reserved. | 2 * Copyright (C) 2014 Google Inc. All rights reserved. |
| 3 * | 3 * |
| 4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
| 5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
| 6 * met: | 6 * met: |
| 7 * | 7 * |
| 8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
| 9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
| 10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
| (...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 179 /** | 179 /** |
| 180 * @param {!WebInspector.TimelineModel.Record} record | 180 * @param {!WebInspector.TimelineModel.Record} record |
| 181 * @param {number} level | 181 * @param {number} level |
| 182 */ | 182 */ |
| 183 _appendRecord: function(record, level) | 183 _appendRecord: function(record, level) |
| 184 { | 184 { |
| 185 var timelineData = this.timelineData(); | 185 var timelineData = this.timelineData(); |
| 186 | 186 |
| 187 this._startTime = this._startTime ? Math.min(this._startTime, record.sta
rtTime) : record.startTime; | 187 this._startTime = this._startTime ? Math.min(this._startTime, record.sta
rtTime) : record.startTime; |
| 188 this._zeroTime = this._startTime; | 188 this._zeroTime = this._startTime; |
| 189 var recordEndTime = record.endTime || record.startTime; | 189 var recordEndTime = record.endTime; |
| 190 this._endTime = Math.max(this._endTime, recordEndTime); | 190 this._endTime = Math.max(this._endTime, recordEndTime); |
| 191 this._totalTime = Math.max(1000, this._endTime - this._startTime); | 191 this._totalTime = Math.max(1000, this._endTime - this._startTime); |
| 192 | 192 |
| 193 if (this._mainThread) { | 193 if (this._mainThread) { |
| 194 if (record.type === WebInspector.TimelineModel.RecordType.GPUTask ||
!!record.thread) | 194 if (record.type === WebInspector.TimelineModel.RecordType.GPUTask ||
!!record.thread) |
| 195 return; | 195 return; |
| 196 } else { | 196 } else { |
| 197 if (record.type === WebInspector.TimelineModel.RecordType.Program ||
!record.thread) | 197 if (record.type === WebInspector.TimelineModel.RecordType.Program ||
!record.thread || record.thread === "gpu") |
| 198 return; | 198 return; |
| 199 } | 199 } |
| 200 | 200 |
| 201 var recordIndex = this._pushRecord(record, true, level, record.startTime
, record.endTime); |
| 201 var currentTime = record.startTime; | 202 var currentTime = record.startTime; |
| 202 for (var i = 0; i < record.children.length; ++i) { | 203 for (var i = 0; i < record.children.length; ++i) { |
| 203 var childRecord = record.children[i]; | 204 var childRecord = record.children[i]; |
| 204 var childStartTime = childRecord.startTime; | 205 var childStartTime = childRecord.startTime; |
| 205 if (currentTime !== childStartTime) | 206 var childEndTime = childRecord.endTime; |
| 206 this._pushRecord(record, true, level, currentTime, childStartTim
e); | 207 if (childStartTime === childEndTime) { |
| 207 var childEndTime = childRecord.endTime || childRecord.startTime; | 208 this._appendRecord(childRecord, level + 1); |
| 209 continue; |
| 210 } |
| 211 |
| 212 if (currentTime !== childStartTime) { |
| 213 if (recordIndex !== -1) { |
| 214 this._timelineData.entryTotalTimes[recordIndex] = childStart
Time - record.startTime; |
| 215 recordIndex = -1; |
| 216 } else { |
| 217 this._pushRecord(record, true, level, currentTime, childStar
tTime); |
| 218 } |
| 219 } |
| 208 this._pushRecord(record, false, level, childStartTime, childEndTime)
; | 220 this._pushRecord(record, false, level, childStartTime, childEndTime)
; |
| 209 this._appendRecord(childRecord, level + 1); | 221 this._appendRecord(childRecord, level + 1); |
| 210 currentTime = childEndTime; | 222 currentTime = childEndTime; |
| 211 } | 223 } |
| 212 if (recordEndTime !== currentTime || record.children.length === 0) | 224 if (recordEndTime !== currentTime || record.children.length === 0) |
| 213 this._pushRecord(record, true, level, currentTime, recordEndTime); | 225 this._pushRecord(record, true, level, currentTime, recordEndTime); |
| 214 | 226 |
| 215 this._maxStackDepth = Math.max(this._maxStackDepth, level + 2); | 227 this._maxStackDepth = Math.max(this._maxStackDepth, level + 2); |
| 216 }, | 228 }, |
| 217 | 229 |
| 218 /** | 230 /** |
| 219 * @param {!WebInspector.TimelineModel.Record} record | 231 * @param {!WebInspector.TimelineModel.Record} record |
| 220 * @param {boolean} isSelfSegment | 232 * @param {boolean} isSelfSegment |
| 221 * @param {number} level | 233 * @param {number} level |
| 222 * @param {number} startTime | 234 * @param {number} startTime |
| 223 * @param {number} endTime | 235 * @param {number} endTime |
| 236 * @return {number} |
| 224 */ | 237 */ |
| 225 _pushRecord: function(record, isSelfSegment, level, startTime, endTime) | 238 _pushRecord: function(record, isSelfSegment, level, startTime, endTime) |
| 226 { | 239 { |
| 227 var index = this._records.length; | 240 var index = this._records.length; |
| 228 this._records.push(record); | 241 this._records.push(record); |
| 229 this._timelineData.entryOffsets[index] = startTime - this._zeroTime; | 242 this._timelineData.entryOffsets[index] = startTime - this._zeroTime; |
| 230 this._timelineData.entryLevels[index] = level; | 243 this._timelineData.entryLevels[index] = level; |
| 231 this._timelineData.entryTotalTimes[index] = endTime - startTime; | 244 this._timelineData.entryTotalTimes[index] = endTime - startTime; |
| 232 this._isSelfSegment[index] = isSelfSegment; | 245 this._isSelfSegment[index] = isSelfSegment; |
| 246 return index; |
| 233 }, | 247 }, |
| 234 | 248 |
| 235 /** | 249 /** |
| 236 * @param {number} entryIndex | 250 * @param {number} entryIndex |
| 237 * @return {?Array.<!{title: string, text: string}>} | 251 * @return {?Array.<!{title: string, text: string}>} |
| 238 */ | 252 */ |
| 239 prepareHighlightedEntryInfo: function(entryIndex) | 253 prepareHighlightedEntryInfo: function(entryIndex) |
| 240 { | 254 { |
| 241 return null; | 255 return null; |
| 242 }, | 256 }, |
| 243 | 257 |
| 244 /** | 258 /** |
| 245 * @param {number} entryIndex | 259 * @param {number} entryIndex |
| 246 * @return {boolean} | 260 * @return {boolean} |
| 247 */ | 261 */ |
| 248 canJumpToEntry: function(entryIndex) | 262 canJumpToEntry: function(entryIndex) |
| 249 { | 263 { |
| 250 return false; | 264 return false; |
| 251 }, | 265 }, |
| 252 | 266 |
| 253 /** | 267 /** |
| 254 * @param {number} entryIndex | 268 * @param {number} entryIndex |
| 255 * @return {?Object} | |
| 256 */ | |
| 257 entryData: function(entryIndex) | |
| 258 { | |
| 259 return null; | |
| 260 }, | |
| 261 | |
| 262 /** | |
| 263 * @param {number} entryIndex | |
| 264 * @return {!string} | 269 * @return {!string} |
| 265 */ | 270 */ |
| 266 entryColor: function(entryIndex) | 271 entryColor: function(entryIndex) |
| 267 { | 272 { |
| 268 var category = WebInspector.TimelineUIUtils.categoryForRecord(this._reco
rds[entryIndex]); | 273 var category = WebInspector.TimelineUIUtils.categoryForRecord(this._reco
rds[entryIndex]); |
| 269 return this._isSelfSegment[entryIndex] ? category.fillColorStop1 : categ
ory.backgroundColor; | 274 return this._isSelfSegment[entryIndex] ? category.fillColorStop1 : categ
ory.backgroundColor; |
| 270 }, | 275 }, |
| 271 | 276 |
| 272 /** | 277 /** |
| 278 * @param {number} entryIndex |
| 279 * @return {!{startTimeOffset: number, endTimeOffset: number}} |
| 280 */ |
| 281 highlightTimeRange: function(entryIndex) |
| 282 { |
| 283 var record = this._records[entryIndex]; |
| 284 return { |
| 285 startTimeOffset: record.startTime - this._zeroTime, |
| 286 endTimeOffset: record.endTime - this._zeroTime |
| 287 }; |
| 288 }, |
| 289 |
| 290 /** |
| 273 * @param {number} entryIndex | 291 * @param {number} entryIndex |
| 274 * @return {!string} | 292 * @return {!string} |
| 275 */ | 293 */ |
| 276 textColor: function(entryIndex) | 294 textColor: function(entryIndex) |
| 277 { | 295 { |
| 278 return "white"; | 296 return "white"; |
| 279 } | 297 } |
| 280 } | 298 } |
| 281 | 299 |
| 282 /** | 300 /** |
| 283 * @constructor | 301 * @constructor |
| 284 * @extends {WebInspector.View} | 302 * @extends {WebInspector.View} |
| 285 * @implements {WebInspector.TimelineModeView} | 303 * @implements {WebInspector.TimelineModeView} |
| 286 * @implements {WebInspector.TimeRangeController} | 304 * @implements {WebInspector.FlameChartDelegate} |
| 287 * @param {!WebInspector.TimelineModeViewDelegate} delegate | 305 * @param {!WebInspector.TimelineModeViewDelegate} delegate |
| 288 * @param {!WebInspector.TimelineModel} model | 306 * @param {!WebInspector.TimelineModel} model |
| 289 * @param {!WebInspector.TimelineFrameModel} frameModel | 307 * @param {!WebInspector.TimelineFrameModel} frameModel |
| 290 * @param {boolean} mainThread | 308 * @param {boolean} mainThread |
| 291 */ | 309 */ |
| 292 WebInspector.TimelineFlameChart = function(delegate, model, frameModel, mainThre
ad) | 310 WebInspector.TimelineFlameChart = function(delegate, model, frameModel, mainThre
ad) |
| 293 { | 311 { |
| 294 WebInspector.View.call(this); | 312 WebInspector.View.call(this); |
| 313 this.element.classList.add("timeline-flamechart"); |
| 314 this.registerRequiredCSS("flameChart.css"); |
| 295 this._delegate = delegate; | 315 this._delegate = delegate; |
| 296 this._model = model; | 316 this._model = model; |
| 297 this._dataProvider = new WebInspector.TimelineFlameChartDataProvider(model,
frameModel, mainThread); | 317 this._dataProvider = new WebInspector.TimelineFlameChartDataProvider(model,
frameModel, mainThread); |
| 298 this._mainView = new WebInspector.FlameChart.MainPane(this._dataProvider, th
is, true, true); | 318 this._mainView = new WebInspector.FlameChart.MainPane(this._dataProvider, th
is, true, true); |
| 299 this._mainView.show(this.element); | 319 this._mainView.show(this.element); |
| 300 this._model.addEventListener(WebInspector.TimelineModel.Events.RecordingStar
ted, this._onRecordingStarted, this); | 320 this._model.addEventListener(WebInspector.TimelineModel.Events.RecordingStar
ted, this._onRecordingStarted, this); |
| 321 this._mainView.addEventListener(WebInspector.FlameChart.Events.EntrySelected
, this._onEntrySelected, this); |
| 301 } | 322 } |
| 302 | 323 |
| 303 WebInspector.TimelineFlameChart.prototype = { | 324 WebInspector.TimelineFlameChart.prototype = { |
| 304 /** | 325 /** |
| 305 * @param {number} windowStartTime | 326 * @param {number} windowStartTime |
| 306 * @param {number} windowEndTime | 327 * @param {number} windowEndTime |
| 307 */ | 328 */ |
| 308 requestWindowTimes: function(windowStartTime, windowEndTime) | 329 requestWindowTimes: function(windowStartTime, windowEndTime) |
| 309 { | 330 { |
| 310 this._delegate.requestWindowTimes(windowStartTime, windowEndTime); | 331 this._delegate.requestWindowTimes(windowStartTime, windowEndTime); |
| 311 }, | 332 }, |
| 312 | 333 |
| 313 /** | 334 /** |
| 314 * @param {?RegExp} textFilter | 335 * @param {?RegExp} textFilter |
| 315 */ | 336 */ |
| 316 refreshRecords: function(textFilter) | 337 refreshRecords: function(textFilter) |
| 317 { | 338 { |
| 318 this._dataProvider.reset(); | 339 this._dataProvider.reset(); |
| 319 this._mainView._scheduleUpdate(); | 340 this._mainView.reset(); |
| 341 this.setSelectedRecord(this._selectedRecord); |
| 320 }, | 342 }, |
| 321 | 343 |
| 322 reset: function() | 344 reset: function() |
| 323 { | 345 { |
| 324 this._automaticallySizeWindow = true; | 346 this._automaticallySizeWindow = true; |
| 325 this._dataProvider.reset(); | 347 this._dataProvider.reset(); |
| 326 this._mainView.setWindowTimes(0, Infinity); | 348 this._mainView.setWindowTimes(0, Infinity); |
| 349 delete this._selectedRecord; |
| 327 }, | 350 }, |
| 328 | 351 |
| 329 _onRecordingStarted: function() | 352 _onRecordingStarted: function() |
| 330 { | 353 { |
| 331 this._automaticallySizeWindow = true; | 354 this._automaticallySizeWindow = true; |
| 332 }, | 355 }, |
| 333 | 356 |
| 334 /** | 357 /** |
| 335 * @param {!WebInspector.TimelineModel.Record} record | 358 * @param {!WebInspector.TimelineModel.Record} record |
| 336 */ | 359 */ |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 382 */ | 405 */ |
| 383 highlightSearchResult: function(record, regex, selectRecord) | 406 highlightSearchResult: function(record, regex, selectRecord) |
| 384 { | 407 { |
| 385 }, | 408 }, |
| 386 | 409 |
| 387 /** | 410 /** |
| 388 * @param {?WebInspector.TimelineModel.Record} record | 411 * @param {?WebInspector.TimelineModel.Record} record |
| 389 */ | 412 */ |
| 390 setSelectedRecord: function(record) | 413 setSelectedRecord: function(record) |
| 391 { | 414 { |
| 415 this._selectedRecord = record; |
| 416 var entryRecords = this._dataProvider._records; |
| 417 for (var entryIndex = 0; entryIndex < entryRecords.length; ++entryIndex)
{ |
| 418 if (entryRecords[entryIndex] === record) { |
| 419 this._mainView.setSelectedEntry(entryIndex); |
| 420 return; |
| 421 } |
| 422 } |
| 423 this._mainView.setSelectedEntry(-1); |
| 424 if (this._selectedElement) { |
| 425 this._selectedElement.remove(); |
| 426 delete this._selectedElement; |
| 427 } |
| 428 }, |
| 429 |
| 430 /** |
| 431 * @param {!WebInspector.Event} event |
| 432 */ |
| 433 _onEntrySelected: function(event) |
| 434 { |
| 435 var entryIndex = event.data; |
| 436 var record = this._dataProvider._records[entryIndex]; |
| 437 this._delegate.selectRecord(record); |
| 392 }, | 438 }, |
| 393 | 439 |
| 394 __proto__: WebInspector.View.prototype | 440 __proto__: WebInspector.View.prototype |
| 395 } | 441 } |
| OLD | NEW |