OLD | NEW |
1 // Copyright 2017 The Chromium Authors. All rights reserved. | 1 // Copyright 2017 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 | 4 |
5 var TestRunner = class { | 5 var TestRunner = class { |
6 constructor(baseURL, log, completeTest, fetch) { | 6 constructor(baseURL, log, completeTest, fetch) { |
7 this._dumpInspectorProtocolMessages = false; | 7 this._dumpInspectorProtocolMessages = false; |
8 this._baseURL = baseURL; | 8 this._baseURL = baseURL; |
9 this._log = log; | 9 this._log = log; |
10 this._completeTest = completeTest; | 10 this._completeTest = completeTest; |
(...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
160 } | 160 } |
161 }; | 161 }; |
162 | 162 |
163 TestRunner.Page = class { | 163 TestRunner.Page = class { |
164 constructor(testRunner, targetId) { | 164 constructor(testRunner, targetId) { |
165 this._testRunner = testRunner; | 165 this._testRunner = testRunner; |
166 this._targetId = targetId; | 166 this._targetId = targetId; |
167 } | 167 } |
168 | 168 |
169 async createSession() { | 169 async createSession() { |
170 await DevToolsAPI._sendCommandOrDie('Target.attachToTarget', {targetId: this
._targetId}); | 170 var sessionId = (await DevToolsAPI._sendCommandOrDie('Target.attachToTarget'
, {targetId: this._targetId})).sessionId; |
171 var session = new TestRunner.Session(this); | 171 var session = new TestRunner.Session(this, sessionId); |
172 DevToolsAPI._sessions.set(this._targetId, session); | 172 DevToolsAPI._sessions.set(sessionId, session); |
173 return session; | 173 return session; |
174 } | 174 } |
175 | 175 |
176 navigate(url) { | 176 navigate(url) { |
177 return this._navigate(this._testRunner.url(url)); | 177 return this._navigate(this._testRunner.url(url)); |
178 } | 178 } |
179 | 179 |
180 async _navigate(url) { | 180 async _navigate(url) { |
181 if (DevToolsAPI._sessions.get(this._targetId)) | |
182 this._testRunner.die(`Cannot navigate to ${url} with active session`, new
Error()); | |
183 | |
184 var session = await this.createSession(); | 181 var session = await this.createSession(); |
185 session.protocol.Page.enable(); | 182 session.protocol.Page.enable(); |
186 session.protocol.Page.navigate({url: url}); | 183 session.protocol.Page.navigate({url: url}); |
187 | 184 |
188 var callback; | 185 var callback; |
189 var promise = new Promise(f => callback = f); | 186 var promise = new Promise(f => callback = f); |
190 session.protocol.Page.onFrameNavigated(message => { | 187 session.protocol.Page.onFrameNavigated(message => { |
191 if (!message.params.frame.parentId) | 188 if (!message.params.frame.parentId) |
192 callback(); | 189 callback(); |
193 }); | 190 }); |
194 await promise; | 191 await promise; |
195 | 192 |
196 await session.disconnect(); | 193 await session.disconnect(); |
197 } | 194 } |
198 | 195 |
199 async loadHTML(html) { | 196 async loadHTML(html) { |
200 if (DevToolsAPI._sessions.get(this._targetId)) | |
201 this._testRunner.die('Cannot loadHTML with active session', new Error()); | |
202 | |
203 html = html.replace(/'/g, "\\'").replace(/\n/g, '\\n'); | 197 html = html.replace(/'/g, "\\'").replace(/\n/g, '\\n'); |
204 var session = await this.createSession(); | 198 var session = await this.createSession(); |
205 await session.protocol.Runtime.evaluate({expression: `document.body.innerHTM
L='${html}'`}); | 199 await session.protocol.Runtime.evaluate({expression: `document.body.innerHTM
L='${html}'`}); |
206 await session.disconnect(); | 200 await session.disconnect(); |
207 } | 201 } |
208 }; | 202 }; |
209 | 203 |
210 TestRunner.Session = class { | 204 TestRunner.Session = class { |
211 constructor(page) { | 205 constructor(page, sessionId) { |
212 this._testRunner = page._testRunner; | 206 this._testRunner = page._testRunner; |
213 this._page = page; | 207 this._page = page; |
| 208 this._sessionId = sessionId; |
214 this._requestId = 0; | 209 this._requestId = 0; |
215 this._dispatchTable = new Map(); | 210 this._dispatchTable = new Map(); |
216 this._eventHandlers = new Map(); | 211 this._eventHandlers = new Map(); |
217 this.protocol = this._setupProtocol(); | 212 this.protocol = this._setupProtocol(); |
218 } | 213 } |
219 | 214 |
220 async disconnect() { | 215 async disconnect() { |
221 await DevToolsAPI._sendCommandOrDie('Target.detachFromTarget', {targetId: th
is._page._targetId}); | 216 await DevToolsAPI._sendCommandOrDie('Target.detachFromTarget', {sessionId: t
his._sessionId}); |
222 DevToolsAPI._sessions.delete(this._page._targetId); | 217 DevToolsAPI._sessions.delete(this._sessionId); |
223 } | 218 } |
224 | 219 |
225 sendRawCommand(requestId, message) { | 220 sendRawCommand(requestId, message) { |
226 DevToolsAPI._sendCommandOrDie('Target.sendMessageToTarget', {targetId: this.
_page._targetId, message: message}); | 221 DevToolsAPI._sendCommandOrDie('Target.sendMessageToTarget', {sessionId: this
._sessionId, message: message}); |
227 return new Promise(f => this._dispatchTable.set(requestId, f)); | 222 return new Promise(f => this._dispatchTable.set(requestId, f)); |
228 } | 223 } |
229 | 224 |
230 sendCommand(method, params) { | 225 sendCommand(method, params) { |
231 var requestId = ++this._requestId; | 226 var requestId = ++this._requestId; |
232 var messageObject = {'id': requestId, 'method': method, 'params': params}; | 227 var messageObject = {'id': requestId, 'method': method, 'params': params}; |
233 if (this._testRunner._dumpInspectorProtocolMessages) | 228 if (this._testRunner._dumpInspectorProtocolMessages) |
234 this._testRunner.log(`frontend => backend: ${JSON.stringify(messageObject)
}`); | 229 this._testRunner.log(`frontend => backend: ${JSON.stringify(messageObject)
}`); |
235 return this.sendRawCommand(requestId, JSON.stringify(messageObject)); | 230 return this.sendRawCommand(requestId, JSON.stringify(messageObject)); |
236 } | 231 } |
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
354 try { | 349 try { |
355 if (typeof messageId === 'number') { | 350 if (typeof messageId === 'number') { |
356 var handler = DevToolsAPI._dispatchTable.get(messageId); | 351 var handler = DevToolsAPI._dispatchTable.get(messageId); |
357 if (handler) { | 352 if (handler) { |
358 DevToolsAPI._dispatchTable.delete(messageId); | 353 DevToolsAPI._dispatchTable.delete(messageId); |
359 handler(messageObject); | 354 handler(messageObject); |
360 } | 355 } |
361 } else { | 356 } else { |
362 var eventName = messageObject.method; | 357 var eventName = messageObject.method; |
363 if (eventName === 'Target.receivedMessageFromTarget') { | 358 if (eventName === 'Target.receivedMessageFromTarget') { |
364 var targetId = messageObject.params.targetId; | 359 var sessionId = messageObject.params.sessionId; |
365 var message = messageObject.params.message; | 360 var message = messageObject.params.message; |
366 var session = DevToolsAPI._sessions.get(targetId); | 361 var session = DevToolsAPI._sessions.get(sessionId); |
367 if (session) | 362 if (session) |
368 session._dispatchMessage(JSON.parse(message)); | 363 session._dispatchMessage(JSON.parse(message)); |
369 } | 364 } |
370 } | 365 } |
371 } catch(e) { | 366 } catch(e) { |
372 DevToolsAPI._die(`Exception when dispatching message\n${JSON.stringify(messa
geObject)}`, e); | 367 DevToolsAPI._die(`Exception when dispatching message\n${JSON.stringify(messa
geObject)}`, e); |
373 } | 368 } |
374 }; | 369 }; |
375 | 370 |
376 DevToolsAPI._sendCommand = function(method, params) { | 371 DevToolsAPI._sendCommand = function(method, params) { |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
443 | 438 |
444 window['onerror'] = (message, source, lineno, colno, error) => { | 439 window['onerror'] = (message, source, lineno, colno, error) => { |
445 DevToolsAPI._log(`${error}\n${error.stack}`); | 440 DevToolsAPI._log(`${error}\n${error.stack}`); |
446 DevToolsAPI._completeTest(); | 441 DevToolsAPI._completeTest(); |
447 }; | 442 }; |
448 | 443 |
449 window.addEventListener('unhandledrejection', e => { | 444 window.addEventListener('unhandledrejection', e => { |
450 DevToolsAPI._log(`Promise rejection: ${e.reason}\n${e.reason ? e.reason.stack
: ''}`); | 445 DevToolsAPI._log(`Promise rejection: ${e.reason}\n${e.reason ? e.reason.stack
: ''}`); |
451 DevToolsAPI._completeTest(); | 446 DevToolsAPI._completeTest(); |
452 }, false); | 447 }, false); |
OLD | NEW |