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

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

Issue 1719313002: Add persistent handles to service protocol and Observatory UI (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Created 4 years, 10 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) 2015, 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 library persitent_handles_page;
6
7 import 'dart:async';
8 import 'dart:html';
9 import 'observatory_element.dart';
10 import 'package:observatory/app.dart';
11 import 'package:observatory/elements.dart';
12 import 'package:observatory/service.dart';
13 import 'package:polymer/polymer.dart';
14
15 class WeakPersistentHandlesSortedTable extends SortedTable {
16 factory WeakPersistentHandlesSortedTable() {
17 var columns = [
18 new SortedTableColumn.withFormatter('External Size',
19 Utils.formatSize),
20 new SortedTableColumn('Peer'),
21 new SortedTableColumn('Finalizer Callback'),
22 new SortedTableColumn(''), // Spacer column.
23 new SortedTableColumn('Object'),
24 ];
25 WeakPersistentHandlesSortedTable result =
26 new WeakPersistentHandlesSortedTable._(columns);
27 // Sort by external size.
28 result.sortColumnIndex = 0;
29 return result;
30 }
31
32 WeakPersistentHandlesSortedTable._(columns) : super(columns);
33
34 @override
35 dynamic getSortKeyFor(int row, int col) {
36 return super.getSortKeyFor(row, col);
37 }
38
39 void update(List<ServiceMap> handles, HtmlElement tableBody) {
40 clearRows();
41 for (ServiceMap handle in handles) {
42 var row = [int.parse(handle['externalSize'], onError: (_) => 0),
43 handle['peer'],
44 handle['callbackSymbolName'] +
45 '( ${handle['callbackAddress']} )',
46 '', // Spacer column.
47 handle['object']];
48 addRow(new SortedTableRow(row));
49 print(row);
50 }
51 sort();
52 _updateTableInDom(tableBody);
53 }
54
55 void sortAndDisplay(HtmlElement tableBody) {
56 sort();
57 _updateTableInDom(tableBody);
58 }
59
60
61 void _updateTableInDom(HtmlElement tableBody) {
62 assert(tableBody != null);
63 // Resize DOM table.
64 if (tableBody.children.length > sortedRows.length) {
65 // Shrink the table.
66 var deadRows =
67 tableBody.children.length - sortedRows.length;
68 for (var i = 0; i < deadRows; i++) {
69 tableBody.children.removeLast();
70 }
71 } else if (tableBody.children.length < sortedRows.length) {
72 // Grow table.
73 var newRows = sortedRows.length - tableBody.children.length;
74 for (var i = 0; i < newRows; i++) {
75 _addDomRow(tableBody);
76 }
77 }
78 assert(tableBody.children.length == sortedRows.length);
79 // Fill table.
80 for (var i = 0; i < sortedRows.length; i++) {
81 var rowIndex = sortedRows[i];
82 var tr = tableBody.children[i];
83 _fillDomRow(tr, rowIndex);
84 }
85 }
86
87 void _addDomRow(HtmlElement tableBody) {
88 // Add empty dom row.
89 var tr = new TableRowElement();
90
91 var cell;
92
93 cell = tr.insertCell(-1);
94 cell = tr.insertCell(-1);
95 cell = tr.insertCell(-1);
96
97 // Add spacer.
98 cell = tr.insertCell(-1);
99 cell.classes.add('left-border-spacer');
100
101 // Add class ref.
102 cell = tr.insertCell(-1);
103 AnyServiceRefElement objectRef = new Element.tag('any-service-ref');
104 cell.children.add(objectRef);
105
106 // Add row to table.
107 tableBody.children.add(tr);
108 }
109
110 void _fillDomRow(TableRowElement tr, int rowIndex) {
111 var row = rows[rowIndex];
112
113 for (var i = 0; i < row.values.length - 2; i++) {
114 var cell = tr.children[i];
115 cell.title = row.values[i].toString();
116 cell.text = getFormattedValue(rowIndex, i);
117 cell.style.paddingLeft = '1em';
118 cell.style.paddingRight = '1em';
119 }
120
121 final int objectIndex = row.values.length - 1;
122 AnyServiceRefElement objectRef = tr.children[objectIndex].children[0];
123 objectRef.ref = row.values[objectIndex];
124 }
125 }
126
127
128 @CustomTag('persistent-handles-page')
129 class PersistentHandlesPageElement extends ObservatoryElement {
130 PersistentHandlesPageElement.created() : super.created();
131
132 @observable Isolate isolate;
133 @observable var /*ObservableList | ServiceObject*/ persistentHandles;
134 @observable var /*ObservableList | ServiceObject*/ weakPersistentHandles;
135 @observable WeakPersistentHandlesSortedTable weakPersistentHandlesTable;
136 var _weakPersistentHandlesTableBody;
137
138 void isolateChanged(oldValue) {
139 if (isolate != null) {
140 refresh();
141 }
142 }
143
144 @override
145 void attached() {
146 super.attached();
147 _weakPersistentHandlesTableBody =
148 shadowRoot.querySelector('#weakPersistentHandlesTableBody');
149 weakPersistentHandlesTable =
150 new WeakPersistentHandlesSortedTable();
151 }
152
153 Future refresh() {
154 return isolate.getPersistentHandles().then(_refreshView);
155 }
156
157 _refreshView(/*ObservableList | ServiceObject*/ object) {
158 persistentHandles = object['persistentHandles'];
159 weakPersistentHandles = object['weakPersistentHandles'];
160 weakPersistentHandlesTable.update(
161 weakPersistentHandles,
162 _weakPersistentHandlesTableBody);
163 }
164
165 @observable void changeSort(Event e, var detail, Element target) {
166 if (target is TableCellElement) {
167 if (weakPersistentHandlesTable.sortColumnIndex != target.cellIndex) {
168 weakPersistentHandlesTable.sortColumnIndex = target.cellIndex;
169 weakPersistentHandlesTable.sortDescending = true;
170 } else {
171 weakPersistentHandlesTable.sortDescending =
172 !weakPersistentHandlesTable.sortDescending;
173 }
174 weakPersistentHandlesTable.sortAndDisplay(
175 _weakPersistentHandlesTableBody);
176 }
177 }
178 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698