blob: 99c2b8163023a99087dbd0c6bf545fd4606ec0d0 [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
5Audits2.ProtocolService = class extends Common.Object {
6 constructor() {
7 super();
8 /** @type {?Protocol.InspectorBackend.Connection} */
9 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 */
21 attach() {
22 return InspectorMain.interceptMainConnection(this._dispatchProtocolMessage.bind(this)).then(rawConnection => {
23 this._rawConnection = rawConnection;
24 });
25 }
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 /**
38 * @return {!Promise<!Object|undefined>}
39 */
40 detach() {
41 return Promise.resolve().then(() => this._send('stop')).then(() => this._backend.dispose()).then(() => {
42 delete this._backend;
43 delete this._backendPromise;
44 return this._rawConnection.disconnect();
45 });
46 }
47
48 /**
49 * @param {function (string): undefined} callback
50 */
51 registerStatusCallback(callback) {
52 this._status = callback;
53 }
54
55 /**
56 * @param {string} message
57 */
58 _dispatchProtocolMessage(message) {
59 this._send('dispatchProtocolMessage', {message: message});
60 }
61
62 _initWorker() {
63 this._backendPromise =
64 Services.serviceManager.createAppService('audits2_worker', 'Audits2Service').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 });
71 }
72
73 /**
74 * @param {string} message
75 */
76 _sendProtocolMessage(message) {
77 this._rawConnection.sendMessage(message);
78 }
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};