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

Side by Side Diff: patch

Issue 2217723004: Converted Observatory isolate-summary element (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Added final tests 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
« no previous file with comments | « no previous file | pkg/pkg.gyp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 Index: runtime/observatory/lib/src/elements/observatory_application.html
2 diff --git a/runtime/observatory/lib/src/elements/observatory_application.html b /runtime/observatory/lib/src/elements/observatory_application.html
Cutch 2016/08/09 20:04:22 delete this.
cbernaschina 2016/08/09 20:06:47 Done.
3 deleted file mode 100644
4 index d91819f0d4bddb2551c812f83a8dd25cf2d6b0d3..00000000000000000000000000000000 00000000
5 --- a/runtime/observatory/lib/src/elements/observatory_application.html
6 +++ /dev/null
7 @@ -1,8 +0,0 @@
8 -<link rel="import" href="../../../../packages/polymer/polymer.html">
9 -
10 -<link rel="import" href="service_view.html">
11 -<polymer-element name="observatory-application">
12 - <!-- This element explicitly manages its child elements -->
13 -</polymer-element>
14 -
15 -<script type="application/dart" src="observatory_application.dart"></script>
16 \ No newline at end of file
17 Index: runtime/observatory/lib/elements.dart
18 diff --git a/runtime/observatory/lib/elements.dart b/runtime/observatory/lib/ele ments.dart
19 index ecc32ac42ff3985eaffa3a763afb3080d711ce5f..c021ab5b86c5e8a6f75f9119ef08204c ff6f9a46 100644
20 --- a/runtime/observatory/lib/elements.dart
21 +++ b/runtime/observatory/lib/elements.dart
22 @@ -36,7 +36,6 @@ export 'package:observatory/src/elements/object_common.dart';
23 export 'package:observatory/src/elements/object_view.dart';
24 export 'package:observatory/src/elements/objectpool_view.dart';
25 export 'package:observatory/src/elements/objectstore_view.dart';
26 -export 'package:observatory/src/elements/observatory_application.dart';
27 export 'package:observatory/src/elements/observatory_element.dart';
28 export 'package:observatory/src/elements/persistent_handles.dart';
29 export 'package:observatory/src/elements/ports.dart';
30 @@ -65,6 +64,9 @@ import 'package:observatory/src/elements/flag_list.dart';
31 import 'package:observatory/src/elements/function_ref.dart';
32 import 'package:observatory/src/elements/function_ref_wrapper.dart';
33 import 'package:observatory/src/elements/general_error.dart';
34 +import 'package:observatory/src/elements/isolate/counter_chart.dart';
35 +import 'package:observatory/src/elements/isolate/shared_summary.dart';
36 +import 'package:observatory/src/elements/isolate/shared_summary_wrapper.dart';
37 import 'package:observatory/src/elements/isolate_ref.dart';
38 import 'package:observatory/src/elements/isolate_ref_wrapper.dart';
39 import 'package:observatory/src/elements/library_ref.dart';
40 @@ -90,6 +92,7 @@ import 'package:observatory/src/elements/nav/top_menu.dart';
41 import 'package:observatory/src/elements/nav/top_menu_wrapper.dart';
42 import 'package:observatory/src/elements/nav/vm_menu.dart';
43 import 'package:observatory/src/elements/nav/vm_menu_wrapper.dart';
44 +import 'package:observatory/src/elements/observatory_application.dart';
45 import 'package:observatory/src/elements/script_ref.dart';
46 import 'package:observatory/src/elements/script_ref_wrapper.dart';
47 import 'package:observatory/src/elements/source_link.dart';
48 @@ -110,6 +113,7 @@ export 'package:observatory/src/elements/error_ref.dart';
49 export 'package:observatory/src/elements/flag_list.dart';
50 export 'package:observatory/src/elements/function_ref.dart';
51 export 'package:observatory/src/elements/general_error.dart';
52 +export 'package:observatory/src/elements/isolate/counter_chart.dart';
53 export 'package:observatory/src/elements/isolate_ref.dart';
54 export 'package:observatory/src/elements/library_ref.dart';
55 export 'package:observatory/src/elements/nav/bar.dart';
56 @@ -124,6 +128,7 @@ export 'package:observatory/src/elements/nav/notify_exceptio n.dart';
57 export 'package:observatory/src/elements/nav/refresh.dart';
58 export 'package:observatory/src/elements/nav/top_menu.dart';
59 export 'package:observatory/src/elements/nav/vm_menu.dart';
60 +export 'package:observatory/src/elements/observatory_application.dart';
61 export 'package:observatory/src/elements/script_ref.dart';
62 export 'package:observatory/src/elements/source_link.dart';
63 export 'package:observatory/src/elements/view_footer.dart';
64 @@ -146,6 +151,9 @@ Future initElements() async {
65 FunctionRefElement.tag.ensureRegistration();
66 FunctionRefElementWrapper.tag.ensureRegistration();
67 GeneralErrorElement.tag.ensureRegistration();
68 + IsolateCounterChartElement.tag.ensureRegistration();
69 + IsolateSharedSummaryElement.tag.ensureRegistration();
70 + IsolateSharedSummaryElementWrapper.tag.ensureRegistration();
71 IsolateRefElement.tag.ensureRegistration();
72 IsolateRefElementWrapper.tag.ensureRegistration();
73 LibraryRefElement.tag.ensureRegistration();
74 @@ -171,6 +179,8 @@ Future initElements() async {
75 NavTopMenuElementWrapper.tag.ensureRegistration();
76 NavVMMenuElement.tag.ensureRegistration();
77 NavVMMenuElementWrapper.tag.ensureRegistration();
78 + ObservatoryApplicationElement.tag.ensureRegistration();
79 + ScriptRefElement.tag.ensureRegistration();
80 ScriptRefElement.tag.ensureRegistration();
81 ScriptRefElementWrapper.tag.ensureRegistration();
82 SourceLinkElement.tag.ensureRegistration();
83 Index: runtime/observatory/lib/elements.html
84 diff --git a/runtime/observatory/lib/elements.html b/runtime/observatory/lib/ele ments.html
85 index 2b42d474fa00953956a57c1d791cb1d1debe6dca..0af52face915870548839792d69ea400 9a34c5af 100644
86 --- a/runtime/observatory/lib/elements.html
87 +++ b/runtime/observatory/lib/elements.html
88 @@ -29,11 +29,11 @@
89 <link rel="import" href="src/elements/object_view.html">
90 <link rel="import" href="src/elements/objectpool_view.html">
91 <link rel="import" href="src/elements/objectstore_view.html">
92 -<link rel="import" href="src/elements/observatory_application.html">
93 <link rel="import" href="src/elements/persistent_handles.html">
94 <link rel="import" href="src/elements/ports.html">
95 <link rel="import" href="src/elements/script_inset.html">
96 <link rel="import" href="src/elements/script_view.html">
97 <link rel="import" href="src/elements/service_ref.html">
98 +<link rel="import" href="src/elements/service_view.html">
99 <link rel="import" href="src/elements/timeline_page.html">
100 <link rel="import" href="src/elements/vm_view.html">
101 Index: runtime/observatory/lib/models.dart
102 diff --git a/runtime/observatory/lib/models.dart b/runtime/observatory/lib/model s.dart
103 index ded6d78a5fa6f9945396d4818c644796cd0b1bab..497d7b059badc971ed35503819670f08 8c582fbe 100644
104 --- a/runtime/observatory/lib/models.dart
105 +++ b/runtime/observatory/lib/models.dart
106 @@ -17,6 +17,7 @@ part 'src/models/objects/extension_data.dart';
107 part 'src/models/objects/flag.dart';
108 part 'src/models/objects/frame.dart';
109 part 'src/models/objects/function.dart';
110 +part 'src/models/objects/heap_space.dart';
111 part 'src/models/objects/instance.dart';
112 part 'src/models/objects/isolate.dart';
113 part 'src/models/objects/library.dart';
114 Index: runtime/observatory/lib/src/elements/css/shared.css
115 diff --git a/runtime/observatory/lib/src/elements/css/shared.css b/runtime/obser vatory/lib/src/elements/css/shared.css
116 index e468fc8610774c316a1b3c8b7b6fed2c6152627c..9b200ef9b6f5ea2d4276ad13e25c0beb 47b9584b 100644
117 --- a/runtime/observatory/lib/src/elements/css/shared.css
118 +++ b/runtime/observatory/lib/src/elements/css/shared.css
119 @@ -61,12 +61,12 @@ h1 {
120 white-space: nowrap;
121 }
122
123 -a {
124 +a[href] {
125 color: #0489c3;
126 text-decoration: none;
127 }
128
129 -a:hover {
130 +a[href]:hover {
131 text-decoration: underline;
132 }
133
134 @@ -461,6 +461,35 @@ function-ref-wrapped > a[href] {
135 text-decoration: none;
136 }
137
138 +/* isolate-counter-chart */
139 +
140 +isolate-shared-summary-wrapped {
141 + display: block;
142 + height: 300px;
143 + position: relative;
144 +}
145 +isolate-shared-summary-wrapped > .menu {
146 + float: right;
147 + top: 0;
148 + right: 0;
149 +}
150 +isolate-shared-summary-wrapped > isolate-counter-chart {
151 + position: absolute;
152 + left: 0;
153 + top: 0;
154 + right: 200px;
155 + clear: both;
156 +}
157 +isolate-shared-summary-wrapped .errorBox {
158 + background-color: #f5f5f5;
159 + border: 1px solid #ccc;
160 + padding: 2em;
161 + font-family: consolas, courier, monospace;
162 + font-size: 1em;
163 + line-height: 1.2em;
164 + white-space: pre;
165 +}
166 +
167 /* isolate-ref */
168 /* TODO(cbernaschina) fix isolate-ref-wrapped to isolate-ref when wrapper
169 removed */
170 @@ -473,6 +502,38 @@ isolate-ref-wrapped > a[href] {
171 text-decoration: none;
172 }
173
174 +/* isolate-shared-summary */
175 +/* TODO(cbernaschina) fix isolate-shared-summary-wrapped
176 +to isolate-shared-summary when wrapper removed */
177 +
178 +isolate-shared-summary,
179 +isolate-shared-summary-wrapped {
180 + display: block;
181 + height: 300px;
182 + position: relative;
183 +}
184 +isolate-shared-summary-wrapped > .menu {
185 + float: right;
186 + top: 0;
187 + right: 0;
188 +}
189 +isolate-shared-summary-wrapped > isolate-counter-chart {
190 + position: absolute;
191 + left: 0;
192 + top: 0;
193 + right: 230px;
194 + clear: both;
195 +}
196 +isolate-shared-summary-wrapped .errorBox {
197 + background-color: #f5f5f5;
198 + border: 1px solid #ccc;
199 + padding: 2em;
200 + font-family: consolas, courier, monospace;
201 + font-size: 1em;
202 + line-height: 1.2em;
203 + white-space: pre;
204 +}
205 +
206 /* library-ref */
207 /* TODO(cbernaschina) fix library-ref-wrapped to library-ref when wrapper
208 removed */
209 Index: runtime/observatory/lib/src/elements/isolate/counter_chart.dart
210 diff --git a/runtime/observatory/lib/src/elements/isolate/counter_chart.dart b/r untime/observatory/lib/src/elements/isolate/counter_chart.dart
211 new file mode 100644
212 index 0000000000000000000000000000000000000000..3c7b3bc4c3f431a4368f397fb08aa64f 4b47e9d0
213 --- /dev/null
214 +++ b/runtime/observatory/lib/src/elements/isolate/counter_chart.dart
215 @@ -0,0 +1,77 @@
216 +// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
217 +// for details. All rights reserved. Use of this source code is governed by a
218 +// BSD-style license that can be found in the LICENSE file.
219 +
220 +import 'dart:html';
221 +import 'dart:async';
222 +import 'package:charted/charted.dart';
223 +import "package:charted/charts/charts.dart";
224 +import 'package:observatory/src/elements/helpers/rendering_scheduler.dart';
225 +import 'package:observatory/src/elements/helpers/tag.dart';
226 +
227 +class IsolateCounterChartElement extends HtmlElement implements Renderable {
228 + static const tag =
229 + const Tag<IsolateCounterChartElement>('isolate-counter-chart');
230 +
231 + RenderingScheduler<IsolateCounterChartElement> _r;
232 +
233 + Stream<RenderedEvent<IsolateCounterChartElement>> get onRendered =>
234 + _r.onRendered;
235 +
236 + Map _counters;
237 + StreamSubscription _subscription;
238 +
239 + factory IsolateCounterChartElement(Map counters, {RenderingQueue queue}) {
240 + assert(counters != null);
241 + IsolateCounterChartElement e = document.createElement(tag.name);
242 + e._r = new RenderingScheduler(e, queue: queue);
243 + e._counters = counters;
244 + return e;
245 + }
246 +
247 + IsolateCounterChartElement.created() : super.created();
248 +
249 + @override
250 + void attached() {
251 + super.attached();
252 + _r.enable();
253 + _subscription = window.onResize.listen((_) => _r.dirty());
254 + }
255 +
256 + @override
257 + void detached() {
258 + super.detached();
259 + children = [];
260 + _r.disable(notify: true);
261 + _subscription.cancel();
262 + }
263 +
264 + void render() {
265 + var areaHost;
266 + var legendHost;
267 + children = [
268 + areaHost = new DivElement()..classes = ['host'],
269 + legendHost = new DivElement()..classes = ['legend']
270 + ];
271 + final series = new ChartSeries("Work", [1], new PieChartRenderer(
272 + sortDataByValue: false
273 + ));
274 + var rect = areaHost.getBoundingClientRect();
275 + var minSize = new Rect.size(rect.width, rect.height);
276 + final config = new ChartConfig([series], [0])
277 + ..minimumSize = minSize
278 + ..legend = new ChartLegend(legendHost, showValues: true);
279 + final data = new ChartData([
280 + new ChartColumnSpec(label: 'Type', type: ChartColumnSpec.TYPE_STRING),
281 + new ChartColumnSpec(label: 'Percent', formatter: (v) => v.toString())
282 + ], _counters.keys
283 + .map((key) => [key, double.parse(_counters[key].split('%')[0])])
284 + .toList());
285 +
286 + new LayoutArea(areaHost, data, config, state: new ChartState(),
287 + autoUpdate: true)
288 + ..addChartBehavior(new Hovercard())
289 + ..addChartBehavior(new AxisLabelTooltip())
290 + ..draw();
291 + }
292 +}
293 Index: runtime/observatory/lib/src/elements/isolate/shared_summary.dart
294 diff --git a/runtime/observatory/lib/src/elements/isolate/shared_summary.dart b/ runtime/observatory/lib/src/elements/isolate/shared_summary.dart
295 new file mode 100644
296 index 0000000000000000000000000000000000000000..2999fb078ca0ea2ce353c339eb26170d 641029ef
297 --- /dev/null
298 +++ b/runtime/observatory/lib/src/elements/isolate/shared_summary.dart
299 @@ -0,0 +1,152 @@
300 +// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
301 +// for details. All rights reserved. Use of this source code is governed by a
302 +// BSD-style license that can be found in the LICENSE file.
303 +
304 +import 'dart:html';
305 +import 'dart:async';
306 +import 'package:observatory/models.dart' as M;
307 +import 'package:observatory/utils.dart';
308 +import 'package:observatory/src/elements/helpers/rendering_scheduler.dart';
309 +import 'package:observatory/src/elements/helpers/tag.dart';
310 +import 'package:observatory/src/elements/helpers/uris.dart';
311 +import 'package:observatory/src/elements/isolate/counter_chart.dart';
312 +
313 +class IsolateSharedSummaryElement extends HtmlElement implements Renderable {
314 + static const tag =
315 + const Tag<IsolateSharedSummaryElement>('isolate-shared-summary-wrapped');
316 +
317 + RenderingScheduler<IsolateSharedSummaryElement> _r;
318 +
319 + Stream<RenderedEvent<IsolateSharedSummaryElement>> get onRendered =>
320 + _r.onRendered;
321 +
322 + M.Isolate _isolate;
323 +
324 + factory IsolateSharedSummaryElement(M.Isolate isolate,
325 + {RenderingQueue queue}) {
326 + assert(isolate != null);
327 + IsolateSharedSummaryElement e = document.createElement(tag.name);
328 + e._r = new RenderingScheduler(e, queue: queue);
329 + e._isolate = isolate;
330 + return e;
331 + }
332 +
333 + IsolateSharedSummaryElement.created() : super.created();
334 +
335 + @override
336 + void attached() {
337 + super.attached();
338 + _r.enable();
339 + }
340 +
341 + @override
342 + void detached() {
343 + super.detached();
344 + children = [];
345 + _r.disable(notify: true);
346 + }
347 +
348 + void render() {
349 + children = [];
350 + if (_isolate.error != null) {
351 + children = [
352 + new PreElement()..classes = const ["errorBox"]
353 + ..text = _isolate.error.message
354 + ];
355 + }
356 + final newHeapUsed = Utils.formatSize(_isolate.newSpace.used);
357 + final newHeapCapacity = Utils.formatSize(_isolate.newSpace.capacity);
358 + final oldHeapUsed = Utils.formatSize(_isolate.oldSpace.used);
359 + final oldHeapCapacity = Utils.formatSize(_isolate.oldSpace.capacity);
360 + children.addAll([
361 + new DivElement()..classes = ['menu']
362 + ..children = [
363 + new DivElement()..classes = const ['memberList']
364 + ..children = [
365 + new DivElement()..classes = const ['memberItem']
366 + ..children = [
367 + new DivElement()..classes = const ['memberName']
368 + ..text = 'new heap',
369 + new DivElement()..classes = const ['memberValue']
370 + ..text = '$newHeapUsed of $newHeapCapacity',
371 + ],
372 + new DivElement()..classes = const ['memberItem']
373 + ..children = [
374 + new DivElement()..classes = const ['memberName']
375 + ..text = 'old heap',
376 + new DivElement()..classes = const ['memberValue']
377 + ..text = '$oldHeapUsed of $oldHeapCapacity',
378 + ]
379 + ],
380 + new BRElement(),
381 + new DivElement()
382 + ..children = [
383 + new SpanElement()..text = 'see ',
384 + new AnchorElement(href: Uris.debugger(_isolate))
385 + ..text = 'debug'
386 + ],
387 + new DivElement()
388 + ..children = [
389 + new SpanElement()..text = 'see ',
390 + new AnchorElement(href: Uris.classTree(_isolate))
391 + ..text = 'class hierarchy'
392 + ],
393 + new DivElement()
394 + ..children = [
395 + new SpanElement()..text = 'see ',
396 + new AnchorElement(href: Uris.cpuProfiler(_isolate))
397 + ..text = 'cpu profile'
398 + ],
399 + new DivElement()
400 + ..children = [
401 + new SpanElement()..text = 'see ',
402 + new AnchorElement(href: Uris.cpuProfilerTable(_isolate))
403 + ..text = 'cpu profile (table)'
404 + ],
405 + new DivElement()
406 + ..children = [
407 + new SpanElement()..text = 'see ',
408 + new AnchorElement(href: Uris.allocationProfiler(_isolate))
409 + ..text = 'allocation profile'
410 + ],
411 + new DivElement()
412 + ..children = [
413 + new SpanElement()..text = 'see ',
414 + new AnchorElement(href: Uris.heapMap(_isolate))
415 + ..text = 'heap map'
416 + ],
417 + new DivElement()
418 + ..children = [
419 + new SpanElement()..text = 'see ',
420 + new AnchorElement(href: Uris.metrics(_isolate))
421 + ..text = 'metrics'
422 + ],
423 + new DivElement()
424 + ..children = [
425 + new SpanElement()..text = 'see ',
426 + new AnchorElement(href: Uris.heapSnapshot(_isolate))
427 + ..text = 'heap snapshot'
428 + ],
429 + new DivElement()
430 + ..children = [
431 + new SpanElement()..text = 'see ',
432 + new AnchorElement(href: Uris.persistentHandles(_isolate))
433 + ..text = 'persistent handles'
434 + ],
435 + new DivElement()
436 + ..children = [
437 + new SpanElement()..text = 'see ',
438 + new AnchorElement(href: Uris.ports(_isolate))
439 + ..text = 'ports'
440 + ],
441 + new DivElement()
442 + ..children = [
443 + new SpanElement()..text = 'see ',
444 + new AnchorElement(href: Uris.logging(_isolate))
445 + ..text = 'logging'
446 + ]
447 + ],
448 + new IsolateCounterChartElement(_isolate.counters, queue: _r.queue)
449 + ]);
450 + }
451 +}
452 Index: runtime/observatory/lib/src/elements/isolate/shared_summary_wrapper.dart
453 diff --git a/runtime/observatory/lib/src/elements/isolate/shared_summary_wrapper .dart b/runtime/observatory/lib/src/elements/isolate/shared_summary_wrapper.dart
454 new file mode 100644
455 index 0000000000000000000000000000000000000000..66b90ef6a126fb2fd50f8783c08aa857 5bf04eac
456 --- /dev/null
457 +++ b/runtime/observatory/lib/src/elements/isolate/shared_summary_wrapper.dart
458 @@ -0,0 +1,164 @@
459 +// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
460 +// for details. All rights reserved. Use of this source code is governed by a
461 +// BSD-style license that can be found in the LICENSE file.
462 +
463 +import 'dart:html';
464 +import 'dart:async';
465 +import 'package:observatory/app.dart';
466 +import 'package:observatory/service.dart';
467 +import 'package:observatory/src/elements/helpers/tag.dart';
468 +import 'package:observatory/src/elements/shims/binding.dart';
469 +import 'package:observatory/src/elements/isolate/shared_summary.dart';
470 +
471 +@bindable
472 +class IsolateSharedSummaryElementWrapper extends HtmlElement {
473 + static const binder = const Binder<IsolateSharedSummaryElementWrapper>(const {
474 + 'isolate': #isolate
475 + });
476 +
477 + static const tag =
478 + const Tag<IsolateSharedSummaryElementWrapper>('isolate-shared-summary');
479 +
480 + IsolateSharedSummaryElementWrapper.created() : super.created() {
481 + binder.registerCallback(this);
482 + createShadowRoot();
483 + render();
484 + }
485 +
486 + Isolate _isolate;
487 + StreamSubscription _subscription;
488 +
489 + Isolate get isolate => _isolate;
490 +
491 + void set isolate(Isolate value) {
492 + _isolate = value;
493 + _detached();
494 + _attached();
495 + }
496 +
497 + @override
498 + void attached() {
499 + super.attached();
500 + _attached();
501 + }
502 +
503 + @override
504 + void detached() {
505 + super.detached();
506 + _detached();
507 + }
508 +
509 + void _attached() {
510 + if (_isolate != null) {
511 + _subscription = _isolate.changes.listen((_) { render(); });
512 + }
513 + render();
514 + }
515 +
516 + void _detached() {
517 + _subscription?.cancel();
518 + _subscription = null;
519 + }
520 +
521 + void render() {
522 + if (_isolate == null) {
523 + return;
524 + }
525 + shadowRoot.children = [
526 + new StyleElement()
527 + ..text = '''
528 + a[href] {
529 + color: #0489c3;
530 + text-decoration: none;
531 + }
532 + a[href]:hover {
533 + text-decoration: underline;
534 + }
535 + .memberList {
536 + display: table;
537 + }
538 + .memberItem {
539 + display: table-row;
540 + }
541 + .memberName, .memberValue {
542 + display: table-cell;
543 + vertical-align: top;
544 + padding: 3px 0 3px 1em;
545 + font: 400 14px 'Montserrat', sans-serif;
546 + }
547 + isolate-shared-summary-wrapped {
548 + display: block;
549 + height: 300px;
550 + position: relative;
551 + }
552 + isolate-shared-summary-wrapped > .menu {
553 + float: right;
554 + top: 0;
555 + right: 0;
556 + }
557 + isolate-shared-summary-wrapped > isolate-counter-chart {
558 + position: absolute;
559 + left: 0;
560 + top: 0;
561 + right: 230px;
562 + clear: both;
563 + }
564 + isolate-shared-summary-wrapped .errorBox {
565 + background-color: #f5f5f5;
566 + border: 1px solid #ccc;
567 + padding: 2em;
568 + font-family: consolas, courier, monospace;
569 + font-size: 1em;
570 + line-height: 1.2em;
571 + white-space: pre;
572 + }
573 + isolate-counter-chart {
574 + display: block;
575 + position: relative;
576 + height: 300px;
577 + min-width: 350px;
578 + }
579 + isolate-counter-chart > div.host {
580 + position: absolute;
581 + left: 0;
582 + bottom: 0;
583 + top: 0;
584 + right: 250px;
585 + }
586 + isolate-counter-chart > div.legend {
587 + position: absolute;
588 + width: 250px;
589 + top: 0;
590 + right: 0;
591 + bottom: 0;
592 + overflow-y: auto;
593 + }
594 + .type-pie-rdr > .chart-legend-color {
595 + border-radius: 6px;
596 + }
597 + .chart-legend-row, .chart-legend-more {
598 + width: 100%;
599 + display: flex;
600 + font-size: 14px;
601 + margin-bottom: 16px;
602 + position: relative;
603 + cursor: default;
604 + }
605 + .chart-legend-color, .chart-legend-more-color {
606 + width: 12px;
607 + height: 12px;
608 + margin: auto 8px;
609 + border-radius: 2px;
610 + }
611 + .chart-legend-label {
612 + overflow: hidden;
613 + text-overflow: ellipsis;
614 + max-width: 120px;
615 + flex: 1;
616 + }
617 + ''',
618 + new IsolateSharedSummaryElement(_isolate,
619 + queue: ObservatoryApplication.app.queue)
620 + ];
621 + }
622 +}
623 Index: runtime/observatory/lib/src/elements/isolate_summary.dart
624 diff --git a/runtime/observatory/lib/src/elements/isolate_summary.dart b/runtime /observatory/lib/src/elements/isolate_summary.dart
625 index b0b2e061b9985877f5518b1fd296c8219194e954..b41befdf38621a9bc06e726b1c3fc862 1f660fe8 100644
626 --- a/runtime/observatory/lib/src/elements/isolate_summary.dart
627 +++ b/runtime/observatory/lib/src/elements/isolate_summary.dart
628 @@ -4,10 +4,7 @@
629
630 library isolate_summary_element;
631
632 -import 'dart:html';
633 import 'observatory_element.dart';
634 -import 'package:charted/charted.dart';
635 -import "package:charted/charts/charts.dart";
636 import 'package:observatory/service.dart';
637 import 'package:polymer/polymer.dart';
638
639 @@ -31,88 +28,3 @@ class IsolateLocationElement extends ObservatoryElement {
640
641 @published Isolate isolate;
642 }
643 -
644 -@CustomTag('isolate-shared-summary')
645 -class IsolateSharedSummaryElement extends ObservatoryElement {
646 - IsolateSharedSummaryElement.created() : super.created();
647 -
648 - @published Isolate isolate;
649 -}
650 -
651 -class CounterChart {
652 - final HtmlElement _wrapper;
653 - HtmlElement _areaHost;
654 - HtmlElement _legendHost;
655 - LayoutArea _area;
656 - ChartData _data;
657 - final _columns = [
658 - new ChartColumnSpec(label: 'Type', type: ChartColumnSpec.TYPE_STRING),
659 - new ChartColumnSpec(label: 'Percent', formatter: (v) => v.toString())
660 - ];
661 -
662 - CounterChart(this._wrapper) {
663 - assert(_wrapper != null);
664 - _areaHost = _wrapper.querySelector('.chart-host');
665 - assert(_areaHost != null);
666 - _areaHost.clientWidth;
667 - _legendHost = _wrapper.querySelector('.chart-legend-host');
668 - assert(_legendHost != null);
669 - var series = new ChartSeries("Work", [1], new PieChartRenderer(
670 - sortDataByValue: false
671 - ));
672 - var config = new ChartConfig([series], [0]);
673 - config.minimumSize = new Rect(200, 200);
674 - config.legend = new ChartLegend(_legendHost, showValues: true);
675 - _data = new ChartData(_columns, []);
676 - _area = new LayoutArea(_areaHost,
677 - _data,
678 - config,
679 - state: new ChartState(),
680 - autoUpdate: false);
681 - _area.addChartBehavior(new Hovercard());
682 - _area.addChartBehavior(new AxisLabelTooltip());
683 - }
684 -
685 - void update(Map counters) {
686 - var rows = [];
687 - for (var key in counters.keys) {
688 - var value = double.parse(counters[key].split('%')[0]);
689 - rows.add([key, value]);
690 - }
691 - _area.data = new ChartData(_columns, rows);
692 - _area.draw();
693 - }
694 -}
695 -
696 -@CustomTag('isolate-counter-chart')
697 -class IsolateCounterChartElement extends ObservatoryElement {
698 - IsolateCounterChartElement.created() : super.created();
699 -
700 - @published ObservableMap counters;
701 - CounterChart chart;
702 -
703 - attached() {
704 - super.attached();
705 - chart =
706 - new CounterChart(shadowRoot.querySelector('#isolate-counter-chart'));
707 - }
708 -
709 - detached() {
710 - super.detached();
711 - var host = shadowRoot.querySelector('#isolate-counter-chart-host');
712 - host.children.clear();
713 - var legendHost =
714 - shadowRoot.querySelector('#isolate-counter-chart-legend-host');
715 - legendHost.children.clear();
716 - }
717 -
718 - void countersChanged(oldValue) {
719 - if (counters == null) {
720 - return;
721 - }
722 - if (chart == null) {
723 - return;
724 - }
725 - chart.update(counters);
726 - }
727 -}
728 Index: runtime/observatory/lib/src/elements/isolate_summary.html
729 diff --git a/runtime/observatory/lib/src/elements/isolate_summary.html b/runtime /observatory/lib/src/elements/isolate_summary.html
730 index 1a0c0a14a642a742271f249e9114553f13dc89ff..3c4924d8a9f7aa816d4923e6f7a357c1 d828b78f 100644
731 --- a/runtime/observatory/lib/src/elements/isolate_summary.html
732 +++ b/runtime/observatory/lib/src/elements/isolate_summary.html
733 @@ -85,146 +85,4 @@
734 </template>
735 </polymer-element>
736
737 -<polymer-element name="isolate-shared-summary">
738 - <template>
739 - <style>
740 - .errorBox {
741 - background-color: #f5f5f5;
742 - border: 1px solid #ccc;
743 - padding: 2em;
744 - font-family: consolas, courier, monospace;
745 - font-size: 1em;
746 - line-height: 1.2em;
747 - white-space: pre;
748 - }
749 - </style>
750 - <link rel="stylesheet" href="css/shared.css">
751 - <template if="{{ isolate.error != null }}">
752 - <div class="content-centered">
753 - <pre class="errorBox">{{ isolate.error.message }}</pre>
754 - <br>
755 - </div>
756 - </template>
757 - <div class="flex-row">
758 - <div style="flex:2">
759 - <isolate-counter-chart counters="{{ isolate.counters }}"></isolate-coun ter-chart>
760 - </div>
761 - <div style="flex:1">
762 - <div class="memberList">
763 - <div class="memberItem">
764 - <div class="memberName">new heap</div>
765 - <div class="memberValue">
766 - {{ isolate.newSpace.used | formatSize }}
767 - of
768 - {{ isolate.newSpace.capacity | formatSize }}
769 - </div>
770 - </div>
771 - <div class="memberItem">
772 - <div class="memberName">old heap</div>
773 - <div class="memberValue">
774 - {{ isolate.oldSpace.used | formatSize }}
775 - of
776 - {{ isolate.oldSpace.capacity | formatSize }}
777 - </div>
778 - </div>
779 - </div>
780 - <br>
781 - <div class="memberItem">
782 - <div class="memberValue">
783 - See <a on-click="{{ goto }}" _href="{{ gotoLink('/debugger', isolat e) }}">debugger</a>
784 - </div>
785 - </div>
786 - <div class="memberItem">
787 - <div class="memberValue">
788 - See <a on-click="{{ goto }}" _href="{{ gotoLink('/class-tree', isol ate) }}">class hierarchy</a>
789 - </div>
790 - </div>
791 - <div class="memberItem">
792 - <div class="memberValue">
793 - See <a on-click="{{ goto }}" _href="{{ gotoLink('/profiler', isolat e) }}">cpu profile</a>
794 - </div>
795 - </div>
796 - <div class="memberItem">
797 - <div class="memberValue">
798 - See <a on-click="{{ goto }}" _href="{{ gotoLink('/profiler-table', isolate) }}">cpu profile (table)</a>
799 - </div>
800 - </div>
801 - <div class="memberItem">
802 - <div class="memberValue">
803 - See <a on-click="{{ goto }}" _href="{{ gotoLink('/allocation-profil er', isolate) }}">allocation profile</a>
804 - </div>
805 - </div>
806 - <div class="memberItem">
807 - <div class="memberValue">
808 - See <a on-click="{{ goto }}" _href="{{ gotoLink('/heap-map', isolat e) }}">heap map</a>
809 - </div>
810 - </div>
811 - <div class="memberItem">
812 - <div class="memberValue">
813 - See <a on-click="{{ goto }}" _href="{{ gotoLink('/metrics', isolate ) }}">metrics</a>
814 - </div>
815 - </div>
816 - <div class="memberItem">
817 - <div class="memberValue">
818 - See <a on-click="{{ goto }}" _href="{{ gotoLink('/heap-snapshot', i solate) }}">heap snapshot</a>
819 - </div>
820 - </div>
821 - <div class="memberItem">
822 - <div class="memberValue">
823 - See <a on-click="{{ goto }}" _href="{{ gotoLink('/persistent-handle s', isolate) }}">persistent handles</a>
824 - </div>
825 - </div>
826 - <div class="memberItem">
827 - <div class="memberValue">
828 - See <a on-click="{{ goto }}" _href="{{ gotoLink('/ports', isolate) }}">ports</a>
829 - </div>
830 - </div>
831 - <div class="memberItem">
832 - <div class="memberValue">
833 - See <a on-click="{{ goto }}" _href="{{ gotoLink('/logging', isolate ) }}">logging</a>
834 - </div>
835 - </div>
836 - <!-- Temporarily disabled until UI for dart:io is acceptable.
837 - <template if="{{ isolate.ioEnabled }}">
838 - <div class="memberItem">
839 - <div class="memberValue">
840 - See <a on-click="{{ goto }}" href="{{ gotoLink('/io', isolate) }} ">dart:io</a>
841 - </div>
842 - </div>
843 - </template>
844 - -->
845 - </div>
846 - </div>
847 - </template>
848 -</polymer-element>
849 -
850 -<polymer-element name="isolate-counter-chart">
851 - <template>
852 - <link rel="stylesheet" href="../../../../packages/charted/charts/themes/qua ntum_theme.css">
853 - <style>
854 -.chart-wrapper {
855 -}
856 -.chart-host-wrapper {
857 - display: flex;
858 - flex-direction: row;
859 - max-height: 250px;
860 -}
861 -.chart-host {
862 - flex: 1;
863 -}
864 -.chart-legend-host {
865 - flex: 1;
866 - overflow-x: auto;
867 - overflow-y: auto;
868 -}
869 - </style>
870 - <div class="chart-wrapper" id="isolate-counter-chart">
871 - <div class="chart-host-wrapper">
872 - <div class="chart-host" id="isolate-counter-chart-host"></div>
873 - <div class="chart-legend-host" id="isolate-counter-chart-legend-host">< /div>
874 - </div>
875 - </div>
876 - </template>
877 -</polymer-element>
878 -
879 <script type="application/dart" src="isolate_summary.dart"></script>
880 Index: runtime/observatory/lib/src/elements/observatory_application.dart
881 diff --git a/runtime/observatory/lib/src/elements/observatory_application.dart b /runtime/observatory/lib/src/elements/observatory_application.dart
882 index 4acdc6575bcaa90772680166fc826e0e71db29a4..0e85692d6b3793c42c92d72e5609ceff c7fcfb50 100644
883 --- a/runtime/observatory/lib/src/elements/observatory_application.dart
884 +++ b/runtime/observatory/lib/src/elements/observatory_application.dart
885 @@ -4,22 +4,24 @@
886
887 library observatory_application_element;
888
889 -import 'observatory_element.dart';
890 +import 'dart:html';
891 import 'package:observatory/app.dart';
892 -import 'package:polymer/polymer.dart';
893 +import 'package:observatory/src/elements/helpers/tag.dart';
894
895 /// Main application tag. Responsible for instantiating an instance of
896 /// [ObservatoryApplication] which is passed declaratively to all child
897 /// elements.
898 -@CustomTag('observatory-application')
899 -class ObservatoryApplicationElement extends ObservatoryElement {
900 +class ObservatoryApplicationElement extends HtmlElement {
901 + static const tag =
902 + const Tag<ObservatoryApplicationElement>('observatory-application');
903 +
904 ObservatoryApplication app;
905
906 ObservatoryApplicationElement.created() : super.created();
907
908 @override
909 - void domReady() {
910 - super.domReady();
911 + void attached() {
912 + super.attached();
913 app = new ObservatoryApplication(this);
914 }
915 }
916 Index: runtime/observatory/lib/src/models/objects/heap_space.dart
917 diff --git a/runtime/observatory/lib/src/models/objects/target.dart b/runtime/ob servatory/lib/src/models/objects/heap_space.dart
918 similarity index 78%
919 copy from runtime/observatory/lib/src/models/objects/target.dart
920 copy to runtime/observatory/lib/src/models/objects/heap_space.dart
921 index a58673f248b4a1bd7638d02be186e5ec384640a3..29c55ce8496db99ab8904b8bd02a5335 224bd46b 100644
922 --- a/runtime/observatory/lib/src/models/objects/target.dart
923 +++ b/runtime/observatory/lib/src/models/objects/heap_space.dart
924 @@ -4,6 +4,7 @@
925
926 part of models;
927
928 -abstract class Target {
929 - String get name;
930 +abstract class HeapSpace {
931 + int get used;
932 + int get capacity;
933 }
934 Index: runtime/observatory/lib/src/models/objects/isolate.dart
935 diff --git a/runtime/observatory/lib/src/models/objects/isolate.dart b/runtime/o bservatory/lib/src/models/objects/isolate.dart
936 index 81d54c5f60571739922ba285efee88c61296403d..45f5524ceec81eed2bfdca7e5b7d5055 8227856f 100644
937 --- a/runtime/observatory/lib/src/models/objects/isolate.dart
938 +++ b/runtime/observatory/lib/src/models/objects/isolate.dart
939 @@ -5,12 +5,58 @@
940 part of models;
941
942 abstract class IsolateRef {
943 + /// The id which is passed to the getIsolate RPC to reload this
944 + /// isolate.
945 String get id;
946 +
947 + /// A numeric id for this isolate, represented as a string. Unique.
948 int get number;
949 +
950 + /// A name identifying this isolate. Not guaranteed to be unique.
951 String get name;
952 }
953
954 abstract class Isolate extends IsolateRef {
955 + /// The time that the VM started in milliseconds since the epoch.
956 DateTime get startTime;
957 +
958 + /// Is the isolate in a runnable state?
959 bool get runnable;
960 +
961 + /// The number of live ports for this isolate.
962 + //int get livePorts;
963 +
964 + /// Will this isolate pause when exiting?
965 + //bool get pauseOnExit;
966 +
967 + /// The last pause event delivered to the isolate. If the isolate is
968 + /// running, this will be a resume event.
969 + //Event get pauseEvent;
970 +
971 + /// [optional] The root library for this isolate.
972 + ///
973 + /// Guaranteed to be initialized when the IsolateRunnable event fires.
974 + //LibraryRef get rootLib;
975 +
976 + /// A list of all libraries for this isolate.
977 + ///
978 + /// Guaranteed to be initialized when the IsolateRunnable event fires.
979 + Iterable<LibraryRef> get libraries;
980 +
981 + /// A list of all breakpoints for this isolate.
982 + //Iterable<Breakpoint> get breakpoints;
983 +
984 + /// [optional] The error that is causing this isolate to exit, if applicable.
985 + Error get error;
986 +
987 + /// The current pause on exception mode for this isolate.
988 + //ExceptionPauseMode get exceptionPauseMode;
989 +
990 + /// [optional]The list of service extension RPCs that are registered for this
991 + /// isolate, if any.
992 + Iterable<String> get extensionRPCs;
993 +
994 + Map get counters;
995 + HeapSpace get newSpace;
996 + HeapSpace get oldSpace;
997 }
998 Index: runtime/observatory/lib/src/service/object.dart
999 diff --git a/runtime/observatory/lib/src/service/object.dart b/runtime/observato ry/lib/src/service/object.dart
1000 index afd924048b1a1113b1f0117d1d6e6b08f5a27408..bc21be8ca177a58e2db11295e96751e0 c35d21cd 100644
1001 --- a/runtime/observatory/lib/src/service/object.dart
1002 +++ b/runtime/observatory/lib/src/service/object.dart
1003 @@ -1077,7 +1077,7 @@ class TagProfile {
1004 }
1005 }
1006
1007 -class HeapSpace extends Observable {
1008 +class HeapSpace extends Observable implements M.HeapSpace {
1009 @observable int used = 0;
1010 @observable int capacity = 0;
1011 @observable int external = 0;
1012 @@ -1139,7 +1139,7 @@ class Isolate extends ServiceObjectOwner implements M.Isol ate {
1013 return (new DateTime.now().difference(startTime));
1014 }
1015
1016 - @observable ObservableMap counters = new ObservableMap();
1017 + @observable Map counters = {};
1018
1019 void _updateRunState() {
1020 topFrame = (pauseEvent != null ? pauseEvent.topFrame : null);
1021 @@ -1441,18 +1441,18 @@ class Isolate extends ServiceObjectOwner implements M.Is olate {
1022 for (var i = 0; i < counts.length; i++) {
1023 sum += counts[i];
1024 }
1025 - // TODO: Why does this not work without this?
1026 - counters = toObservable({});
1027 + var _counters = {};
1028 if (sum == 0) {
1029 for (var i = 0; i < names.length; i++) {
1030 - counters[names[i]] = '0.0%';
1031 + _counters[names[i]] = '0.0%';
1032 }
1033 } else {
1034 for (var i = 0; i < names.length; i++) {
1035 - counters[names[i]] =
1036 + _counters[names[i]] =
1037 (counts[i] / sum * 100.0).toStringAsFixed(2) + '%';
1038 }
1039 }
1040 + counters = _counters;
1041 }
1042
1043 updateHeapsFromMap(map['_heaps']);
1044 Index: runtime/observatory/observatory_sources.gypi
1045 diff --git a/runtime/observatory/observatory_sources.gypi b/runtime/observatory/ observatory_sources.gypi
1046 index fe89855486e20e2526e406a3aac2254d3616d815..8fd96abc9613f81ff429734233a20eda 04e30650 100644
1047 --- a/runtime/observatory/observatory_sources.gypi
1048 +++ b/runtime/observatory/observatory_sources.gypi
1049 @@ -99,6 +99,9 @@
1050 'lib/src/elements/instructions_view.html',
1051 'lib/src/elements/io_view.dart',
1052 'lib/src/elements/io_view.html',
1053 + 'lib/src/elements/isolate/counter_chart.dart',
1054 + 'lib/src/elements/isolate/shared_summary_wrapper.dart',
1055 + 'lib/src/elements/isolate/shared_summary.dart',
1056 'lib/src/elements/isolate_reconnect.dart',
1057 'lib/src/elements/isolate_reconnect.html',
1058 'lib/src/elements/isolate_ref.dart',
1059 @@ -151,7 +154,6 @@
1060 'lib/src/elements/objectpool_view.dart',
1061 'lib/src/elements/objectpool_view.html',
1062 'lib/src/elements/observatory_application.dart',
1063 - 'lib/src/elements/observatory_application.html',
1064 'lib/src/elements/observatory_element.dart',
1065 'lib/src/elements/persistent_handles.dart',
1066 'lib/src/elements/persistent_handles.html',
1067 @@ -187,6 +189,7 @@
1068 'lib/src/models/objects/flag.dart',
1069 'lib/src/models/objects/frame.dart',
1070 'lib/src/models/objects/function.dart',
1071 + 'lib/src/models/objects/heap_space.dart',
1072 'lib/src/models/objects/instance.dart',
1073 'lib/src/models/objects/isolate.dart',
1074 'lib/src/models/objects/library.dart',
1075 Index: runtime/observatory/tests/observatory_ui/mocks/objects/isolate.dart
1076 diff --git a/runtime/observatory/tests/observatory_ui/mocks/objects/isolate.dart b/runtime/observatory/tests/observatory_ui/mocks/objects/isolate.dart
1077 index d65b840cdb6c82b8e55ef60a54091ab094ac8b68..310d70c106358b6868713293e051a788 fe40ba48 100644
1078 --- a/runtime/observatory/tests/observatory_ui/mocks/objects/isolate.dart
1079 +++ b/runtime/observatory/tests/observatory_ui/mocks/objects/isolate.dart
1080 @@ -18,8 +18,17 @@ class IsolateMock implements M.Isolate {
1081 final String name;
1082 final DateTime startTime;
1083 final bool runnable;
1084 + final Iterable<M.LibraryRef> libraries;
1085 + final M.Error error;
1086 + final Iterable<String> extensionRPCs;
1087 + final Map counters;
1088 + final M.HeapSpace newSpace;
1089 + final M.HeapSpace oldSpace;
1090
1091 const IsolateMock({this.id: 'i-id', this.number, this.name: 'i-name',
1092 - this.startTime, this.runnable: true});
1093 + this.startTime, this.runnable: true,
1094 + this.libraries: const [], this.error,
1095 + this.extensionRPCs: const [], this.counters,
1096 + this.newSpace, this.oldSpace});
1097 // TODO(cbernaschina) add other properties.
1098 }
1099 Index: runtime/observatory/web/index.html
1100 diff --git a/runtime/observatory/web/index.html b/runtime/observatory/web/index. html
1101 index 065952529416f98855d51442e9a9af15f81fa6be..ccd9bfca2a8d493375d05eb7c02c39aa 822c79bd 100644
1102 --- a/runtime/observatory/web/index.html
1103 +++ b/runtime/observatory/web/index.html
1104 @@ -4,6 +4,7 @@
1105 <meta charset="utf-8">
1106 <title>Dart VM Observatory</title>
1107 <link rel="import" href="packages/polymer/polymer.html">
1108 + <link rel="stylesheet" href="packages/charted/charts/themes/quantum_theme.css ">
1109 <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css ">
1110 <link rel="import" href="packages/observatory/elements.html">
1111 <script src="packages/js_util/dist/js_util.js"></script>
1112 @@ -11,6 +12,5 @@
1113 <script src="packages/browser/dart.js"></script>
1114 </head>
1115 <body style="height: 100%">
1116 - <observatory-application></observatory-application>
1117 </body>
1118 </html>
1119 Index: runtime/observatory/web/main.dart
1120 diff --git a/runtime/observatory/web/main.dart b/runtime/observatory/web/main.da rt
1121 index 41f3dc74c2c0f43a978edec47cc86685153cc87b..36c03ab1165391d55ef8b4c35ad74444 bf05ff01 100644
1122 --- a/runtime/observatory/web/main.dart
1123 +++ b/runtime/observatory/web/main.dart
1124 @@ -2,6 +2,7 @@
1125 // for details. All rights reserved. Use of this source code is governed by a
1126 // BSD-style license that can be found in the LICENSE file.
1127
1128 +import 'dart:html';
1129 import 'package:logging/logging.dart';
1130 import 'package:polymer/polymer.dart';
1131 import 'package:observatory/elements.dart';
1132 @@ -24,4 +25,6 @@ main() async {
1133 Logger.root.info('Polymer initialized');
1134 await Polymer.onReady;
1135 Logger.root.info('Polymer elements have been upgraded');
1136 + document.body.children
1137 + .insert(0, document.createElement('observatory-application'));
1138 }
OLDNEW
« no previous file with comments | « no previous file | pkg/pkg.gyp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698