diff --git a/data/serviceworker.mjs b/data/serviceworker.mjs index 011b47c..23bb475 100644 --- a/data/serviceworker.mjs +++ b/data/serviceworker.mjs @@ -1,38 +1,125 @@ +// This file is autogenerated by scripts +// Do NOT modify this file manually + export default { + AbortController: false, + AbortPaymentEvent: false, + AbortSignal: false, addEventListener: false, applicationCache: false, atob: false, + BackgroundFetchEvent: false, + BackgroundFetchManager: false, + BackgroundFetchRecord: false, + BackgroundFetchRegistration: false, + BackgroundFetchUpdateUIEvent: false, Blob: false, BroadcastChannel: false, btoa: false, ByteLengthQueuingStrategy: false, + c: false, Cache: false, caches: false, CacheStorage: false, + CanMakePaymentEvent: false, + CanvasGradient: false, + CanvasPattern: false, clearInterval: false, clearTimeout: false, Client: false, clients: false, Clients: false, close: true, + CloseEvent: false, CompressionStream: false, console: false, + cookieStore: false, + CookieStore: false, + CookieStoreManager: false, CountQueuingStrategy: false, + createImageBitmap: false, + CropTarget: false, + crossOriginIsolated: false, crypto: false, Crypto: false, CryptoKey: false, + CSSSkewX: false, + CSSSkewY: false, CustomEvent: false, DecompressionStream: false, + dispatchEvent: false, + DOMException: false, + DOMMatrix: false, + DOMMatrixReadOnly: false, + DOMPoint: false, + DOMPointReadOnly: false, + DOMQuad: false, + DOMRect: false, + DOMRectReadOnly: false, + DOMStringList: false, ErrorEvent: false, Event: false, + EventSource: false, + EventTarget: false, + ExtendableCookieChangeEvent: false, ExtendableEvent: false, ExtendableMessageEvent: false, + f: false, fetch: false, FetchEvent: false, File: false, + FileList: false, + FileReader: false, FileReaderSync: false, + FileSystemDirectoryHandle: false, + FileSystemFileHandle: false, + FileSystemHandle: false, + FileSystemWritableFileStream: false, + FontFace: false, + fonts: false, FormData: false, + GPU: false, + GPUAdapter: false, + GPUAdapterInfo: false, + GPUBindGroup: false, + GPUBindGroupLayout: false, + GPUBuffer: false, + GPUBufferUsage: false, + GPUCanvasContext: false, + GPUColorWrite: false, + GPUCommandBuffer: false, + GPUCommandEncoder: false, + GPUCompilationInfo: false, + GPUCompilationMessage: false, + GPUComputePassEncoder: false, + GPUComputePipeline: false, + GPUDevice: false, + GPUDeviceLostInfo: false, + GPUError: false, + GPUExternalTexture: false, + GPUInternalError: false, + GPUMapMode: false, + GPUOutOfMemoryError: false, + GPUPipelineError: false, + GPUPipelineLayout: false, + GPUQuerySet: false, + GPUQueue: false, + GPURenderBundle: false, + GPURenderBundleEncoder: false, + GPURenderPassEncoder: false, + GPURenderPipeline: false, + GPUSampler: false, + GPUShaderModule: false, + GPUShaderStage: false, + GPUSupportedFeatures: false, + GPUSupportedLimits: false, + GPUTexture: false, + GPUTextureUsage: false, + GPUTextureView: false, + GPUUncapturedErrorEvent: false, + GPUValidationError: false, Headers: false, + i: false, IDBCursor: false, IDBCursorWithValue: false, IDBDatabase: false, @@ -44,18 +131,41 @@ export default { IDBRequest: false, IDBTransaction: false, IDBVersionChangeEvent: false, + ImageBitmap: false, + ImageBitmapRenderingContext: false, ImageData: false, importScripts: false, indexedDB: false, + InstallEvent: false, + isSecureContext: false, location: false, + Lock: false, + LockManager: false, + MediaCapabilities: false, MessageChannel: false, MessageEvent: false, MessagePort: false, + n: false, name: false, + NavigationPreloadManager: false, navigator: false, + NavigatorUAData: false, + NetworkInformation: false, Notification: false, + NotificationEvent: false, + o: false, + OffscreenCanvas: false, + OffscreenCanvasRenderingContext2D: false, + onabortpayment: true, + onactivate: true, + onbackgroundfetchabort: true, + onbackgroundfetchclick: true, + onbackgroundfetchfail: true, + onbackgroundfetchsuccess: true, + oncanmakepayment: true, onclose: true, onconnect: true, + oncookiechange: true, onerror: true, onfetch: true, oninstall: true, @@ -66,11 +176,16 @@ export default { onnotificationclose: true, onoffline: true, ononline: true, + onpaymentrequest: true, + onperiodicsync: true, onpush: true, onpushsubscriptionchange: true, onrejectionhandled: true, onsync: true, onunhandledrejection: true, + origin: false, + Path2D: false, + PaymentRequestEvent: false, performance: false, Performance: false, PerformanceEntry: false, @@ -80,8 +195,19 @@ export default { PerformanceObserver: false, PerformanceObserverEntryList: false, PerformanceResourceTiming: false, + PerformanceServerTiming: false, PerformanceTiming: false, + PeriodicSyncEvent: false, + PeriodicSyncManager: false, + Permissions: false, + PermissionStatus: false, postMessage: true, + PromiseRejectionEvent: false, + PushEvent: false, + PushManager: false, + PushMessageData: false, + PushSubscription: false, + PushSubscriptionOptions: false, queueMicrotask: false, ReadableByteStreamController: false, ReadableStream: false, @@ -91,9 +217,15 @@ export default { ReadableStreamDefaultReader: false, registration: false, removeEventListener: false, + reportError: false, + ReportingObserver: false, Request: false, Response: false, + scheduler: false, + Scheduler: false, + SecurityPolicyViolationEvent: false, self: false, + serviceWorker: false, ServiceWorker: false, ServiceWorkerContainer: false, ServiceWorkerGlobalScope: false, @@ -102,20 +234,67 @@ export default { setInterval: false, setTimeout: false, skipWaiting: false, + StorageBucket: false, + StorageBucketManager: false, + StorageManager: false, + structuredClone: false, SubtleCrypto: false, + SyncEvent: false, + SyncManager: false, + t: false, + TaskController: false, + TaskPriorityChangeEvent: false, + TaskSignal: false, TextDecoder: false, TextDecoderStream: false, TextEncoder: false, TextEncoderStream: false, + TextMetrics: false, TransformStream: false, TransformStreamDefaultController: false, + TrustedHTML: false, + TrustedScript: false, + TrustedScriptURL: false, + TrustedTypePolicy: false, + TrustedTypePolicyFactory: false, + trustedTypes: false, + u: false, URL: false, + URLPattern: false, URLSearchParams: false, + UserActivation: false, WebAssembly: false, + WebGL2RenderingContext: false, + WebGLActiveInfo: false, + WebGLBuffer: false, + WebGLContextEvent: false, + WebGLFramebuffer: false, + WebGLObject: false, + WebGLProgram: false, + WebGLQuery: false, + WebGLRenderbuffer: false, + WebGLRenderingContext: false, + WebGLSampler: false, + WebGLShader: false, + WebGLShaderPrecisionFormat: false, + WebGLSync: false, + WebGLTexture: false, + WebGLTransformFeedback: false, + WebGLUniformLocation: false, + WebGLVertexArrayObject: false, WebSocket: false, + WebSocketError: false, + WebSocketStream: false, + WebTransport: false, + WebTransportBidirectionalStream: false, + WebTransportDatagramDuplexStream: false, + WebTransportError: false, + WGSLLanguageFeatures: false, WindowClient: false, Worker: false, WorkerGlobalScope: false, + WorkerLocation: false, + WorkerNavigator: false, WritableStream: false, WritableStreamDefaultController: false, WritableStreamDefaultWriter: false, diff --git a/globals.json b/globals.json index 11e5c0a..a76db6c 100644 --- a/globals.json +++ b/globals.json @@ -2434,40 +2434,124 @@ "version": false }, "serviceworker": { + "AbortController": false, + "AbortPaymentEvent": false, + "AbortSignal": false, "addEventListener": false, "applicationCache": false, "atob": false, + "BackgroundFetchEvent": false, + "BackgroundFetchManager": false, + "BackgroundFetchRecord": false, + "BackgroundFetchRegistration": false, + "BackgroundFetchUpdateUIEvent": false, "Blob": false, "BroadcastChannel": false, "btoa": false, "ByteLengthQueuingStrategy": false, + "c": false, "Cache": false, "caches": false, "CacheStorage": false, + "CanMakePaymentEvent": false, + "CanvasGradient": false, + "CanvasPattern": false, "clearInterval": false, "clearTimeout": false, "Client": false, "clients": false, "Clients": false, "close": true, + "CloseEvent": false, "CompressionStream": false, "console": false, + "cookieStore": false, + "CookieStore": false, + "CookieStoreManager": false, "CountQueuingStrategy": false, + "createImageBitmap": false, + "CropTarget": false, + "crossOriginIsolated": false, "crypto": false, "Crypto": false, "CryptoKey": false, + "CSSSkewX": false, + "CSSSkewY": false, "CustomEvent": false, "DecompressionStream": false, + "dispatchEvent": false, + "DOMException": false, + "DOMMatrix": false, + "DOMMatrixReadOnly": false, + "DOMPoint": false, + "DOMPointReadOnly": false, + "DOMQuad": false, + "DOMRect": false, + "DOMRectReadOnly": false, + "DOMStringList": false, "ErrorEvent": false, "Event": false, + "EventSource": false, + "EventTarget": false, + "ExtendableCookieChangeEvent": false, "ExtendableEvent": false, "ExtendableMessageEvent": false, + "f": false, "fetch": false, "FetchEvent": false, "File": false, + "FileList": false, + "FileReader": false, "FileReaderSync": false, + "FileSystemDirectoryHandle": false, + "FileSystemFileHandle": false, + "FileSystemHandle": false, + "FileSystemWritableFileStream": false, + "FontFace": false, + "fonts": false, "FormData": false, + "GPU": false, + "GPUAdapter": false, + "GPUAdapterInfo": false, + "GPUBindGroup": false, + "GPUBindGroupLayout": false, + "GPUBuffer": false, + "GPUBufferUsage": false, + "GPUCanvasContext": false, + "GPUColorWrite": false, + "GPUCommandBuffer": false, + "GPUCommandEncoder": false, + "GPUCompilationInfo": false, + "GPUCompilationMessage": false, + "GPUComputePassEncoder": false, + "GPUComputePipeline": false, + "GPUDevice": false, + "GPUDeviceLostInfo": false, + "GPUError": false, + "GPUExternalTexture": false, + "GPUInternalError": false, + "GPUMapMode": false, + "GPUOutOfMemoryError": false, + "GPUPipelineError": false, + "GPUPipelineLayout": false, + "GPUQuerySet": false, + "GPUQueue": false, + "GPURenderBundle": false, + "GPURenderBundleEncoder": false, + "GPURenderPassEncoder": false, + "GPURenderPipeline": false, + "GPUSampler": false, + "GPUShaderModule": false, + "GPUShaderStage": false, + "GPUSupportedFeatures": false, + "GPUSupportedLimits": false, + "GPUTexture": false, + "GPUTextureUsage": false, + "GPUTextureView": false, + "GPUUncapturedErrorEvent": false, + "GPUValidationError": false, "Headers": false, + "i": false, "IDBCursor": false, "IDBCursorWithValue": false, "IDBDatabase": false, @@ -2479,18 +2563,41 @@ "IDBRequest": false, "IDBTransaction": false, "IDBVersionChangeEvent": false, + "ImageBitmap": false, + "ImageBitmapRenderingContext": false, "ImageData": false, "importScripts": false, "indexedDB": false, + "InstallEvent": false, + "isSecureContext": false, "location": false, + "Lock": false, + "LockManager": false, + "MediaCapabilities": false, "MessageChannel": false, "MessageEvent": false, "MessagePort": false, + "n": false, "name": false, + "NavigationPreloadManager": false, "navigator": false, + "NavigatorUAData": false, + "NetworkInformation": false, "Notification": false, + "NotificationEvent": false, + "o": false, + "OffscreenCanvas": false, + "OffscreenCanvasRenderingContext2D": false, + "onabortpayment": true, + "onactivate": true, + "onbackgroundfetchabort": true, + "onbackgroundfetchclick": true, + "onbackgroundfetchfail": true, + "onbackgroundfetchsuccess": true, + "oncanmakepayment": true, "onclose": true, "onconnect": true, + "oncookiechange": true, "onerror": true, "onfetch": true, "oninstall": true, @@ -2501,11 +2608,16 @@ "onnotificationclose": true, "onoffline": true, "ononline": true, + "onpaymentrequest": true, + "onperiodicsync": true, "onpush": true, "onpushsubscriptionchange": true, "onrejectionhandled": true, "onsync": true, "onunhandledrejection": true, + "origin": false, + "Path2D": false, + "PaymentRequestEvent": false, "performance": false, "Performance": false, "PerformanceEntry": false, @@ -2515,8 +2627,19 @@ "PerformanceObserver": false, "PerformanceObserverEntryList": false, "PerformanceResourceTiming": false, + "PerformanceServerTiming": false, "PerformanceTiming": false, + "PeriodicSyncEvent": false, + "PeriodicSyncManager": false, + "Permissions": false, + "PermissionStatus": false, "postMessage": true, + "PromiseRejectionEvent": false, + "PushEvent": false, + "PushManager": false, + "PushMessageData": false, + "PushSubscription": false, + "PushSubscriptionOptions": false, "queueMicrotask": false, "ReadableByteStreamController": false, "ReadableStream": false, @@ -2526,9 +2649,15 @@ "ReadableStreamDefaultReader": false, "registration": false, "removeEventListener": false, + "reportError": false, + "ReportingObserver": false, "Request": false, "Response": false, + "scheduler": false, + "Scheduler": false, + "SecurityPolicyViolationEvent": false, "self": false, + "serviceWorker": false, "ServiceWorker": false, "ServiceWorkerContainer": false, "ServiceWorkerGlobalScope": false, @@ -2537,20 +2666,67 @@ "setInterval": false, "setTimeout": false, "skipWaiting": false, + "StorageBucket": false, + "StorageBucketManager": false, + "StorageManager": false, + "structuredClone": false, "SubtleCrypto": false, + "SyncEvent": false, + "SyncManager": false, + "t": false, + "TaskController": false, + "TaskPriorityChangeEvent": false, + "TaskSignal": false, "TextDecoder": false, "TextDecoderStream": false, "TextEncoder": false, "TextEncoderStream": false, + "TextMetrics": false, "TransformStream": false, "TransformStreamDefaultController": false, + "TrustedHTML": false, + "TrustedScript": false, + "TrustedScriptURL": false, + "TrustedTypePolicy": false, + "TrustedTypePolicyFactory": false, + "trustedTypes": false, + "u": false, "URL": false, + "URLPattern": false, "URLSearchParams": false, + "UserActivation": false, "WebAssembly": false, + "WebGL2RenderingContext": false, + "WebGLActiveInfo": false, + "WebGLBuffer": false, + "WebGLContextEvent": false, + "WebGLFramebuffer": false, + "WebGLObject": false, + "WebGLProgram": false, + "WebGLQuery": false, + "WebGLRenderbuffer": false, + "WebGLRenderingContext": false, + "WebGLSampler": false, + "WebGLShader": false, + "WebGLShaderPrecisionFormat": false, + "WebGLSync": false, + "WebGLTexture": false, + "WebGLTransformFeedback": false, + "WebGLUniformLocation": false, + "WebGLVertexArrayObject": false, "WebSocket": false, + "WebSocketError": false, + "WebSocketStream": false, + "WebTransport": false, + "WebTransportBidirectionalStream": false, + "WebTransportDatagramDuplexStream": false, + "WebTransportError": false, + "WGSLLanguageFeatures": false, "WindowClient": false, "Worker": false, "WorkerGlobalScope": false, + "WorkerLocation": false, + "WorkerNavigator": false, "WritableStream": false, "WritableStreamDefaultController": false, "WritableStreamDefaultWriter": false, diff --git a/package.json b/package.json index 23e76f1..1aa7446 100644 --- a/package.json +++ b/package.json @@ -22,6 +22,7 @@ "update:builtin": "node scripts/update.mjs --environment=builtin", "update:nodeBuiltin": "node scripts/update.mjs --environment=nodeBuiltin", "update:worker": "node scripts/update.mjs --environment=worker", + "update:serviceWorker": "node scripts/update.mjs --environment=serviceWorker", "update:shelljs": "node scripts/update.mjs --environment=shelljs", "update:jest": "node scripts/update.mjs --environment=jest", "update:vitest": "node scripts/update.mjs --environment=vitest", diff --git a/puppeteer.config.cjs b/puppeteer.config.cjs index 891c175..241323a 100644 --- a/puppeteer.config.cjs +++ b/puppeteer.config.cjs @@ -3,13 +3,4 @@ // Will download when execute module.exports = { skipDownload: true, - chrome: { - skipDownload: false, - }, - 'chrome-headless-shell': { - skipDownload: false, - }, - firefox: { - skipDownload: false, - }, }; diff --git a/scripts/get-browser-globals.mjs b/scripts/get-browser-globals.mjs index c23cc85..d95a6d8 100644 --- a/scripts/get-browser-globals.mjs +++ b/scripts/get-browser-globals.mjs @@ -75,21 +75,30 @@ const isWritable = name => name === 'location' || name.startsWith('on'); +const puppeteerBrowsers = [ + 'chrome', + 'chrome-headless-shell', + 'firefox', +]; + async function downloadBrowser({product} = {}) { const {downloadBrowsers} = await import('puppeteer/internal/node/install.js'); const originalEnv = {...process.env}; - try { - process.env.PUPPETEER_SKIP_DOWNLOAD = JSON.stringify(false); - if (product) { - process.env.PUPPETEER_PRODUCT = product; - } + const envOverrides = { + PUPPETEER_SKIP_DOWNLOAD: JSON.stringify(false), + ...Object.fromEntries(puppeteerBrowsers.map(browser => [ + `PUPPETEER_${browser.replaceAll('-', '_').toUpperCase()}_SKIP_DOWNLOAD`, + JSON.stringify(browser !== product), + ])), + }; + + Object.assign(process.env, envOverrides); + + try { await downloadBrowsers(); } finally { - for (const env of [ - 'PUPPETEER_PRODUCT', - 'PUPPETEER_SKIP_DOWNLOAD', - ]) { + for (const env of Object.keys(envOverrides)) { if (Object.hasOwn(originalEnv)) { process.env[env] = originalEnv[env]; } else { @@ -99,11 +108,20 @@ async function downloadBrowser({product} = {}) { } } -async function navigateToSecureContext(page, responses) { +async function navigateToSecureContext(page, serverOptions) { + const responses = { + '/': { + contentType: 'text/html', + content: '', + }, + ...serverOptions?.responses, + }; + const port = await getPort(); const server = http.createServer((request, response) => { const {url} = request; - if (responses?.[url]) { + + if (responses[url]) { const {contentType, content} = responses[url]; response.statusCode = 200; response.setHeader('Content-Type', contentType); @@ -111,12 +129,6 @@ async function navigateToSecureContext(page, responses) { return; } - if (url === '/') { - response.statusCode = 200; - response.setHeader('Content-Type', 'text/html'); - response.end(''); - } - response.statusCode = 404; }); @@ -139,9 +151,10 @@ async function navigateToSecureContext(page, responses) { } async function runInBrowser(function_, { - product, + product = 'chrome', secureContext = false, arguments: arguments_ = [], + server: serverOptions, } = {}) { await downloadBrowser({product}); @@ -151,7 +164,7 @@ async function runInBrowser(function_, { let server; try { if (secureContext) { - server = await navigateToSecureContext(page); + server = await navigateToSecureContext(page, serverOptions); assert.ok( server.isSecureContext, 'Expected a secure server.', @@ -235,6 +248,48 @@ async function runInWebWorker(function_) { } } +async function runInServiceWorker(function_) { + const executeCommandMark = 'get-globals'; + const workerUrl = `/service-worker.js?${Date.now()}`; + const workerCode = outdent` + self.onmessage = ({data, source}) => { + if (data !== '${executeCommandMark}') { + return; + } + + source.postMessage(${function_}()); + }; + `; + + const result = await runInBrowser(async ([workerUrl, executeCommandMark]) => { + // eslint-disable-next-line no-undef -- execute in browser + const {navigator} = window; + const registration = await navigator.serviceWorker.register(`${workerUrl}`); + const serviceWorker = registration.active ?? registration.waiting ?? registration.installing; + + return new Promise(resolve => { + navigator.serviceWorker.addEventListener('message', ({data}) => { + resolve(data); + }); + serviceWorker.postMessage(executeCommandMark); + navigator.serviceWorker.startMessages(); + }); + }, { + secureContext: true, + arguments: [workerUrl, executeCommandMark], + server: { + responses: { + [workerUrl]: { + contentType: 'application/javascript', + content: workerCode, + }, + }, + }, + }); + + return result; +} + async function getBrowserGlobals() { const chromeGlobals = await runInBrowser(getGlobalThisProperties, {secureContext: true}); const firefoxGlobals = await runInBrowser(getGlobalThisProperties, {product: 'firefox', secureContext: true}); @@ -267,4 +322,17 @@ async function getWebWorkerGlobals() { ); } -export {getBrowserGlobals, getWebWorkerGlobals}; +async function getServiceWorkerGlobals() { + const properties = await runInServiceWorker(getGlobalThisProperties); + + return createGlobals( + properties, + { + shouldExclude: name => name.startsWith('__'), + isWritable: name => name.startsWith('on'), + excludeBuiltins: true, + }, + ); +} + +export {getBrowserGlobals, getWebWorkerGlobals, getServiceWorkerGlobals}; diff --git a/scripts/update.mjs b/scripts/update.mjs index 3de05fc..277db1b 100644 --- a/scripts/update.mjs +++ b/scripts/update.mjs @@ -3,7 +3,11 @@ import {outdent} from 'outdent'; import {execaCommand} from 'execa'; import getBuiltinGlobals from './get-builtin-globals.mjs'; import getNodeBuiltinGlobals from './get-node-builtin-globals.mjs'; -import {getBrowserGlobals, getWebWorkerGlobals} from './get-browser-globals.mjs'; +import { + getBrowserGlobals, + getWebWorkerGlobals, + getServiceWorkerGlobals, +} from './get-browser-globals.mjs'; import getShelljsGlobals from './get-shelljs-globals.mjs'; import getJestGlobals from './get-jest-globals.mjs'; import {updateGlobals} from './utilities.mjs'; @@ -27,6 +31,10 @@ const ALL_JOBS = [ environment: 'worker', getGlobals: getWebWorkerGlobals, }, + { + environment: 'serviceWorker', + getGlobals: getServiceWorkerGlobals, + }, { environment: 'shelljs', getGlobals: getShelljsGlobals,