Skip to content

KSES: Allow autofocus within dialog elements#12255

Open
Sukhendu2002 wants to merge 3 commits into
WordPress:trunkfrom
Sukhendu2002:fix/65491-kses-dialog-autofocus
Open

KSES: Allow autofocus within dialog elements#12255
Sukhendu2002 wants to merge 3 commits into
WordPress:trunkfrom
Sukhendu2002:fix/65491-kses-dialog-autofocus

Conversation

@Sukhendu2002

Copy link
Copy Markdown

Trac ticket: https://core.trac.wordpress.org/ticket/65491


This Pull Request is for code review only. Please keep all other discussion in the Trac ticket. Do not merge this Pull Request. See GitHub Pull Requests for Code Review in the Core Handbook for more details.

@github-actions

Copy link
Copy Markdown

Hi there! 👋

Thank you for your contribution to WordPress! 💖

It looks like this is your first pull request to wordpress-develop. Here are a few things to be aware of that may help you out!

No one monitors this repository for new pull requests. Pull requests must be attached to a Trac ticket to be considered for inclusion in WordPress Core. To attach a pull request to a Trac ticket, please include the ticket's full URL in your pull request description.

Pull requests are never merged on GitHub. The WordPress codebase continues to be managed through the SVN repository that this GitHub repository mirrors. Please feel free to open pull requests to work on any contribution you are making.

More information about how GitHub pull requests can be used to contribute to WordPress can be found in the Core Handbook.

Please include automated tests. Including tests in your pull request is one way to help your patch be considered faster. To learn about WordPress' test suites, visit the Automated Testing page in the handbook.

If you have not had a chance, please review the Contribute with Code page in the WordPress Core Handbook.

The Developer Hub also documents the various coding standards that are followed:

Thank you,
The WordPress Project

@github-actions

Copy link
Copy Markdown

Test using WordPress Playground

The changes in this pull request can previewed and tested using a WordPress Playground instance.

WordPress Playground is an experimental project that creates a full WordPress instance entirely within the browser.

Some things to be aware of

  • All changes will be lost when closing a tab with a Playground instance.
  • All changes will be lost when refreshing the page.
  • A fresh instance is created each time the link below is clicked.
  • Every time this pull request is updated, a new ZIP file containing all changes is created. If changes are not reflected in the Playground instance,
    it's possible that the most recent build failed, or has not completed. Check the list of workflow runs to be sure.

For more details about these limitations and more, check out the Limitations page in the WordPress Playground documentation.

Test this pull request with WordPress Playground.

@Sukhendu2002
Sukhendu2002 marked this pull request as ready for review June 22, 2026 08:27
@github-actions

github-actions Bot commented Jun 22, 2026

Copy link
Copy Markdown

The following accounts have interacted with this PR and/or linked issues. I will continue to update these lists as activity occurs. You can also manually ask me to refresh this list by adding the props-bot label.

Core Committers: Use this line as a base for the props when committing in SVN:

Props sukhendu2002, khokansardar.

To understand the WordPress project's expectations around crediting contributors, please review the Contributor Attribution page in the Core Handbook.

Comment thread src/wp-includes/kses.php

return wp_kses_split( $content, $allowed_html, $allowed_protocols );
$filter_dialog_autofocus = (
'post' === $allowed_html &&

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This only takes effect for the 'post' context. wp_kses( $content, 'data' ), custom allow-lists that include , and other contexts will silently strip autofocus. If that's intentional for 7.1, let's state it explicitly in the docblock so it's a documented limitation rather than a surprise. A test asserting the non-post behavior would lock it in.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Added docblock note and non-post test

Comment thread src/wp-includes/kses.php
$allowed_html[ $tag ]['autofocus'] = true;
}
}
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hardcoding autofocus/dialog-specific logic into the generic low-level wp_kses() is a concern. This function underpins every sanitization context, and baking one HTML feature's special case inline sets a precedent (the next person wants popover, inert, etc.). Can we either (a) move this behind a documented filter / a general "context-aware attribute" helper, or (b) at minimum add a code comment explaining why it must live here?
cc @westonruter since you raised the "only within a dialog" approach in #64576.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Added explanatory comment, kept minimal scoped fix.

Comment thread src/wp-includes/kses.php
}

/**
* Removes autofocus attributes unless the element appears within a dialog element.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The function strips autofocus from the element itself (not just keeping it on descendants) — the test bakes this in and it's the right behavior, but it's non-obvious from the name. Please note it in the docblock so future readers don't assume dialogs are exempt entirely.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Updated docblock

Comment on lines +167 to +172
public function test_wp_kses_post_allows_autofocus_only_inside_dialog() {
$this->assertEqualHTML(
'<dialog><button autofocus>Close</button></dialog><button>Outside</button>',
wp_kses_post( '<dialog autofocus><button autofocus>Close</button></dialog><button autofocus>Outside</button>' )
);
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The depth-counting explicitly handles nesting but there's no test for it. Please add cases for:

  • nested dialogs, e.g. …
  • the valued attribute form autofocus="autofocus"

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Added both cases

Comment on lines +177 to +182
public function test_wp_kses_post_removes_autofocus_outside_dialog_after_unsupported_html() {
$this->assertStringNotContainsString(
'autofocus',
wp_kses_post( '<table>text</table><button autofocus>Outside</button>' )
);
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please also add a test for a non-post context (ties to the 'post' === $allowed_html comment above) to lock in and document that behavior.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants