diff --git a/src/wp-includes/html-api/class-wp-html-tag-processor.php b/src/wp-includes/html-api/class-wp-html-tag-processor.php
index 39390621e8..032ca2af32 100644
--- a/src/wp-includes/html-api/class-wp-html-tag-processor.php
+++ b/src/wp-includes/html-api/class-wp-html-tag-processor.php
@@ -2551,6 +2551,15 @@ class WP_HTML_Tag_Processor {
return false;
}
+ $existing_bookmark = $this->bookmarks[ $bookmark_name ];
+
+ if (
+ $this->token_starts_at === $existing_bookmark->start &&
+ $this->token_length === $existing_bookmark->length
+ ) {
+ return true;
+ }
+
if ( ++$this->seek_count > static::MAX_SEEK_OPS ) {
_doing_it_wrong(
__METHOD__,
diff --git a/tests/phpunit/tests/html-api/wpHtmlTagProcessor-bookmark.php b/tests/phpunit/tests/html-api/wpHtmlTagProcessor-bookmark.php
index ad0cf68906..0e72f9d726 100644
--- a/tests/phpunit/tests/html-api/wpHtmlTagProcessor-bookmark.php
+++ b/tests/phpunit/tests/html-api/wpHtmlTagProcessor-bookmark.php
@@ -435,16 +435,49 @@ HTML;
public function test_limits_the_number_of_seek_calls() {
$processor = new WP_HTML_Tag_Processor( '
' );
$processor->next_tag( 'li' );
- $processor->set_bookmark( 'bookmark' );
+ $processor->set_bookmark( 'ping' );
+ $processor->next_tag( 'li' );
+ $processor->set_bookmark( 'pong' );
- for ( $i = 0; $i < WP_HTML_Tag_Processor::MAX_SEEK_OPS; $i++ ) {
- $this->assertTrue( $processor->seek( 'bookmark' ), 'Could not seek to the "bookmark"' );
+ for ( $i = 0; $i < WP_HTML_Tag_Processor::MAX_SEEK_OPS; $i += 2 ) {
+ $this->assertTrue(
+ $processor->seek( 'ping' ),
+ 'Could not seek to the "ping": check test setup.'
+ );
+
+ $this->assertTrue(
+ $processor->seek( 'pong' ),
+ 'Could not seek to the "pong": check test setup.'
+ );
}
$this->setExpectedIncorrectUsage( 'WP_HTML_Tag_Processor::seek' );
$this->assertFalse( $processor->seek( 'bookmark' ), "$i-th seek() to the bookmark succeeded, even though it should exceed the allowed limit" );
}
+ /**
+ * @ticket 62085
+ *
+ * @covers WP_HTML_Tag_Processor::seek
+ */
+ public function test_skips_counting_noop_seek_calls() {
+ $processor = new WP_HTML_Tag_Processor( '' );
+ $processor->next_tag( 'li' );
+ $processor->set_bookmark( 'here' );
+
+ for ( $i = 0; $i < WP_HTML_Tag_Processor::MAX_SEEK_OPS; $i++ ) {
+ $this->assertTrue(
+ $processor->seek( 'here' ),
+ 'Could not seek to the "here": check test setup.'
+ );
+ }
+
+ $this->assertTrue(
+ $processor->seek( 'here' ),
+ 'Should never fail to seek if the seek is pointing at the current location.'
+ );
+ }
+
/**
* Ensures that it's possible to seek to an earlier location in a document even
* after reaching the end of a document, when most functionality shuts down.