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

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

Powered by Google App Engine
This is Rietveld 408576698