| // Copyright 2023 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| import * as path from 'path'; |
| import * as puppeteer from 'puppeteer-core'; |
| import {dumpCollectedErrors} from 'test/conductor/events.js'; |
| import * as MochaHooks from 'test/conductor/mocha_hooks.js'; |
| import { |
| clearPuppeteerState, |
| getBrowserAndPages, |
| registerHandlers, |
| setBrowserAndPages, |
| } from 'test/conductor/puppeteer-state.js'; |
| import {setTestServerPort} from 'test/conductor/server_port.js'; |
| import {TestConfig} from 'test/conductor/test_config.js'; |
| import { getBrowserAndPagesWrappers } from 'test/shared/non_hosted_wrappers'; |
| |
| const EXTENSION_DIR = path.join(__dirname, '..', '..', '..', 'DevTools_CXX_Debugging.stage2', 'gen'); |
| const DEVTOOLS_DIR = path.join(__dirname, '..', '..', '..', 'devtools-frontend', 'gen'); |
| |
| async function beforeAll() { |
| setTestServerPort(Number(process.env.testServerPort)); |
| registerHandlers(); |
| |
| const executablePath = TestConfig.chromeBinary; |
| |
| const defaultViewport = { |
| width: 1280, |
| height: 760, |
| }; |
| |
| const browser = await puppeteer.launch({ |
| headless: !TestConfig.debug, |
| devtools: true, |
| dumpio: !TestConfig.debug, |
| executablePath, |
| defaultViewport, |
| args: [ |
| // The fingerprint should match devtools-frontend's |
| '--ignore-certificate-errors-spki-list=KLy6vv6synForXwI6lDIl+D3ZrMV6Y1EMTY6YpOcAos=', |
| `--load-extension=${EXTENSION_DIR}`, |
| `--disable-extensions-except=${EXTENSION_DIR}`, |
| `--window-size=${defaultViewport.width + 20, defaultViewport.height + 100}`, |
| `--custom-devtools-frontend=${new URL(`${DEVTOOLS_DIR}/front_end`, 'file://').href}`, |
| '--disable-features=RenderDocument', |
| ], |
| }); |
| |
| const connectOptions = {browserWSEndpoint: browser.wsEndpoint()}; |
| const conn = await puppeteer.connect(connectOptions); |
| |
| const newTabTarget = |
| await conn.waitForTarget(target => target.url() === 'chrome://newtab/' || target.url() === 'about:blank'); |
| const target = await newTabTarget?.page(); |
| if (!target) { |
| throw new Error('Could not find target page'); |
| } |
| const devtoolsTarget = await conn.waitForTarget(target => target.url().startsWith('devtools://')); |
| const frontend = await devtoolsTarget?.page(); |
| if (!frontend) { |
| throw new Error('Could not find frontend page'); |
| } |
| await frontend.setViewport(defaultViewport); |
| const devToolsVeLogging = {enabled: true, testing: true}; |
| await frontend.evaluateOnNewDocument(`globalThis.hostConfigForTesting = ${JSON.stringify({devToolsVeLogging})};`); |
| await frontend.reload(); |
| |
| setBrowserAndPages({frontend, target, browser: conn}); |
| } |
| |
| async function afterAll() { |
| const {browser} = getBrowserAndPages(); |
| await browser.close(); |
| |
| clearPuppeteerState(); |
| dumpCollectedErrors(); |
| } |
| |
| async function beforeEach() { |
| const {devToolsPage} = getBrowserAndPagesWrappers(); |
| await devToolsPage.evaluate(() => { |
| localStorage.clear(); |
| const experiments = JSON.parse(localStorage.getItem('experiments') ?? '{}'); |
| experiments['instrumentationBreakpoints'] = true; |
| localStorage.setItem('experiments', JSON.stringify(experiments)); |
| }); |
| await devToolsPage.reload(); |
| await devToolsPage.click('[aria-label="Customize and control DevTools"]'); |
| await devToolsPage.click('[aria-label="Undock into separate window"]'); |
| } |
| |
| async function afterEach() { |
| const {frontend, target} = getBrowserAndPages(); |
| await frontend.reload(); |
| await target.goto('about:blank'); |
| } |
| |
| export function mochaGlobalTeardown() { |
| return MochaHooks.mochaGlobalTeardown(); |
| } |
| export function mochaGlobalSetup(this: Mocha.Suite) { |
| return MochaHooks.mochaGlobalSetup.call(this); |
| } |
| export const mochaHooks = { |
| beforeAll, |
| afterAll, |
| beforeEach, |
| afterEach, |
| }; |