diff --git a/wp-includes/html-api/class-wp-html-tag-processor.php b/wp-includes/html-api/class-wp-html-tag-processor.php
index 5a9221fc9e..f540aa743d 100644
--- a/wp-includes/html-api/class-wp-html-tag-processor.php
+++ b/wp-includes/html-api/class-wp-html-tag-processor.php
@@ -1404,6 +1404,7 @@ private function class_name_updates_to_attributes_updates() {
* Applies attribute updates to HTML document.
*
* @since 6.2.0
+ * @since 6.3.0 Invalidate any bookmarks whose targets are overwritten.
*
* @return void
*/
@@ -1434,7 +1435,7 @@ private function apply_attributes_updates() {
* Adjust bookmark locations to account for how the text
* replacements adjust offsets in the input document.
*/
- foreach ( $this->bookmarks as $bookmark ) {
+ foreach ( $this->bookmarks as $bookmark_name => $bookmark ) {
/*
* Each lexical update which appears before the bookmark's endpoints
* might shift the offsets for those endpoints. Loop through each change
@@ -1445,20 +1446,22 @@ private function apply_attributes_updates() {
$tail_delta = 0;
foreach ( $this->lexical_updates as $diff ) {
- $update_head = $bookmark->start >= $diff->start;
- $update_tail = $bookmark->end >= $diff->start;
-
- if ( ! $update_head && ! $update_tail ) {
+ if ( $bookmark->start < $diff->start && $bookmark->end < $diff->start ) {
break;
}
+ if ( $bookmark->start >= $diff->start && $bookmark->end < $diff->end ) {
+ $this->release_bookmark( $bookmark_name );
+ continue 2;
+ }
+
$delta = strlen( $diff->text ) - ( $diff->end - $diff->start );
- if ( $update_head ) {
+ if ( $bookmark->start >= $diff->start ) {
$head_delta += $delta;
}
- if ( $update_tail ) {
+ if ( $bookmark->end >= $diff->end ) {
$tail_delta += $delta;
}
}
@@ -1470,6 +1473,18 @@ private function apply_attributes_updates() {
$this->lexical_updates = array();
}
+ /**
+ * Checks whether a bookmark with the given name exists.
+ *
+ * @since 6.3.0
+ *
+ * @param string $bookmark_name Name to identify a bookmark that potentially exists.
+ * @return bool Whether that bookmark exists.
+ */
+ public function has_bookmark( $bookmark_name ) {
+ return array_key_exists( $bookmark_name, $this->bookmarks );
+ }
+
/**
* Move the internal cursor in the Tag Processor to a given bookmark's location.
*
diff --git a/wp-includes/version.php b/wp-includes/version.php
index 9f55914696..ef66bfd3de 100644
--- a/wp-includes/version.php
+++ b/wp-includes/version.php
@@ -16,7 +16,7 @@
*
* @global string $wp_version
*/
-$wp_version = '6.3-alpha-55554';
+$wp_version = '6.3-alpha-55555';
/**
* Holds the WordPress DB revision, increments when changes are made to the WordPress DB schema.