@@ -10,7 +10,6 @@ import {
10
10
Launcher as ChromeLauncher ,
11
11
launch as defaultChromiumLaunch ,
12
12
} from 'chrome-launcher' ;
13
- import WebSocket , { WebSocketServer } from 'ws' ;
14
13
15
14
import { createLogger } from '../util/logger.js' ;
16
15
import { TempDir } from '../util/temp-dir.js' ;
@@ -37,8 +36,6 @@ export class ChromiumExtensionRunner {
37
36
params ;
38
37
chromiumInstance ;
39
38
chromiumLaunch ;
40
- reloadManagerExtension ;
41
- wss ;
42
39
exiting ;
43
40
_promiseSetupDone ;
44
41
@@ -110,32 +107,9 @@ export class ChromiumExtensionRunner {
110
107
* Setup the Chromium Profile and run a Chromium instance.
111
108
*/
112
109
async setupInstance ( ) {
113
- // Start a websocket server on a free localhost TCP port.
114
- this . wss = await new Promise ( ( resolve ) => {
115
- const server = new WebSocketServer (
116
- // Use a ipv4 host so we don't need to escape ipv6 address
117
- // https://github.com/mozilla/web-ext/issues/2331
118
- { port : 0 , host : '127.0.0.1' , clientTracking : true } ,
119
- // Wait the server to be listening (so that the extension
120
- // runner can successfully retrieve server address and port).
121
- ( ) => resolve ( server ) ,
122
- ) ;
123
- } ) ;
124
-
125
- // Prevent unhandled socket error (e.g. when chrome
126
- // is exiting, See https://github.com/websockets/ws/issues/1256).
127
- this . wss . on ( 'connection' , function ( socket ) {
128
- socket . on ( 'error' , ( err ) => {
129
- log . debug ( `websocket connection error: ${ err } ` ) ;
130
- } ) ;
131
- } ) ;
132
-
133
- // Create the extension that will manage the addon reloads
134
- this . reloadManagerExtension = await this . createReloadManagerExtension ( ) ;
135
-
136
110
// Start chrome pointing it to a given profile dir
137
- const extensions = [ this . reloadManagerExtension ]
138
- . concat ( this . params . extensions . map ( ( { sourceDir } ) => sourceDir ) )
111
+ const extensions = this . params . extensions
112
+ . map ( ( { sourceDir } ) => sourceDir )
139
113
. join ( ',' ) ;
140
114
141
115
const { chromiumBinary } = this . params ;
@@ -226,123 +200,14 @@ export class ChromiumExtensionRunner {
226
200
} ) ;
227
201
}
228
202
229
- async wssBroadcast ( data ) {
230
- return new Promise ( ( resolve ) => {
231
- const clients = this . wss ? new Set ( this . wss . clients ) : new Set ( ) ;
232
-
233
- function cleanWebExtReloadComplete ( ) {
234
- const client = this ;
235
- client . removeEventListener ( 'message' , webExtReloadComplete ) ;
236
- client . removeEventListener ( 'close' , cleanWebExtReloadComplete ) ;
237
- clients . delete ( client ) ;
238
- }
239
-
240
- const webExtReloadComplete = async ( message ) => {
241
- const msg = JSON . parse ( message . data ) ;
242
-
243
- if ( msg . type === 'webExtReloadExtensionComplete' ) {
244
- for ( const client of clients ) {
245
- cleanWebExtReloadComplete . call ( client ) ;
246
- }
247
- resolve ( ) ;
248
- }
249
- } ;
250
-
251
- for ( const client of clients ) {
252
- if ( client . readyState === WebSocket . OPEN ) {
253
- client . addEventListener ( 'message' , webExtReloadComplete ) ;
254
- client . addEventListener ( 'close' , cleanWebExtReloadComplete ) ;
255
-
256
- client . send ( JSON . stringify ( data ) ) ;
257
- } else {
258
- clients . delete ( client ) ;
259
- }
260
- }
261
-
262
- if ( clients . size === 0 ) {
263
- resolve ( ) ;
264
- }
265
- } ) ;
266
- }
267
-
268
- async createReloadManagerExtension ( ) {
269
- const tmpDir = new TempDir ( ) ;
270
- await tmpDir . create ( ) ;
271
- this . registerCleanup ( ( ) => tmpDir . remove ( ) ) ;
272
-
273
- const extPath = path . join (
274
- tmpDir . path ( ) ,
275
- `reload-manager-extension-${ Date . now ( ) } ` ,
276
- ) ;
277
-
278
- log . debug ( `Creating reload-manager-extension in ${ extPath } ` ) ;
279
-
280
- await fs . mkdir ( extPath , { recursive : true } ) ;
281
-
282
- await fs . writeFile (
283
- path . join ( extPath , 'manifest.json' ) ,
284
- JSON . stringify ( {
285
- manifest_version : 2 ,
286
- name : 'web-ext Reload Manager Extension' ,
287
- version : '1.0' ,
288
- permissions : [ 'management' , 'tabs' ] ,
289
- background : {
290
- scripts : [ 'bg.js' ] ,
291
- } ,
292
- } ) ,
293
- ) ;
294
-
295
- const wssInfo = this . wss . address ( ) ;
296
-
297
- const bgPage = `(function bgPage() {
298
- async function getAllDevExtensions() {
299
- const allExtensions = await new Promise(
300
- r => chrome.management.getAll(r));
301
-
302
- return allExtensions.filter((extension) => {
303
- return extension.enabled &&
304
- extension.installType === "development" &&
305
- extension.id !== chrome.runtime.id;
306
- });
307
- }
308
-
309
- const setEnabled = (extensionId, value) =>
310
- chrome.runtime.id == extensionId ?
311
- new Promise.resolve() :
312
- new Promise(r => chrome.management.setEnabled(extensionId, value, r));
313
-
314
- async function reloadExtension(extensionId) {
315
- await setEnabled(extensionId, false);
316
- await setEnabled(extensionId, true);
317
- }
318
-
319
- const ws = new window.WebSocket(
320
- "ws://${ wssInfo . address } :${ wssInfo . port } ");
321
-
322
- ws.onmessage = async (evt) => {
323
- const msg = JSON.parse(evt.data);
324
- if (msg.type === 'webExtReloadAllExtensions') {
325
- const devExtensions = await getAllDevExtensions();
326
- await Promise.all(devExtensions.map(ext => reloadExtension(ext.id)));
327
- ws.send(JSON.stringify({ type: 'webExtReloadExtensionComplete' }));
328
- }
329
- };
330
- })()` ;
331
-
332
- await fs . writeFile ( path . join ( extPath , 'bg.js' ) , bgPage ) ;
333
- return extPath ;
334
- }
335
-
336
203
/**
337
204
* Reloads all the extensions, collect any reload error and resolves to
338
205
* an array composed by a single ExtensionRunnerReloadResult object.
339
206
*/
340
207
async reloadAllExtensions ( ) {
341
208
const runnerName = this . getName ( ) ;
342
209
343
- await this . wssBroadcast ( {
344
- type : 'webExtReloadAllExtensions' ,
345
- } ) ;
210
+ // TODO: Restore reload functionality using the remote debugging protocol.
346
211
347
212
process . stdout . write (
348
213
`\rLast extension reload: ${ new Date ( ) . toTimeString ( ) } ` ,
@@ -394,21 +259,6 @@ export class ChromiumExtensionRunner {
394
259
this . chromiumInstance = null ;
395
260
}
396
261
397
- if ( this . wss ) {
398
- // Close all websocket clients, closing the WebSocketServer
399
- // does not terminate the existing connection and it wouldn't
400
- // resolve until all of the existing connections are closed.
401
- for ( const wssClient of this . wss ?. clients || [ ] ) {
402
- if ( wssClient . readyState === WebSocket . OPEN ) {
403
- wssClient . terminate ( ) ;
404
- }
405
- }
406
- await new Promise ( ( resolve ) =>
407
- this . wss ? this . wss . close ( resolve ) : resolve ( ) ,
408
- ) ;
409
- this . wss = null ;
410
- }
411
-
412
262
// Call all the registered cleanup callbacks.
413
263
for ( const fn of this . cleanupCallbacks ) {
414
264
try {
0 commit comments