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