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

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

Issue 2204563003: Converted Observatory cpu-profile element (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Refactoring Created 4 years, 4 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
(Empty)
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
3 // BSD-style license that can be found in the LICENSE file.
4
5 import 'dart:async';
6 import 'dart:html';
7 import 'package:observatory/models.dart' as M;
8 import 'package:observatory/src/elements/helpers/rendering_scheduler.dart';
9 import 'package:observatory/src/elements/helpers/tag.dart';
10
11 enum ProfileTreeMode {
12 code,
13 function,
14 }
15
16 class StackTraceTreeConfigChangedEvent {
17 final StackTraceTreeConfigElement element;
18 StackTraceTreeConfigChangedEvent(this.element);
19 }
20
21 class StackTraceTreeConfigElement extends HtmlElement implements Renderable {
22 static const tag =
23 const Tag<StackTraceTreeConfigElement>('stack-trace-tree-config');
24
25 RenderingScheduler<StackTraceTreeConfigElement> _r;
26
27 Stream<RenderedEvent<StackTraceTreeConfigElement>> get onRendered =>
28 _r.onRendered;
29
30 StreamController<StackTraceTreeConfigChangedEvent> _onModeChange =
31 new StreamController<StackTraceTreeConfigChangedEvent>.broadcast();
32 StreamController<StackTraceTreeConfigChangedEvent> _onDirectionChange =
33 new StreamController<StackTraceTreeConfigChangedEvent>.broadcast();
34 StreamController<StackTraceTreeConfigChangedEvent> _onFilterChange =
35 new StreamController<StackTraceTreeConfigChangedEvent>.broadcast();
36 Stream<StackTraceTreeConfigChangedEvent> get onModeChange =>
37 _onModeChange.stream;
38 Stream<StackTraceTreeConfigChangedEvent> get onDirectionChange =>
39 _onDirectionChange.stream;
40 Stream<StackTraceTreeConfigChangedEvent> get onFilterChange =>
41 _onFilterChange.stream;
42
43 bool _showMode;
44 bool _showDirection;
45 bool _showFilter;
46 ProfileTreeMode _mode;
47 M.ProfileTreeDirection _direction;
48 String _filter;
49
50 bool get showMode => _showMode;
51 bool get showDirection => _showDirection;
52 bool get showFilter => _showFilter;
53 ProfileTreeMode get mode => _mode;
54 M.ProfileTreeDirection get direction => _direction;
55 String get filter => _filter;
56
57 set showMode(bool value) => _showMode = _r.checkAndReact(_showMode, value);
58 set showDirection(bool value) =>
59 _showDirection = _r.checkAndReact(_showDirection, value);
60 set showFilter(bool value) =>
61 _showFilter = _r.checkAndReact(_showFilter, value);
62 set mode(ProfileTreeMode value) => _mode = _r.checkAndReact(_mode, value);
63 set direction(M.ProfileTreeDirection value) =>
64 _direction = _r.checkAndReact(_direction, value);
65 set filter(String value) => _filter = _r.checkAndReact(_filter, value);
66
67 factory StackTraceTreeConfigElement({bool showMode: true,
68 bool showDirection: true, bool showFilter: true, String filter: '',
69 ProfileTreeMode mode: ProfileTreeMode.function,
70 M.ProfileTreeDirection direction: M.ProfileTreeDirection.exclusive,
71 RenderingQueue queue}) {
72 assert(showMode != null);
73 assert(showDirection != null);
74 assert(showFilter != null);
75 assert(mode != null);
76 assert(direction != null);
77 assert(filter != null);
78 StackTraceTreeConfigElement e = document.createElement(tag.name);
79 e._r = new RenderingScheduler(e, queue: queue);
80 e._showMode = showMode;
81 e._showDirection = showDirection;
82 e._showFilter = showFilter;
83 e._mode = mode;
84 e._direction = direction;
85 e._filter = filter;
86 return e;
87 }
88
89 StackTraceTreeConfigElement.created() : super.created();
90
91 @override
92 void attached() {
93 super.attached();
94 _r.enable();
95 }
96
97 @override
98 void detached() {
99 super.detached(); _r.disable(notify: true);
100 children = const [];
101 }
102
103 void render() {
104 children = [
105 new DivElement()..classes = ['content-centered-big']
106 ..children = [
107 new HeadingElement.h2()..text = 'Tree display',
108 new HRElement(),
109 new DivElement()..classes = ['row']
110 ..children = [
111 new DivElement()..classes = ['memberList']
112 ..children = _createMembers()
113 ]
114 ]
115 ];
116 }
117
118 List<Element> _createMembers() {
119 var members = <Element>[];
120 if (_showMode) {
121 members.add(
122 new DivElement()..classes = ['memberItem']
123 ..children = [
124 new DivElement()..classes = ['memberName']..text = 'Mode',
125 new DivElement()..classes = ['memberValue']
126 ..children = _createModeSelect()
127 ]
128 );
129 }
130 if (_showDirection) {
131 members.add(
132 new DivElement()..classes = ['memberItem']
133 ..children = [
134 new DivElement()..classes = ['memberName']
135 ..text = 'Call Tree Direction',
136 new SpanElement()..classes = ['memberValue']
137 ..children = _createDirectionSelect()
138 ]
139 );
140 }
141 if (showFilter) {
142 members.add(
143 new DivElement()..classes = ['memberItem']
144 ..children = [
145 new DivElement()..classes = ['memberName']
146 ..text = 'Call Tree Filter'
147 ..title = 'case-sensitive substring match',
148 new SpanElement()..classes = ['memberValue']
149 ..children = _createFilter()
150 ]
151 );
152 }
153 return members;
154 }
155
156 List<Element> _createModeSelect() {
157 var s;
158 return [
159 s = new SelectElement()..value = modeToString(_mode)
160 ..children = ProfileTreeMode.values.map((mode) {
161 return new OptionElement(value : modeToString(mode),
162 selected: _mode == mode)
163 ..text = modeToString(mode);
164 }).toList(growable: false)
165 ..onChange.listen((_) {
166 _mode = ProfileTreeMode.values[s.selectedIndex];
167 })
168 ..onChange.map(_toEvent).listen(_triggerModeChange),
169 ];
170 }
171
172 List<Element> _createDirectionSelect() {
173 var s;
174 return [
175 s = new SelectElement()..value = directionToString(_direction)
176 ..children = M.ProfileTreeDirection.values.map((direction) {
177 return new OptionElement(value: directionToString(direction),
178 selected: _direction == direction)
179 ..text = directionToString(direction);
180 }).toList(growable: false)
181 ..onChange.listen((_) {
182 _direction = M.ProfileTreeDirection.values[s.selectedIndex];
183 })
184 ..onChange.map(_toEvent).listen(_triggerDirectionChange),
185 new SpanElement()..text = 'Tree is rooted at ' +
186 (_direction == 'Down' ? '"main"' : 'function / code') +
187 '. Child nodes are callers.'
188 ];
189 }
190
191 List<Element> _createFilter(){
192 var t;
193 return [
194 t = new TextInputElement()..placeholder = 'Search filter'
195 ..value = filter
196 ..onChange.listen((_) { _filter = t.value; })
197 ..onChange.map(_toEvent).listen(_triggerFilterChange)
198 ];
199 }
200
201 static String modeToString(ProfileTreeMode mode) {
202 switch (mode) {
203 case ProfileTreeMode.code: return 'Code';
204 case ProfileTreeMode.function: return 'Function';
205 }
206 throw new Exception('Unknown ProfileTreeMode');
207 }
208
209 static String directionToString(M.ProfileTreeDirection direction) {
210 switch (direction) {
211 case M.ProfileTreeDirection.inclusive: return 'Top down';
212 case M.ProfileTreeDirection.exclusive: return 'Bottom up';
213 }
214 throw new Exception('Unknown ProfileTreeDirection');
215 }
216
217 StackTraceTreeConfigChangedEvent _toEvent(_) {
218 return new StackTraceTreeConfigChangedEvent(this);
219 }
220
221 void _triggerModeChange(e) => _onModeChange.add(e);
222 void _triggerDirectionChange(e) => _onDirectionChange.add(e);
223 void _triggerFilterChange(e) => _onFilterChange.add(e);
224
225
226 }
227
228 /*<link rel="import" href="../../../../packages/polymer/polymer.html">
Cutch 2016/08/04 15:35:52 delete commented out code
cbernaschina 2016/08/04 19:45:08 Done.
229
230 <polymer-element name="stack-trace-tree-config">
231 <template>
232 <link rel="stylesheet" href="css/shared.css">
233 <style>
234 .statusBox {
235 height: 100%;
236 padding: 0.5em;
237 }
238 .row {
239 display: flex;
240 }
241 </style>
242 <div class="content-centered-big">
243 <template if="{{ show }}">
244 <h2>Tree display</h2>
245 <hr>
246 <div class="row">
247 <div>
248 <div class="memberList">
249 <template if="{{ showModeSelector }}">
250 <div class="memberItem">
251 <div class="memberName">Mode</div>
252 <div class="memberValue">
253 <select value="{{modeSelector}}">
254 <option value="Code">Code</option>
255 <option value="Function">Function</option>
256 </select>
257 </div>
258 </div>
259 </template>
260 <template if="{{ showDirectionSelector }}">
261 <div class="memberItem">
262 <div class="memberName">Call Tree Direction</div>
263 <span class="memberValue">
264 <select value="{{directionSelector}}">
265 <option value="Down">Top down</option>
266 <option value="Up">Bottom up</option>
267 </select>
268 <template if="{{ directionSelector == 'Down' }}">
269 <span>
270 Tree is rooted at "main". Child nodes are callees.
271 </span>
272 </template>
273 <template if="{{ directionSelector == 'Up' }}">
274 <span>
275 Tree is rooted at executing function / code. Child nodes are callers.
276 </span>
277 </template>
278 </span>
279 </div>
280 </template>
281 <template if="{{ showFilter }}">
282 <div class="memberItem">
283 <div title="case-sensitive substring match" class="memberName" >Call Tree Filter</div>
284 <span class="memberValue">
285 <input type="text" placeholder="Search filter" id="filterInp ut">
286 </span>
287 </div>
288 </template>
289 </div>
290 </div>
291 </div>
292 </template>
293 </div>
294 </template>
295 </polymer-element>
296
297 <script type="application/dart" src="stack_trace_tree_config.dart"></script>*/
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698