diff --git a/src/chromium/crPage.ts b/src/chromium/crPage.ts index 63a1ba099cac4..9a43187c85de2 100644 --- a/src/chromium/crPage.ts +++ b/src/chromium/crPage.ts @@ -99,6 +99,7 @@ export class CRPage implements PageDelegate { this._client.send('Runtime.enable', {}).then(() => this._ensureIsolatedWorld(UTILITY_WORLD_NAME)), this._networkManager.initialize(), this._client.send('Target.setAutoAttach', { autoAttach: true, waitForDebuggerOnStart: true, flatten: true }), + this._client.send('Emulation.setFocusEmulationEnabled', { enabled: true }), ]; const options = this._page.context()._options; if (options.bypassCSP) diff --git a/test/focus.spec.js b/test/focus.spec.js new file mode 100644 index 0000000000000..250a522e58c1c --- /dev/null +++ b/test/focus.spec.js @@ -0,0 +1,57 @@ +/** + * Copyright Microsoft Corporation. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +const utils = require('./utils'); +const { waitEvent } = utils; + +/** + * @type {PageTestSuite} + */ +module.exports.describe = function({testRunner, expect}) { + const {describe, xdescribe, fdescribe} = testRunner; + const {it, fit, xit, dit} = testRunner; + const {beforeAll, beforeEach, afterAll, afterEach} = testRunner; + + describe('Page.focus', function() { + it('should work', async function({page, server}) { + await page.setContent(`
`); + expect(await page.evaluate(() => document.activeElement.nodeName)).toBe('BODY'); + await page.focus('#d1'); + expect(await page.evaluate(() => document.activeElement.id)).toBe('d1'); + }); + it('should emit focus event', async function({page, server}) { + await page.setContent(`
`); + let focused = false; + await page.exposeFunction('focusEvent', () => focused = true); + await page.evaluate(() => d1.addEventListener('focus', focusEvent)); + await page.focus('#d1'); + expect(focused).toBe(true); + }); + it('should emit blur event', async function({page, server}) { + await page.setContent(`
DIV1
DIV2
`); + await page.focus('#d1'); + let focused = false; + let blurred = false; + await page.exposeFunction('focusEvent', () => focused = true); + await page.exposeFunction('blurEvent', () => blurred = true); + await page.evaluate(() => d1.addEventListener('blur', blurEvent)); + await page.evaluate(() => d2.addEventListener('focus', focusEvent)); + await page.focus('#d2'); + expect(focused).toBe(true); + expect(blurred).toBe(true); + }); + }); +}; diff --git a/test/playwright.spec.js b/test/playwright.spec.js index f2ddb2a6f8919..6329726a39b38 100644 --- a/test/playwright.spec.js +++ b/test/playwright.spec.js @@ -173,6 +173,7 @@ module.exports.describe = ({testRunner, product, playwrightPath}) => { testRunner.loadTests(require('./emulation.spec.js'), testOptions); testRunner.loadTests(require('./evaluation.spec.js'), testOptions); testRunner.loadTests(require('./frame.spec.js'), testOptions); + testRunner.loadTests(require('./focus.spec.js'), testOptions); testRunner.loadTests(require('./input.spec.js'), testOptions); testRunner.loadTests(require('./jshandle.spec.js'), testOptions); testRunner.loadTests(require('./keyboard.spec.js'), testOptions);