| 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 library ports; | 5 import 'dart:html'; |
| 6 import 'dart:async'; |
| 7 import 'package:observatory/models.dart' as M; |
| 8 import 'package:observatory/src/elements/helpers/any_ref.dart'; |
| 9 import 'package:observatory/src/elements/helpers/rendering_scheduler.dart'; |
| 10 import 'package:observatory/src/elements/helpers/tag.dart'; |
| 11 import 'package:observatory/src/elements/helpers/uris.dart'; |
| 12 import 'package:observatory/src/elements/instance_ref.dart'; |
| 13 import 'package:observatory/src/elements/nav/bar.dart'; |
| 14 import 'package:observatory/src/elements/nav/isolate_menu.dart'; |
| 15 import 'package:observatory/src/elements/nav/menu.dart'; |
| 16 import 'package:observatory/src/elements/nav/notify.dart'; |
| 17 import 'package:observatory/src/elements/nav/refresh.dart'; |
| 18 import 'package:observatory/src/elements/nav/top_menu.dart'; |
| 19 import 'package:observatory/src/elements/nav/vm_menu.dart'; |
| 20 import 'package:observatory/src/elements/view_footer.dart'; |
| 6 | 21 |
| 7 import 'dart:async'; | 22 class PortsElement extends HtmlElement implements Renderable { |
| 8 import 'observatory_element.dart'; | 23 static const tag = const Tag<PortsElement>('ports-page', |
| 9 import 'package:observatory/service.dart'; | 24 dependencies: const [ |
| 10 import 'package:polymer/polymer.dart'; | 25 NavBarElement.tag, |
| 26 NavTopMenuElement.tag, |
| 27 NavVMMenuElement.tag, |
| 28 NavIsolateMenuElement.tag, |
| 29 NavMenuElement.tag, |
| 30 NavRefreshElement.tag, |
| 31 NavNotifyElement.tag, |
| 32 InstanceRefElement.tag, |
| 33 ViewFooterElement.tag |
| 34 ]); |
| 11 | 35 |
| 12 @CustomTag('ports-page') | 36 RenderingScheduler<PortsElement> _r; |
| 13 class PortsPageElement extends ObservatoryElement { | |
| 14 PortsPageElement.created() : super.created(); | |
| 15 | 37 |
| 16 @observable Isolate isolate; | 38 Stream<RenderedEvent<PortsElement>> get onRendered => _r.onRendered; |
| 17 @observable var /*ObservableList | ServiceObject*/ ports; | |
| 18 | 39 |
| 19 void isolateChanged(oldValue) { | 40 M.VM _vm; |
| 20 if (isolate != null) { | 41 M.IsolateRef _isolate; |
| 21 isolate.getPorts().then(_refreshView); | 42 M.EventRepository _events; |
| 22 } | 43 M.NotificationRepository _notifications; |
| 44 M.PortsRepository _ports; |
| 45 M.InstanceRepository _instances; |
| 46 M.Ports _isolatePorts; |
| 47 |
| 48 |
| 49 M.IsolateRef get isolate => _isolate; |
| 50 M.NotificationRepository get notifications => _notifications; |
| 51 M.PortsRepository get ports => _ports; |
| 52 M.VMRef get vm => _vm; |
| 53 |
| 54 factory PortsElement(M.VM vm, M.IsolateRef isolate, |
| 55 M.EventRepository events, |
| 56 M.NotificationRepository notifications, |
| 57 M.PortsRepository ports, |
| 58 M.InstanceRepository instances, |
| 59 {RenderingQueue queue}) { |
| 60 assert(vm != null); |
| 61 assert(isolate != null); |
| 62 assert(events != null); |
| 63 assert(notifications != null); |
| 64 assert(ports != null); |
| 65 assert(instances != null); |
| 66 PortsElement e = document.createElement(tag.name); |
| 67 e._r = new RenderingScheduler(e, queue: queue); |
| 68 e._vm = vm; |
| 69 e._isolate = isolate; |
| 70 e._events = events; |
| 71 e._notifications = notifications; |
| 72 e._ports = ports; |
| 73 e._instances = instances; |
| 74 return e; |
| 23 } | 75 } |
| 24 | 76 |
| 25 Future refresh() { | 77 PortsElement.created() : super.created(); |
| 26 return isolate.getPorts().then(_refreshView); | 78 |
| 79 @override |
| 80 void attached() { |
| 81 super.attached(); |
| 82 _r.enable(); |
| 83 _refresh(); |
| 27 } | 84 } |
| 28 | 85 |
| 29 _refreshView(/*ObservableList | ServiceObject*/ object) { | 86 @override |
| 30 ports = object['ports']; | 87 void detached() { |
| 88 super.detached(); |
| 89 children = []; |
| 90 _r.disable(notify: true); |
| 91 } |
| 92 |
| 93 void render() { |
| 94 children = [ |
| 95 new NavBarElement(queue: _r.queue) |
| 96 ..children = [ |
| 97 new NavTopMenuElement(queue: _r.queue), |
| 98 new NavVMMenuElement(_vm, _events, queue: _r.queue), |
| 99 new NavIsolateMenuElement(_isolate, _events, queue: _r.queue), |
| 100 new NavMenuElement('ports', link: Uris.ports(_isolate), last: true, |
| 101 queue: _r.queue), |
| 102 new NavRefreshElement(queue: _r.queue) |
| 103 ..onRefresh.listen((_) => _refresh()), |
| 104 new NavNotifyElement(_notifications, queue: _r.queue) |
| 105 ], |
| 106 new DivElement() |
| 107 ..classes = ['content-centered'] |
| 108 ..children = [ |
| 109 new HeadingElement.h1()..text = 'Ports', |
| 110 new BRElement(), new HRElement(), |
| 111 new DivElement() |
| 112 ..children = _createList(), |
| 113 new HRElement() |
| 114 ], |
| 115 new ViewFooterElement(queue: _r.queue) |
| 116 ]; |
| 117 } |
| 118 |
| 119 List<Element> _createList() { |
| 120 if (_isolatePorts == null) { |
| 121 return const []; |
| 122 } |
| 123 int i = 0; |
| 124 return _isolatePorts.elements.map((port) => |
| 125 new DivElement()..classes = ['memberItem'] |
| 126 ..children = [ |
| 127 new DivElement()..classes = ['memberName'] |
| 128 ..children = [ |
| 129 new SpanElement()..classes = ['port-number'] |
| 130 ..text = '[ ${++i} ] ', |
| 131 new SpanElement()..text = '${port.name}' |
| 132 ], |
| 133 new DivElement()..classes = ['memberValue'] |
| 134 ..children = [ |
| 135 anyRef(_isolate, port.handler, _instances, queue: _r.queue) |
| 136 ] |
| 137 ] |
| 138 ).toList(); |
| 139 } |
| 140 |
| 141 Future _refresh() async { |
| 142 _isolatePorts = null; |
| 143 _r.dirty(); |
| 144 _isolatePorts = await _ports.get(_isolate); |
| 145 _r.dirty(); |
| 31 } | 146 } |
| 32 } | 147 } |
| OLD | NEW |