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

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: Merged with master 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()..classes = ['mode-select']
160 ..value = modeToString(_mode)
161 ..children = ProfileTreeMode.values.map((mode) {
162 return new OptionElement(value : modeToString(mode),
163 selected: _mode == mode)
164 ..text = modeToString(mode);
165 }).toList(growable: false)
166 ..onChange.listen((_) {
167 _mode = ProfileTreeMode.values[s.selectedIndex];
168 })
169 ..onChange.map(_toEvent).listen(_triggerModeChange),
170 ];
171 }
172
173 List<Element> _createDirectionSelect() {
174 var s;
175 return [
176 s = new SelectElement()..classes = ['direction-select']
177 ..value = directionToString(_direction)
178 ..children = M.ProfileTreeDirection.values.map((direction) {
179 return new OptionElement(value: directionToString(direction),
180 selected: _direction == direction)
181 ..text = directionToString(direction);
182 }).toList(growable: false)
183 ..onChange.listen((_) {
184 _direction = M.ProfileTreeDirection.values[s.selectedIndex];
185 })
186 ..onChange.map(_toEvent).listen(_triggerDirectionChange),
187 new SpanElement()..text = 'Tree is rooted at ' +
188 (_direction == 'Down' ? '"main"' : 'function / code') +
189 '. Child nodes are callers.'
190 ];
191 }
192
193 List<Element> _createFilter(){
194 var t;
195 return [
196 t = new TextInputElement()..placeholder = 'Search filter'
197 ..value = filter
198 ..onChange.listen((_) { _filter = t.value; })
199 ..onChange.map(_toEvent).listen(_triggerFilterChange)
200 ];
201 }
202
203 static String modeToString(ProfileTreeMode mode) {
204 switch (mode) {
205 case ProfileTreeMode.code: return 'Code';
206 case ProfileTreeMode.function: return 'Function';
207 }
208 throw new Exception('Unknown ProfileTreeMode');
209 }
210
211 static String directionToString(M.ProfileTreeDirection direction) {
212 switch (direction) {
213 case M.ProfileTreeDirection.inclusive: return 'Top down';
214 case M.ProfileTreeDirection.exclusive: return 'Bottom up';
215 }
216 throw new Exception('Unknown ProfileTreeDirection');
217 }
218
219 StackTraceTreeConfigChangedEvent _toEvent(_) {
220 return new StackTraceTreeConfigChangedEvent(this);
221 }
222
223 void _triggerModeChange(e) => _onModeChange.add(e);
224 void _triggerDirectionChange(e) => _onDirectionChange.add(e);
225 void _triggerFilterChange(e) => _onFilterChange.add(e);
226
227
228 }
OLDNEW
« no previous file with comments | « runtime/observatory/lib/src/elements/service_view.html ('k') | runtime/observatory/lib/src/models/objects/error.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698