diff --git a/examples/content-esm/template.spec.mjs b/examples/content-esm/template.spec.mjs index 13fd9f89..337a7d73 100644 --- a/examples/content-esm/template.spec.mjs +++ b/examples/content-esm/template.spec.mjs @@ -1,76 +1,14 @@ import path from 'path' +import {fileURLToPath} from 'url' import {execSync} from 'child_process' -import {test as base, chromium} from '@playwright/test' +import {extensionFixtures} from '../extension-fixtures.mjs' + +const __filename = fileURLToPath(import.meta.url) +const __dirname = path.dirname(__filename) const exampleDir = 'examples/content-esm' const pathToExtension = path.join(__dirname, `dist/chrome`) -/** - * @typedef {import('@playwright/test').BrowserContext} BrowserContext - */ - -const extensionFixtures = ( - /** @type {string} */ pathToExtension, - /** @type {boolean} */ headless -) => { - return base.extend({ - /** @type {() => Promise} */ - context: async (_, use) => { - const context = await chromium.launchPersistentContext('', { - headless: false, - args: [ - headless ? `--headless=new` : '', - `--disable-extensions-except=${pathToExtension}`, - `--load-extension=${pathToExtension}`, - '--no-first-run', // Disable Chrome's native first run experience. - '--disable-client-side-phishing-detection', // Disables client-side phishing detection - '--disable-component-extensions-with-background-pages', // Disable some built-in extensions that aren't affected by '--disable-extensions' - '--disable-default-apps', // Disable installation of default apps - '--disable-features=InterestFeedContentSuggestions', // Disables the Discover feed on NTP - '--disable-features=Translate', // Disables Chrome translation, both the manual option and the popup prompt when a page with differing language is detected. - '--hide-scrollbars', // Hide scrollbars from screenshots. - '--mute-audio', // Mute any audio - '--no-default-browser-check', // Disable the default browser check, do not prompt to set it as such - '--no-first-run', // Skip first run wizards - '--ash-no-nudges', // Avoids blue bubble "user education" nudges (eg., "… give your browser a new look", Memory Saver) - '--disable-search-engine-choice-screen', // Disable the 2023+ search engine choice screen - '--disable-features=MediaRoute', // Avoid the startup dialog for `Do you want the application “Chromium.app” to accept incoming network connections?`. Also disables the Chrome Media Router which creates background networking activity to discover cast targets. A superset of disabling DialMediaRouteProvider. - '--use-mock-keychain', // Use mock keychain on Mac to prevent the blocking permissions dialog about "Chrome wants to use your confidential information stored in your keychain" - '--disable-background-networking', // Disable various background network services, including extension updating, safe browsing service, upgrade detector, translate, UMA - '--disable-breakpad', // Disable crashdump collection (reporting is already disabled in Chromium) - '--disable-component-update', // Don't update the browser 'components' listed at chrome://components/ - '--disable-domain-reliability', // Disables Domain Reliability Monitoring, which tracks whether the browser has difficulty contacting Google-owned sites and uploads reports to Google. - '--disable-features=AutofillServerCommunicatio', // Disables autofill server communication. This feature isn't disabled via other 'parent' flags. - '--disable-features=CertificateTransparencyComponentUpdate', - '--disable-sync', // Disable syncing to a Google account - '--disable-features=OptimizationHints', // Used for turning on Breakpad crash reporting in a debug environment where crash reporting is typically compiled but disabled. Disable the Chrome Optimization Guide and networking with its service API - '--disable-features=DialMediaRouteProvider', // A weaker form of disabling the MediaRouter feature. See that flag's details. - '--no-pings', // Don't send hyperlink auditing pings - '--enable-features=SidePanelUpdates' // Ensure the side panel is visible. This is used for testing the side panel feature. - ].filter((arg) => !!arg) - }) - await use(context) - await context.close() - }, - /** @type {() => Promise} */ - extensionId: async ({context}, use) => { - /* - // for manifest v2: - let [background] = context.backgroundPages() - if (!background) - background = await context.waitForEvent('backgroundpage') - */ - - // for manifest v3: - let [background] = context.serviceWorkers() - if (!background) background = await context.waitForEvent('serviceworker') - - const extensionId = background.url().split('/')[2] - await use(extensionId) - } - }) -} - const test = extensionFixtures(pathToExtension, true) test.beforeAll(async () => { diff --git a/examples/extension-fixtures.mjs b/examples/extension-fixtures.mjs new file mode 100644 index 00000000..a9c7a2be --- /dev/null +++ b/examples/extension-fixtures.mjs @@ -0,0 +1,70 @@ +import {test as base, chromium} from '@playwright/test' + +/** + * @typedef {import('@playwright/test').BrowserContext} BrowserContext + */ +const extensionFixtures = ( + /** @type {string} */ pathToExtension, + /** @type {boolean} */ headless + /** @returns {import('@playwright/test').TestModifier<{}, {context: BrowserContext, extensionId: string}>} */ +) => { + return base.extend({ + /** @type {() => Promise} */ + // eslint-disable-next-line no-empty-pattern + context: async ({}, use) => { + const context = await chromium.launchPersistentContext('', { + headless: false, + args: [ + headless ? `--headless=new` : '', + `--disable-extensions-except=${pathToExtension}`, + `--load-extension=${pathToExtension}`, + '--no-first-run', // Disable Chrome's native first run experience. + '--disable-client-side-phishing-detection', // Disables client-side phishing detection + '--disable-component-extensions-with-background-pages', // Disable some built-in extensions that aren't affected by '--disable-extensions' + '--disable-default-apps', // Disable installation of default apps + '--disable-features=InterestFeedContentSuggestions', // Disables the Discover feed on NTP + '--disable-features=Translate', // Disables Chrome translation, both the manual option and the popup prompt when a page with differing language is detected. + '--hide-scrollbars', // Hide scrollbars from screenshots. + '--mute-audio', // Mute any audio + '--no-default-browser-check', // Disable the default browser check, do not prompt to set it as such + '--no-first-run', // Skip first run wizards + '--ash-no-nudges', // Avoids blue bubble "user education" nudges (eg., "… give your browser a new look", Memory Saver) + '--disable-search-engine-choice-screen', // Disable the 2023+ search engine choice screen + '--disable-features=MediaRoute', // Avoid the startup dialog for `Do you want the application “Chromium.app” to accept incoming network connections?`. Also disables the Chrome Media Router which creates background networking activity to discover cast targets. A superset of disabling DialMediaRouteProvider. + '--use-mock-keychain', // Use mock keychain on Mac to prevent the blocking permissions dialog about "Chrome wants to use your confidential information stored in your keychain" + '--disable-background-networking', // Disable various background network services, including extension updating, safe browsing service, upgrade detector, translate, UMA + '--disable-breakpad', // Disable crashdump collection (reporting is already disabled in Chromium) + '--disable-component-update', // Don't update the browser 'components' listed at chrome://components/ + '--disable-domain-reliability', // Disables Domain Reliability Monitoring, which tracks whether the browser has difficulty contacting Google-owned sites and uploads reports to Google. + '--disable-features=AutofillServerCommunicatio', // Disables autofill server communication. This feature isn't disabled via other 'parent' flags. + '--disable-features=CertificateTransparencyComponentUpdate', + '--disable-sync', // Disable syncing to a Google account + '--disable-features=OptimizationHints', // Used for turning on Breakpad crash reporting in a debug environment where crash reporting is typically compiled but disabled. Disable the Chrome Optimization Guide and networking with its service API + '--disable-features=DialMediaRouteProvider', // A weaker form of disabling the MediaRouter feature. See that flag's details. + '--no-pings', // Don't send hyperlink auditing pings + '--enable-features=SidePanelUpdates' // Ensure the side panel is visible. This is used for testing the side panel feature. + ].filter((arg) => !!arg) + }) + await use(context) + await context.close() + }, + /** @type {() => Promise} */ + extensionId: async ({context}, use) => { + /* + // for manifest v2: + let [background] = context.backgroundPages() + if (!background) + background = await context.waitForEvent('backgroundpage') + */ + + // for manifest v3: + let [background] = context.serviceWorkers() + if (!background) background = await context.waitForEvent('serviceworker') + + const extensionId = background.url().split('/')[2] + await use(extensionId) + } + }) +} + +export {extensionFixtures} diff --git a/examples/new-esm/template.spec.mjs b/examples/new-esm/template.spec.mjs index 6ad94618..c5f6bbf9 100644 --- a/examples/new-esm/template.spec.mjs +++ b/examples/new-esm/template.spec.mjs @@ -1,77 +1,15 @@ import path from 'path' +import {fileURLToPath} from 'url' import {execSync} from 'child_process' +import {extensionFixtures} from '../extension-fixtures.mjs' -import {test as base, chromium} from '@playwright/test' +// Recreate __dirname for ES Modules +const __filename = fileURLToPath(import.meta.url) +const __dirname = path.dirname(__filename) -const exampleDir = 'examples/content-esm' +const exampleDir = 'examples/new-esm' const pathToExtension = path.join(__dirname, `dist/chrome`) -/** - * @typedef {import('@playwright/test').BrowserContext} BrowserContext - */ - -const extensionFixtures = ( - /** @type {string} */ pathToExtension, - /** @type {boolean} */ headless -) => { - return base.extend({ - /** @type {() => Promise} */ - context: async (_, use) => { - const context = await chromium.launchPersistentContext('', { - headless: false, - args: [ - headless ? `--headless=new` : '', - `--disable-extensions-except=${pathToExtension}`, - `--load-extension=${pathToExtension}`, - '--no-first-run', // Disable Chrome's native first run experience. - '--disable-client-side-phishing-detection', // Disables client-side phishing detection - '--disable-component-extensions-with-background-pages', // Disable some built-in extensions that aren't affected by '--disable-extensions' - '--disable-default-apps', // Disable installation of default apps - '--disable-features=InterestFeedContentSuggestions', // Disables the Discover feed on NTP - '--disable-features=Translate', // Disables Chrome translation, both the manual option and the popup prompt when a page with differing language is detected. - '--hide-scrollbars', // Hide scrollbars from screenshots. - '--mute-audio', // Mute any audio - '--no-default-browser-check', // Disable the default browser check, do not prompt to set it as such - '--no-first-run', // Skip first run wizards - '--ash-no-nudges', // Avoids blue bubble "user education" nudges (eg., "… give your browser a new look", Memory Saver) - '--disable-search-engine-choice-screen', // Disable the 2023+ search engine choice screen - '--disable-features=MediaRoute', // Avoid the startup dialog for `Do you want the application “Chromium.app” to accept incoming network connections?`. Also disables the Chrome Media Router which creates background networking activity to discover cast targets. A superset of disabling DialMediaRouteProvider. - '--use-mock-keychain', // Use mock keychain on Mac to prevent the blocking permissions dialog about "Chrome wants to use your confidential information stored in your keychain" - '--disable-background-networking', // Disable various background network services, including extension updating, safe browsing service, upgrade detector, translate, UMA - '--disable-breakpad', // Disable crashdump collection (reporting is already disabled in Chromium) - '--disable-component-update', // Don't update the browser 'components' listed at chrome://components/ - '--disable-domain-reliability', // Disables Domain Reliability Monitoring, which tracks whether the browser has difficulty contacting Google-owned sites and uploads reports to Google. - '--disable-features=AutofillServerCommunicatio', // Disables autofill server communication. This feature isn't disabled via other 'parent' flags. - '--disable-features=CertificateTransparencyComponentUpdate', - '--disable-sync', // Disable syncing to a Google account - '--disable-features=OptimizationHints', // Used for turning on Breakpad crash reporting in a debug environment where crash reporting is typically compiled but disabled. Disable the Chrome Optimization Guide and networking with its service API - '--disable-features=DialMediaRouteProvider', // A weaker form of disabling the MediaRouter feature. See that flag's details. - '--no-pings', // Don't send hyperlink auditing pings - '--enable-features=SidePanelUpdates' // Ensure the side panel is visible. This is used for testing the side panel feature. - ].filter((arg) => !!arg) - }) - await use(context) - await context.close() - }, - /** @type {() => Promise} */ - extensionId: async ({context}, use) => { - /* - // for manifest v2: - let [background] = context.backgroundPages() - if (!background) - background = await context.waitForEvent('backgroundpage') - */ - - // for manifest v3: - let [background] = context.serviceWorkers() - if (!background) background = await context.waitForEvent('serviceworker') - - const extensionId = background.url().split('/')[2] - await use(extensionId) - } - }) -} - const test = extensionFixtures(pathToExtension, true) test.beforeAll(async () => { @@ -85,7 +23,7 @@ test('should exist an element with the welcome message text', async ({ }) => { await page.goto('chrome://newtab/') const h1 = page.locator('h1') - await test.expect(h1).toHaveText('Welcome to your New Extension') + await test.expect(h1).toHaveText('Welcome to your New ESModule Extension') }) test('should exist a default color value', async ({page}) => {