OLD | NEW |
1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file | 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 | 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 import 'dart:html'; | 5 import 'dart:html'; |
6 import 'dart:async'; | 6 import 'dart:async'; |
7 import 'package:observatory/src/elements/helpers/rendering_scheduler.dart'; | 7 import 'package:observatory/src/elements/helpers/rendering_scheduler.dart'; |
8 import 'package:observatory/src/elements/helpers/tag.dart'; | 8 import 'package:observatory/src/elements/helpers/tag.dart'; |
9 import 'package:observatory/src/elements/helpers/uris.dart'; | 9 import 'package:observatory/src/elements/helpers/uris.dart'; |
10 import 'package:observatory/models.dart' show ConnectionException; | 10 import 'package:observatory/models.dart' show ConnectionException; |
11 | 11 |
12 | 12 class ExceptionDeleteEvent { |
13 class ExceptionDeleteEvent{ | |
14 final Exception exception; | 13 final Exception exception; |
15 final StackTrace stacktrace; | 14 final StackTrace stacktrace; |
16 | 15 |
17 ExceptionDeleteEvent(this.exception, {this.stacktrace}); | 16 ExceptionDeleteEvent(this.exception, {this.stacktrace}); |
18 } | 17 } |
19 | 18 |
20 class NavNotifyExceptionElement extends HtmlElement implements Renderable { | 19 class NavNotifyExceptionElement extends HtmlElement implements Renderable { |
21 static const tag = const Tag<NavNotifyExceptionElement>('nav-exception'); | 20 static const tag = const Tag<NavNotifyExceptionElement>('nav-exception'); |
22 | 21 |
23 RenderingScheduler _r; | 22 RenderingScheduler _r; |
24 | 23 |
25 Stream<RenderedEvent<NavNotifyExceptionElement>> get onRendered => | 24 Stream<RenderedEvent<NavNotifyExceptionElement>> get onRendered => |
26 _r.onRendered; | 25 _r.onRendered; |
27 | 26 |
28 final StreamController<ExceptionDeleteEvent> _onDelete = | 27 final StreamController<ExceptionDeleteEvent> _onDelete = |
29 new StreamController<ExceptionDeleteEvent>.broadcast(); | 28 new StreamController<ExceptionDeleteEvent>.broadcast(); |
30 Stream<ExceptionDeleteEvent> get onDelete => _onDelete.stream; | 29 Stream<ExceptionDeleteEvent> get onDelete => _onDelete.stream; |
31 | 30 |
32 Exception _exception; | 31 Exception _exception; |
33 StackTrace _stacktrace; | 32 StackTrace _stacktrace; |
34 | 33 |
35 Exception get exception => _exception; | 34 Exception get exception => _exception; |
36 StackTrace get stacktrace => _stacktrace; | 35 StackTrace get stacktrace => _stacktrace; |
37 | 36 |
38 factory NavNotifyExceptionElement(Exception exception, | 37 factory NavNotifyExceptionElement(Exception exception, |
39 {StackTrace stacktrace: null, RenderingQueue queue}) { | 38 {StackTrace stacktrace: null, RenderingQueue queue}) { |
40 assert(exception != null); | 39 assert(exception != null); |
41 NavNotifyExceptionElement e = document.createElement(tag.name); | 40 NavNotifyExceptionElement e = document.createElement(tag.name); |
42 e._r = new RenderingScheduler(e, queue: queue); | 41 e._r = new RenderingScheduler(e, queue: queue); |
43 e._exception = exception; | 42 e._exception = exception; |
44 e._stacktrace = stacktrace; | 43 e._stacktrace = stacktrace; |
(...skipping 20 matching lines...) Expand all Loading... |
65 renderConnectionException(); | 64 renderConnectionException(); |
66 } else { | 65 } else { |
67 renderGenericException(); | 66 renderGenericException(); |
68 } | 67 } |
69 } | 68 } |
70 | 69 |
71 void renderConnectionException() { | 70 void renderConnectionException() { |
72 children = [ | 71 children = [ |
73 new DivElement() | 72 new DivElement() |
74 ..children = [ | 73 ..children = [ |
75 new SpanElement()..text = 'The request cannot be completed because the ' | 74 new SpanElement() |
76 'VM is currently disconnected', | 75 ..text = 'The request cannot be completed because the ' |
77 new BRElement(), new BRElement(), | 76 'VM is currently disconnected', |
78 new SpanElement()..text = '[', | 77 new BRElement(), |
79 new AnchorElement(href: Uris.vmConnect()) | 78 new BRElement(), |
80 ..text = 'Connect to a different VM', | 79 new SpanElement()..text = '[', |
81 new SpanElement()..text = ']', | 80 new AnchorElement(href: Uris.vmConnect()) |
82 new ButtonElement()..innerHtml = '×' | 81 ..text = 'Connect to a different VM', |
83 ..onClick.map(_toEvent).listen(_delete) | 82 new SpanElement()..text = ']', |
84 ] | 83 new ButtonElement() |
| 84 ..innerHtml = '×' |
| 85 ..onClick.map(_toEvent).listen(_delete) |
| 86 ] |
85 ]; | 87 ]; |
86 } | 88 } |
87 | 89 |
88 void renderGenericException() { | 90 void renderGenericException() { |
89 List<Node> content; | 91 List<Node> content; |
90 content = [ | 92 content = [ |
91 new SpanElement()..text = 'Unexpected exception:', | 93 new SpanElement()..text = 'Unexpected exception:', |
92 new BRElement(), new BRElement(), | 94 new BRElement(), |
| 95 new BRElement(), |
93 new DivElement()..text = exception.toString(), | 96 new DivElement()..text = exception.toString(), |
94 new BRElement() | 97 new BRElement() |
95 ]; | 98 ]; |
96 if (stacktrace != null) { | 99 if (stacktrace != null) { |
97 content.addAll([ | 100 content.addAll([ |
98 new SpanElement()..text = 'Stacktrace:', | 101 new SpanElement()..text = 'Stacktrace:', |
99 new BRElement(), new BRElement(), | 102 new BRElement(), |
| 103 new BRElement(), |
100 new DivElement()..text = stacktrace.toString(), | 104 new DivElement()..text = stacktrace.toString(), |
101 new BRElement() | 105 new BRElement() |
102 ]); | 106 ]); |
103 } | 107 } |
104 content.addAll([ | 108 content.addAll([ |
105 new SpanElement()..text = '[', | 109 new SpanElement()..text = '[', |
106 new AnchorElement(href: Uris.vmConnect()) | 110 new AnchorElement(href: Uris.vmConnect()) |
107 ..text = 'Connect to a different VM', | 111 ..text = 'Connect to a different VM', |
108 new SpanElement()..text = ']', | 112 new SpanElement()..text = ']', |
109 new ButtonElement()..innerHtml = '×' | 113 new ButtonElement() |
| 114 ..innerHtml = '×' |
110 ..onClick.map(_toEvent).listen(_delete) | 115 ..onClick.map(_toEvent).listen(_delete) |
111 ]); | 116 ]); |
112 children = [ | 117 children = [new DivElement()..children = content]; |
113 new DivElement() | |
114 ..children = content | |
115 ]; | |
116 } | 118 } |
117 | 119 |
118 ExceptionDeleteEvent _toEvent(_) { | 120 ExceptionDeleteEvent _toEvent(_) { |
119 return new ExceptionDeleteEvent(exception, stacktrace: stacktrace); | 121 return new ExceptionDeleteEvent(exception, stacktrace: stacktrace); |
120 } | 122 } |
121 | 123 |
122 void _delete(ExceptionDeleteEvent e) { | 124 void _delete(ExceptionDeleteEvent e) { |
123 _onDelete.add(e); | 125 _onDelete.add(e); |
124 } | 126 } |
125 | 127 |
126 void delete() { | 128 void delete() { |
127 _onDelete.add(new ExceptionDeleteEvent(exception, stacktrace: stacktrace)); | 129 _onDelete.add(new ExceptionDeleteEvent(exception, stacktrace: stacktrace)); |
128 } | 130 } |
129 } | 131 } |
OLD | NEW |