Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 /* | |
| 2 * Copyright 2014 The Chromium Authors. All rights reserved. | |
| 3 * Use of this source code is governed by a BSD-style license that can be | |
| 4 * found in the LICENSE file. | |
| 5 */ | |
| 6 | |
| 7 /** | |
| 8 * @constructor | |
| 9 * @implements {WebInspector.TimelineModeView} | |
| 10 * @implements {WebInspector.FlameChartDelegate} | |
| 11 * @extends {WebInspector.VBox} | |
| 12 * @param {!WebInspector.TimelineModeViewDelegate} delegate | |
| 13 * @param {!WebInspector.TracingModel} tracingModel | |
| 14 */ | |
| 15 WebInspector.TimelineTraceView = function(delegate, tracingModel) | |
| 16 { | |
| 17 WebInspector.VBox.call(this); | |
| 18 this._delegate = delegate; | |
| 19 this._tracingModel = tracingModel; | |
|
pfeldman
2014/03/26 20:37:12
unused?
caseq
2014/03/28 17:13:41
used now :-)
| |
| 20 this.element.classList.add("timeline-flamechart"); | |
| 21 this.registerRequiredCSS("flameChart.css"); | |
| 22 this._delegate = delegate; | |
| 23 this._model = tracingModel; | |
| 24 this._dataProvider = new WebInspector.TraceViewFlameChartDataProvider(tracin gModel); | |
| 25 this._mainView = new WebInspector.FlameChart.MainPane(this._dataProvider, th is, true, true); | |
| 26 this._mainView.show(this.element); | |
| 27 this._mainView.addEventListener(WebInspector.FlameChart.Events.EntrySelected , this._onEntrySelected, this); | |
| 28 } | |
| 29 | |
| 30 WebInspector.TimelineTraceView.prototype = { | |
| 31 /** | |
| 32 * @param {number} windowStartTime | |
| 33 * @param {number} windowEndTime | |
| 34 */ | |
| 35 requestWindowTimes: function(windowStartTime, windowEndTime) | |
| 36 { | |
| 37 this._delegate.requestWindowTimes(windowStartTime, windowEndTime); | |
| 38 }, | |
| 39 | |
| 40 wasShown: function() | |
| 41 { | |
| 42 this._mainView._scheduleUpdate(); | |
| 43 }, | |
| 44 | |
| 45 reset: function() | |
| 46 { | |
| 47 this._dataProvider.reset(); | |
| 48 this._mainView.setWindowTimes(0, Infinity); | |
| 49 }, | |
| 50 | |
| 51 /** | |
| 52 * @param {?RegExp} textFilter | |
| 53 */ | |
| 54 refreshRecords: function(textFilter) | |
| 55 { | |
| 56 this._dataProvider.reset(); | |
| 57 this._mainView._scheduleUpdate(); | |
| 58 }, | |
| 59 | |
| 60 /** | |
| 61 * @param {!WebInspector.TimelineModel.Record} record | |
| 62 */ | |
| 63 addRecord: function(record) {}, | |
| 64 | |
| 65 /** | |
| 66 * @param {?WebInspector.TimelineModel.Record} record | |
| 67 * @param {string=} regex | |
| 68 * @param {boolean=} selectRecord | |
| 69 */ | |
| 70 highlightSearchResult: function(record, regex, selectRecord) {}, | |
| 71 | |
| 72 /** | |
| 73 * @param {number} startTime | |
| 74 * @param {number} endTime | |
| 75 */ | |
| 76 setWindowTimes: function(startTime, endTime) | |
| 77 { | |
| 78 this._mainView.setWindowTimes(startTime, endTime); | |
|
pfeldman
2014/03/26 20:10:06
This does not work when applied.
caseq
2014/03/28 17:13:41
This requires https://codereview.chromium.org/2128
| |
| 79 }, | |
| 80 | |
| 81 /** | |
| 82 * @param {number} width | |
| 83 */ | |
| 84 setSidebarSize: function(width) {}, | |
| 85 | |
| 86 /** | |
| 87 * @param {?WebInspector.TimelineModel.Record} record | |
| 88 */ | |
| 89 setSelectedRecord: function(record) {}, | |
| 90 | |
| 91 /** | |
| 92 * @param {!WebInspector.Event} event | |
| 93 */ | |
| 94 _onEntrySelected: function(event) | |
| 95 { | |
| 96 }, | |
| 97 | |
| 98 __proto__: WebInspector.VBox.prototype | |
| 99 }; | |
| 100 | |
| 101 /** | |
| 102 * @constructor | |
| 103 * @implements {WebInspector.FlameChartDataProvider} | |
| 104 * @param {!WebInspector.TracingModel} model | |
| 105 */ | |
| 106 WebInspector.TraceViewFlameChartDataProvider = function(model) | |
| 107 { | |
| 108 WebInspector.FlameChartDataProvider.call(this); | |
| 109 this._model = model; | |
| 110 this._font = "bold 12px " + WebInspector.fontFamily(); | |
| 111 this._palette = new WebInspector.TraceViewPalette(); | |
| 112 } | |
| 113 | |
| 114 WebInspector.TraceViewFlameChartDataProvider.prototype = { | |
| 115 /** | |
| 116 * @return {number} | |
| 117 */ | |
| 118 barHeight: function() | |
| 119 { | |
| 120 return 20; | |
| 121 }, | |
| 122 | |
| 123 /** | |
| 124 * @return {number} | |
| 125 */ | |
| 126 textBaseline: function() | |
| 127 { | |
| 128 return 6; | |
| 129 }, | |
| 130 | |
| 131 /** | |
| 132 * @return {number} | |
| 133 */ | |
| 134 textPadding: function() | |
| 135 { | |
| 136 return 5; | |
| 137 }, | |
| 138 | |
| 139 /** | |
| 140 * @param {number} entryIndex | |
| 141 * @return {string} | |
| 142 */ | |
| 143 entryFont: function(entryIndex) | |
| 144 { | |
| 145 return this._font; | |
| 146 }, | |
| 147 | |
| 148 /** | |
| 149 * @param {number} entryIndex | |
| 150 * @return {?string} | |
| 151 */ | |
| 152 entryTitle: function(entryIndex) | |
| 153 { | |
| 154 return this._records[entryIndex].name; | |
| 155 }, | |
| 156 | |
| 157 /** | |
| 158 * @param {number} startTime | |
| 159 * @param {number} endTime | |
| 160 * @return {?Array.<number>} | |
| 161 */ | |
| 162 dividerOffsets: function(startTime, endTime) | |
| 163 { | |
| 164 return null; | |
| 165 }, | |
| 166 | |
| 167 reset: function() | |
| 168 { | |
| 169 this._timelineData = null; | |
| 170 /** @type {!Array.<!WebInspector.TracingModel.Event|!WebInspector.TraceV iewFlameChartDataProvider.FakeEventForDelimiter>} */ | |
| 171 this._records = []; | |
| 172 }, | |
| 173 | |
| 174 /** | |
| 175 * @return {!WebInspector.FlameChart.TimelineData} | |
| 176 */ | |
| 177 timelineData: function() | |
| 178 { | |
| 179 if (this._timelineData) | |
| 180 return this._timelineData; | |
| 181 | |
| 182 /** | |
| 183 * @type {?WebInspector.FlameChart.TimelineData} | |
| 184 */ | |
| 185 this._timelineData = { | |
| 186 entryLevels: [], | |
| 187 entryTotalTimes: [], | |
| 188 entryOffsets: [] | |
| 189 }; | |
| 190 | |
| 191 this._currentLevel = 0; | |
| 192 this._zeroTime = this._model.minimumRecordTime() || 0; | |
|
pfeldman
2014/03/26 20:37:12
This is going to be relative to the CPU clock, whi
caseq
2014/03/28 17:13:41
With https://codereview.chromium.org/212893002/, t
| |
| 193 this._timeSpan = Math.max((this._model.maximumRecordTime() || 0) - this. _zeroTime, 1000000); | |
| 194 var processes = this._model.sortedProcesses(); | |
| 195 for (var i = 0; i < processes.length; ++i) { | |
| 196 this._appendDelimiterRecord(processes[i].name()); | |
| 197 var threads = processes[i].sortedThreads(); | |
| 198 for (var j = 0; j < threads.length; ++j) { | |
| 199 this._appendDelimiterRecord(threads[j].name()); | |
| 200 var events = threads[j].events(); | |
| 201 for (var k = 0; k < events.length; ++k) { | |
| 202 if (events[k].duration) | |
| 203 this._appendRecord(events[k]); | |
| 204 } | |
| 205 this._currentLevel += threads[j].maxStackDepth(); | |
| 206 } | |
| 207 ++this._currentLevel; | |
| 208 } | |
| 209 return this._timelineData; | |
| 210 }, | |
| 211 | |
| 212 /** | |
| 213 * @return {number} | |
| 214 */ | |
| 215 zeroTime: function() | |
| 216 { | |
| 217 return this._toTimelineTime(this._zeroTime); | |
| 218 }, | |
| 219 | |
| 220 /** | |
| 221 * @return {number} | |
| 222 */ | |
| 223 totalTime: function() | |
| 224 { | |
| 225 return this._toTimelineTime(this._timeSpan); | |
| 226 }, | |
| 227 | |
| 228 /** | |
| 229 * @return {number} | |
| 230 */ | |
| 231 maxStackDepth: function() | |
| 232 { | |
| 233 return this._currentLevel; | |
| 234 }, | |
| 235 | |
| 236 /** | |
| 237 * @param {number} entryIndex | |
| 238 * @return {?Array.<!{title: string, text: string}>} | |
| 239 */ | |
| 240 prepareHighlightedEntryInfo: function(entryIndex) | |
| 241 { | |
| 242 return null; | |
| 243 }, | |
| 244 | |
| 245 /** | |
| 246 * @param {number} entryIndex | |
| 247 * @return {boolean} | |
| 248 */ | |
| 249 canJumpToEntry: function(entryIndex) | |
| 250 { | |
| 251 return false; | |
| 252 }, | |
| 253 | |
| 254 /** | |
| 255 * @param {number} entryIndex | |
| 256 * @return {!string} | |
| 257 */ | |
| 258 entryColor: function(entryIndex) | |
| 259 { | |
| 260 var record = this._records[entryIndex]; | |
| 261 if (record instanceof WebInspector.TraceViewFlameChartDataProvider.FakeE ventForDelimiter) | |
|
pfeldman
2014/03/26 20:10:06
instanceof is way too expensive for the case of 2M
caseq
2014/03/28 17:13:41
Fixed.
| |
| 262 return "#555"; | |
| 263 return this._palette.colorForString(this._records[entryIndex].name); | |
| 264 }, | |
| 265 | |
| 266 | |
| 267 /** | |
| 268 * @param {number} entryIndex | |
| 269 * @param {!CanvasRenderingContext2D} context | |
| 270 * @param {?string} text | |
| 271 * @param {number} barX | |
| 272 * @param {number} barY | |
| 273 * @param {number} barWidth | |
| 274 * @param {number} barHeight | |
| 275 * @param {function(number):number} offsetToPosition | |
| 276 * @return {boolean} | |
| 277 */ | |
| 278 decorateEntry: function(entryIndex, context, text, barX, barY, barWidth, bar Height, offsetToPosition) | |
| 279 { | |
| 280 return false; | |
| 281 }, | |
| 282 | |
| 283 /** | |
| 284 * @param {number} entryIndex | |
| 285 * @return {boolean} | |
| 286 */ | |
| 287 forceDecoration: function(entryIndex) | |
| 288 { | |
| 289 return false; | |
| 290 }, | |
| 291 | |
| 292 /** | |
| 293 * @param {number} entryIndex | |
| 294 * @return {?{startTimeOffset: number, endTimeOffset: number}} | |
| 295 */ | |
| 296 highlightTimeRange: function(entryIndex) | |
| 297 { | |
| 298 return null; | |
| 299 }, | |
| 300 | |
| 301 /** | |
| 302 * @return {number} | |
| 303 */ | |
| 304 paddingLeft: function() | |
| 305 { | |
| 306 return 0; | |
| 307 }, | |
| 308 | |
| 309 /** | |
| 310 * @param {number} entryIndex | |
| 311 * @return {!string} | |
| 312 */ | |
| 313 textColor: function(entryIndex) | |
| 314 { | |
| 315 return "white"; | |
| 316 }, | |
| 317 | |
| 318 /** | |
| 319 * @param {string} title | |
| 320 */ | |
| 321 _appendDelimiterRecord: function(title) | |
| 322 { | |
| 323 var record = new WebInspector.TraceViewFlameChartDataProvider.FakeEventF orDelimiter(this._zeroTime, this._timeSpan, title, 0); | |
| 324 this._appendRecord(record); | |
| 325 ++this._currentLevel; | |
| 326 }, | |
| 327 | |
| 328 /** | |
| 329 * @param {!WebInspector.TracingModel.Event|!WebInspector.TraceViewFlameChar tDataProvider.FakeEventForDelimiter} record | |
| 330 */ | |
| 331 _appendRecord: function(record) | |
| 332 { | |
| 333 var index = this._records.length; | |
| 334 this._records.push(record); | |
| 335 this._timelineData.entryLevels[index] = this._currentLevel + record.leve l; | |
| 336 this._timelineData.entryTotalTimes[index] = this._toTimelineTime(record. duration); | |
| 337 this._timelineData.entryOffsets[index] = this._toTimelineTime(record.sta rtTime - this._zeroTime); | |
| 338 }, | |
| 339 | |
| 340 /** | |
| 341 * @param {number} time | |
| 342 * @return {number} | |
| 343 */ | |
| 344 _toTimelineTime: function(time) | |
| 345 { | |
| 346 return time / 1000; | |
| 347 } | |
| 348 } | |
| 349 | |
| 350 /** | |
| 351 * @constructor | |
| 352 * @param {number} offset | |
| 353 * @param {number} duration | |
| 354 * @param {string} title | |
| 355 */ | |
| 356 WebInspector.TraceViewFlameChartDataProvider.FakeEventForDelimiter = function(of fset, duration, title, level) | |
| 357 { | |
| 358 this.startTime = offset; | |
| 359 this.duration = duration; | |
| 360 this.name = title; | |
| 361 this.level = level; | |
| 362 } | |
| 363 | |
| 364 // The below logic is shamelessly stolen from https://code.google.com/p/trace-vi ewer/source/browse/trunk/trace_viewer/tracing/color_scheme.js | |
| 365 | |
| 366 /** | |
| 367 * @constructor | |
| 368 */ | |
| 369 WebInspector.TraceViewPalette = function() | |
| 370 { | |
| 371 this._palette = WebInspector.TraceViewPalette._paletteBase.map(WebInspector. TraceViewPalette._rgbToString); | |
| 372 } | |
| 373 | |
| 374 WebInspector.TraceViewPalette._paletteBase = [ | |
| 375 {r: 138, g: 113, b: 152}, | |
|
pfeldman
2014/03/26 20:10:06
See WebInspector.Color.Nicknames for how we define
caseq
2014/03/28 17:13:41
Changed objects to arrays, though I think we do no
| |
| 376 {r: 175, g: 112, b: 133}, | |
| 377 {r: 127, g: 135, b: 225}, | |
| 378 {r: 93, g: 81, b: 137}, | |
| 379 {r: 116, g: 143, b: 119}, | |
| 380 {r: 178, g: 214, b: 122}, | |
| 381 {r: 87, g: 109, b: 147}, | |
| 382 {r: 119, g: 155, b: 95}, | |
| 383 {r: 114, g: 180, b: 160}, | |
| 384 {r: 132, g: 85, b: 103}, | |
| 385 {r: 157, g: 210, b: 150}, | |
| 386 {r: 148, g: 94, b: 86}, | |
| 387 {r: 164, g: 108, b: 138}, | |
| 388 {r: 139, g: 191, b: 150}, | |
| 389 {r: 110, g: 99, b: 145}, | |
| 390 {r: 80, g: 129, b: 109}, | |
| 391 {r: 125, g: 140, b: 149}, | |
| 392 {r: 93, g: 124, b: 132}, | |
| 393 {r: 140, g: 85, b: 140}, | |
| 394 {r: 104, g: 163, b: 162}, | |
| 395 {r: 132, g: 141, b: 178}, | |
| 396 {r: 131, g: 105, b: 147}, | |
| 397 {r: 135, g: 183, b: 98}, | |
| 398 {r: 152, g: 134, b: 177}, | |
| 399 {r: 141, g: 188, b: 141}, | |
| 400 {r: 133, g: 160, b: 210}, | |
| 401 {r: 126, g: 186, b: 148}, | |
| 402 {r: 112, g: 198, b: 205}, | |
| 403 {r: 180, g: 122, b: 195}, | |
| 404 {r: 203, g: 144, b: 152} | |
| 405 ]; | |
| 406 | |
| 407 /** | |
| 408 * @param {string} string | |
| 409 * @return {number} | |
| 410 */ | |
| 411 WebInspector.TraceViewPalette._stringHash = function(string) | |
| 412 { | |
| 413 var hash = 0; | |
| 414 for (var i = 0; i < string.length; ++i) | |
| 415 hash = (hash + 37 * hash + 11 * string.charCodeAt(i)) % 0xFFFFFFFF; | |
| 416 return hash; | |
| 417 } | |
| 418 | |
| 419 /** | |
| 420 * @param {!{r: number, g:number, b:number}} rgb | |
| 421 * @return {string} | |
| 422 */ | |
| 423 WebInspector.TraceViewPalette._rgbToString = function(rgb) | |
| 424 { | |
| 425 return "rgb(" + rgb.r + "," + rgb.g + "," + rgb.b +")"; | |
| 426 } | |
| 427 | |
| 428 WebInspector.TraceViewPalette.prototype = { | |
| 429 /** | |
| 430 * @param {string} string | |
| 431 * @return {string} | |
| 432 */ | |
| 433 colorForString: function(string) | |
| 434 { | |
| 435 var hash = WebInspector.TraceViewPalette._stringHash(string); | |
| 436 return this._palette[hash % this._palette.length]; | |
| 437 } | |
| 438 }; | |
| OLD | NEW |