| OLD | NEW |
| 1 // Copyright (c) 2015 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2015 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | |
| 5 /** | 4 /** |
| 6 * @constructor | |
| 7 * @implements {InspectorBackendClass.Connection} | 5 * @implements {InspectorBackendClass.Connection} |
| 8 * @param {!InspectorBackendClass.Connection.Params} params | 6 * @unrestricted |
| 9 */ | 7 */ |
| 10 WebInspector.MainConnection = function(params) | 8 WebInspector.MainConnection = class { |
| 11 { | 9 /** |
| 10 * @param {!InspectorBackendClass.Connection.Params} params |
| 11 */ |
| 12 constructor(params) { |
| 12 this._onMessage = params.onMessage; | 13 this._onMessage = params.onMessage; |
| 13 this._onDisconnect = params.onDisconnect; | 14 this._onDisconnect = params.onDisconnect; |
| 14 this._disconnected = false; | 15 this._disconnected = false; |
| 15 this._eventListeners = [ | 16 this._eventListeners = [ |
| 16 InspectorFrontendHost.events.addEventListener(InspectorFrontendHostAPI.E
vents.DispatchMessage, this._dispatchMessage, this), | 17 InspectorFrontendHost.events.addEventListener( |
| 17 InspectorFrontendHost.events.addEventListener(InspectorFrontendHostAPI.E
vents.DispatchMessageChunk, this._dispatchMessageChunk, this), | 18 InspectorFrontendHostAPI.Events.DispatchMessage, this._dispatchMessage
, this), |
| 18 InspectorFrontendHost.events.addEventListener(InspectorFrontendHostAPI.E
vents.EvaluateForTestInFrontend, this._evaluateForTestInFrontend, this), | 19 InspectorFrontendHost.events.addEventListener( |
| 20 InspectorFrontendHostAPI.Events.DispatchMessageChunk, this._dispatchMe
ssageChunk, this), |
| 21 InspectorFrontendHost.events.addEventListener( |
| 22 InspectorFrontendHostAPI.Events.EvaluateForTestInFrontend, this._evalu
ateForTestInFrontend, this), |
| 19 ]; | 23 ]; |
| 20 }; | 24 } |
| 21 | 25 |
| 22 WebInspector.MainConnection.prototype = { | 26 /** |
| 27 * @override |
| 28 * @param {string} message |
| 29 */ |
| 30 sendMessage(message) { |
| 31 if (!this._disconnected) |
| 32 InspectorFrontendHost.sendMessageToBackend(message); |
| 33 } |
| 34 |
| 35 /** |
| 36 * @param {!WebInspector.Event} event |
| 37 */ |
| 38 _dispatchMessage(event) { |
| 39 this._onMessage.call(null, /** @type {string} */ (event.data)); |
| 40 } |
| 41 |
| 42 /** |
| 43 * @param {!WebInspector.Event} event |
| 44 */ |
| 45 _dispatchMessageChunk(event) { |
| 46 var messageChunk = /** @type {string} */ (event.data['messageChunk']); |
| 47 var messageSize = /** @type {number} */ (event.data['messageSize']); |
| 48 if (messageSize) { |
| 49 this._messageBuffer = ''; |
| 50 this._messageSize = messageSize; |
| 51 } |
| 52 this._messageBuffer += messageChunk; |
| 53 if (this._messageBuffer.length === this._messageSize) { |
| 54 this._onMessage.call(null, this._messageBuffer); |
| 55 this._messageBuffer = ''; |
| 56 this._messageSize = 0; |
| 57 } |
| 58 } |
| 59 |
| 60 /** |
| 61 * @param {!WebInspector.Event} event |
| 62 */ |
| 63 _evaluateForTestInFrontend(event) { |
| 64 if (!InspectorFrontendHost.isUnderTest()) |
| 65 return; |
| 66 |
| 67 var callId = /** @type {number} */ (event.data['callId']); |
| 68 var script = /** @type {number} */ (event.data['script']); |
| 23 | 69 |
| 24 /** | 70 /** |
| 25 * @override | 71 * @suppressGlobalPropertiesCheck |
| 26 * @param {string} message | |
| 27 */ | 72 */ |
| 28 sendMessage: function(message) | 73 function invokeMethod() { |
| 29 { | 74 try { |
| 30 if (!this._disconnected) | 75 script = script + '//# sourceURL=evaluateInWebInspector' + callId + '.js
'; |
| 31 InspectorFrontendHost.sendMessageToBackend(message); | 76 window.eval(script); |
| 32 }, | 77 } catch (e) { |
| 78 console.error(e.stack); |
| 79 } |
| 80 } |
| 33 | 81 |
| 34 /** | 82 InspectorBackendClass.deprecatedRunAfterPendingDispatches(invokeMethod); |
| 35 * @param {!WebInspector.Event} event | 83 } |
| 36 */ | |
| 37 _dispatchMessage: function(event) | |
| 38 { | |
| 39 this._onMessage.call(null, /** @type {string} */ (event.data)); | |
| 40 }, | |
| 41 | 84 |
| 42 /** | 85 /** |
| 43 * @param {!WebInspector.Event} event | 86 * @override |
| 44 */ | 87 * @return {!Promise} |
| 45 _dispatchMessageChunk: function(event) | 88 */ |
| 46 { | 89 disconnect() { |
| 47 var messageChunk = /** @type {string} */ (event.data["messageChunk"]); | 90 var onDisconnect = this._onDisconnect; |
| 48 var messageSize = /** @type {number} */ (event.data["messageSize"]); | 91 WebInspector.EventTarget.removeEventListeners(this._eventListeners); |
| 49 if (messageSize) { | 92 this._onDisconnect = null; |
| 50 this._messageBuffer = ""; | 93 this._onMessage = null; |
| 51 this._messageSize = messageSize; | 94 this._disconnected = true; |
| 52 } | |
| 53 this._messageBuffer += messageChunk; | |
| 54 if (this._messageBuffer.length === this._messageSize) { | |
| 55 this._onMessage.call(null, this._messageBuffer); | |
| 56 this._messageBuffer = ""; | |
| 57 this._messageSize = 0; | |
| 58 } | |
| 59 }, | |
| 60 | 95 |
| 61 /** | 96 var fulfill; |
| 62 * @param {!WebInspector.Event} event | 97 var promise = new Promise(f => fulfill = f); |
| 63 */ | 98 InspectorFrontendHost.reattach(() => { |
| 64 _evaluateForTestInFrontend: function(event) | 99 onDisconnect.call(null, 'force disconnect'); |
| 65 { | 100 fulfill(); |
| 66 if (!InspectorFrontendHost.isUnderTest()) | 101 }); |
| 67 return; | 102 return promise; |
| 68 | 103 } |
| 69 var callId = /** @type {number} */ (event.data["callId"]); | |
| 70 var script = /** @type {number} */ (event.data["script"]); | |
| 71 | |
| 72 /** | |
| 73 * @suppressGlobalPropertiesCheck | |
| 74 */ | |
| 75 function invokeMethod() | |
| 76 { | |
| 77 try { | |
| 78 script = script + "//# sourceURL=evaluateInWebInspector" + callI
d + ".js"; | |
| 79 window.eval(script); | |
| 80 } catch (e) { | |
| 81 console.error(e.stack); | |
| 82 } | |
| 83 } | |
| 84 | |
| 85 InspectorBackendClass.deprecatedRunAfterPendingDispatches(invokeMethod); | |
| 86 }, | |
| 87 | |
| 88 /** | |
| 89 * @override | |
| 90 * @return {!Promise} | |
| 91 */ | |
| 92 disconnect: function() | |
| 93 { | |
| 94 var onDisconnect = this._onDisconnect; | |
| 95 WebInspector.EventTarget.removeEventListeners(this._eventListeners); | |
| 96 this._onDisconnect = null; | |
| 97 this._onMessage = null; | |
| 98 this._disconnected = true; | |
| 99 | |
| 100 var fulfill; | |
| 101 var promise = new Promise(f => fulfill = f); | |
| 102 InspectorFrontendHost.reattach(() => { | |
| 103 onDisconnect.call(null, "force disconnect"); | |
| 104 fulfill(); | |
| 105 }); | |
| 106 return promise; | |
| 107 }, | |
| 108 }; | 104 }; |
| 109 | 105 |
| 110 /** | 106 /** |
| 111 * @constructor | |
| 112 * @implements {InspectorBackendClass.Connection} | 107 * @implements {InspectorBackendClass.Connection} |
| 113 * @param {string} url | 108 * @unrestricted |
| 114 * @param {function()} onWebSocketDisconnect | |
| 115 * @param {!InspectorBackendClass.Connection.Params} params | |
| 116 */ | 109 */ |
| 117 WebInspector.WebSocketConnection = function(url, onWebSocketDisconnect, params) | 110 WebInspector.WebSocketConnection = class { |
| 118 { | 111 /** |
| 112 * @param {string} url |
| 113 * @param {function()} onWebSocketDisconnect |
| 114 * @param {!InspectorBackendClass.Connection.Params} params |
| 115 */ |
| 116 constructor(url, onWebSocketDisconnect, params) { |
| 119 this._socket = new WebSocket(url); | 117 this._socket = new WebSocket(url); |
| 120 this._socket.onerror = this._onError.bind(this); | 118 this._socket.onerror = this._onError.bind(this); |
| 121 this._socket.onopen = this._onOpen.bind(this); | 119 this._socket.onopen = this._onOpen.bind(this); |
| 122 this._socket.onmessage = (messageEvent) => params.onMessage.call(null, /** @
type {string} */ (messageEvent.data)); | 120 this._socket.onmessage = (messageEvent) => params.onMessage.call(null, /** @
type {string} */ (messageEvent.data)); |
| 123 this._socket.onclose = this._onClose.bind(this); | 121 this._socket.onclose = this._onClose.bind(this); |
| 124 | 122 |
| 125 this._onDisconnect = params.onDisconnect; | 123 this._onDisconnect = params.onDisconnect; |
| 126 this._onWebSocketDisconnect = onWebSocketDisconnect; | 124 this._onWebSocketDisconnect = onWebSocketDisconnect; |
| 127 this._connected = false; | 125 this._connected = false; |
| 128 this._messages = []; | 126 this._messages = []; |
| 129 }; | 127 } |
| 130 | 128 |
| 131 WebInspector.WebSocketConnection.prototype = { | 129 _onError() { |
| 132 _onError: function() | 130 this._onWebSocketDisconnect.call(null); |
| 133 { | 131 // This is called if error occurred while connecting. |
| 134 this._onWebSocketDisconnect.call(null); | 132 this._onDisconnect.call(null, 'connection failed'); |
| 135 // This is called if error occurred while connecting. | 133 this._close(); |
| 136 this._onDisconnect.call(null, "connection failed"); | 134 } |
| 137 this._close(); | |
| 138 }, | |
| 139 | 135 |
| 140 _onOpen: function() | 136 _onOpen() { |
| 141 { | 137 this._socket.onerror = console.error; |
| 142 this._socket.onerror = console.error; | 138 this._connected = true; |
| 143 this._connected = true; | 139 for (var message of this._messages) |
| 144 for (var message of this._messages) | 140 this._socket.send(message); |
| 145 this._socket.send(message); | 141 this._messages = []; |
| 146 this._messages = []; | 142 } |
| 147 }, | |
| 148 | 143 |
| 149 _onClose: function() | 144 _onClose() { |
| 150 { | 145 this._onWebSocketDisconnect.call(null); |
| 151 this._onWebSocketDisconnect.call(null); | 146 this._onDisconnect.call(null, 'websocket closed'); |
| 152 this._onDisconnect.call(null, "websocket closed"); | 147 this._close(); |
| 153 this._close(); | 148 } |
| 154 }, | |
| 155 | 149 |
| 156 /** | 150 /** |
| 157 * @param {function()=} callback | 151 * @param {function()=} callback |
| 158 */ | 152 */ |
| 159 _close: function(callback) | 153 _close(callback) { |
| 160 { | 154 this._socket.onerror = null; |
| 161 this._socket.onerror = null; | 155 this._socket.onopen = null; |
| 162 this._socket.onopen = null; | 156 this._socket.onclose = callback || null; |
| 163 this._socket.onclose = callback || null; | 157 this._socket.onmessage = null; |
| 164 this._socket.onmessage = null; | 158 this._socket.close(); |
| 165 this._socket.close(); | 159 this._socket = null; |
| 166 this._socket = null; | 160 this._onWebSocketDisconnect = null; |
| 167 this._onWebSocketDisconnect = null; | 161 } |
| 168 }, | |
| 169 | 162 |
| 170 /** | 163 /** |
| 171 * @override | 164 * @override |
| 172 * @param {string} message | 165 * @param {string} message |
| 173 */ | 166 */ |
| 174 sendMessage: function(message) | 167 sendMessage(message) { |
| 175 { | 168 if (this._connected) |
| 176 if (this._connected) | 169 this._socket.send(message); |
| 177 this._socket.send(message); | 170 else |
| 178 else | 171 this._messages.push(message); |
| 179 this._messages.push(message); | 172 } |
| 180 }, | |
| 181 | 173 |
| 182 /** | 174 /** |
| 183 * @override | 175 * @override |
| 184 * @return {!Promise} | 176 * @return {!Promise} |
| 185 */ | 177 */ |
| 186 disconnect: function() | 178 disconnect() { |
| 187 { | 179 var fulfill; |
| 188 var fulfill; | 180 var promise = new Promise(f => fulfill = f); |
| 189 var promise = new Promise(f => fulfill = f); | 181 this._close(() => { |
| 190 this._close(() => { | 182 this._onDisconnect.call(null, 'force disconnect'); |
| 191 this._onDisconnect.call(null, "force disconnect"); | 183 fulfill(); |
| 192 fulfill(); | 184 }); |
| 193 }); | 185 return promise; |
| 194 return promise; | 186 } |
| 195 } | |
| 196 }; | 187 }; |
| 197 | 188 |
| 198 /** | 189 /** |
| 199 * @constructor | |
| 200 * @implements {InspectorBackendClass.Connection} | 190 * @implements {InspectorBackendClass.Connection} |
| 201 * @param {!InspectorBackendClass.Connection.Params} params | 191 * @unrestricted |
| 202 */ | 192 */ |
| 203 WebInspector.StubConnection = function(params) | 193 WebInspector.StubConnection = class { |
| 204 { | 194 /** |
| 195 * @param {!InspectorBackendClass.Connection.Params} params |
| 196 */ |
| 197 constructor(params) { |
| 205 this._onMessage = params.onMessage; | 198 this._onMessage = params.onMessage; |
| 206 this._onDisconnect = params.onDisconnect; | 199 this._onDisconnect = params.onDisconnect; |
| 200 } |
| 201 |
| 202 /** |
| 203 * @override |
| 204 * @param {string} message |
| 205 */ |
| 206 sendMessage(message) { |
| 207 setTimeout(this._respondWithError.bind(this, message), 0); |
| 208 } |
| 209 |
| 210 /** |
| 211 * @param {string} message |
| 212 */ |
| 213 _respondWithError(message) { |
| 214 var messageObject = JSON.parse(message); |
| 215 var error = { |
| 216 message: 'This is a stub connection, can\'t dispatch message.', |
| 217 code: InspectorBackendClass.DevToolsStubErrorCode, |
| 218 data: messageObject |
| 219 }; |
| 220 this._onMessage.call(null, {id: messageObject.id, error: error}); |
| 221 } |
| 222 |
| 223 /** |
| 224 * @override |
| 225 * @return {!Promise} |
| 226 */ |
| 227 disconnect() { |
| 228 this._onDisconnect.call(null, 'force disconnect'); |
| 229 this._onDisconnect = null; |
| 230 this._onMessage = null; |
| 231 return Promise.resolve(); |
| 232 } |
| 207 }; | 233 }; |
| 208 | |
| 209 WebInspector.StubConnection.prototype = { | |
| 210 /** | |
| 211 * @override | |
| 212 * @param {string} message | |
| 213 */ | |
| 214 sendMessage: function(message) | |
| 215 { | |
| 216 setTimeout(this._respondWithError.bind(this, message), 0); | |
| 217 }, | |
| 218 | |
| 219 /** | |
| 220 * @param {string} message | |
| 221 */ | |
| 222 _respondWithError: function(message) | |
| 223 { | |
| 224 var messageObject = JSON.parse(message); | |
| 225 var error = { message: "This is a stub connection, can't dispatch messag
e.", code: InspectorBackendClass.DevToolsStubErrorCode, data: messageObject }; | |
| 226 this._onMessage.call(null, { id: messageObject.id, error: error }); | |
| 227 }, | |
| 228 | |
| 229 /** | |
| 230 * @override | |
| 231 * @return {!Promise} | |
| 232 */ | |
| 233 disconnect: function() | |
| 234 { | |
| 235 this._onDisconnect.call(null, "force disconnect"); | |
| 236 this._onDisconnect = null; | |
| 237 this._onMessage = null; | |
| 238 return Promise.resolve(); | |
| 239 }, | |
| 240 }; | |
| OLD | NEW |