OLD | NEW |
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, 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 library isolate_view_element; | 5 library isolate_view_element; |
6 | 6 |
7 import 'dart:async'; | 7 import 'dart:async'; |
8 import 'dart:html'; | 8 import 'dart:html'; |
9 import 'package:observatory/models.dart' as M; | 9 import 'package:observatory/models.dart' as M; |
10 import 'package:observatory/src/elements/curly_block.dart'; | 10 import 'package:observatory/src/elements/curly_block.dart'; |
11 import 'package:observatory/src/elements/eval_box.dart'; | 11 import 'package:observatory/src/elements/eval_box.dart'; |
12 import 'package:observatory/src/elements/function_ref.dart'; | 12 import 'package:observatory/src/elements/function_ref.dart'; |
13 import 'package:observatory/src/elements/helpers/nav_bar.dart'; | 13 import 'package:observatory/src/elements/helpers/nav_bar.dart'; |
14 import 'package:observatory/src/elements/helpers/rendering_scheduler.dart'; | 14 import 'package:observatory/src/elements/helpers/rendering_scheduler.dart'; |
15 import 'package:observatory/src/elements/helpers/tag.dart'; | 15 import 'package:observatory/src/elements/helpers/tag.dart'; |
16 import 'package:observatory/src/elements/helpers/uris.dart'; | 16 import 'package:observatory/src/elements/helpers/uris.dart'; |
17 import 'package:observatory/src/elements/isolate/location.dart'; | 17 import 'package:observatory/src/elements/isolate/location.dart'; |
18 import 'package:observatory/src/elements/isolate/run_state.dart'; | 18 import 'package:observatory/src/elements/isolate/run_state.dart'; |
19 import 'package:observatory/src/elements/isolate/shared_summary.dart'; | 19 import 'package:observatory/src/elements/isolate/shared_summary.dart'; |
20 import 'package:observatory/src/elements/library_ref.dart'; | 20 import 'package:observatory/src/elements/library_ref.dart'; |
21 import 'package:observatory/src/elements/nav/class_menu.dart'; | 21 import 'package:observatory/src/elements/nav/class_menu.dart'; |
22 import 'package:observatory/src/elements/nav/isolate_menu.dart'; | 22 import 'package:observatory/src/elements/nav/isolate_menu.dart'; |
23 import 'package:observatory/src/elements/nav/notify.dart'; | 23 import 'package:observatory/src/elements/nav/notify.dart'; |
24 import 'package:observatory/src/elements/nav/refresh.dart'; | 24 import 'package:observatory/src/elements/nav/refresh.dart'; |
25 import 'package:observatory/src/elements/nav/top_menu.dart'; | 25 import 'package:observatory/src/elements/nav/top_menu.dart'; |
26 import 'package:observatory/src/elements/nav/vm_menu.dart'; | 26 import 'package:observatory/src/elements/nav/vm_menu.dart'; |
27 import 'package:observatory/src/elements/script_inset.dart'; | 27 import 'package:observatory/src/elements/script_inset.dart'; |
28 import 'package:observatory/src/elements/source_inset.dart'; | 28 import 'package:observatory/src/elements/source_inset.dart'; |
29 import 'package:observatory/src/elements/view_footer.dart'; | 29 import 'package:observatory/src/elements/view_footer.dart'; |
| 30 import 'package:observatory/utils.dart'; |
30 | 31 |
31 class IsolateViewElement extends HtmlElement implements Renderable { | 32 class IsolateViewElement extends HtmlElement implements Renderable { |
32 static const tag = | 33 static const tag = |
33 const Tag<IsolateViewElement>('isolate-view', dependencies: const [ | 34 const Tag<IsolateViewElement>('isolate-view', dependencies: const [ |
34 CurlyBlockElement.tag, | 35 CurlyBlockElement.tag, |
35 EvalBoxElement.tag, | 36 EvalBoxElement.tag, |
36 FunctionRefElement.tag, | 37 FunctionRefElement.tag, |
37 IsolateLocationElement.tag, | 38 IsolateLocationElement.tag, |
38 IsolateRunStateElement.tag, | 39 IsolateRunStateElement.tag, |
39 IsolateSharedSummaryElement.tag, | 40 IsolateSharedSummaryElement.tag, |
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
126 detached() { | 127 detached() { |
127 super.detached(); | 128 super.detached(); |
128 _r.disable(notify: true); | 129 _r.disable(notify: true); |
129 children = []; | 130 children = []; |
130 _subscription.cancel(); | 131 _subscription.cancel(); |
131 } | 132 } |
132 | 133 |
133 void render() { | 134 void render() { |
134 final uptime = new DateTime.now().difference(_isolate.startTime); | 135 final uptime = new DateTime.now().difference(_isolate.startTime); |
135 final libraries = _isolate.libraries.toList(); | 136 final libraries = _isolate.libraries.toList(); |
| 137 final List<Thread> threads = _isolate.threads; |
136 children = [ | 138 children = [ |
137 navBar([ | 139 navBar([ |
138 new NavTopMenuElement(queue: _r.queue), | 140 new NavTopMenuElement(queue: _r.queue), |
139 new NavVMMenuElement(_vm, _events, queue: _r.queue), | 141 new NavVMMenuElement(_vm, _events, queue: _r.queue), |
140 new NavIsolateMenuElement(_isolate, _events, queue: _r.queue), | 142 new NavIsolateMenuElement(_isolate, _events, queue: _r.queue), |
141 new NavRefreshElement(label: 'Reload Source', queue: _r.queue) | 143 new NavRefreshElement(label: 'Reload Source', queue: _r.queue) |
142 ..onRefresh.listen((e) async { | 144 ..onRefresh.listen((e) async { |
143 e.element.disabled = true; | 145 e.element.disabled = true; |
144 await _isolates.reloadSources(_isolate); | 146 await _isolates.reloadSources(_isolate); |
145 _r.dirty(); | 147 _r.dirty(); |
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
287 ..children = [ | 289 ..children = [ |
288 new CurlyBlockElement(queue: _r.queue) | 290 new CurlyBlockElement(queue: _r.queue) |
289 ..content = libraries | 291 ..content = libraries |
290 .map((l) => new DivElement() | 292 .map((l) => new DivElement() |
291 ..children = [ | 293 ..children = [ |
292 new LibraryRefElement(_isolate, l, | 294 new LibraryRefElement(_isolate, l, |
293 queue: _r.queue) | 295 queue: _r.queue) |
294 ]) | 296 ]) |
295 .toList() | 297 .toList() |
296 ] | 298 ] |
| 299 ], |
| 300 new DivElement() |
| 301 ..classes = ['memberItem'] |
| 302 ..children = [ |
| 303 new DivElement() |
| 304 ..classes = ['memberName'] |
| 305 ..text = 'threads (${threads.length})', |
| 306 new DivElement() |
| 307 ..classes = ['memberValue'] |
| 308 ..children = [ |
| 309 new CurlyBlockElement(queue: _r.queue) |
| 310 ..content = threads |
| 311 .map(_populateThreadInfo) |
| 312 ] |
297 ] | 313 ] |
298 ], | 314 ], |
299 new HRElement(), | 315 new HRElement(), |
300 new EvalBoxElement(_isolate, _isolate.rootLibrary, _instances, _eval, | 316 new EvalBoxElement(_isolate, _isolate.rootLibrary, _instances, _eval, |
301 queue: _r.queue), | 317 queue: _r.queue), |
302 new DivElement() | 318 new DivElement() |
303 ..children = _rootScript != null | 319 ..children = _rootScript != null |
304 ? [ | 320 ? [ |
305 new HRElement(), | 321 new HRElement(), |
306 new ScriptInsetElement( | 322 new ScriptInsetElement( |
307 _isolate, _rootScript, _scripts, _instances, _events, | 323 _isolate, _rootScript, _scripts, _instances, _events, |
308 queue: _r.queue) | 324 queue: _r.queue) |
309 ] | 325 ] |
310 : const [], | 326 : const [], |
311 new HRElement(), | 327 new HRElement(), |
312 new ViewFooterElement(queue: _r.queue) | 328 new ViewFooterElement(queue: _r.queue) |
313 ] | 329 ] |
314 ]; | 330 ]; |
315 } | 331 } |
316 | 332 |
| 333 DivElement _populateThreadInfo(Thread t) { |
| 334 int index = 0; |
| 335 return new DivElement() |
| 336 ..classes = ['indent'] |
| 337 ..children = [ |
| 338 new SpanElement() |
| 339 ..text = '${t.id} ', |
| 340 new CurlyBlockElement(queue: _r.queue) |
| 341 ..content = [ |
| 342 new DivElement() |
| 343 ..classes = ['indent'] |
| 344 ..text = 'kind ${t.kindString}', |
| 345 new DivElement() |
| 346 ..children = t.zones |
| 347 .map((z) => new DivElement() |
| 348 ..classes = ['indent'] |
| 349 ..children = [ |
| 350 new DivElement() |
| 351 ..children = [ |
| 352 new SpanElement() |
| 353 ..children = [ |
| 354 new SpanElement() |
| 355 ..text = 'zone ${index++} ', |
| 356 new CurlyBlockElement(queue: _r.queue) |
| 357 ..content = [ |
| 358 new DivElement() |
| 359 ..classes = ['memberList'] |
| 360 ..children = [ |
| 361 new DivElement() |
| 362 ..classes = ['memberItem'] |
| 363 ..children = [ |
| 364 new SpanElement() |
| 365 ..classes = ['memberName'] |
| 366 ..text = 'used ', |
| 367 new SpanElement() |
| 368 ..classes = ['memberValue'] |
| 369 ..title = '${z.used}B' |
| 370 ..text = |
| 371 Utils.formatSize(z.used) |
| 372 ], |
| 373 new DivElement() |
| 374 ..classes = ['memberItem'] |
| 375 ..children = [ |
| 376 new SpanElement() |
| 377 ..classes = ['memberName'] |
| 378 ..text = 'capacity', |
| 379 new SpanElement() |
| 380 ..classes = ['memberValue'] |
| 381 ..title = '${z.capacity}B' |
| 382 ..text = |
| 383 Utils.formatSize(z.capacity) |
| 384 ] |
| 385 ] |
| 386 ] |
| 387 ] |
| 388 ] |
| 389 ] |
| 390 )] |
| 391 ]; |
| 392 } |
| 393 |
317 Future _loadExtraData() async { | 394 Future _loadExtraData() async { |
318 _function = null; | 395 _function = null; |
319 _rootScript = null; | 396 _rootScript = null; |
320 final frame = M.topFrame(_isolate.pauseEvent); | 397 final frame = M.topFrame(_isolate.pauseEvent); |
321 if (frame != null) { | 398 if (frame != null) { |
322 _function = await _functions.get(_isolate, frame.function.id); | 399 _function = await _functions.get(_isolate, frame.function.id); |
323 } | 400 } |
324 if (_isolate.rootLibrary != null) { | 401 if (_isolate.rootLibrary != null) { |
325 final rootLibrary = | 402 final rootLibrary = |
326 await _libraries.get(_isolate, _isolate.rootLibrary.id); | 403 await _libraries.get(_isolate, _isolate.rootLibrary.id); |
327 _rootScript = rootLibrary.rootScript; | 404 _rootScript = rootLibrary.rootScript; |
328 } | 405 } |
329 _r.dirty(); | 406 _r.dirty(); |
330 } | 407 } |
331 } | 408 } |
OLD | NEW |