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

Side by Side Diff: runtime/observatory/lib/src/elements/vm_connect.dart

Issue 2180803002: Converted Observatory vm-connect element (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Removed temporary commented code Created 4 years, 5 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
OLDNEW
1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2014, 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 vm_connect_element; 5 library vm_connect_element;
6 6
7 import 'dart:html';
8 import 'dart:async';
7 import 'dart:convert'; 9 import 'dart:convert';
8 import 'dart:html'; 10 import 'package:observatory/models.dart' as M;
11 import 'package:observatory/src/elements/helpers/tag.dart';
12 import 'package:observatory/src/elements/helpers/rendering_scheduler.dart';
13 import 'package:observatory/src/elements/nav/bar.dart';
14 import 'package:observatory/src/elements/nav/notify.dart';
15 import 'package:observatory/src/elements/nav/top_menu.dart';
16 import 'package:observatory/src/elements/view_footer.dart';
17 import 'package:observatory/src/elements/vm_connect_target.dart';
9 18
10 import 'observatory_element.dart'; 19 class VMConnectElement extends HtmlElement implements Renderable{
11 import 'package:observatory/elements.dart'; 20 static const tag = const Tag<VMConnectElement>('vm-connect',
12 import 'package:observatory/service_html.dart'; 21 dependencies: const [NavBarElement.tag,
13 import 'package:polymer/polymer.dart'; 22 NavTopMenuElement.tag,
23 NavNotifyElement.tag,
24 ViewFooterElement.tag,
25 VMConnectTargetElement.tag]);
14 26
15 @CustomTag('vm-connect') 27 RenderingScheduler _r;
16 class VMConnectElement extends ObservatoryElement {
17 @published String standaloneVmAddress = '';
18 28
19 VMConnectElement.created() : super.created() { 29 Stream<RenderedEvent<VMConnectElement>> get onRendered => _r.onRendered;
30
31 M.DumpRepository _dump;
32 M.NotificationRepository _notifications;
33 M.TargetRepository _targets;
34 StreamSubscription _targetsSubscription;
35
36 String _address = '';
37
38 factory VMConnectElement(M.TargetRepository targets,
39 M.DumpRepository dump,
40 M.NotificationRepository notifications,
41 {RenderingQueue queue}) {
42 assert(dump != null);
43 assert(notifications != null);
44 assert(targets != null);
45 VMConnectElement e = document.createElement(tag.name);
46 e._r = new RenderingScheduler(e, queue: queue);
47 e._dump = dump;
48 e._notifications = notifications;
49 e._targets = targets;
50 return e;
20 } 51 }
21 52
22 void _connect(WebSocketVMTarget target) { 53 VMConnectElement.created() : super.created();
23 app.vm = new WebSocketVM(target); 54
24 app.locationManager.goForwardingParameters('/vm'); 55 @override
56 void attached() {
57 super.attached(); _r.enable();
58 _targetsSubscription = _targets.onChange.listen((_) => _r.dirty());
25 } 59 }
26 60
27 @override 61 @override
28 void attached() { 62 void detached() {
29 super.attached(); 63 super.detached(); children = []; _r.disable(notify: true);
30 var fileInput = shadowRoot.querySelector('#crashDumpFile'); 64 _targetsSubscription.cancel(); _targetsSubscription = null;
31 fileInput.onChange.listen(_onCrashDumpFileChange);
32 } 65 }
33 66
34 String _normalizeStandaloneAddress(String networkAddress) { 67 void render() {
68 children = [
69 new NavBarElement(queue: _r.queue)
70 ..children = [
71 new NavTopMenuElement(last: true, queue: _r.queue),
72 new NavNotifyElement(_notifications, queue: _r.queue)
73 ],
74 new DivElement()
75 ..classes = ['content-centered']
76 ..children = [
77 new HeadingElement.h1()..text = 'Connect to a Dart VM',
78 new BRElement(), new HRElement(),
79 new DivElement()
80 ..classes = ['flex-row']
81 ..children = [
82 new DivElement()
83 ..classes = ['flex-item-40-percent']
84 ..children = [
85 new HeadingElement.h2()..text = 'WebSocket',
86 new BRElement(),
87 new UListElement()
88 ..children = _targets.list().map((target) {
89 return new LIElement()
90 ..children = [new VMConnectTargetElement(target,
91 current: target == _targets.current, queue: _r.queue)
92 ..onConnect.listen(_connect)
93 ..onDelete.listen(_delete)
94 ];
95 }),
96 new HRElement(),
97 new FormElement()
98 ..autocomplete = 'on'
99 ..children = [
100 _createAddressBox(),
101 new SpanElement()..text = ' ',
102 new ButtonElement()
103 ..text = 'Connect'
104 ..onClick.listen((e) {
105 e.preventDefault(); _create(); }),
106 ],
107 new BRElement(),
108 new PreElement()
109 ..classes = ['well']
110 ..text = 'Run Standalone with: \'--observe\'',
111 new HRElement()
112 ],
113 new DivElement()
114 ..classes = ['flex-item-20-percent'],
115 new DivElement()
116 ..classes = ['flex-item-40-percent']
117 ..children = [
118 new HeadingElement.h2()..text = 'Crash dump',
119 new BRElement(),
120 _createCrushDumpLoader(),
121 new BRElement(), new BRElement(),
122 new PreElement()
123 ..classes = ['well']
124 ..text = 'Request a crash dump with:\n'
125 '\'curl localhost:8181/_getCrashDump > dump.json\'',
126 new HRElement()
127 ]
128 ],
129 ],
130 new ViewFooterElement(queue: _r.queue)
131 ];
132 }
133
134 TextInputElement _createAddressBox() {
135 var textbox = new TextInputElement()
136 ..classes = ['textbox']
137 ..placeholder = 'localhost:8181'
138 ..value = _address;
139 textbox.onChange.listen((e) {
140 _address = textbox.value;
141 });
142 return textbox;
143 }
144
145 FileUploadInputElement _createCrushDumpLoader() {
146 FileUploadInputElement e = new FileUploadInputElement()
147 ..id = 'crashDumpFile';
148 e.onChange.listen((_) {
149 var reader = new FileReader();
150 reader.readAsText(e.files[0]);
151 reader.onLoad.listen((_) {
152 var crashDump = JSON.decode(reader.result);
153 _dump.load(crashDump);
154 });
155 });
156 return e;
157 }
158 void _create() {
159 if (_address == null || _address.isEmpty) return;
160 _targets.add(_normalizeStandaloneAddress(_address));
161 }
162 void _connect(TargetEvent e) => _targets.setCurrent(e.target);
163 void _delete(TargetEvent e) => _targets.delete(e.target);
164
165 static String _normalizeStandaloneAddress(String networkAddress) {
35 if (networkAddress.startsWith('ws://')) { 166 if (networkAddress.startsWith('ws://')) {
36 return networkAddress; 167 return networkAddress;
37 } 168 }
38 return 'ws://${networkAddress}/ws'; 169 return 'ws://${networkAddress}/ws';
39 } 170 }
40
41 void connectStandalone(Event e, var detail, Node target) {
42 // Prevent any form action.
43 e.preventDefault();
44 if (standaloneVmAddress == null) {
45 return;
46 }
47 if (standaloneVmAddress.isEmpty) {
48 return;
49 }
50 var targetAddress = _normalizeStandaloneAddress(standaloneVmAddress);
51 var target = app.targets.findOrMake(targetAddress);
52 _connect(target);
53 }
54
55 _onCrashDumpFileChange(e) {
56 var fileInput = shadowRoot.querySelector('#crashDumpFile');
57 var reader = new FileReader();
58 reader.readAsText(fileInput.files[0]);
59 reader.onLoad.listen((_) {
60 var crashDump = JSON.decode(reader.result);
61 app.loadCrashDump(crashDump);
62 });
63 }
64 } 171 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698