From 3cc4e006478cfca32849487db4b626dd657a2b36 Mon Sep 17 00:00:00 2001 From: thiemowmde Date: Thu, 2 Nov 2023 15:08:25 +0100 Subject: [PATCH] Use faster DOMUtils::hasClass() I tried to benchmark this. It's not really a big bottleneck in this codebase, but can still be seen. For example, the relative runtime of the method CommentUtils::isCommentSeparator (the heaviest user of this feature) goes down from 1.5% to 0.3%. Depends-On: If9252a97562542e7a4bec29edcc6e8dee0fb8221 Change-Id: I6b94a2481b5c4f7983df78ee48d45c0d8a50e53b --- includes/CommentFormatter.php | 4 ++-- includes/CommentParser.php | 8 ++++---- includes/CommentUtils.php | 16 ++++++---------- 3 files changed, 12 insertions(+), 16 deletions(-) diff --git a/includes/CommentFormatter.php b/includes/CommentFormatter.php index 66b61d4c7..8fe799353 100644 --- a/includes/CommentFormatter.php +++ b/includes/CommentFormatter.php @@ -112,7 +112,7 @@ class CommentFormatter { $wrapperNode = $headingElement->parentNode; if ( !( $wrapperNode instanceof Element && - DOMCompat::getClassList( $wrapperNode )->contains( 'mw-heading' ) + DOMUtils::hasClass( $wrapperNode, 'mw-heading' ) ) ) { // Do not add the wrapper if the heading has attributes generated from wikitext (T353489). // Only allow reserved attributes (e.g. 'data-mw', which can't be used in wikitext, but which @@ -379,7 +379,7 @@ class CommentFormatter { $headings = DOMCompat::querySelectorAll( $container, 'h2' ); foreach ( $headings as $headingElement ) { $wrapper = $headingElement->parentNode; - if ( $wrapper instanceof Element && DOMCompat::getClassList( $wrapper )->contains( 'toctitle' ) ) { + if ( $wrapper instanceof Element && DOMUtils::hasClass( $wrapper, 'toctitle' ) ) { continue; } $headingElement = static::handleHeading( $headingElement ); diff --git a/includes/CommentParser.php b/includes/CommentParser.php index 7da5a9b7f..db348bdcc 100644 --- a/includes/CommentParser.php +++ b/includes/CommentParser.php @@ -25,6 +25,7 @@ use Wikimedia\Parsoid\DOM\Element; use Wikimedia\Parsoid\DOM\Node; use Wikimedia\Parsoid\DOM\Text; use Wikimedia\Parsoid\Utils\DOMCompat; +use Wikimedia\Parsoid\Utils\DOMUtils; use Wikimedia\Timestamp\TimestampException; // TODO consider making timestamp parsing not a returned function @@ -563,7 +564,7 @@ class CommentParser { */ private function getUsernameFromLink( Element $link ): ?array { // Selflink: use title of current page - if ( DOMCompat::getClassList( $link )->contains( 'mw-selflink' ) ) { + if ( DOMUtils::hasClass( $link, 'mw-selflink' ) ) { $title = $this->title; } else { $titleString = CommentUtils::getTitleFromUrl( $link->getAttribute( 'href' ) ?? '', $this->config ) ?? ''; @@ -739,9 +740,8 @@ class CommentParser { ) { return NodeFilter::FILTER_REJECT; } - $classList = DOMCompat::getClassList( $node ); // Don't attempt to parse blocks marked 'mw-notalk' - if ( $classList->contains( 'mw-notalk' ) ) { + if ( DOMUtils::hasClass( $node, 'mw-notalk' ) ) { return NodeFilter::FILTER_REJECT; } // Don't detect comments within references. We can't add replies to them without bungling up @@ -749,7 +749,7 @@ class CommentParser { if ( //
    is the only reliably consistent thing between the two parsers $tagName === 'ol' && - DOMCompat::getClassList( $node )->contains( 'references' ) + DOMUtils::hasClass( $node, 'references' ) ) { return NodeFilter::FILTER_REJECT; } diff --git a/includes/CommentUtils.php b/includes/CommentUtils.php index 46c841af5..56fb6e407 100644 --- a/includes/CommentUtils.php +++ b/includes/CommentUtils.php @@ -14,6 +14,7 @@ use Wikimedia\Parsoid\DOM\Element; use Wikimedia\Parsoid\DOM\Node; use Wikimedia\Parsoid\DOM\Text; use Wikimedia\Parsoid\Utils\DOMCompat; +use Wikimedia\Parsoid\Utils\DOMUtils; class CommentUtils { @@ -85,7 +86,7 @@ class CommentUtils { */ public static function isOurGeneratedNode( Node $node ): bool { return $node instanceof Element && ( - DOMCompat::getClassList( $node )->contains( 'ext-discussiontools-init-replylink-buttons' ) || + DOMUtils::hasClass( $node, 'ext-discussiontools-init-replylink-buttons' ) || $node->hasAttribute( 'data-mw-comment-start' ) || $node->hasAttribute( 'data-mw-comment-end' ) ); @@ -164,15 +165,10 @@ class CommentUtils { return true; } - $classList = DOMCompat::getClassList( $node ); - if ( - // Anything marked as not containing comments - $classList->contains( 'mw-notalk' ) || - // {{outdent}} templates - $classList->contains( 'outdent-template' ) || - // {{tracked}} templates (T313097) - $classList->contains( 'mw-trackedTemplate' ) - ) { + // Anything marked as not containing comments + // {{outdent}} templates + // {{tracked}} templates (T313097) + if ( DOMUtils::hasClass( $node, 'mw-notalk|outdent-template|mw-trackedTemplate' ) ) { return true; }