| // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
| // for details. All rights reserved. Use of this source code is governed by a |
| // BSD-style license that can be found in the LICENSE file. |
| |
| library inbound_reference_element; |
| |
| import 'dart:async'; |
| import 'package:polymer/polymer.dart'; |
| import 'package:observatory/service.dart'; |
| import 'service_ref.dart'; |
| |
| @CustomTag('inbound-reference') |
| class InboundReferenceElement extends ServiceRefElement { |
| InboundReferenceElement.created() : super.created(); |
| |
| dynamic get slot => ref['slot']; |
| bool get slotIsArrayIndex => slot is num; |
| bool get slotIsField => slot is ServiceMap && slot['type'] == '@Field'; |
| |
| ServiceObject get source => ref['source']; |
| |
| // I.e., inbound references to 'source' for recursive pointer chasing. |
| @observable ObservableList inboundReferences; |
| Future<ServiceObject> fetchInboundReferences(arg) { |
| return source.isolate.get(source.id + "/inbound_references?limit=$arg") |
| .then((ServiceMap response) { |
| inboundReferences = new ObservableList.from(response['references']); |
| }); |
| } |
| |
| // TODO(turnidge): This is here to workaround vm/dart2js differences. |
| dynamic expander() { |
| return expandEvent; |
| } |
| |
| void expandEvent(bool expand, var done) { |
| assert(ref is ServiceMap); |
| if (expand) { |
| fetchInboundReferences(100).then((result) { |
| notifyPropertyChange(#ref, 0, 1); |
| }).whenComplete(done); |
| } else { |
| ServiceMap refMap = ref; |
| refMap['fields'] = null; |
| refMap['elements'] = null; |
| done(); |
| } |
| } |
| } |