OLD | NEW |
1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 5 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
6 // for details. All rights reserved. Use of this source code is governed by a | 6 // for details. All rights reserved. Use of this source code is governed by a |
7 // BSD-style license that can be found in the LICENSE file. | 7 // BSD-style license that can be found in the LICENSE file. |
8 | 8 |
9 import 'dart:async'; | 9 import 'dart:async'; |
10 import 'dart:html'; | 10 import 'dart:html'; |
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
133 break; | 133 break; |
134 case M.HeapSnapshotLoadingStatus.loaded: | 134 case M.HeapSnapshotLoadingStatus.loaded: |
135 content.addAll(_createReport()); | 135 content.addAll(_createReport()); |
136 break; | 136 break; |
137 } | 137 } |
138 children = content; | 138 children = content; |
139 } | 139 } |
140 | 140 |
141 Future _refresh() async { | 141 Future _refresh() async { |
142 _progress = null; | 142 _progress = null; |
143 _progressStream = _snapshots.get(isolate, roots: _roots, gc: true); | 143 _progressStream = _snapshots.get(isolate, |
| 144 roots: _roots, |
| 145 gc: true); |
144 _r.dirty(); | 146 _r.dirty(); |
145 _progressStream.listen((e) { | 147 _progressStream.listen((e) { |
146 _progress = e.progress; | 148 _progress = e.progress; |
147 _r.dirty(); | 149 _r.dirty(); |
148 }); | 150 }); |
149 _progress = (await _progressStream.first).progress; | 151 _progress = (await _progressStream.first).progress; |
150 _r.dirty(); | 152 _r.dirty(); |
151 if (M.isHeapSnapshotProgressRunning(_progress.status)) { | 153 if (M.isHeapSnapshotProgressRunning(_progress.status)) { |
152 _progress = (await _progressStream.last).progress; | 154 _progress = (await _progressStream.last).progress; |
153 _snapshot = _progress.snapshot; | 155 _snapshot = _progress.snapshot; |
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
272 'that would be freed if the object became garbage.'; | 274 'that would be freed if the object became garbage.'; |
273 report.addAll([ | 275 report.addAll([ |
274 new DivElement() | 276 new DivElement() |
275 ..classes = ['content-centered-big', 'explanation'] | 277 ..classes = ['content-centered-big', 'explanation'] |
276 ..text = text | 278 ..text = text |
277 ..title = text, | 279 ..title = text, |
278 _tree | 280 _tree |
279 ]); | 281 ]); |
280 break; | 282 break; |
281 case HeapSnapshotTreeMode.mergedDominatorTree: | 283 case HeapSnapshotTreeMode.mergedDominatorTree: |
282 _tree = new VirtualTreeElement(_createMergedDominator, | 284 _tree = new VirtualTreeElement( |
283 _updateMergedDominator, _getChildrenMergedDominator, | 285 _createMergedDominator, _updateMergedDominator, |
| 286 _getChildrenMergedDominator, |
284 items: _getChildrenMergedDominator(_snapshot.mergedDominatorTree), | 287 items: _getChildrenMergedDominator(_snapshot.mergedDominatorTree), |
285 queue: _r.queue); | 288 queue: _r.queue); |
286 _tree.expand(_snapshot.mergedDominatorTree); | 289 _tree.expand(_snapshot.mergedDominatorTree); |
287 final text = 'A heap dominator tree, where siblings with the same class' | 290 final text = 'A heap dominator tree, where siblings with the same class' |
288 ' have been merged into a single node.'; | 291 ' have been merged into a single node.'; |
289 report.addAll([ | 292 report.addAll([ |
290 new DivElement() | 293 new DivElement() |
291 ..classes = ['content-centered-big', 'explanation'] | 294 ..classes = ['content-centered-big', 'explanation'] |
292 ..text = text | 295 ..text = text |
293 ..title = text, | 296 ..title = text, |
294 _tree | 297 _tree |
295 ]); | 298 ]); |
296 break; | 299 break; |
297 case HeapSnapshotTreeMode.groupByClass: | 300 case HeapSnapshotTreeMode.groupByClass: |
298 final items = _snapshot.classReferences.toList(); | 301 final items = _snapshot.classReferences.toList(); |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
366 static const int kMaxChildren = 100; | 369 static const int kMaxChildren = 100; |
367 static const int kMinRetainedSize = 4096; | 370 static const int kMinRetainedSize = 4096; |
368 | 371 |
369 static _getChildrenDominator(M.HeapSnapshotDominatorNode node) { | 372 static _getChildrenDominator(M.HeapSnapshotDominatorNode node) { |
370 final list = node.children.toList(); | 373 final list = node.children.toList(); |
371 list.sort((a, b) => b.retainedSize - a.retainedSize); | 374 list.sort((a, b) => b.retainedSize - a.retainedSize); |
372 return list | 375 return list |
373 .where((child) => child.retainedSize >= kMinRetainedSize) | 376 .where((child) => child.retainedSize >= kMinRetainedSize) |
374 .take(kMaxChildren); | 377 .take(kMaxChildren); |
375 } | 378 } |
376 | |
377 static _getChildrenMergedDominator(M.HeapSnapshotMergedDominatorNode node) { | 379 static _getChildrenMergedDominator(M.HeapSnapshotMergedDominatorNode node) { |
378 final list = node.children.toList(); | 380 final list = node.children.toList(); |
379 list.sort((a, b) => b.retainedSize - a.retainedSize); | 381 list.sort((a, b) => b.retainedSize - a.retainedSize); |
380 return list | 382 return list |
381 .where((child) => child.retainedSize >= kMinRetainedSize) | 383 .where((child) => child.retainedSize >= kMinRetainedSize) |
382 .take(kMaxChildren); | 384 .take(kMaxChildren); |
383 } | 385 } |
384 | 386 |
385 static _getChildrenGroup(item) { | 387 static _getChildrenGroup(item) { |
386 if (item is M.HeapSnapshotClassReferences) { | 388 if (item is M.HeapSnapshotClassReferences) { |
(...skipping 18 matching lines...) Expand all Loading... |
405 element.children[3].text = | 407 element.children[3].text = |
406 Utils.formatPercentNormalized(node.retainedSize * 1.0 / _snapshot.size); | 408 Utils.formatPercentNormalized(node.retainedSize * 1.0 / _snapshot.size); |
407 final wrapper = new SpanElement() | 409 final wrapper = new SpanElement() |
408 ..classes = ['name'] | 410 ..classes = ['name'] |
409 ..text = 'Loading...'; | 411 ..text = 'Loading...'; |
410 element.children[4] = wrapper; | 412 element.children[4] = wrapper; |
411 if (node.isStack) { | 413 if (node.isStack) { |
412 wrapper | 414 wrapper |
413 ..text = '' | 415 ..text = '' |
414 ..children = [ | 416 ..children = [ |
415 new AnchorElement(href: Uris.debugger(isolate))..text = 'stack frames' | 417 new AnchorElement(href: Uris.debugger(isolate)) |
| 418 ..text = 'stack frames' |
416 ]; | 419 ]; |
417 } else { | 420 } else { |
418 node.object.then((object) { | 421 node.object.then((object) { |
419 wrapper | 422 wrapper |
420 ..text = '' | 423 ..text = '' |
421 ..children = [anyRef(_isolate, object, _instances, queue: _r.queue)]; | 424 ..children = [anyRef(_isolate, object, _instances, queue: _r.queue)]; |
422 }); | 425 }); |
423 } | 426 } |
424 } | 427 } |
425 | 428 |
426 void _updateMergedDominator( | 429 void _updateMergedDominator( |
427 HtmlElement element, M.HeapSnapshotMergedDominatorNode node, int depth) { | 430 HtmlElement element, M.HeapSnapshotMergedDominatorNode node, int depth) { |
428 element.children[0].text = Utils.formatSize(node.retainedSize); | 431 element.children[0].text = Utils.formatSize(node.retainedSize); |
429 _updateLines(element.children[1].children, depth); | 432 _updateLines(element.children[1].children, depth); |
430 if (_getChildrenMergedDominator(node).isNotEmpty) { | 433 if (_getChildrenMergedDominator(node).isNotEmpty) { |
431 element.children[2].text = _tree.isExpanded(node) ? '▼' : '►'; | 434 element.children[2].text = _tree.isExpanded(node) ? '▼' : '►'; |
432 } else { | 435 } else { |
433 element.children[2].text = ''; | 436 element.children[2].text = ''; |
434 } | 437 } |
435 element.children[3].text = | 438 element.children[3].text = |
436 Utils.formatPercentNormalized(node.retainedSize * 1.0 / _snapshot.size); | 439 Utils.formatPercentNormalized(node.retainedSize * 1.0 / _snapshot.size); |
437 final wrapper = new SpanElement() | 440 final wrapper = new SpanElement() |
438 ..classes = ['name'] | 441 ..classes = ['name'] |
439 ..text = 'Loading...'; | 442 ..text = 'Loading...'; |
440 element.children[4] = wrapper; | 443 element.children[4] = wrapper; |
441 if (node.isStack) { | 444 if (node.isStack) { |
442 wrapper | 445 wrapper |
443 ..text = '' | 446 ..text = '' |
444 ..children = [ | 447 ..children = [ |
445 new AnchorElement(href: Uris.debugger(isolate))..text = 'stack frames' | 448 new AnchorElement(href: Uris.debugger(isolate)) |
| 449 ..text = 'stack frames' |
446 ]; | 450 ]; |
447 } else { | 451 } else { |
448 node.klass.then((klass) { | 452 node.klass.then((klass) { |
449 wrapper | 453 wrapper |
450 ..text = '' | 454 ..text = '' |
451 ..children = [ | 455 ..children = [ |
452 new SpanElement()..text = '${node.instanceCount} instances of ', | 456 new SpanElement()..text = '${node.instanceCount} instances of ', |
453 anyRef(_isolate, klass, _instances, queue: _r.queue) | 457 anyRef(_isolate, klass, _instances, queue: _r.queue) |
454 ]; | 458 ]; |
455 }); | 459 }); |
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
566 value: modeToString(mode), | 570 value: modeToString(mode), |
567 selected: _mode == mode)..text = modeToString(mode); | 571 selected: _mode == mode)..text = modeToString(mode); |
568 }).toList(growable: false) | 572 }).toList(growable: false) |
569 ..onChange.listen((_) { | 573 ..onChange.listen((_) { |
570 _mode = HeapSnapshotTreeMode.values[s.selectedIndex]; | 574 _mode = HeapSnapshotTreeMode.values[s.selectedIndex]; |
571 _r.dirty(); | 575 _r.dirty(); |
572 }) | 576 }) |
573 ]; | 577 ]; |
574 } | 578 } |
575 } | 579 } |
OLD | NEW |