HTML API: Fix finding bookmarks set on closing tag WP_HTML_Tag_Processor.

Setting a bookmark on a tag should set its "start" position before the opening "<", e.g.:
{{{
<div> Testing a <b>Bookmark</b>
----------------^
}}}

The previous calculation assumed this is always one byte to the left from `$tag_name_starts_at`.

However, in a closing tag that index points to a solidus symbol "/":
{{{
<div> Testing a <b>Bookmark</b>
----------------------------^
}}}

The bookmark should therefore start two bytes before the tag name:
{{{
<div> Testing a <b>Bookmark</b>
---------------------------^
}}}

This changeset achieves this by:
* Using the correct starting index for closing tag bookmarks.
* Adding `array( 'tag_closers' => 'visit' )` in `WP_HTML_Tag_Processor::seek()`.

Follow-up to [55203].

Props zieladam, dmsnell, flixos90.
Fixes #57787.
See #57575.

git-svn-id: https://develop.svn.wordpress.org/trunk@55407 602fd350-edb4-49c9-b593-d223f7449a82
This commit is contained in:
Tonya Mork
2023-02-22 20:53:41 +00:00
parent b0754798c6
commit 83ae6b790e
2 changed files with 24 additions and 2 deletions
@@ -722,7 +722,7 @@ class WP_HTML_Tag_Processor {
}
$this->bookmarks[ $name ] = new WP_HTML_Span(
$this->tag_name_starts_at - 1,
$this->tag_name_starts_at - ( $this->is_closing_tag ? 2 : 1 ),
$this->tag_ends_at
);
@@ -1504,7 +1504,7 @@ class WP_HTML_Tag_Processor {
$this->bytes_already_parsed = $this->bookmarks[ $bookmark_name ]->start;
$this->bytes_already_copied = $this->bytes_already_parsed;
$this->output_buffer = substr( $this->html, 0, $this->bytes_already_copied );
return $this->next_tag();
return $this->next_tag( array( 'tag_closers' => 'visit' ) );
}
/**
@@ -63,6 +63,28 @@ class Tests_HtmlApi_wpHtmlTagProcessor_Bookmark extends WP_UnitTestCase {
);
}
/**
* @ticket 57787
*
* @covers WP_HTML_Tag_Processor::seek
*/
public function test_seeks_to_tag_closer_bookmark() {
$p = new WP_HTML_Tag_Processor( '<div>First</div><span>Second</span>' );
$p->next_tag( array( 'tag_closers' => 'visit' ) );
$p->set_bookmark( 'first' );
$p->next_tag( array( 'tag_closers' => 'visit' ) );
$p->set_bookmark( 'second' );
$p->seek( 'first' );
$p->seek( 'second' );
$this->assertSame(
'DIV',
$p->get_tag(),
'Did not seek to the intended bookmark location'
);
}
/**
* WP_HTML_Tag_Processor used to test for the diffs affecting
* the adjusted bookmark position while simultaneously adjusting