| 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 library field_view_element; | 5 library field_view_element; |
| 6 | 6 |
| 7 import 'dart:async'; | 7 import 'dart:async'; |
| 8 import 'dart:html'; | 8 import 'dart:html'; |
| 9 import 'package:observatory/models.dart' as M; | 9 import 'package:observatory/models.dart' as M; |
| 10 import 'package:observatory/src/elements/class_ref.dart'; | 10 import 'package:observatory/src/elements/class_ref.dart'; |
| 11 import 'package:observatory/src/elements/curly_block.dart'; | 11 import 'package:observatory/src/elements/curly_block.dart'; |
| 12 import 'package:observatory/src/elements/helpers/any_ref.dart'; | 12 import 'package:observatory/src/elements/helpers/any_ref.dart'; |
| 13 import 'package:observatory/src/elements/helpers/nav_bar.dart'; | 13 import 'package:observatory/src/elements/helpers/nav_bar.dart'; |
| 14 import 'package:observatory/src/elements/helpers/nav_menu.dart'; | 14 import 'package:observatory/src/elements/helpers/nav_menu.dart'; |
| 15 import 'package:observatory/src/elements/helpers/rendering_scheduler.dart'; | 15 import 'package:observatory/src/elements/helpers/rendering_scheduler.dart'; |
| 16 import 'package:observatory/src/elements/helpers/tag.dart'; | 16 import 'package:observatory/src/elements/helpers/tag.dart'; |
| 17 import 'package:observatory/src/elements/nav/class_menu.dart'; | 17 import 'package:observatory/src/elements/nav/class_menu.dart'; |
| 18 import 'package:observatory/src/elements/nav/isolate_menu.dart'; | 18 import 'package:observatory/src/elements/nav/isolate_menu.dart'; |
| 19 import 'package:observatory/src/elements/nav/library_menu.dart'; | 19 import 'package:observatory/src/elements/nav/library_menu.dart'; |
| 20 import 'package:observatory/src/elements/nav/notify.dart'; | 20 import 'package:observatory/src/elements/nav/notify.dart'; |
| 21 import 'package:observatory/src/elements/nav/refresh.dart'; | 21 import 'package:observatory/src/elements/nav/refresh.dart'; |
| 22 import 'package:observatory/src/elements/nav/top_menu.dart'; | 22 import 'package:observatory/src/elements/nav/top_menu.dart'; |
| 23 import 'package:observatory/src/elements/nav/vm_menu.dart'; | 23 import 'package:observatory/src/elements/nav/vm_menu.dart'; |
| 24 import 'package:observatory/src/elements/object_common.dart'; | 24 import 'package:observatory/src/elements/object_common.dart'; |
| 25 import 'package:observatory/src/elements/script_inset.dart'; | 25 import 'package:observatory/src/elements/script_inset.dart'; |
| 26 import 'package:observatory/src/elements/source_link.dart'; | 26 import 'package:observatory/src/elements/source_link.dart'; |
| 27 import 'package:observatory/src/elements/view_footer.dart'; | 27 import 'package:observatory/src/elements/view_footer.dart'; |
| 28 | 28 |
| 29 class FieldViewElement extends HtmlElement implements Renderable { | 29 class FieldViewElement extends HtmlElement implements Renderable { |
| 30 static const tag = const Tag<FieldViewElement>('field-view', | 30 static const tag = |
| 31 dependencies: const [ | 31 const Tag<FieldViewElement>('field-view', dependencies: const [ |
| 32 ClassRefElement.tag, | 32 ClassRefElement.tag, |
| 33 CurlyBlockElement.tag, | 33 CurlyBlockElement.tag, |
| 34 NavClassMenuElement.tag, | 34 NavClassMenuElement.tag, |
| 35 NavLibraryMenuElement.tag, | 35 NavLibraryMenuElement.tag, |
| 36 NavTopMenuElement.tag, | 36 NavTopMenuElement.tag, |
| 37 NavVMMenuElement.tag, | 37 NavVMMenuElement.tag, |
| 38 NavIsolateMenuElement.tag, | 38 NavIsolateMenuElement.tag, |
| 39 NavRefreshElement.tag, | 39 NavRefreshElement.tag, |
| 40 NavNotifyElement.tag, | 40 NavNotifyElement.tag, |
| 41 ObjectCommonElement.tag, | 41 ObjectCommonElement.tag, |
| 42 ScriptInsetElement.tag, | 42 ScriptInsetElement.tag, |
| 43 SourceLinkElement.tag, | 43 SourceLinkElement.tag, |
| 44 ViewFooterElement.tag | 44 ViewFooterElement.tag |
| 45 ]); | 45 ]); |
| 46 | 46 |
| 47 RenderingScheduler<FieldViewElement> _r; | 47 RenderingScheduler<FieldViewElement> _r; |
| 48 | 48 |
| 49 Stream<RenderedEvent<FieldViewElement>> get onRendered => _r.onRendered; | 49 Stream<RenderedEvent<FieldViewElement>> get onRendered => _r.onRendered; |
| 50 | 50 |
| 51 M.VM _vm; | 51 M.VM _vm; |
| 52 M.IsolateRef _isolate; | 52 M.IsolateRef _isolate; |
| 53 M.EventRepository _events; | 53 M.EventRepository _events; |
| 54 M.NotificationRepository _notifications; | 54 M.NotificationRepository _notifications; |
| 55 M.Field _field; | 55 M.Field _field; |
| 56 M.LibraryRef _library; | 56 M.LibraryRef _library; |
| 57 M.FieldRepository _fields; | 57 M.FieldRepository _fields; |
| 58 M.ClassRepository _classes; | 58 M.ClassRepository _classes; |
| 59 M.RetainedSizeRepository _retainedSizes; | 59 M.RetainedSizeRepository _retainedSizes; |
| 60 M.ReachableSizeRepository _reachableSizes; | 60 M.ReachableSizeRepository _reachableSizes; |
| 61 M.InboundReferencesRepository _references; | 61 M.InboundReferencesRepository _references; |
| 62 M.RetainingPathRepository _retainingPaths; | 62 M.RetainingPathRepository _retainingPaths; |
| 63 M.ScriptRepository _scripts; | 63 M.ScriptRepository _scripts; |
| 64 M.InstanceRepository _instances; | 64 M.InstanceRepository _instances; |
| 65 | 65 |
| 66 | |
| 67 M.VMRef get vm => _vm; | 66 M.VMRef get vm => _vm; |
| 68 M.IsolateRef get isolate => _isolate; | 67 M.IsolateRef get isolate => _isolate; |
| 69 M.NotificationRepository get notifications => _notifications; | 68 M.NotificationRepository get notifications => _notifications; |
| 70 M.Field get field => _field; | 69 M.Field get field => _field; |
| 71 | 70 |
| 72 factory FieldViewElement(M.VM vm, M.IsolateRef isolate, M.Field field, | 71 factory FieldViewElement( |
| 73 M.EventRepository events, | 72 M.VM vm, |
| 74 M.NotificationRepository notifications, | 73 M.IsolateRef isolate, |
| 75 M.FieldRepository fields, | 74 M.Field field, |
| 76 M.ClassRepository classes, | 75 M.EventRepository events, |
| 77 M.RetainedSizeRepository retainedSizes, | 76 M.NotificationRepository notifications, |
| 78 M.ReachableSizeRepository reachableSizes, | 77 M.FieldRepository fields, |
| 79 M.InboundReferencesRepository references, | 78 M.ClassRepository classes, |
| 80 M.RetainingPathRepository retainingPaths, | 79 M.RetainedSizeRepository retainedSizes, |
| 81 M.ScriptRepository scripts, | 80 M.ReachableSizeRepository reachableSizes, |
| 82 M.InstanceRepository instances, | 81 M.InboundReferencesRepository references, |
| 83 {RenderingQueue queue}) { | 82 M.RetainingPathRepository retainingPaths, |
| 83 M.ScriptRepository scripts, |
| 84 M.InstanceRepository instances, |
| 85 {RenderingQueue queue}) { |
| 84 assert(vm != null); | 86 assert(vm != null); |
| 85 assert(isolate != null); | 87 assert(isolate != null); |
| 86 assert(events != null); | 88 assert(events != null); |
| 87 assert(notifications != null); | 89 assert(notifications != null); |
| 88 assert(field != null); | 90 assert(field != null); |
| 89 assert(fields != null); | 91 assert(fields != null); |
| 90 assert(classes != null); | 92 assert(classes != null); |
| 91 assert(retainedSizes != null); | 93 assert(retainedSizes != null); |
| 92 assert(reachableSizes != null); | 94 assert(reachableSizes != null); |
| 93 assert(references != null); | 95 assert(references != null); |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 138 header += 'static '; | 140 header += 'static '; |
| 139 } else { | 141 } else { |
| 140 header += 'top-level '; | 142 header += 'top-level '; |
| 141 } | 143 } |
| 142 } | 144 } |
| 143 if (_field.isFinal) { | 145 if (_field.isFinal) { |
| 144 header += 'final '; | 146 header += 'final '; |
| 145 } else if (_field.isConst) { | 147 } else if (_field.isConst) { |
| 146 header += 'const '; | 148 header += 'const '; |
| 147 } | 149 } |
| 148 if (_field.declaredType.name == 'dynamic'){ | 150 if (_field.declaredType.name == 'dynamic') { |
| 149 header += 'var'; | 151 header += 'var'; |
| 150 } else { | 152 } else { |
| 151 header += _field.declaredType.name; | 153 header += _field.declaredType.name; |
| 152 } | 154 } |
| 153 children = [ | 155 children = [ |
| 154 navBar(_createMenu()), | 156 navBar(_createMenu()), |
| 155 new DivElement()..classes = ['content-centered-big'] | 157 new DivElement() |
| 158 ..classes = ['content-centered-big'] |
| 156 ..children = [ | 159 ..children = [ |
| 157 new HeadingElement.h2()..text = '$header ${field.name}', | 160 new HeadingElement.h2()..text = '$header ${field.name}', |
| 158 new HRElement(), | 161 new HRElement(), |
| 159 new ObjectCommonElement(_isolate, _field, _retainedSizes, | 162 new ObjectCommonElement(_isolate, _field, _retainedSizes, |
| 160 _reachableSizes, _references, _retainingPaths, | 163 _reachableSizes, _references, _retainingPaths, _instances, |
| 161 _instances, queue: _r.queue), | 164 queue: _r.queue), |
| 162 new BRElement(), | 165 new BRElement(), |
| 163 new DivElement()..classes = ['memberList'] | 166 new DivElement() |
| 167 ..classes = ['memberList'] |
| 164 ..children = _createMembers(), | 168 ..children = _createMembers(), |
| 165 new HRElement(), | 169 new HRElement(), |
| 166 new DivElement() | 170 new DivElement() |
| 167 ..children = _field.location == null ? const [] | 171 ..children = _field.location == null |
| 168 : [ | 172 ? const [] |
| 169 new ScriptInsetElement(_isolate, _field.location.script, | 173 : [ |
| 170 _scripts, _instances, _events, | 174 new ScriptInsetElement(_isolate, _field.location.script, |
| 171 startPos: field.location.tokenPos, | 175 _scripts, _instances, _events, |
| 172 endPos: field.location.tokenPos, | 176 startPos: field.location.tokenPos, |
| 173 queue: _r.queue) | 177 endPos: field.location.tokenPos, |
| 174 ], | 178 queue: _r.queue) |
| 179 ], |
| 175 new ViewFooterElement(queue: _r.queue) | 180 new ViewFooterElement(queue: _r.queue) |
| 176 ] | 181 ] |
| 177 ]; | 182 ]; |
| 178 } | 183 } |
| 179 | 184 |
| 180 List<Element> _createMenu() { | 185 List<Element> _createMenu() { |
| 181 final menu = [ | 186 final menu = [ |
| 182 new NavTopMenuElement(queue: _r.queue), | 187 new NavTopMenuElement(queue: _r.queue), |
| 183 new NavVMMenuElement(_vm, _events, queue: _r.queue), | 188 new NavVMMenuElement(_vm, _events, queue: _r.queue), |
| 184 new NavIsolateMenuElement(_isolate, _events, queue: _r.queue) | 189 new NavIsolateMenuElement(_isolate, _events, queue: _r.queue) |
| 185 ]; | 190 ]; |
| 186 if (_library != null) { | 191 if (_library != null) { |
| 187 menu.add(new NavLibraryMenuElement(_isolate, _field.dartOwner, | 192 menu.add(new NavLibraryMenuElement(_isolate, _field.dartOwner, |
| 188 queue: _r.queue)); | 193 queue: _r.queue)); |
| 189 } else if (_field.dartOwner is M.ClassRef) { | 194 } else if (_field.dartOwner is M.ClassRef) { |
| 190 menu.add( | 195 menu.add( |
| 191 new NavClassMenuElement(_isolate, _field.dartOwner, queue: _r.queue) | 196 new NavClassMenuElement(_isolate, _field.dartOwner, queue: _r.queue)); |
| 192 ); | |
| 193 } | 197 } |
| 194 menu.addAll([ | 198 menu.addAll([ |
| 195 navMenu(_field.name), | 199 navMenu(_field.name), |
| 196 new NavRefreshElement(queue: _r.queue) | 200 new NavRefreshElement(queue: _r.queue) |
| 197 ..onRefresh.listen((e) { | 201 ..onRefresh.listen((e) { |
| 198 e.element.disabled = true; | 202 e.element.disabled = true; |
| 199 _refresh(); | 203 _refresh(); |
| 200 }), | 204 }), |
| 201 new NavNotifyElement(_notifications, queue: _r.queue) | 205 new NavNotifyElement(_notifications, queue: _r.queue) |
| 202 ]); | 206 ]); |
| 203 return menu; | 207 return menu; |
| 204 } | 208 } |
| 205 | 209 |
| 206 List<Element> _createMembers() { | 210 List<Element> _createMembers() { |
| 207 final members = <Element>[ | 211 final members = <Element>[ |
| 208 new DivElement()..classes = ['memberItem'] | 212 new DivElement() |
| 213 ..classes = ['memberItem'] |
| 209 ..children = [ | 214 ..children = [ |
| 210 new DivElement()..classes = ['memberName'] | 215 new DivElement() |
| 216 ..classes = ['memberName'] |
| 211 ..text = 'owner', | 217 ..text = 'owner', |
| 212 new DivElement()..classes = ['memberName'] | 218 new DivElement() |
| 219 ..classes = ['memberName'] |
| 213 ..children = [ | 220 ..children = [ |
| 214 _field.dartOwner == null | 221 _field.dartOwner == null |
| 215 ? (new SpanElement()..text = '...') | 222 ? (new SpanElement()..text = '...') |
| 216 : anyRef(_isolate, _field.dartOwner, _instances, | 223 : anyRef(_isolate, _field.dartOwner, _instances, |
| 217 queue: _r.queue) | 224 queue: _r.queue) |
| 218 ] | 225 ] |
| 219 ], | 226 ], |
| 220 new DivElement()..classes = ['memberItem'] | 227 new DivElement() |
| 228 ..classes = ['memberItem'] |
| 221 ..children = [ | 229 ..children = [ |
| 222 new DivElement()..classes = ['memberName'] | 230 new DivElement() |
| 231 ..classes = ['memberName'] |
| 223 ..text = 'script', | 232 ..text = 'script', |
| 224 new DivElement()..classes = ['memberName'] | 233 new DivElement() |
| 234 ..classes = ['memberName'] |
| 225 ..children = [ | 235 ..children = [ |
| 226 new SourceLinkElement(_isolate, field.location, _scripts, | 236 new SourceLinkElement(_isolate, field.location, _scripts, |
| 227 queue: _r.queue) | 237 queue: _r.queue) |
| 228 ] | 238 ] |
| 229 ] | 239 ] |
| 230 ]; | 240 ]; |
| 231 if (!_field.isStatic) { | 241 if (!_field.isStatic) { |
| 232 members.add( | 242 members.add(new DivElement() |
| 233 new DivElement()..classes = ['memberItem'] | 243 ..classes = ['memberItem'] |
| 234 ..title = 'The types observed for this field at runtime. ' | 244 ..title = 'The types observed for this field at runtime. ' |
| 235 'Fields that are observed to have a single type at runtime ' | 245 'Fields that are observed to have a single type at runtime ' |
| 236 'or to never be null may allow for additional optimization.' | 246 'or to never be null may allow for additional optimization.' |
| 237 ..children = [ | 247 ..children = [ |
| 238 new DivElement()..classes = ['memberName'] | 248 new DivElement() |
| 239 ..text = 'observed types', | 249 ..classes = ['memberName'] |
| 240 new DivElement()..classes = ['memberName'] | 250 ..text = 'observed types', |
| 241 ..children = _createGuard() | 251 new DivElement() |
| 242 ] | 252 ..classes = ['memberName'] |
| 243 ); | 253 ..children = _createGuard() |
| 254 ]); |
| 244 } | 255 } |
| 245 if (_field.staticValue != null) { | 256 if (_field.staticValue != null) { |
| 246 members.add( | 257 members.add(new DivElement() |
| 247 new DivElement()..classes = ['memberItem'] | 258 ..classes = ['memberItem'] |
| 248 ..children = [ | 259 ..children = [ |
| 249 new DivElement()..classes = ['memberName'] | 260 new DivElement() |
| 250 ..text = 'static value', | 261 ..classes = ['memberName'] |
| 251 new DivElement()..classes = ['memberName'] | 262 ..text = 'static value', |
| 252 ..children = [ | 263 new DivElement() |
| 253 anyRef(_isolate, _field.staticValue, _instances, | 264 ..classes = ['memberName'] |
| 254 queue: _r.queue) | 265 ..children = [ |
| 255 ] | 266 anyRef(_isolate, _field.staticValue, _instances, queue: _r.queue) |
| 256 ] | 267 ] |
| 257 ); | 268 ]); |
| 258 } | 269 } |
| 259 return members; | 270 return members; |
| 260 } | 271 } |
| 261 | 272 |
| 262 List<Element> _createGuard() { | 273 List<Element> _createGuard() { |
| 263 final guard = <Element>[]; | 274 final guard = <Element>[]; |
| 264 switch (_field.guardClassKind) { | 275 switch (_field.guardClassKind) { |
| 265 case M.GuardClassKind.unknown: | 276 case M.GuardClassKind.unknown: |
| 266 guard.add(new SpanElement()..text = 'none'); | 277 guard.add(new SpanElement()..text = 'none'); |
| 267 break; | 278 break; |
| 268 case M.GuardClassKind.dynamic: | 279 case M.GuardClassKind.dynamic: |
| 269 guard.add(new SpanElement()..text = 'various'); | 280 guard.add(new SpanElement()..text = 'various'); |
| 270 break; | 281 break; |
| 271 case M.GuardClassKind.single: | 282 case M.GuardClassKind.single: |
| 272 guard.add(new ClassRefElement(_isolate, _field.guardClass, | 283 guard.add( |
| 273 queue: _r.queue)); | 284 new ClassRefElement(_isolate, _field.guardClass, queue: _r.queue)); |
| 274 break; | 285 break; |
| 275 } | 286 } |
| 276 guard.add(new SpanElement() | 287 guard.add(new SpanElement() |
| 277 ..text = _field.guardNullable ? '— null observed' : '— null not observed' | 288 ..text = |
| 278 ); | 289 _field.guardNullable ? '— null observed' : '— null not observed'); |
| 279 return guard; | 290 return guard; |
| 280 } | 291 } |
| 281 | 292 |
| 282 Future _refresh() async { | 293 Future _refresh() async { |
| 283 _field = await _fields.get(_isolate, _field.id); | 294 _field = await _fields.get(_isolate, _field.id); |
| 284 if (_field.dartOwner is M.LibraryRef) { | 295 if (_field.dartOwner is M.LibraryRef) { |
| 285 _library = _field.dartOwner; | 296 _library = _field.dartOwner; |
| 286 } else if (_field.dartOwner is M.ClassRef) { | 297 } else if (_field.dartOwner is M.ClassRef) { |
| 287 _library = (await _classes.get(_isolate, _field.dartOwner.id)).library; | 298 _library = (await _classes.get(_isolate, _field.dartOwner.id)).library; |
| 288 } | 299 } |
| 289 _r.dirty(); | 300 _r.dirty(); |
| 290 } | 301 } |
| 291 } | 302 } |
| OLD | NEW |