Skip to content

clear() throws error (The element to be cleared could not be focused) in shadow DOM #1143

Description

@nolanlawson

Reproduction example

https://stackblitz.com/edit/js-4pfvam?file=index.js

Prerequisites

To repro, create an <input> in a shadow root, and then try to clear() it:

import userEvent from '@testing-library/user-event';

const appDiv = document.getElementById('app');

appDiv.attachShadow({ mode: 'open' }).innerHTML = '<input type=text>';
const input = appDiv.shadowRoot.querySelector('input');

userEvent.clear(input); // throws the Error

Expected behavior

An <input> should be clear()able regardless of whether it's in a shadow root or not. It's still focusable, even if it's in a shadow root.

Actual behavior

The error is thrown: The element to be cleared could not be focused

The root cause seems to be this line of code:

https://github.com/testing-library/user-event/blob/7a305dee9ab833d6f338d567fc2e862b4838b76a/src/utility/clear.ts#L12C1-L14

The issue is that document.activeElement is not sufficient for determining the active element in this case. You would need to drill down one level deeper into the shadow root:

document.activeElement // shadow host element
document.activeElement.shadowRoot.activeElement // <input>

User-event version

14.4.3

Environment

See repro above.

Additional context

This used to work in a previous version of @testing-libray/user-event. It seems to have started throwing in this commit: 1cda1b1

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions