When using HtmlHelper for style deduplication, slight differences in the serialization format used by the legacy parser caused test failures. Add a "compatibility" mode which tries to better match legacy parser behavior for void elements, character escapes, and other details. Parsoid HTML has always been serialized using an HTML5 serializer, so this compatibility mode will be disabled when processing Parsoid HTML. Change-Id: I0441aa3e44f6562e05e95a18cc282c53fe446788
59 lines
2.3 KiB
PHP
59 lines
2.3 KiB
PHP
<?php
|
|
|
|
namespace MediaWiki\Tests\Unit;
|
|
|
|
use MediaWiki\Html\HtmlHelper;
|
|
use MediaWikiUnitTestCase;
|
|
use Wikimedia\RemexHtml\HTMLData;
|
|
use Wikimedia\RemexHtml\Serializer\SerializerNode;
|
|
use Wikimedia\RemexHtml\Tokenizer\PlainAttributes;
|
|
|
|
class HtmlHelperTest extends MediaWikiUnitTestCase {
|
|
|
|
/**
|
|
* @covers \MediaWiki\Html\HtmlHelper::modifyElements
|
|
*/
|
|
public function testModifyElements() {
|
|
$shouldModifyCallback = static function ( SerializerNode $node ) {
|
|
return $node->namespace === HTMLData::NS_HTML
|
|
&& $node->name === 'a'
|
|
&& isset( $node->attrs['href'] );
|
|
};
|
|
$modifyCallbackInPlace = static function ( SerializerNode $node ) {
|
|
$node->attrs['href'] = 'https://tracker.org/' . $node->attrs['href'];
|
|
return $node;
|
|
};
|
|
$input = '<p>Foo <a href="https://example.org/">bar</a> baz</p>';
|
|
$expectedOutput = '<p>Foo <a href="https://tracker.org/https://example.org/">bar</a> baz</p>';
|
|
|
|
$output = HtmlHelper::modifyElements( $input, $shouldModifyCallback, $modifyCallbackInPlace );
|
|
$this->assertSame( $expectedOutput, $output );
|
|
|
|
$modifyCallbackNew = static function ( SerializerNode $node ) {
|
|
$href = 'https://tracker.org/' . $node->attrs['href'];
|
|
$newNode = new SerializerNode( $node->id, $node->parentId, $node->namespace, $node->name,
|
|
new PlainAttributes( [ 'href' => $href ] ), $node->void );
|
|
$node->attrs['href'] = 'https://tracker.org/' . $node->attrs['href'];
|
|
return $newNode;
|
|
};
|
|
|
|
$output = HtmlHelper::modifyElements( $input, $shouldModifyCallback, $modifyCallbackNew );
|
|
$this->assertSame( $expectedOutput, $output );
|
|
|
|
// Check the "legacy compatibility" mode, for void elements like <link>
|
|
$input = "<link data-test='<style data-mw-deduplicate=\" \">bar</style>'>";
|
|
$shouldModifyCallback = static function ( SerializerNode $node ) {
|
|
return false;
|
|
};
|
|
// HTML5 output
|
|
$expectedOutput = '<link data-test="<style data-mw-deduplicate=" ">bar</style>">';
|
|
$output = HtmlHelper::modifyElements( $input, $shouldModifyCallback, $modifyCallbackInPlace, true );
|
|
$this->assertSame( $expectedOutput, $output );
|
|
|
|
// "Legacy" output
|
|
$expectedOutput = '<link data-test="<style data-mw-deduplicate=" ">bar</style>" />';
|
|
$output = HtmlHelper::modifyElements( $input, $shouldModifyCallback, $modifyCallbackInPlace, false );
|
|
$this->assertSame( $expectedOutput, $output );
|
|
}
|
|
|
|
}
|