Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 class Notification { | |
| 8 Notification.fromEvent(this.event); | |
| 9 Notification.fromException(this.exception, this.stacktrace); | |
| 10 | |
| 11 ServiceEvent event; | |
| 12 var exception; | |
| 13 var stacktrace; | |
| 14 } | |
| 15 | |
| 7 /// The observatory application. Instances of this are created and owned | 16 /// The observatory application. Instances of this are created and owned |
| 8 /// by the observatory_application custom element. | 17 /// by the observatory_application custom element. |
| 9 class ObservatoryApplication extends Observable { | 18 class ObservatoryApplication extends Observable { |
| 10 static ObservatoryApplication app; | 19 static ObservatoryApplication app; |
| 11 final _pageRegistry = new List<Page>(); | 20 final _pageRegistry = new List<Page>(); |
| 12 LocationManager _locationManager; | 21 LocationManager _locationManager; |
| 13 LocationManager get locationManager => _locationManager; | 22 LocationManager get locationManager => _locationManager; |
| 14 @observable Page currentPage; | 23 @observable Page currentPage; |
| 15 VM _vm; | 24 VM _vm; |
| 16 VM get vm => _vm; | 25 VM get vm => _vm; |
| (...skipping 15 matching lines...) Expand all Loading... | |
| 32 targets.add(vm.target); | 41 targets.add(vm.target); |
| 33 } | 42 } |
| 34 _removeDisconnectEvents(); | 43 _removeDisconnectEvents(); |
| 35 }); | 44 }); |
| 36 | 45 |
| 37 vm.onDisconnect.then((String reason) { | 46 vm.onDisconnect.then((String reason) { |
| 38 if (this.vm != vm) { | 47 if (this.vm != vm) { |
| 39 // This disconnect event occured *after* a new VM was installed. | 48 // This disconnect event occured *after* a new VM was installed. |
| 40 return; | 49 return; |
| 41 } | 50 } |
| 42 notifications.add(new ServiceEvent.connectionClosed(reason)); | 51 notifications.add( |
| 52 new Notification.fromEvent( | |
| 53 new ServiceEvent.connectionClosed(reason))); | |
| 43 }); | 54 }); |
| 44 | 55 |
| 45 vm.errors.stream.listen(_onError); | |
| 46 vm.events.stream.listen(_onEvent); | 56 vm.events.stream.listen(_onEvent); |
| 47 vm.exceptions.stream.listen(_onException); | |
| 48 } | 57 } |
| 49 _vm = vm; | 58 _vm = vm; |
| 50 } | 59 } |
| 51 final TargetManager targets; | 60 final TargetManager targets; |
| 52 @reflectable final ObservatoryApplicationElement rootElement; | 61 @reflectable final ObservatoryApplicationElement rootElement; |
| 53 | 62 |
| 54 TraceViewElement _traceView = null; | 63 TraceViewElement _traceView = null; |
| 55 | 64 |
| 56 @reflectable ServiceObject lastErrorOrException; | 65 @reflectable ServiceObject lastErrorOrException; |
| 57 @observable ObservableList<ServiceEvent> notifications = | 66 @observable ObservableList<Notification> notifications = |
| 58 new ObservableList<ServiceEvent>(); | 67 new ObservableList<Notification>(); |
| 59 | 68 |
| 60 void _initOnce() { | 69 void _initOnce() { |
| 61 assert(app == null); | 70 assert(app == null); |
| 62 app = this; | 71 app = this; |
| 63 _registerPages(); | 72 _registerPages(); |
| 64 Analytics.initialize(); | 73 Analytics.initialize(); |
| 65 // Visit the current page. | 74 // Visit the current page. |
| 66 locationManager._visit(); | 75 locationManager._visit(); |
| 67 } | 76 } |
| 68 | 77 |
| 69 void removePauseEvents(Isolate isolate) { | 78 void removePauseEvents(Isolate isolate) { |
| 70 bool isPauseEvent(var event) { | 79 bool isPauseEvent(ServiceEvent event) { |
|
Cutch
2015/05/13 17:50:09
this method should be on event.
turnidge
2015/05/14 17:53:42
Done.
| |
| 71 return (event.eventType == ServiceEvent.kPauseStart || | 80 return (event.eventType == ServiceEvent.kPauseStart || |
| 72 event.eventType == ServiceEvent.kPauseExit || | 81 event.eventType == ServiceEvent.kPauseExit || |
| 73 event.eventType == ServiceEvent.kPauseBreakpoint || | 82 event.eventType == ServiceEvent.kPauseBreakpoint || |
| 74 event.eventType == ServiceEvent.kPauseInterrupted || | 83 event.eventType == ServiceEvent.kPauseInterrupted || |
| 75 event.eventType == ServiceEvent.kPauseException); | 84 event.eventType == ServiceEvent.kPauseException); |
| 76 } | 85 } |
| 77 | 86 |
| 78 notifications.removeWhere((oldEvent) { | 87 notifications.removeWhere((notification) { |
| 79 return (oldEvent.isolate == isolate && | 88 var event = notification.event; |
| 80 isPauseEvent(oldEvent)); | 89 return (event != null && |
| 90 event.isolate == isolate && | |
| 91 isPauseEvent(event)); | |
| 81 }); | 92 }); |
| 82 } | 93 } |
| 83 | 94 |
| 84 void _onEvent(ServiceEvent event) { | 95 void _onEvent(ServiceEvent event) { |
| 85 switch(event.eventType) { | 96 switch(event.eventType) { |
| 86 case ServiceEvent.kIsolateStart: | 97 case ServiceEvent.kIsolateStart: |
| 87 case ServiceEvent.kIsolateUpdate: | 98 case ServiceEvent.kIsolateUpdate: |
| 88 case ServiceEvent.kGraph: | 99 case ServiceEvent.kGraph: |
| 89 case ServiceEvent.kBreakpointAdded: | 100 case ServiceEvent.kBreakpointAdded: |
| 90 case ServiceEvent.kBreakpointResolved: | 101 case ServiceEvent.kBreakpointResolved: |
| 91 case ServiceEvent.kBreakpointRemoved: | 102 case ServiceEvent.kBreakpointRemoved: |
| 92 case ServiceEvent.kGC: | 103 case ServiceEvent.kGC: |
| 93 // Ignore for now. | 104 // Ignore for now. |
| 94 break; | 105 break; |
| 95 | 106 |
| 96 case ServiceEvent.kIsolateExit: | 107 case ServiceEvent.kIsolateExit: |
| 97 case ServiceEvent.kResume: | 108 case ServiceEvent.kResume: |
| 98 removePauseEvents(event.isolate); | 109 removePauseEvents(event.isolate); |
| 99 break; | 110 break; |
| 100 | 111 |
| 101 case ServiceEvent.kPauseStart: | 112 case ServiceEvent.kPauseStart: |
| 102 case ServiceEvent.kPauseExit: | 113 case ServiceEvent.kPauseExit: |
| 103 case ServiceEvent.kPauseBreakpoint: | 114 case ServiceEvent.kPauseBreakpoint: |
| 104 case ServiceEvent.kPauseInterrupted: | 115 case ServiceEvent.kPauseInterrupted: |
| 105 case ServiceEvent.kPauseException: | 116 case ServiceEvent.kPauseException: |
| 106 removePauseEvents(event.isolate); | 117 removePauseEvents(event.isolate); |
| 107 notifications.add(event); | 118 notifications.add(new Notification.fromEvent(event)); |
| 108 break; | 119 break; |
| 109 | 120 |
| 110 case ServiceEvent.kInspect: | 121 case ServiceEvent.kInspect: |
| 111 notifications.add(event); | 122 notifications.add(new Notification.fromEvent(event)); |
| 112 break; | 123 break; |
| 113 | 124 |
| 114 default: | 125 default: |
| 115 // Ignore unrecognized events. | 126 // Ignore unrecognized events. |
| 116 Logger.root.severe('Unrecognized event: $event'); | 127 Logger.root.severe('Unrecognized event: $event'); |
| 117 break; | 128 break; |
| 118 } | 129 } |
| 119 } | 130 } |
| 120 | 131 |
| 121 void _registerPages() { | 132 void _registerPages() { |
| 122 _pageRegistry.add(new VMPage(this)); | 133 _pageRegistry.add(new VMPage(this)); |
| 123 _pageRegistry.add(new FlagsPage(this)); | 134 _pageRegistry.add(new FlagsPage(this)); |
| 124 _pageRegistry.add(new InspectPage(this)); | 135 _pageRegistry.add(new InspectPage(this)); |
| 125 _pageRegistry.add(new ClassTreePage(this)); | 136 _pageRegistry.add(new ClassTreePage(this)); |
| 126 _pageRegistry.add(new DebuggerPage(this)); | 137 _pageRegistry.add(new DebuggerPage(this)); |
| 127 _pageRegistry.add(new CpuProfilerPage(this)); | 138 _pageRegistry.add(new CpuProfilerPage(this)); |
| 128 _pageRegistry.add(new TableCpuProfilerPage(this)); | 139 _pageRegistry.add(new TableCpuProfilerPage(this)); |
| 129 _pageRegistry.add(new AllocationProfilerPage(this)); | 140 _pageRegistry.add(new AllocationProfilerPage(this)); |
| 130 _pageRegistry.add(new HeapMapPage(this)); | 141 _pageRegistry.add(new HeapMapPage(this)); |
| 131 _pageRegistry.add(new VMConnectPage(this)); | 142 _pageRegistry.add(new VMConnectPage(this)); |
| 132 _pageRegistry.add(new IsolateReconnectPage(this)); | 143 _pageRegistry.add(new IsolateReconnectPage(this)); |
| 133 _pageRegistry.add(new ErrorViewPage(this)); | 144 _pageRegistry.add(new ErrorViewPage(this)); |
| 134 _pageRegistry.add(new MetricsPage(this)); | 145 _pageRegistry.add(new MetricsPage(this)); |
| 135 // Note that ErrorPage must be the last entry in the list as it is | 146 // Note that ErrorPage must be the last entry in the list as it is |
| 136 // the catch all. | 147 // the catch all. |
| 137 _pageRegistry.add(new ErrorPage(this)); | 148 _pageRegistry.add(new ErrorPage(this)); |
| 138 } | 149 } |
| 139 | 150 |
| 140 void _onError(ServiceError error) { | |
| 141 lastErrorOrException = error; | |
| 142 _visit(Uri.parse('error/'), null); | |
| 143 } | |
| 144 | |
| 145 void _onException(ServiceException exception) { | |
| 146 lastErrorOrException = exception; | |
| 147 if (exception.kind == 'NetworkException') { | |
| 148 // Got a network exception, visit the vm-connect page. | |
| 149 this.vm = null; | |
| 150 locationManager.go(locationManager.makeLink('/vm-connect')); | |
| 151 } else { | |
| 152 _visit(Uri.parse('error/'), {}); | |
| 153 } | |
| 154 } | |
| 155 | |
| 156 void _visit(Uri uri, Map internalArguments) { | 151 void _visit(Uri uri, Map internalArguments) { |
| 157 if (internalArguments['trace'] != null) { | 152 if (internalArguments['trace'] != null) { |
| 158 var traceArg = internalArguments['trace']; | 153 var traceArg = internalArguments['trace']; |
| 159 if (traceArg == 'on') { | 154 if (traceArg == 'on') { |
| 160 Tracer.start(); | 155 Tracer.start(); |
| 161 } else if (traceArg == 'off') { | 156 } else if (traceArg == 'off') { |
| 162 Tracer.stop(); | 157 Tracer.stop(); |
| 163 } | 158 } |
| 164 } | 159 } |
| 165 if (Tracer.current != null) { | 160 if (Tracer.current != null) { |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 211 } | 206 } |
| 212 | 207 |
| 213 ObservatoryApplication(this.rootElement) : | 208 ObservatoryApplication(this.rootElement) : |
| 214 targets = new TargetManager() { | 209 targets = new TargetManager() { |
| 215 _locationManager = new LocationManager(this); | 210 _locationManager = new LocationManager(this); |
| 216 vm = new WebSocketVM(targets.defaultTarget); | 211 vm = new WebSocketVM(targets.defaultTarget); |
| 217 _initOnce(); | 212 _initOnce(); |
| 218 } | 213 } |
| 219 | 214 |
| 220 void _removeDisconnectEvents() { | 215 void _removeDisconnectEvents() { |
| 221 notifications.removeWhere((oldEvent) { | 216 notifications.removeWhere((notification) { |
| 222 return (oldEvent.eventType == ServiceEvent.kConnectionClosed); | 217 var event = notification.event; |
| 218 return (event != null && | |
| 219 event.eventType == ServiceEvent.kConnectionClosed); | |
| 223 }); | 220 }); |
| 224 } | 221 } |
| 225 | 222 |
| 226 loadCrashDump(Map crashDump) { | 223 loadCrashDump(Map crashDump) { |
| 227 this.vm = new FakeVM(crashDump['result']); | 224 this.vm = new FakeVM(crashDump['result']); |
| 228 app.locationManager.go('#/vm'); | 225 app.locationManager.go('#/vm'); |
| 229 } | 226 } |
| 227 | |
| 228 void handleException(e, st) { | |
| 229 // TODO(turnidge): Report this failure via analytics. | |
| 230 Logger.root.warning('Caught exception: ${e}\n${st}'); | |
| 231 notifications.add(new Notification.fromException(e, st)); | |
| 232 } | |
| 230 } | 233 } |
| OLD | NEW |