Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(125)

Side by Side Diff: runtime/bin/vmservice/client/lib/src/app/application.dart

Issue 340443006: Add support for asynchronous event notification to the observatory. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 6 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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 part of app; 5 part of app;
6 6
7 /// A [Pane] controls the user interface of Observatory. At any given time 7 /// A [Pane] controls the user interface of Observatory. At any given time
8 /// one pane will be the current pane. Panes are registered at startup. 8 /// one pane will be the current pane. Panes are registered at startup.
9 /// When the user navigates within the application, each pane is asked if it 9 /// When the user navigates within the application, each pane is asked if it
10 /// can handle the current location, the first pane to say yes, wins. 10 /// can handle the current location, the first pane to say yes, wins.
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after
109 assert(canVisit(url)); 109 assert(canVisit(url));
110 (element as ServiceObjectViewElement).object = app.lastErrorOrException; 110 (element as ServiceObjectViewElement).object = app.lastErrorOrException;
111 } 111 }
112 112
113 bool canVisit(String url) => url.startsWith('error/'); 113 bool canVisit(String url) => url.startsWith('error/');
114 } 114 }
115 115
116 /// The observatory application. Instances of this are created and owned 116 /// The observatory application. Instances of this are created and owned
117 /// by the observatory_application custom element. 117 /// by the observatory_application custom element.
118 class ObservatoryApplication extends Observable { 118 class ObservatoryApplication extends Observable {
119 static ObservatoryApplication app;
119 final _paneRegistry = new List<Pane>(); 120 final _paneRegistry = new List<Pane>();
120 ServiceObjectPane _serviceObjectPane; 121 ServiceObjectPane _serviceObjectPane;
121 Pane _currentPane; 122 Pane _currentPane;
122 @observable final LocationManager locationManager; 123 @observable final LocationManager locationManager;
123 @observable final VM vm; 124 @observable final VM vm;
124 @observable Isolate isolate; 125 @observable Isolate isolate;
125 @reflectable final ObservatoryApplicationElement rootElement; 126 @reflectable final ObservatoryApplicationElement rootElement;
126 127
127 @reflectable ServiceObject lastErrorOrException; 128 @reflectable ServiceObject lastErrorOrException;
128 129
130 @observable ObservableList<ServiceEvent> notifications =
131 new ObservableList<ServiceEvent>();
132
129 void _initOnce() { 133 void _initOnce() {
134 app = this;
135 vm.events.stream.listen(_handleEvent);
130 _registerPanes(); 136 _registerPanes();
131 vm.errors.stream.listen(_onError); 137 vm.errors.stream.listen(_onError);
132 vm.exceptions.stream.listen(_onException); 138 vm.exceptions.stream.listen(_onException);
133 location = locationManager; 139 location = locationManager;
134 locationManager._init(this); 140 locationManager._init(this);
135 } 141 }
136 142
143 void _removePauseEvents(Isolate isolate) {
144 bool isPauseEvent(var event) {
145 return (event.eventType == 'IsolateInterrupted' ||
146 event.eventType == 'BreakpointReached' ||
147 event.eventType == 'ExceptionThrown');
148 }
149
150 notifications.removeWhere((oldEvent) {
151 return (oldEvent.isolate == isolate &&
152 isPauseEvent(oldEvent));
153 });
154 }
155
156 void _handleEvent(ServiceEvent event) {
157 switch(event.eventType) {
158 case 'IsolateCreated':
159 // vm.reload();
160 break;
161
162 case 'IsolateShutdown':
163 // TODO(turnidge): Should we show the user isolate shutdown events?
164 // What if there are hundreds of them? Coalesce multiple
165 // shutdown events into one notification?
166 _removePauseEvents(event.isolate);
167 // vm.reload();
168 break;
169
170 case 'BreakpointResolved':
171 // Do nothing.
172 break;
173
174 case 'IsolateResumed':
175 _removePauseEvents(event.isolate);
176 break;
177
178 case 'BreakpointReached':
179 case 'IsolateInterrupted':
180 case 'ExceptionThrown':
181 _removePauseEvents(event.isolate);
182 notifications.add(event);
183 break;
184
185 default:
186 // Ignore unrecognized events.
187 Logger.root.severe('Unrecognized event type: ${event.eventType}');
188 break;
189 }
190 }
191
137 void _registerPanes() { 192 void _registerPanes() {
138 if (_serviceObjectPane != null) { 193 if (_serviceObjectPane != null) {
139 // Already done. 194 // Already done.
140 return; 195 return;
141 } 196 }
142 // Register ClassTreePane. 197 // Register ClassTreePane.
143 _paneRegistry.add(new ClassTreePane(this)); 198 _paneRegistry.add(new ClassTreePane(this));
144 _paneRegistry.add(new ErrorViewPane(this)); 199 _paneRegistry.add(new ErrorViewPane(this));
145 // Note that ServiceObjectPane must be the last entry in the list as it is 200 // Note that ServiceObjectPane must be the last entry in the list as it is
146 // the catch all. 201 // the catch all.
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
192 } 247 }
193 248
194 ObservatoryApplication.devtools(this.rootElement) : 249 ObservatoryApplication.devtools(this.rootElement) :
195 locationManager = new HashLocationManager(), 250 locationManager = new HashLocationManager(),
196 vm = new DartiumVM() { 251 vm = new DartiumVM() {
197 _initOnce(); 252 _initOnce();
198 } 253 }
199 254
200 ObservatoryApplication(this.rootElement) : 255 ObservatoryApplication(this.rootElement) :
201 locationManager = new HashLocationManager(), 256 locationManager = new HashLocationManager(),
202 vm = new HttpVM() { 257 vm = new WebSocketVM() {
turnidge 2014/06/26 21:27:46 I recall that this broke something last time I cha
Cutch 2014/06/27 16:03:49 This breaks clicking the Observatory link to recon
turnidge 2014/06/27 18:15:06 Ok, good.
203 _initOnce(); 258 _initOnce();
204 } 259 }
205 } 260 }
206 261
207 LocationManager location; 262 LocationManager location;
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698