| 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 |
| 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| 12 * Lesser General Public License for more details. | 12 * Lesser General Public License for more details. |
| 13 * | 13 * |
| 14 * You should have received a copy of the GNU Lesser General Public | 14 * You should have received a copy of the GNU Lesser General Public |
| 15 * License along with this library; if not, write to the Free Software | 15 * License along with this library; if not, write to the Free Software |
| 16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 US
A | 16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 US
A |
| 17 */ | 17 */ |
| 18 | 18 |
| 19 /** | 19 /** |
| 20 * @unrestricted | 20 * @unrestricted |
| 21 */ | 21 */ |
| 22 WebInspector.ResourceWebSocketFrameView = class extends WebInspector.VBox { | 22 Network.ResourceWebSocketFrameView = class extends UI.VBox { |
| 23 /** | 23 /** |
| 24 * @param {!WebInspector.NetworkRequest} request | 24 * @param {!SDK.NetworkRequest} request |
| 25 */ | 25 */ |
| 26 constructor(request) { | 26 constructor(request) { |
| 27 super(); | 27 super(); |
| 28 this.registerRequiredCSS('network/webSocketFrameView.css'); | 28 this.registerRequiredCSS('network/webSocketFrameView.css'); |
| 29 this.element.classList.add('websocket-frame-view'); | 29 this.element.classList.add('websocket-frame-view'); |
| 30 this._request = request; | 30 this._request = request; |
| 31 | 31 |
| 32 this._splitWidget = new WebInspector.SplitWidget(false, true, 'resourceWebSo
cketFrameSplitViewState'); | 32 this._splitWidget = new UI.SplitWidget(false, true, 'resourceWebSocketFrameS
plitViewState'); |
| 33 this._splitWidget.show(this.element); | 33 this._splitWidget.show(this.element); |
| 34 | 34 |
| 35 var columns = /** @type {!Array<!WebInspector.DataGrid.ColumnDescriptor>} */
([ | 35 var columns = /** @type {!Array<!UI.DataGrid.ColumnDescriptor>} */ ([ |
| 36 {id: 'data', title: WebInspector.UIString('Data'), sortable: false, weight
: 88}, { | 36 {id: 'data', title: Common.UIString('Data'), sortable: false, weight: 88},
{ |
| 37 id: 'length', | 37 id: 'length', |
| 38 title: WebInspector.UIString('Length'), | 38 title: Common.UIString('Length'), |
| 39 sortable: false, | 39 sortable: false, |
| 40 align: WebInspector.DataGrid.Align.Right, | 40 align: UI.DataGrid.Align.Right, |
| 41 weight: 5 | 41 weight: 5 |
| 42 }, | 42 }, |
| 43 {id: 'time', title: WebInspector.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 WebInspector.SortableDataGrid(columns); | 46 this._dataGrid = new UI.SortableDataGrid(columns); |
| 47 this._dataGrid.setRowContextMenuCallback(onRowContextMenu); | 47 this._dataGrid.setRowContextMenuCallback(onRowContextMenu); |
| 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 = /** @type {!WebInspector.SortableDataGrid.NodeCompara
tor} */ ( | 50 this._timeComparator = /** @type {!UI.SortableDataGrid.NodeComparator} */ ( |
| 51 WebInspector.ResourceWebSocketFrameNodeTimeComparator); | 51 Network.ResourceWebSocketFrameNodeTimeComparator); |
| 52 this._dataGrid.sortNodes(this._timeComparator, false); | 52 this._dataGrid.sortNodes(this._timeComparator, false); |
| 53 this._dataGrid.markColumnAsSortedBy('time', WebInspector.DataGrid.Order.Asce
nding); | 53 this._dataGrid.markColumnAsSortedBy('time', UI.DataGrid.Order.Ascending); |
| 54 this._dataGrid.addEventListener(WebInspector.DataGrid.Events.SortingChanged,
this._sortItems, this); | 54 this._dataGrid.addEventListener(UI.DataGrid.Events.SortingChanged, this._sor
tItems, this); |
| 55 | 55 |
| 56 this._dataGrid.setName('ResourceWebSocketFrameView'); | 56 this._dataGrid.setName('ResourceWebSocketFrameView'); |
| 57 this._dataGrid.addEventListener(WebInspector.DataGrid.Events.SelectedNode, t
his._onFrameSelected, this); | 57 this._dataGrid.addEventListener(UI.DataGrid.Events.SelectedNode, this._onFra
meSelected, this); |
| 58 this._dataGrid.addEventListener(WebInspector.DataGrid.Events.DeselectedNode,
this._onFrameDeselected, this); | 58 this._dataGrid.addEventListener(UI.DataGrid.Events.DeselectedNode, this._onF
rameDeselected, this); |
| 59 this._splitWidget.setMainWidget(this._dataGrid.asWidget()); | 59 this._splitWidget.setMainWidget(this._dataGrid.asWidget()); |
| 60 | 60 |
| 61 var view = new WebInspector.EmptyWidget('Select frame to browse its content.
'); | 61 var view = new UI.EmptyWidget('Select frame to browse its content.'); |
| 62 this._splitWidget.setSidebarWidget(view); | 62 this._splitWidget.setSidebarWidget(view); |
| 63 | 63 |
| 64 /** @type {?WebInspector.ResourceWebSocketFrameNode} */ | 64 /** @type {?Network.ResourceWebSocketFrameNode} */ |
| 65 this._selectedNode = null; | 65 this._selectedNode = null; |
| 66 | 66 |
| 67 /** | 67 /** |
| 68 * @param {!WebInspector.ContextMenu} contextMenu | 68 * @param {!UI.ContextMenu} contextMenu |
| 69 * @param {!WebInspector.DataGridNode} node | 69 * @param {!UI.DataGridNode} node |
| 70 */ | 70 */ |
| 71 function onRowContextMenu(contextMenu, node) { | 71 function onRowContextMenu(contextMenu, node) { |
| 72 contextMenu.appendItem( | 72 contextMenu.appendItem( |
| 73 WebInspector.UIString.capitalize('Copy ^message'), | 73 Common.UIString.capitalize('Copy ^message'), |
| 74 InspectorFrontendHost.copyText.bind(InspectorFrontendHost, node.data.d
ata)); | 74 InspectorFrontendHost.copyText.bind(InspectorFrontendHost, node.data.d
ata)); |
| 75 } | 75 } |
| 76 } | 76 } |
| 77 | 77 |
| 78 /** | 78 /** |
| 79 * @param {number} opCode | 79 * @param {number} opCode |
| 80 * @param {boolean} mask | 80 * @param {boolean} mask |
| 81 * @return {string} | 81 * @return {string} |
| 82 */ | 82 */ |
| 83 static opCodeDescription(opCode, mask) { | 83 static opCodeDescription(opCode, mask) { |
| 84 var rawDescription = WebInspector.ResourceWebSocketFrameView.opCodeDescripti
ons[opCode] || ''; | 84 var rawDescription = Network.ResourceWebSocketFrameView.opCodeDescriptions[o
pCode] || ''; |
| 85 var localizedDescription = WebInspector.UIString(rawDescription); | 85 var localizedDescription = Common.UIString(rawDescription); |
| 86 return WebInspector.UIString('%s (Opcode %d%s)', localizedDescription, opCod
e, (mask ? ', mask' : '')); | 86 return Common.UIString('%s (Opcode %d%s)', localizedDescription, opCode, (ma
sk ? ', mask' : '')); |
| 87 } | 87 } |
| 88 | 88 |
| 89 /** | 89 /** |
| 90 * @override | 90 * @override |
| 91 */ | 91 */ |
| 92 wasShown() { | 92 wasShown() { |
| 93 this.refresh(); | 93 this.refresh(); |
| 94 this._request.addEventListener(WebInspector.NetworkRequest.Events.WebsocketF
rameAdded, this._frameAdded, this); | 94 this._request.addEventListener(SDK.NetworkRequest.Events.WebsocketFrameAdded
, this._frameAdded, this); |
| 95 } | 95 } |
| 96 | 96 |
| 97 /** | 97 /** |
| 98 * @override | 98 * @override |
| 99 */ | 99 */ |
| 100 willHide() { | 100 willHide() { |
| 101 this._request.removeEventListener(WebInspector.NetworkRequest.Events.Websock
etFrameAdded, this._frameAdded, this); | 101 this._request.removeEventListener(SDK.NetworkRequest.Events.WebsocketFrameAd
ded, this._frameAdded, this); |
| 102 } | 102 } |
| 103 | 103 |
| 104 /** | 104 /** |
| 105 * @param {!WebInspector.Event} event | 105 * @param {!Common.Event} event |
| 106 */ | 106 */ |
| 107 _frameAdded(event) { | 107 _frameAdded(event) { |
| 108 var frame = /** @type {!WebInspector.NetworkRequest.WebSocketFrame} */ (even
t.data); | 108 var frame = /** @type {!SDK.NetworkRequest.WebSocketFrame} */ (event.data); |
| 109 this._dataGrid.insertChild(new WebInspector.ResourceWebSocketFrameNode(this.
_request.url, frame)); | 109 this._dataGrid.insertChild(new Network.ResourceWebSocketFrameNode(this._requ
est.url, frame)); |
| 110 } | 110 } |
| 111 | 111 |
| 112 /** | 112 /** |
| 113 * @param {!WebInspector.Event} event | 113 * @param {!Common.Event} event |
| 114 */ | 114 */ |
| 115 _onFrameSelected(event) { | 115 _onFrameSelected(event) { |
| 116 var selectedNode = /** @type {!WebInspector.ResourceWebSocketFrameNode} */ (
event.target.selectedNode); | 116 var selectedNode = /** @type {!Network.ResourceWebSocketFrameNode} */ (event
.target.selectedNode); |
| 117 this._currentSelectedNode = selectedNode; | 117 this._currentSelectedNode = selectedNode; |
| 118 var contentProvider = selectedNode.contentProvider(); | 118 var contentProvider = selectedNode.contentProvider(); |
| 119 contentProvider.requestContent().then(contentHandler.bind(this)); | 119 contentProvider.requestContent().then(contentHandler.bind(this)); |
| 120 | 120 |
| 121 /** | 121 /** |
| 122 * @param {(string|null)} content | 122 * @param {(string|null)} content |
| 123 * @this {WebInspector.ResourceWebSocketFrameView} | 123 * @this {Network.ResourceWebSocketFrameView} |
| 124 */ | 124 */ |
| 125 function contentHandler(content) { | 125 function contentHandler(content) { |
| 126 if (this._currentSelectedNode !== selectedNode) | 126 if (this._currentSelectedNode !== selectedNode) |
| 127 return; | 127 return; |
| 128 WebInspector.JSONView.parseJSON(content).then(handleJSONData.bind(this)); | 128 Network.JSONView.parseJSON(content).then(handleJSONData.bind(this)); |
| 129 } | 129 } |
| 130 | 130 |
| 131 /** | 131 /** |
| 132 * @param {?WebInspector.ParsedJSON} parsedJSON | 132 * @param {?Network.ParsedJSON} parsedJSON |
| 133 * @this {WebInspector.ResourceWebSocketFrameView} | 133 * @this {Network.ResourceWebSocketFrameView} |
| 134 */ | 134 */ |
| 135 function handleJSONData(parsedJSON) { | 135 function handleJSONData(parsedJSON) { |
| 136 if (this._currentSelectedNode !== selectedNode) | 136 if (this._currentSelectedNode !== selectedNode) |
| 137 return; | 137 return; |
| 138 if (parsedJSON) | 138 if (parsedJSON) |
| 139 this._splitWidget.setSidebarWidget(WebInspector.JSONView.createSearchabl
eView(parsedJSON)); | 139 this._splitWidget.setSidebarWidget(Network.JSONView.createSearchableView
(parsedJSON)); |
| 140 else | 140 else |
| 141 this._splitWidget.setSidebarWidget(new WebInspector.ResourceSourceFrame(
contentProvider)); | 141 this._splitWidget.setSidebarWidget(new SourceFrame.ResourceSourceFrame(c
ontentProvider)); |
| 142 } | 142 } |
| 143 } | 143 } |
| 144 | 144 |
| 145 /** | 145 /** |
| 146 * @param {!WebInspector.Event} event | 146 * @param {!Common.Event} event |
| 147 */ | 147 */ |
| 148 _onFrameDeselected(event) { | 148 _onFrameDeselected(event) { |
| 149 this._currentSelectedNode = null; | 149 this._currentSelectedNode = null; |
| 150 } | 150 } |
| 151 | 151 |
| 152 refresh() { | 152 refresh() { |
| 153 this._dataGrid.rootNode().removeChildren(); | 153 this._dataGrid.rootNode().removeChildren(); |
| 154 var frames = this._request.frames(); | 154 var frames = this._request.frames(); |
| 155 for (var i = 0; i < frames.length; ++i) | 155 for (var i = 0; i < frames.length; ++i) |
| 156 this._dataGrid.insertChild(new WebInspector.ResourceWebSocketFrameNode(thi
s._request.url, frames[i])); | 156 this._dataGrid.insertChild(new Network.ResourceWebSocketFrameNode(this._re
quest.url, frames[i])); |
| 157 } | 157 } |
| 158 | 158 |
| 159 _sortItems() { | 159 _sortItems() { |
| 160 this._dataGrid.sortNodes(this._timeComparator, !this._dataGrid.isSortOrderAs
cending()); | 160 this._dataGrid.sortNodes(this._timeComparator, !this._dataGrid.isSortOrderAs
cending()); |
| 161 } | 161 } |
| 162 }; | 162 }; |
| 163 | 163 |
| 164 /** @enum {number} */ | 164 /** @enum {number} */ |
| 165 WebInspector.ResourceWebSocketFrameView.OpCodes = { | 165 Network.ResourceWebSocketFrameView.OpCodes = { |
| 166 ContinuationFrame: 0, | 166 ContinuationFrame: 0, |
| 167 TextFrame: 1, | 167 TextFrame: 1, |
| 168 BinaryFrame: 2, | 168 BinaryFrame: 2, |
| 169 ConnectionCloseFrame: 8, | 169 ConnectionCloseFrame: 8, |
| 170 PingFrame: 9, | 170 PingFrame: 9, |
| 171 PongFrame: 10 | 171 PongFrame: 10 |
| 172 }; | 172 }; |
| 173 | 173 |
| 174 /** @type {!Array.<string> } */ | 174 /** @type {!Array.<string> } */ |
| 175 WebInspector.ResourceWebSocketFrameView.opCodeDescriptions = (function() { | 175 Network.ResourceWebSocketFrameView.opCodeDescriptions = (function() { |
| 176 var opCodes = WebInspector.ResourceWebSocketFrameView.OpCodes; | 176 var opCodes = Network.ResourceWebSocketFrameView.OpCodes; |
| 177 var map = []; | 177 var map = []; |
| 178 map[opCodes.ContinuationFrame] = 'Continuation Frame'; | 178 map[opCodes.ContinuationFrame] = 'Continuation Frame'; |
| 179 map[opCodes.TextFrame] = 'Text Frame'; | 179 map[opCodes.TextFrame] = 'Text Frame'; |
| 180 map[opCodes.BinaryFrame] = 'Binary Frame'; | 180 map[opCodes.BinaryFrame] = 'Binary Frame'; |
| 181 map[opCodes.ContinuationFrame] = 'Connection Close Frame'; | 181 map[opCodes.ContinuationFrame] = 'Connection Close Frame'; |
| 182 map[opCodes.PingFrame] = 'Ping Frame'; | 182 map[opCodes.PingFrame] = 'Ping Frame'; |
| 183 map[opCodes.PongFrame] = 'Pong Frame'; | 183 map[opCodes.PongFrame] = 'Pong Frame'; |
| 184 return map; | 184 return map; |
| 185 })(); | 185 })(); |
| 186 | 186 |
| 187 | 187 |
| 188 /** | 188 /** |
| 189 * @unrestricted | 189 * @unrestricted |
| 190 */ | 190 */ |
| 191 WebInspector.ResourceWebSocketFrameNode = class extends WebInspector.SortableDat
aGridNode { | 191 Network.ResourceWebSocketFrameNode = class extends UI.SortableDataGridNode { |
| 192 /** | 192 /** |
| 193 * @param {string} url | 193 * @param {string} url |
| 194 * @param {!WebInspector.NetworkRequest.WebSocketFrame} frame | 194 * @param {!SDK.NetworkRequest.WebSocketFrame} frame |
| 195 */ | 195 */ |
| 196 constructor(url, frame) { | 196 constructor(url, frame) { |
| 197 var dataText = frame.text; | 197 var dataText = frame.text; |
| 198 var length = frame.text.length; | 198 var length = frame.text.length; |
| 199 var time = new Date(frame.time * 1000); | 199 var time = new Date(frame.time * 1000); |
| 200 var timeText = ('0' + time.getHours()).substr(-2) + ':' + ('0' + time.getMin
utes()).substr(-2) + ':' + | 200 var timeText = ('0' + time.getHours()).substr(-2) + ':' + ('0' + time.getMin
utes()).substr(-2) + ':' + |
| 201 ('0' + time.getSeconds()).substr(-2) + '.' + ('00' + time.getMillisecond
s()).substr(-3); | 201 ('0' + time.getSeconds()).substr(-2) + '.' + ('00' + time.getMillisecond
s()).substr(-3); |
| 202 var timeNode = createElement('div'); | 202 var timeNode = createElement('div'); |
| 203 timeNode.createTextChild(timeText); | 203 timeNode.createTextChild(timeText); |
| 204 timeNode.title = time.toLocaleString(); | 204 timeNode.title = time.toLocaleString(); |
| 205 | 205 |
| 206 var isTextFrame = frame.opCode === WebInspector.ResourceWebSocketFrameView.O
pCodes.TextFrame; | 206 var isTextFrame = frame.opCode === Network.ResourceWebSocketFrameView.OpCode
s.TextFrame; |
| 207 if (!isTextFrame) | 207 if (!isTextFrame) |
| 208 dataText = WebInspector.ResourceWebSocketFrameView.opCodeDescription(frame
.opCode, frame.mask); | 208 dataText = Network.ResourceWebSocketFrameView.opCodeDescription(frame.opCo
de, frame.mask); |
| 209 | 209 |
| 210 super({data: dataText, length: length, time: timeNode}); | 210 super({data: dataText, length: length, time: timeNode}); |
| 211 | 211 |
| 212 this._url = url; | 212 this._url = url; |
| 213 this._frame = frame; | 213 this._frame = frame; |
| 214 this._isTextFrame = isTextFrame; | 214 this._isTextFrame = isTextFrame; |
| 215 this._dataText = dataText; | 215 this._dataText = dataText; |
| 216 } | 216 } |
| 217 | 217 |
| 218 /** | 218 /** |
| 219 * @override | 219 * @override |
| 220 */ | 220 */ |
| 221 createCells() { | 221 createCells() { |
| 222 var element = this._element; | 222 var element = this._element; |
| 223 element.classList.toggle( | 223 element.classList.toggle( |
| 224 'websocket-frame-view-row-error', this._frame.type === WebInspector.Netw
orkRequest.WebSocketFrameType.Error); | 224 'websocket-frame-view-row-error', this._frame.type === SDK.NetworkReques
t.WebSocketFrameType.Error); |
| 225 element.classList.toggle( | 225 element.classList.toggle( |
| 226 'websocket-frame-view-row-outcoming', this._frame.type === WebInspector.
NetworkRequest.WebSocketFrameType.Send); | 226 'websocket-frame-view-row-outcoming', this._frame.type === SDK.NetworkRe
quest.WebSocketFrameType.Send); |
| 227 element.classList.toggle('websocket-frame-view-row-opcode', !this._isTextFra
me); | 227 element.classList.toggle('websocket-frame-view-row-opcode', !this._isTextFra
me); |
| 228 super.createCells(); | 228 super.createCells(); |
| 229 } | 229 } |
| 230 | 230 |
| 231 /** | 231 /** |
| 232 * @override | 232 * @override |
| 233 * @return {number} | 233 * @return {number} |
| 234 */ | 234 */ |
| 235 nodeSelfHeight() { | 235 nodeSelfHeight() { |
| 236 return 17; | 236 return 17; |
| 237 } | 237 } |
| 238 | 238 |
| 239 /** | 239 /** |
| 240 * @return {!WebInspector.ContentProvider} | 240 * @return {!Common.ContentProvider} |
| 241 */ | 241 */ |
| 242 contentProvider() { | 242 contentProvider() { |
| 243 return WebInspector.StaticContentProvider.fromString( | 243 return Common.StaticContentProvider.fromString( |
| 244 this._url, WebInspector.resourceTypes.WebSocket, this._dataText); | 244 this._url, Common.resourceTypes.WebSocket, this._dataText); |
| 245 } | 245 } |
| 246 }; | 246 }; |
| 247 | 247 |
| 248 /** | 248 /** |
| 249 * @param {!WebInspector.ResourceWebSocketFrameNode} a | 249 * @param {!Network.ResourceWebSocketFrameNode} a |
| 250 * @param {!WebInspector.ResourceWebSocketFrameNode} b | 250 * @param {!Network.ResourceWebSocketFrameNode} b |
| 251 * @return {number} | 251 * @return {number} |
| 252 */ | 252 */ |
| 253 WebInspector.ResourceWebSocketFrameNodeTimeComparator = function(a, b) { | 253 Network.ResourceWebSocketFrameNodeTimeComparator = function(a, b) { |
| 254 return a._frame.time - b._frame.time; | 254 return a._frame.time - b._frame.time; |
| 255 }; | 255 }; |
| OLD | NEW |