1- import process from 'node:process' ;
2- import assert from 'node:assert/strict' ;
3- import puppeteer from 'puppeteer' ;
1+ import { launchBrowser } from './browser.mjs' ;
42import { createGlobals } from './utilities.mjs' ;
53import { startServer } from './browser/server.mjs' ;
64
5+ const firefoxNonStandardGlobals = new Set ( [
6+ // Can't find documentation
7+ 'Directory' ,
8+ // Non-standard https://developer.mozilla.org/en-US/docs/Web/API/Window/dump
9+ 'dump' ,
10+ // Non-standard https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/InternalError
11+ 'InternalError' ,
12+ // https://bugzilla.mozilla.org/show_bug.cgi?id=1754441
13+ 'InstallTrigger' ,
14+ // Can't find documentation
15+ 'AnimationTrigger' ,
16+ // Legacy feature https://github.com/whatwg/html/issues/2741
17+ 'ondragexit' ,
18+ ] ) ;
19+
720const ignoredGlobals = new Set ( [
821 // Chrome only
922 'chrome' ,
@@ -20,16 +33,10 @@ const ignoredGlobals = new Set([
2033 'CSS2Properties' ,
2134 // Deprecated https://developer.mozilla.org/en-US/docs/Web/API/Window/captureEvents
2235 'captureEvents' ,
23- // Can't find documentation
24- 'Directory' ,
25- // Non-standard https://developer.mozilla.org/en-US/docs/Web/API/Window/dump
26- 'dump' ,
2736 // Non-standard https://developer.mozilla.org/en-US/docs/Web/API/Window/fullScreen
2837 'fullScreen' ,
2938 // Non-standard https://developer.mozilla.org/en-US/docs/Web/API/window/getDefaultComputedStyle
3039 'getDefaultComputedStyle' ,
31- // Non-standard https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/InternalError
32- 'InternalError' ,
3340 // Can't find documentation
3441 'KeyEvent' ,
3542 // Non-standard https://developer.mozilla.org/en-US/docs/Web/API/MouseScrollEvent
@@ -58,6 +65,7 @@ const ignoredGlobals = new Set([
5865 'setResizable' ,
5966 // Non-standard https://developer.mozilla.org/en-US/docs/Web/API/Window/updateCommands
6067 'updateCommands' ,
68+ ...firefoxNonStandardGlobals ,
6169] ) ;
6270
6371const shouldExclude = name =>
@@ -73,54 +81,8 @@ const isWritable = name =>
7381 name === 'location'
7482 || name . startsWith ( 'on' ) ;
7583
76- const puppeteerBrowsers = [
77- 'chrome' ,
78- 'chrome-headless-shell' ,
79- 'firefox' ,
80- ] ;
81-
82- async function downloadBrowser ( { product} = { } ) {
83- const { downloadBrowsers} = await import ( 'puppeteer/internal/node/install.js' ) ;
84- const originalEnv = { ...process . env } ;
85-
86- const envOverrides = {
87- PUPPETEER_SKIP_DOWNLOAD : JSON . stringify ( false ) ,
88- ...Object . fromEntries ( puppeteerBrowsers . map ( browser => [
89- `PUPPETEER_${ browser . replaceAll ( '-' , '_' ) . toUpperCase ( ) } _SKIP_DOWNLOAD` ,
90- JSON . stringify ( browser !== product ) ,
91- ] ) ) ,
92- } ;
93-
94- Object . assign ( process . env , envOverrides ) ;
95-
96- try {
97- await downloadBrowsers ( ) ;
98- } finally {
99- for ( const env of Object . keys ( envOverrides ) ) {
100- if ( Object . hasOwn ( originalEnv ) ) {
101- process . env [ env ] = originalEnv [ env ] ;
102- } else {
103- delete process . env [ env ] ;
104- }
105- }
106- }
107- }
108-
109- async function getGlobalsInBrowser ( environment , product = 'chrome' ) {
110- await downloadBrowser ( { product} ) ;
111-
112- const browser = await puppeteer . launch ( { browser : product } ) ;
113-
114- try {
115- const version = await browser . version ( ) ;
116- assert . ok (
117- version . toLowerCase ( ) . startsWith ( `${ product } /` ) ,
118- `Unexpected browser version: '${ version } ', expected '${ product } '.` ,
119- ) ;
120- } catch ( error ) {
121- await browser . close ( ) ;
122- throw error ;
123- }
84+ async function _getGlobalsInBrowser ( environment , browserName ) {
85+ const browser = await launchBrowser ( { browser : browserName } ) ;
12486
12587 const page = await browser . newPage ( ) ;
12688
@@ -135,15 +97,18 @@ async function getGlobalsInBrowser(environment, product = 'chrome') {
13597 }
13698}
13799
100+ async function getGlobalsInBrowser ( environment ) {
101+ const results = await Promise . all (
102+ [ 'chrome' , 'firefox' ] . map ( browser => _getGlobalsInBrowser ( environment , browser ) ) ,
103+ ) ;
104+ return results . flat ( ) . filter ( name => ! firefoxNonStandardGlobals . has ( name ) ) ;
105+ }
106+
138107async function getBrowserGlobals ( ) {
139- const chromeGlobals = await getGlobalsInBrowser ( 'browser' ) ;
140- const firefoxGlobals = await getGlobalsInBrowser ( 'browser' , 'firefox' ) ;
108+ const properties = await getGlobalsInBrowser ( 'browser' ) ;
141109
142110 return createGlobals (
143- [
144- ...chromeGlobals ,
145- ...firefoxGlobals ,
146- ] ,
111+ properties ,
147112 {
148113 shouldExclude,
149114 isWritable,
0 commit comments