blob: 67f7f9e1cf6380b6652f567fcd32242355478a78 [file] [log] [blame]
Blink Reformat4c46d092018-04-07 15:32:37 +00001// Copyright 2018 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
cjamcl@google.comaa1532c2019-05-31 03:01:24 +00005Audits.ProtocolService = class extends Common.Object {
Blink Reformat4c46d092018-04-07 15:32:37 +00006 constructor() {
7 super();
Dmitry Gozman99d7a6c2018-11-12 17:55:11 +00008 /** @type {?Protocol.Connection} */
Blink Reformat4c46d092018-04-07 15:32:37 +00009 this._rawConnection = null;
10 /** @type {?Services.ServiceManager.Service} */
11 this._backend = null;
12 /** @type {?Promise} */
13 this._backendPromise = null;
14 /** @type {?function(string)} */
15 this._status = null;
16 }
17
18 /**
19 * @return {!Promise<undefined>}
20 */
Connor Clarkca8905e2019-08-23 18:35:10 +000021 async attach() {
22 await SDK.targetManager.suspendAllTargets();
23 const childTargetManager = SDK.targetManager.mainTarget().model(SDK.ChildTargetManager);
24 this._rawConnection = await childTargetManager.createParallelConnection(this._dispatchProtocolMessage.bind(this));
Blink Reformat4c46d092018-04-07 15:32:37 +000025 }
26
27 /**
28 * @param {string} auditURL
29 * @param {!Array<string>} categoryIDs
30 * @param {!Object} flags
Paul Irish8f1e33d2018-05-31 02:29:50 +000031 * @return {!Promise<!ReportRenderer.RunnerResult>}
Blink Reformat4c46d092018-04-07 15:32:37 +000032 */
33 startLighthouse(auditURL, categoryIDs, flags) {
34 return this._send('start', {url: auditURL, categoryIDs, flags});
35 }
36
37 /**
Connor Clarkca8905e2019-08-23 18:35:10 +000038 * @return {!Promise<undefined>}
Blink Reformat4c46d092018-04-07 15:32:37 +000039 */
Connor Clarkca8905e2019-08-23 18:35:10 +000040 async detach() {
41 await this._send('stop');
42 await this._backend.dispose();
43 delete this._backend;
44 delete this._backendPromise;
45 await this._rawConnection.disconnect();
46 await SDK.targetManager.resumeAllTargets();
Blink Reformat4c46d092018-04-07 15:32:37 +000047 }
48
49 /**
50 * @param {function (string): undefined} callback
51 */
52 registerStatusCallback(callback) {
53 this._status = callback;
54 }
55
56 /**
Connor Clarkca8905e2019-08-23 18:35:10 +000057 * @param {!Object} message
Blink Reformat4c46d092018-04-07 15:32:37 +000058 */
59 _dispatchProtocolMessage(message) {
Connor Clarkca8905e2019-08-23 18:35:10 +000060 this._send('dispatchProtocolMessage', {message: JSON.stringify(message)});
Blink Reformat4c46d092018-04-07 15:32:37 +000061 }
62
63 _initWorker() {
cjamcl@google.comaa1532c2019-05-31 03:01:24 +000064 this._backendPromise = Services.serviceManager.createAppService('audits_worker', 'AuditsService').then(backend => {
65 if (this._backend)
66 return;
67 this._backend = backend;
68 this._backend.on('statusUpdate', result => this._status(result.message));
69 this._backend.on('sendProtocolMessage', result => this._sendProtocolMessage(result.message));
70 });
Blink Reformat4c46d092018-04-07 15:32:37 +000071 }
72
73 /**
74 * @param {string} message
75 */
76 _sendProtocolMessage(message) {
Alexey Kozyatinskiybd7d3a62018-07-28 02:33:51 +000077 this._rawConnection.sendRawMessage(message);
Blink Reformat4c46d092018-04-07 15:32:37 +000078 }
79
80 /**
81 * @param {string} method
82 * @param {!Object=} params
Paul Irish8f1e33d2018-05-31 02:29:50 +000083 * @return {!Promise<!ReportRenderer.RunnerResult>}
Blink Reformat4c46d092018-04-07 15:32:37 +000084 */
85 _send(method, params) {
86 if (!this._backendPromise)
87 this._initWorker();
88
89 return this._backendPromise.then(_ => this._backend.send(method, params));
90 }
91};