| 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 248 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 259 report.add(_tree); | 259 report.add(_tree); |
| 260 break; | 260 break; |
| 261 default: | 261 default: |
| 262 break; | 262 break; |
| 263 } | 263 } |
| 264 return report; | 264 return report; |
| 265 } | 265 } |
| 266 | 266 |
| 267 static Element _createDominator(toggle) { | 267 static Element _createDominator(toggle) { |
| 268 return new DivElement() | 268 return new DivElement() |
| 269 ..classes = const ['tree-item'] | 269 ..classes = ['tree-item'] |
| 270 ..children = [ | 270 ..children = [ |
| 271 new SpanElement()..classes = const ['size'] | 271 new SpanElement()..classes = ['size'] |
| 272 ..title = 'retained size', | 272 ..title = 'retained size', |
| 273 new SpanElement()..classes = const ['lines'], | 273 new SpanElement()..classes = ['lines'], |
| 274 new ButtonElement()..classes = const ['expander'] | 274 new ButtonElement()..classes = ['expander'] |
| 275 ..onClick.listen((_) => toggle(autoToggleSingleChildNodes: true)), | 275 ..onClick.listen((_) => toggle(autoToggleSingleChildNodes: true)), |
| 276 new SpanElement()..classes = const ['percentage'] | 276 new SpanElement()..classes = ['percentage'] |
| 277 ..title = 'percentage of heap being retained', | 277 ..title = 'percentage of heap being retained', |
| 278 new SpanElement()..classes = const ['name'] | 278 new SpanElement()..classes = ['name'] |
| 279 ]; | 279 ]; |
| 280 } | 280 } |
| 281 | 281 |
| 282 static Element _createGroup(toggle) { | 282 static Element _createGroup(toggle) { |
| 283 return new DivElement() | 283 return new DivElement() |
| 284 ..classes = const ['tree-item'] | 284 ..classes = ['tree-item'] |
| 285 ..children = [ | 285 ..children = [ |
| 286 new SpanElement()..classes = const ['size'] | 286 new SpanElement()..classes = ['size'] |
| 287 ..title = 'shallow size', | 287 ..title = 'shallow size', |
| 288 new SpanElement()..classes = const ['lines'], | 288 new SpanElement()..classes = ['lines'], |
| 289 new ButtonElement()..classes = const ['expander'] | 289 new ButtonElement()..classes = ['expander'] |
| 290 ..onClick.listen((_) => toggle(autoToggleSingleChildNodes: true)), | 290 ..onClick.listen((_) => toggle(autoToggleSingleChildNodes: true)), |
| 291 new SpanElement()..classes = const ['count'] | 291 new SpanElement()..classes = ['count'] |
| 292 ..title = 'shallow size', | 292 ..title = 'shallow size', |
| 293 new SpanElement()..classes = const ['name'] | 293 new SpanElement()..classes = ['name'] |
| 294 ]; | 294 ]; |
| 295 } | 295 } |
| 296 | 296 |
| 297 static const int kMaxChildren = 100; | 297 static const int kMaxChildren = 100; |
| 298 static const int kMinRetainedSize = 4096; | 298 static const int kMinRetainedSize = 4096; |
| 299 | 299 |
| 300 static _getChildrenDominator(M.HeapSnapshotDominatorNode node) { | 300 static _getChildrenDominator(M.HeapSnapshotDominatorNode node) { |
| 301 final list = node.children.toList(); | 301 final list = node.children.toList(); |
| 302 list.sort((a, b) => b.retainedSize - a.retainedSize); | 302 list.sort((a, b) => b.retainedSize - a.retainedSize); |
| 303 return list.where((child) => child.retainedSize >= kMinRetainedSize) | 303 return list.where((child) => child.retainedSize >= kMinRetainedSize) |
| (...skipping 15 matching lines...) Expand all Loading... |
| 319 int depth) { | 319 int depth) { |
| 320 element.children[0].text = Utils.formatSize(node.retainedSize); | 320 element.children[0].text = Utils.formatSize(node.retainedSize); |
| 321 _updateLines(element.children[1].children, depth); | 321 _updateLines(element.children[1].children, depth); |
| 322 if (_getChildrenDominator(node).isNotEmpty) { | 322 if (_getChildrenDominator(node).isNotEmpty) { |
| 323 element.children[2].text = _tree.isExpanded(node) ? '▼' : '►'; | 323 element.children[2].text = _tree.isExpanded(node) ? '▼' : '►'; |
| 324 } else { | 324 } else { |
| 325 element.children[2].text = ''; | 325 element.children[2].text = ''; |
| 326 } | 326 } |
| 327 element.children[3].text = Utils.formatPercentNormalized( | 327 element.children[3].text = Utils.formatPercentNormalized( |
| 328 node.retainedSize * 1.0 / _snapshot.size); | 328 node.retainedSize * 1.0 / _snapshot.size); |
| 329 final wrapper = new SpanElement()..classes = const ['name'] | 329 final wrapper = new SpanElement()..classes = ['name'] |
| 330 ..text = 'Loading...'; | 330 ..text = 'Loading...'; |
| 331 element.children[4] = wrapper; | 331 element.children[4] = wrapper; |
| 332 node.object.then((object) { | 332 node.object.then((object) { |
| 333 wrapper..text = '' | 333 wrapper..text = '' |
| 334 ..children = [anyRef(_isolate, object, _instances, queue: _r.queue)]; | 334 ..children = [anyRef(_isolate, object, _instances, queue: _r.queue)]; |
| 335 }); | 335 }); |
| 336 } | 336 } |
| 337 | 337 |
| 338 void _updateGroup(HtmlElement element, item, int depth) { | 338 void _updateGroup(HtmlElement element, item, int depth) { |
| 339 _updateLines(element.children[1].children, depth); | 339 _updateLines(element.children[1].children, depth); |
| 340 if (item is M.HeapSnapshotClassReferences) { | 340 if (item is M.HeapSnapshotClassReferences) { |
| 341 element.children[0].text = Utils.formatSize(item.shallowSize); | 341 element.children[0].text = Utils.formatSize(item.shallowSize); |
| 342 element.children[2].text = _tree.isExpanded(item) ? '▼' : '►'; | 342 element.children[2].text = _tree.isExpanded(item) ? '▼' : '►'; |
| 343 element.children[3].text = '${item.instances} instances of '; | 343 element.children[3].text = '${item.instances} instances of '; |
| 344 element.children[4] = new ClassRefElement(_isolate, item.clazz, | 344 element.children[4] = new ClassRefElement(_isolate, item.clazz, |
| 345 queue: _r.queue)..classes = const ['name']; | 345 queue: _r.queue)..classes = ['name']; |
| 346 } else if (item is Iterable) { | 346 } else if (item is Iterable) { |
| 347 element.children[0].text = ''; | 347 element.children[0].text = ''; |
| 348 if (item.isNotEmpty) { | 348 if (item.isNotEmpty) { |
| 349 element.children[2].text = _tree.isExpanded(item) ? '▼' : '►'; | 349 element.children[2].text = _tree.isExpanded(item) ? '▼' : '►'; |
| 350 } else { | 350 } else { |
| 351 element.children[2].text = ''; | 351 element.children[2].text = ''; |
| 352 } | 352 } |
| 353 element.children[3].text = ''; | 353 element.children[3].text = ''; |
| 354 if (item is Iterable<M.HeapSnapshotClassInbound>) { | 354 if (item is Iterable<M.HeapSnapshotClassInbound>) { |
| 355 element.children[4] = new SpanElement()..classes = const ['name'] | 355 element.children[4] = new SpanElement()..classes = ['name'] |
| 356 ..text = '${item.length} Incoming references'; | 356 ..text = '${item.length} Incoming references'; |
| 357 } else { | 357 } else { |
| 358 element.children[4] = new SpanElement()..classes = const ['name'] | 358 element.children[4] = new SpanElement()..classes = ['name'] |
| 359 ..text = '${item.length} Outgoing references'; | 359 ..text = '${item.length} Outgoing references'; |
| 360 } | 360 } |
| 361 } else { | 361 } else { |
| 362 element.children[0].text = ''; | 362 element.children[0].text = ''; |
| 363 element.children[2].text = ''; | 363 element.children[2].text = ''; |
| 364 element.children[3].text = ''; | 364 element.children[3].text = ''; |
| 365 element.children[4] = new SpanElement()..classes = const ['name']; | 365 element.children[4] = new SpanElement()..classes = ['name']; |
| 366 if (item is M.HeapSnapshotClassInbound){ | 366 if (item is M.HeapSnapshotClassInbound){ |
| 367 element.children[3].text = | 367 element.children[3].text = |
| 368 '${item.count} references from instances of '; | 368 '${item.count} references from instances of '; |
| 369 element.children[4].children = [ | 369 element.children[4].children = [ |
| 370 new ClassRefElement(_isolate, item.source, | 370 new ClassRefElement(_isolate, item.source, |
| 371 queue: _r.queue) | 371 queue: _r.queue) |
| 372 ]; | 372 ]; |
| 373 } else if (item is M.HeapSnapshotClassOutbound){ | 373 } else if (item is M.HeapSnapshotClassOutbound){ |
| 374 element.children[3]..text = '${item.count} references to instances of '; | 374 element.children[3]..text = '${item.count} references to instances of '; |
| 375 element.children[4].children = [ | 375 element.children[4].children = [ |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 408 selected: _mode == mode) | 408 selected: _mode == mode) |
| 409 ..text = modeToString(mode); | 409 ..text = modeToString(mode); |
| 410 }).toList(growable: false) | 410 }).toList(growable: false) |
| 411 ..onChange.listen((_) { | 411 ..onChange.listen((_) { |
| 412 _mode = HeapSnapshotTreeMode.values[s.selectedIndex]; | 412 _mode = HeapSnapshotTreeMode.values[s.selectedIndex]; |
| 413 _r.dirty(); | 413 _r.dirty(); |
| 414 }) | 414 }) |
| 415 ]; | 415 ]; |
| 416 } | 416 } |
| 417 } | 417 } |
| OLD | NEW |