| // 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. |
| |
| import 'dart:html'; |
| import 'dart:async'; |
| |
| import 'package:observatory/app.dart'; |
| import 'package:observatory/models.dart' show IsolateUpdateEvent; |
| import 'package:observatory/mocks.dart' show IsolateUpdateEventMock; |
| import 'package:observatory/service_html.dart' show Isolate; |
| import 'package:observatory/src/elements/isolate_ref.dart'; |
| import 'package:observatory/src/elements/helpers/tag.dart'; |
| import 'package:observatory/src/elements/shims/binding.dart'; |
| |
| class IsolateRefElementWrapper extends HtmlElement { |
| |
| static final binder = new Binder<IsolateRefElementWrapper>( |
| const [const Binding('ref')]); |
| |
| static const tag = const Tag<IsolateRefElementWrapper>('isolate-ref'); |
| |
| final StreamController<IsolateUpdateEvent> _updatesController = |
| new StreamController<IsolateUpdateEvent>(); |
| Stream<IsolateUpdateEvent> _updates; |
| StreamSubscription _subscription; |
| |
| Isolate _isolate; |
| Isolate get ref => _isolate; |
| void set ref(Isolate ref) { _isolate = ref; _detached(); _attached(); } |
| |
| IsolateRefElementWrapper.created() : super.created() { |
| _updates = _updatesController.stream.asBroadcastStream(); |
| binder.registerCallback(this); |
| createShadowRoot(); |
| render(); |
| } |
| |
| @override |
| void attached() { |
| super.attached(); |
| _attached(); |
| } |
| |
| void _attached() { |
| if (ref != null) { |
| _subscription = ref.changes.listen((_) { |
| _updatesController.add(new IsolateUpdateEventMock(isolate: ref)); |
| }); |
| } |
| render(); |
| } |
| |
| @override |
| void detached() { |
| super.detached(); |
| _detached(); |
| } |
| |
| void _detached() { |
| if (_subscription != null) { |
| _subscription.cancel(); |
| _subscription = null; |
| } |
| } |
| |
| void render() { |
| shadowRoot.children = []; |
| if (ref == null) return; |
| |
| shadowRoot.children = [ |
| new StyleElement() |
| ..text = '@import "packages/observatory/src/elements/css/shared.css";', |
| new IsolateRefElement(_isolate, _updates, |
| queue: ObservatoryApplication.app.queue) |
| ]; |
| } |
| } |