| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2012 Research In Motion Limited. All rights reserved. | 2 * Copyright (C) 2012 Research In Motion Limited. All rights reserved. |
| 3 * | 3 * |
| 4 * This library is free software; you can redistribute it and/or | 4 * This library is free software; you can redistribute it and/or |
| 5 * modify it under the terms of the GNU Lesser General Public | 5 * modify it under the terms of the GNU Lesser General Public |
| 6 * License as published by the Free Software Foundation; either | 6 * License as published by the Free Software Foundation; either |
| 7 * version 2 of the License, or (at your option) any later version. | 7 * version 2 of the License, or (at your option) any later version. |
| 8 * | 8 * |
| 9 * This library is distributed in the hope that it will be useful, | 9 * This library is distributed in the hope that it will be useful, |
| 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of | 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| (...skipping 26 matching lines...) Expand all Loading... |
| 37 id: 'length', | 37 id: 'length', |
| 38 title: Common.UIString('Length'), | 38 title: Common.UIString('Length'), |
| 39 sortable: false, | 39 sortable: false, |
| 40 align: DataGrid.DataGrid.Align.Right, | 40 align: DataGrid.DataGrid.Align.Right, |
| 41 weight: 5 | 41 weight: 5 |
| 42 }, | 42 }, |
| 43 {id: 'time', title: Common.UIString('Time'), sortable: true, weight: 7} | 43 {id: 'time', title: Common.UIString('Time'), sortable: true, weight: 7} |
| 44 ]); | 44 ]); |
| 45 | 45 |
| 46 this._dataGrid = new DataGrid.SortableDataGrid(columns); | 46 this._dataGrid = new DataGrid.SortableDataGrid(columns); |
| 47 this._dataGrid.setRowContextMenuCallback(onRowContextMenu); | 47 this._dataGrid.setRowContextMenuCallback(onRowContextMenu.bind(this)); |
| 48 this._dataGrid.setStickToBottom(true); | 48 this._dataGrid.setStickToBottom(true); |
| 49 this._dataGrid.setCellClass('websocket-frame-view-td'); | 49 this._dataGrid.setCellClass('websocket-frame-view-td'); |
| 50 this._timeComparator = | 50 this._timeComparator = |
| 51 /** @type {function(!Network.ResourceWebSocketFrameNode, !Network.Resour
ceWebSocketFrameNode):number} */ ( | 51 /** @type {function(!Network.ResourceWebSocketFrameNode, !Network.Resour
ceWebSocketFrameNode):number} */ ( |
| 52 Network.ResourceWebSocketFrameNodeTimeComparator); | 52 Network.ResourceWebSocketFrameNodeTimeComparator); |
| 53 this._dataGrid.sortNodes(this._timeComparator, false); | 53 this._dataGrid.sortNodes(this._timeComparator, false); |
| 54 this._dataGrid.markColumnAsSortedBy('time', DataGrid.DataGrid.Order.Ascendin
g); | 54 this._dataGrid.markColumnAsSortedBy('time', DataGrid.DataGrid.Order.Ascendin
g); |
| 55 this._dataGrid.addEventListener(DataGrid.DataGrid.Events.SortingChanged, thi
s._sortItems, this); | 55 this._dataGrid.addEventListener(DataGrid.DataGrid.Events.SortingChanged, thi
s._sortItems, this); |
| 56 | 56 |
| 57 this._dataGrid.setName('ResourceWebSocketFrameView'); | 57 this._dataGrid.setName('ResourceWebSocketFrameView'); |
| 58 this._dataGrid.addEventListener(DataGrid.DataGrid.Events.SelectedNode, this.
_onFrameSelected, this); | 58 this._dataGrid.addEventListener(DataGrid.DataGrid.Events.SelectedNode, this.
_onFrameSelected, this); |
| 59 this._dataGrid.addEventListener(DataGrid.DataGrid.Events.DeselectedNode, thi
s._onFrameDeselected, this); | 59 this._dataGrid.addEventListener(DataGrid.DataGrid.Events.DeselectedNode, thi
s._onFrameDeselected, this); |
| 60 this._splitWidget.setMainWidget(this._dataGrid.asWidget()); | |
| 61 | 60 |
| 62 var view = new UI.EmptyWidget('Select frame to browse its content.'); | 61 this._mainToolbar = new UI.Toolbar(''); |
| 63 this._splitWidget.setSidebarWidget(view); | 62 |
| 63 this._clearAllButton = new UI.ToolbarButton(Common.UIString('Clear All'), 'l
argeicon-clear'); |
| 64 this._clearAllButton.addEventListener(UI.ToolbarButton.Events.Click, this._c
learFrames, this); |
| 65 this._mainToolbar.appendToolbarItem(this._clearAllButton); |
| 66 |
| 67 this._filterTypeCombobox = new UI.ToolbarComboBox(this._updateFilterSetting.
bind(this)); |
| 68 for (var filterItem of Network.ResourceWebSocketFrameView._filterTypes) { |
| 69 var option = this._filterTypeCombobox.createOption(filterItem.label, filte
rItem.label, filterItem.name); |
| 70 this._filterTypeCombobox.addOption(option); |
| 71 } |
| 72 this._mainToolbar.appendToolbarItem(this._filterTypeCombobox); |
| 73 this._filterType = null; |
| 74 |
| 75 var placeholder = 'Enter regex, for example: (web)?socket'; |
| 76 this._filterTextInput = new UI.ToolbarInput(Common.UIString(placeholder), 0.
4, undefined, true); |
| 77 this._filterTextInput.addEventListener(UI.ToolbarInput.Event.TextChanged, th
is._updateFilterSetting, this); |
| 78 this._mainToolbar.appendToolbarItem(this._filterTextInput); |
| 79 this._filterRegex = null; |
| 80 |
| 81 var mainContainer = new UI.VBox(); |
| 82 mainContainer.element.appendChild(this._mainToolbar.element); |
| 83 this._dataGrid.asWidget().show(mainContainer.element); |
| 84 this._splitWidget.setMainWidget(mainContainer); |
| 85 |
| 86 this._frameEmptyWidget = new UI.EmptyWidget(Common.UIString('Select frame to
browse its content.')); |
| 87 this._splitWidget.setSidebarWidget(this._frameEmptyWidget); |
| 64 | 88 |
| 65 /** @type {?Network.ResourceWebSocketFrameNode} */ | 89 /** @type {?Network.ResourceWebSocketFrameNode} */ |
| 66 this._selectedNode = null; | 90 this._selectedNode = null; |
| 67 | 91 |
| 68 /** | 92 /** |
| 69 * @param {!UI.ContextMenu} contextMenu | 93 * @param {!UI.ContextMenu} contextMenu |
| 70 * @param {!DataGrid.DataGridNode} node | 94 * @param {!DataGrid.DataGridNode} node |
| 95 * @this {Network.ResourceWebSocketFrameView} |
| 71 */ | 96 */ |
| 72 function onRowContextMenu(contextMenu, node) { | 97 function onRowContextMenu(contextMenu, node) { |
| 73 contextMenu.appendItem( | 98 contextMenu.appendItem( |
| 74 Common.UIString.capitalize('Copy ^message'), | 99 Common.UIString.capitalize('Copy ^message'), |
| 75 InspectorFrontendHost.copyText.bind(InspectorFrontendHost, node.data.d
ata)); | 100 InspectorFrontendHost.copyText.bind(InspectorFrontendHost, node.data.d
ata)); |
| 101 contextMenu.appendSeparator(); |
| 102 contextMenu.appendItem(Common.UIString.capitalize('Clear ^all'), this._cle
arFrames.bind(this)); |
| 76 } | 103 } |
| 77 } | 104 } |
| 78 | 105 |
| 79 /** | 106 /** |
| 80 * @param {number} opCode | 107 * @param {number} opCode |
| 81 * @param {boolean} mask | 108 * @param {boolean} mask |
| 82 * @return {string} | 109 * @return {string} |
| 83 */ | 110 */ |
| 84 static opCodeDescription(opCode, mask) { | 111 static opCodeDescription(opCode, mask) { |
| 85 var rawDescription = Network.ResourceWebSocketFrameView.opCodeDescriptions[o
pCode] || ''; | 112 var rawDescription = Network.ResourceWebSocketFrameView.opCodeDescriptions[o
pCode] || ''; |
| (...skipping 14 matching lines...) Expand all Loading... |
| 100 */ | 127 */ |
| 101 willHide() { | 128 willHide() { |
| 102 this._request.removeEventListener(SDK.NetworkRequest.Events.WebsocketFrameAd
ded, this._frameAdded, this); | 129 this._request.removeEventListener(SDK.NetworkRequest.Events.WebsocketFrameAd
ded, this._frameAdded, this); |
| 103 } | 130 } |
| 104 | 131 |
| 105 /** | 132 /** |
| 106 * @param {!Common.Event} event | 133 * @param {!Common.Event} event |
| 107 */ | 134 */ |
| 108 _frameAdded(event) { | 135 _frameAdded(event) { |
| 109 var frame = /** @type {!SDK.NetworkRequest.WebSocketFrame} */ (event.data); | 136 var frame = /** @type {!SDK.NetworkRequest.WebSocketFrame} */ (event.data); |
| 137 if (!this._frameFilter(frame)) |
| 138 return; |
| 110 this._dataGrid.insertChild(new Network.ResourceWebSocketFrameNode(this._requ
est.url(), frame)); | 139 this._dataGrid.insertChild(new Network.ResourceWebSocketFrameNode(this._requ
est.url(), frame)); |
| 111 } | 140 } |
| 112 | 141 |
| 113 /** | 142 /** |
| 114 * @param {!Common.Event} event | 143 * @param {!SDK.NetworkRequest.WebSocketFrame} frame |
| 144 * @return {boolean} |
| 145 */ |
| 146 _frameFilter(frame) { |
| 147 if (this._filterType && frame.type !== this._filterType) |
| 148 return false; |
| 149 return !this._filterRegex || this._filterRegex.test(frame.text); |
| 150 } |
| 151 |
| 152 _clearFrames() { |
| 153 // TODO(allada): actially remove frames from request. |
| 154 this._request[Network.ResourceWebSocketFrameView._clearFrameOffsetSymbol] =
this._request.frames().length; |
| 155 this.refresh(); |
| 156 } |
| 157 |
| 158 _updateFilterSetting() { |
| 159 var text = this._filterTextInput.value(); |
| 160 var type = this._filterTypeCombobox.selectedOption().value; |
| 161 this._filterRegex = text ? new RegExp(text, 'i') : null; |
| 162 this._filterType = type === 'all' ? null : type; |
| 163 this.refresh(); |
| 164 } |
| 165 |
| 166 /** |
| 167 * @param {!Common.Event} event |
| 115 */ | 168 */ |
| 116 _onFrameSelected(event) { | 169 _onFrameSelected(event) { |
| 117 var selectedNode = /** @type {!Network.ResourceWebSocketFrameNode} */ (event
.data); | 170 var selectedNode = /** @type {!Network.ResourceWebSocketFrameNode} */ (event
.data); |
| 118 this._currentSelectedNode = selectedNode; | 171 this._currentSelectedNode = selectedNode; |
| 119 var contentProvider = selectedNode.contentProvider(); | 172 var contentProvider = selectedNode.contentProvider(); |
| 120 contentProvider.requestContent().then(contentHandler.bind(this)); | 173 contentProvider.requestContent().then(contentHandler.bind(this)); |
| 121 | 174 |
| 122 /** | 175 /** |
| 123 * @param {(string|null)} content | 176 * @param {(string|null)} content |
| 124 * @this {Network.ResourceWebSocketFrameView} | 177 * @this {Network.ResourceWebSocketFrameView} |
| (...skipping 16 matching lines...) Expand all Loading... |
| 141 else | 194 else |
| 142 this._splitWidget.setSidebarWidget(new SourceFrame.ResourceSourceFrame(c
ontentProvider)); | 195 this._splitWidget.setSidebarWidget(new SourceFrame.ResourceSourceFrame(c
ontentProvider)); |
| 143 } | 196 } |
| 144 } | 197 } |
| 145 | 198 |
| 146 /** | 199 /** |
| 147 * @param {!Common.Event} event | 200 * @param {!Common.Event} event |
| 148 */ | 201 */ |
| 149 _onFrameDeselected(event) { | 202 _onFrameDeselected(event) { |
| 150 this._currentSelectedNode = null; | 203 this._currentSelectedNode = null; |
| 204 this._splitWidget.setSidebarWidget(this._frameEmptyWidget); |
| 151 } | 205 } |
| 152 | 206 |
| 153 refresh() { | 207 refresh() { |
| 154 this._dataGrid.rootNode().removeChildren(); | 208 this._dataGrid.rootNode().removeChildren(); |
| 209 |
| 210 var url = this._request.url(); |
| 155 var frames = this._request.frames(); | 211 var frames = this._request.frames(); |
| 156 for (var i = 0; i < frames.length; ++i) | 212 var offset = this._request[Network.ResourceWebSocketFrameView._clearFrameOff
setSymbol] || 0; |
| 157 this._dataGrid.insertChild(new Network.ResourceWebSocketFrameNode(this._re
quest.url(), frames[i])); | 213 frames = frames.slice(offset); |
| 214 frames = frames.filter(this._frameFilter.bind(this)); |
| 215 frames.forEach(frame => this._dataGrid.insertChild(new Network.ResourceWebSo
cketFrameNode(url, frame))); |
| 158 } | 216 } |
| 159 | 217 |
| 160 _sortItems() { | 218 _sortItems() { |
| 161 this._dataGrid.sortNodes(this._timeComparator, !this._dataGrid.isSortOrderAs
cending()); | 219 this._dataGrid.sortNodes(this._timeComparator, !this._dataGrid.isSortOrderAs
cending()); |
| 162 } | 220 } |
| 163 }; | 221 }; |
| 164 | 222 |
| 165 /** @enum {number} */ | 223 /** @enum {number} */ |
| 166 Network.ResourceWebSocketFrameView.OpCodes = { | 224 Network.ResourceWebSocketFrameView.OpCodes = { |
| 167 ContinuationFrame: 0, | 225 ContinuationFrame: 0, |
| (...skipping 10 matching lines...) Expand all Loading... |
| 178 var map = []; | 236 var map = []; |
| 179 map[opCodes.ContinuationFrame] = 'Continuation Frame'; | 237 map[opCodes.ContinuationFrame] = 'Continuation Frame'; |
| 180 map[opCodes.TextFrame] = 'Text Frame'; | 238 map[opCodes.TextFrame] = 'Text Frame'; |
| 181 map[opCodes.BinaryFrame] = 'Binary Frame'; | 239 map[opCodes.BinaryFrame] = 'Binary Frame'; |
| 182 map[opCodes.ContinuationFrame] = 'Connection Close Frame'; | 240 map[opCodes.ContinuationFrame] = 'Connection Close Frame'; |
| 183 map[opCodes.PingFrame] = 'Ping Frame'; | 241 map[opCodes.PingFrame] = 'Ping Frame'; |
| 184 map[opCodes.PongFrame] = 'Pong Frame'; | 242 map[opCodes.PongFrame] = 'Pong Frame'; |
| 185 return map; | 243 return map; |
| 186 })(); | 244 })(); |
| 187 | 245 |
| 246 /** @type {!Array<!UI.NamedBitSetFilterUI.Item>} */ |
| 247 Network.ResourceWebSocketFrameView._filterTypes = [ |
| 248 {name: 'all', label: Common.UIString('All')}, |
| 249 {name: 'send', label: Common.UIString('Send')}, |
| 250 {name: 'receive', label: Common.UIString('Receive')}, |
| 251 ]; |
| 188 | 252 |
| 189 /** | 253 /** |
| 190 * @unrestricted | 254 * @unrestricted |
| 191 */ | 255 */ |
| 192 Network.ResourceWebSocketFrameNode = class extends DataGrid.SortableDataGridNode
{ | 256 Network.ResourceWebSocketFrameNode = class extends DataGrid.SortableDataGridNode
{ |
| 193 /** | 257 /** |
| 194 * @param {string} url | 258 * @param {string} url |
| 195 * @param {!SDK.NetworkRequest.WebSocketFrame} frame | 259 * @param {!SDK.NetworkRequest.WebSocketFrame} frame |
| 196 */ | 260 */ |
| 197 constructor(url, frame) { | 261 constructor(url, frame) { |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 246 }; | 310 }; |
| 247 | 311 |
| 248 /** | 312 /** |
| 249 * @param {!Network.ResourceWebSocketFrameNode} a | 313 * @param {!Network.ResourceWebSocketFrameNode} a |
| 250 * @param {!Network.ResourceWebSocketFrameNode} b | 314 * @param {!Network.ResourceWebSocketFrameNode} b |
| 251 * @return {number} | 315 * @return {number} |
| 252 */ | 316 */ |
| 253 Network.ResourceWebSocketFrameNodeTimeComparator = function(a, b) { | 317 Network.ResourceWebSocketFrameNodeTimeComparator = function(a, b) { |
| 254 return a._frame.time - b._frame.time; | 318 return a._frame.time - b._frame.time; |
| 255 }; | 319 }; |
| 320 |
| 321 Network.ResourceWebSocketFrameView._clearFrameOffsetSymbol = Symbol('ClearFrameO
ffset'); |
| OLD | NEW |