OLD | NEW |
(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 } |
OLD | NEW |