OLD | NEW |
(Empty) | |
| 1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file |
| 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. |
| 4 |
| 5 import 'dart:html'; |
| 6 import 'dart:async'; |
| 7 import 'package:observatory/models.dart' as M; |
| 8 import 'package:observatory/src/elements/helpers/tag.dart'; |
| 9 import 'package:observatory/src/elements/helpers/rendering_scheduler.dart'; |
| 10 |
| 11 class EventRemoveEvent{ |
| 12 EventRemoveEvent(); |
| 13 } |
| 14 |
| 15 class NavNotifyEventElement extends HtmlElement implements Renderable { |
| 16 static const tag = const Tag<NavNotifyEventElement>('nav-event'); |
| 17 |
| 18 RenderingScheduler _r; |
| 19 |
| 20 Stream<RenderedEvent<NavNotifyEventElement>> get onRendered => _r.onRendered; |
| 21 |
| 22 final StreamController<EventRemoveEvent> _onRemove; |
| 23 final Stream<EventRemoveEvent> onRemove; |
| 24 |
| 25 M.Event _event; |
| 26 M.Event get event => _event; |
| 27 |
| 28 factory NavNotifyEventElement(M.Event event, {RenderingQueue queue}) { |
| 29 assert(event != null); |
| 30 NavNotifyEventElement e = document.createElement(tag.name); |
| 31 e._r = new RenderingScheduler(e, queue: queue); |
| 32 e._event = event; |
| 33 return e; |
| 34 } |
| 35 |
| 36 NavNotifyEventElement.created() |
| 37 : this._(new StreamController<EventRemoveEvent>()); |
| 38 |
| 39 NavNotifyEventElement._(StreamController<EventRemoveEvent> onRemove) |
| 40 : super.created(), |
| 41 this._onRemove = onRemove, |
| 42 this.onRemove = onRemove.stream.asBroadcastStream(); |
| 43 |
| 44 @override |
| 45 void attached() { super.attached(); _r.enable(); } |
| 46 |
| 47 @override |
| 48 void detached() { super.detached(); children = []; _r.disable(notify: true); } |
| 49 |
| 50 void render() { |
| 51 children = []; |
| 52 List<Element> content; |
| 53 if (event is M.PauseStartEvent) { |
| 54 content = _managePauseStartEvent(event as M.PauseStartEvent); |
| 55 } else if (event is M.PauseExitEvent) { |
| 56 content = _managePauseExitEvent(event as M.PauseExitEvent); |
| 57 } else if (event is M.PauseBreakpointEvent) { |
| 58 content = _managePauseBreakpointEvent(event as M.PauseBreakpointEvent); |
| 59 } else if (event is M.PauseInterruptedEvent) { |
| 60 content = _managePauseInterruptedEvent(event as M.PauseInterruptedEvent); |
| 61 } else if (event is M.PauseExceptionEvent) { |
| 62 content = _managePauseExceptionEvent(event as M.PauseExceptionEvent); |
| 63 } else if (event is M.NoneEvent) { |
| 64 content = _manageNoneEvent(event as M.NoneEvent); |
| 65 } else if (event is M.ConnectionClosedEvent) { |
| 66 content = _manageConnectionClosedEvent(event as M.ConnectionClosedEvent); |
| 67 } else if (event is M.InspectEvent) { |
| 68 content = _manageInspectEvent(event as M.InspectEvent); |
| 69 } else if (event is M.IsolateReloadEvent) { |
| 70 content = _manageIsolateReloadEvent(event as M.IsolateReloadEvent); |
| 71 } else { |
| 72 return; |
| 73 } |
| 74 children = [ |
| 75 new DivElement() |
| 76 ..children = [] |
| 77 ..children.addAll(content) |
| 78 ..children.add(new ButtonElement()..innerHtml = '×' |
| 79 ..onClick.map(_toEvent).listen(_remove)) |
| 80 ]; |
| 81 } |
| 82 |
| 83 static List<Element> _managePauseStartEvent(M.PauseStartEvent event) { |
| 84 return [ |
| 85 new SpanElement()..text = 'Isolate ', |
| 86 new AnchorElement( |
| 87 href: '#/inspect?isolateId=${Uri.encodeComponent(event.isolate.id)}') |
| 88 ..text = event.isolate.name, |
| 89 new SpanElement()..text = ' is paused at isolate start', |
| 90 new BRElement(), new BRElement(), |
| 91 new AnchorElement( |
| 92 href: '#/debugger?isolateId=${Uri.encodeComponent(event.isolate.id)}') |
| 93 ..text = 'debug', |
| 94 ]; |
| 95 } |
| 96 |
| 97 static List<Element> _managePauseExitEvent(M.PauseExitEvent event) { |
| 98 return [ |
| 99 new SpanElement()..text = 'Isolate ', |
| 100 new AnchorElement( |
| 101 href: '#/inspect?isolateId=${Uri.encodeComponent(event.isolate.id)}') |
| 102 ..text = event.isolate.name, |
| 103 new SpanElement()..text = ' is paused at isolate exit', |
| 104 new BRElement(), new BRElement(), |
| 105 new AnchorElement( |
| 106 href: '#/debugger?isolateId=${Uri.encodeComponent(event.isolate.id)}') |
| 107 ..text = 'debug', |
| 108 ]; |
| 109 } |
| 110 |
| 111 static List<Element> _managePauseBreakpointEvent(M.PauseBreakpointEvent event)
{ |
| 112 String message = ' is paused'; |
| 113 if (event.breakpoint != null) { |
| 114 message += ' at breakpoint ${event.breakpoint.number}'; |
| 115 } |
| 116 return [ |
| 117 new SpanElement()..text = 'Isolate ', |
| 118 new AnchorElement( |
| 119 href: '#/inspect?isolateId=${Uri.encodeComponent(event.isolate.id)}') |
| 120 ..text = event.isolate.name, |
| 121 new SpanElement() |
| 122 ..text = message, |
| 123 new BRElement(), new BRElement(), |
| 124 new AnchorElement( |
| 125 href: '#/debugger?isolateId=${Uri.encodeComponent(event.isolate.id)}') |
| 126 ..text = 'debug', |
| 127 ]; |
| 128 } |
| 129 |
| 130 static List<Element> _managePauseInterruptedEvent(M.PauseInterruptedEvent even
t) { |
| 131 return [ |
| 132 new SpanElement()..text = 'Isolate ', |
| 133 new AnchorElement( |
| 134 href: '#/inspect?isolateId=${Uri.encodeComponent(event.isolate.id)}') |
| 135 ..text = event.isolate.name, |
| 136 new SpanElement() |
| 137 ..text = ' is paused', |
| 138 new BRElement(), new BRElement(), |
| 139 new AnchorElement( |
| 140 href: '#/debugger?isolateId=${Uri.encodeComponent(event.isolate.id)}') |
| 141 ..text = 'debug', |
| 142 ]; |
| 143 } |
| 144 |
| 145 static List<Element> _managePauseExceptionEvent(M.PauseExceptionEvent event) { |
| 146 return [ |
| 147 new SpanElement()..text = 'Isolate ', |
| 148 new AnchorElement( |
| 149 href: '#/inspect?isolateId=${Uri.encodeComponent(event.isolate.id)}') |
| 150 ..text = event.isolate.name, |
| 151 new SpanElement() |
| 152 ..text = ' is paused due to exception', |
| 153 new BRElement(), new BRElement(), |
| 154 new AnchorElement( |
| 155 href: '#/debugger?isolateId=${Uri.encodeComponent(event.isolate.id)}') |
| 156 ..text = 'debug', |
| 157 ]; |
| 158 } |
| 159 |
| 160 static List<Element> _manageNoneEvent(M.NoneEvent event) { |
| 161 return [ |
| 162 new SpanElement()..text = 'Isolate ', |
| 163 new AnchorElement( |
| 164 href: '#/inspect?isolateId=${Uri.encodeComponent(event.isolate.id)}') |
| 165 ..text = event.isolate.name, |
| 166 new SpanElement() |
| 167 ..text = ' is paused', |
| 168 new BRElement(), new BRElement(), |
| 169 new AnchorElement( |
| 170 href: '#/debugger?isolateId=${Uri.encodeComponent(event.isolate.id)}') |
| 171 ..text = 'debug', |
| 172 ]; |
| 173 } |
| 174 |
| 175 static List<Element> _manageConnectionClosedEvent(M.ConnectionClosedEvent even
t) { |
| 176 return [ |
| 177 new SpanElement()..text = 'Disconnected from VM: ${event.reason}', |
| 178 new BRElement(), new BRElement(), new SpanElement()..text = '[', |
| 179 new AnchorElement(href: '#/vm-connect')..text = 'Connect to a VM', |
| 180 new SpanElement()..text = ']' |
| 181 ]; |
| 182 } |
| 183 |
| 184 static List<Element> _manageInspectEvent(M.InspectEvent event) { |
| 185 return [ |
| 186 new SpanElement()..text = 'Inspect ', |
| 187 // TODO(cbernaschina) add InstanceRefElement back. |
| 188 //new InstanceRefElement()..instance = event.inspectee |
| 189 ]; |
| 190 } |
| 191 |
| 192 static List<Element> _manageIsolateReloadEvent(M.IsolateReloadEvent event) { |
| 193 if (event.error != null) { |
| 194 return [ |
| 195 new SpanElement()..text = 'Isolate reload failed:', |
| 196 new BRElement(), new BRElement(), |
| 197 new DivElement() |
| 198 ..classes = ["indent", "error"] |
| 199 ..text = event.error.message.toString() |
| 200 ]; |
| 201 } else { |
| 202 return [new SpanElement()..text = 'Isolate reload']; |
| 203 } |
| 204 } |
| 205 |
| 206 EventRemoveEvent _toEvent(_) { |
| 207 return new EventRemoveEvent(); |
| 208 } |
| 209 |
| 210 void _remove(EventRemoveEvent e) { |
| 211 if (_onRemove.hasListener) { |
| 212 _onRemove.add(e); |
| 213 } |
| 214 } |
| 215 } |
OLD | NEW |