Page Menu
Home
Phorge
Search
Configure Global Search
Log In
Files
F585155
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Flag For Later
Award Token
Size
15 KB
Referenced Files
None
Subscribers
None
View Options
diff --git a/includes/htmlform/fields/HTMLFormFieldCloner.php b/includes/htmlform/fields/HTMLFormFieldCloner.php
index 07e833886fb..df35765fec2 100644
--- a/includes/htmlform/fields/HTMLFormFieldCloner.php
+++ b/includes/htmlform/fields/HTMLFormFieldCloner.php
@@ -439,10 +439,11 @@ class HTMLFormFieldCloner extends HTMLFormField {
if ( !empty( $this->mParams['row-legend'] ) ) {
$legend = $this->msg( $this->mParams['row-legend'] )->text();
+ $legend = $legend ? Html::element( 'legend', [], $legend ) : '';
$html = Html::rawElement(
'fieldset',
[],
- $legend ? Html::element( 'legend', [], $legend ) : '' . $html
+ $legend . $html
);
}
@@ -548,10 +549,11 @@ class HTMLFormFieldCloner extends HTMLFormField {
if ( !empty( $this->mParams['row-legend'] ) ) {
$legend = $this->msg( $this->mParams['row-legend'] )->text();
+ $legend = $legend ? Html::element( 'legend', [], $legend ) : '';
$html = Html::rawElement(
'fieldset',
[],
- $legend ? Html::element( 'legend', [], $legend ) : '' . $html
+ $legend . $html
);
}
diff --git a/tests/phpunit/integration/includes/HTMLForm/Field/HTMLFormFieldClonerTest.php b/tests/phpunit/integration/includes/HTMLForm/Field/HTMLFormFieldClonerTest.php
new file mode 100644
index 00000000000..a277ad74975
--- /dev/null
+++ b/tests/phpunit/integration/includes/HTMLForm/Field/HTMLFormFieldClonerTest.php
@@ -0,0 +1,85 @@
+<?php
+namespace MediaWiki\Tests\Integration\HTMLForm\Field;
+
+use MediaWiki\HTMLForm\Field\HTMLFormFieldCloner;
+use MediaWiki\Tests\Integration\HTMLForm\HTMLFormFieldTestCase;
+use OOUI\Tag;
+use ReflectionClass;
+
+/**
+ * @covers \MediaWiki\HTMLForm\Field\HTMLFormFieldCloner
+ */
+class HTMLFormFieldClonerTest extends HTMLFormFieldTestCase {
+ /** @inheritDoc */
+ protected $className = HTMLFormFieldCloner::class;
+
+ protected function setUp(): void {
+ parent::setUp();
+
+ // Reset unique ID counter for cloner-type fields and OOUI fields between tests.
+ $ref = new ReflectionClass( HTMLFormFieldCloner::class );
+ $ref->setStaticPropertyValue( 'counter', 0 );
+
+ Tag::resetElementId();
+ }
+
+ public static function provideInputHtml() {
+ yield 'without legend' => [
+ [
+ 'format' => 'div',
+ 'fields' => [
+ [
+ 'label' => 'Test',
+ 'type' => 'text',
+ ],
+ ]
+ ],
+ [],
+ '<ul id="mw-htmlform-cloner-list-mw-input-testfield" class="mw-htmlform-cloner-ul" data-template="<div class="mw-htmlform-cloner-row"> <div class="mw-htmlform-field-HTMLTextField"><label for="mw-input-testfield--HTMLFormFieldCloner1x--0">Test</label><div class="mw-input"><input id="mw-input-testfield--HTMLFormFieldCloner1x--0" name="testfield[HTMLFormFieldCloner1x][0]" size="45"> </div></div><button class="mw-htmlform-submit mw-htmlform-cloner-delete-button mw-htmlform-primary mw-htmlform-progressive" id="mw-input-testfield--HTMLFormFieldCloner1x--delete" type="submit" name="testfield[HTMLFormFieldCloner1x][delete]" value="(htmlform-cloner-delete)" formnovalidate="">(htmlform-cloner-delete)</button> </div>" data-unique-id="HTMLFormFieldCloner1x"></ul><button class="mw-htmlform-submit mw-htmlform-cloner-create-button mw-htmlform-primary mw-htmlform-progressive" id="mw-input-testfield--create" type="submit" name="testfield[create]" value="(htmlform-cloner-create)" formnovalidate="">(htmlform-cloner-create)</button>'
+ ];
+
+ yield 'with legend' => [
+ [
+ 'format' => 'div',
+ 'row-legend' => 'some-legend-msg',
+ 'fields' => [
+ [
+ 'label' => 'Test',
+ 'type' => 'text',
+ ],
+ ]
+ ],
+ [],
+ '<ul id="mw-htmlform-cloner-list-mw-input-testfield" class="mw-htmlform-cloner-ul" data-template="<fieldset><legend>some-legend-msg</legend><div class="mw-htmlform-cloner-row"> <div class="mw-htmlform-field-HTMLTextField"><label for="mw-input-testfield--HTMLFormFieldCloner1x--0">Test</label><div class="mw-input"><input id="mw-input-testfield--HTMLFormFieldCloner1x--0" name="testfield[HTMLFormFieldCloner1x][0]" size="45"> </div></div><button class="mw-htmlform-submit mw-htmlform-cloner-delete-button mw-htmlform-primary mw-htmlform-progressive" id="mw-input-testfield--HTMLFormFieldCloner1x--delete" type="submit" name="testfield[HTMLFormFieldCloner1x][delete]" value="(htmlform-cloner-delete)" formnovalidate="">(htmlform-cloner-delete)</button> </div></fieldset>" data-unique-id="HTMLFormFieldCloner1x"></ul><button class="mw-htmlform-submit mw-htmlform-cloner-create-button mw-htmlform-primary mw-htmlform-progressive" id="mw-input-testfield--create" type="submit" name="testfield[create]" value="(htmlform-cloner-create)" formnovalidate="">(htmlform-cloner-create)</button>'
+ ];
+ }
+
+ public static function provideInputOOUI() {
+ yield 'without legend' => [
+ [
+ 'fields' => [
+ [
+ 'label' => 'Test',
+ 'type' => 'text',
+ ],
+ ]
+ ],
+ [],
+ "<ul id=\"mw-htmlform-cloner-list-mw-input-testfield\" class=\"mw-htmlform-cloner-ul\" data-template=\"<div class="mw-htmlform-cloner-row"> <div id='ooui-php-2' class='mw-htmlform-field-HTMLTextField oo-ui-layout oo-ui-labelElement oo-ui-fieldLayout oo-ui-fieldLayout-align-top' data-ooui='{"_":"mw.htmlform.FieldLayout","fieldWidget":{"tag":"mw-input-testfield--HTMLFormFieldCloner1x--0"},"align":"top","helpInline":true,"\$overlay":true,"label":{"html":"Test"},"classes":["mw-htmlform-field-HTMLTextField"]}'><div class='oo-ui-fieldLayout-body'><span class='oo-ui-fieldLayout-header'><label for='ooui-php-1' class='oo-ui-labelElement-label'>Test</label></span><div class='oo-ui-fieldLayout-field'><div id='mw-input-testfield--HTMLFormFieldCloner1x--0' class='oo-ui-widget oo-ui-widget-enabled oo-ui-inputWidget oo-ui-textInputWidget oo-ui-textInputWidget-type-text oo-ui-textInputWidget-php' data-ooui='{"_":"OO.ui.TextInputWidget","name":"testfield[HTMLFormFieldCloner1x][0]","inputId":"ooui-php-1","required":false}'><input type='text' tabindex='0' name='testfield[HTMLFormFieldCloner1x][0]' value='' id='ooui-php-1' class='oo-ui-inputWidget-input' /><span class='oo-ui-iconElement-icon oo-ui-iconElement-noIcon'></span><span class='oo-ui-indicatorElement-indicator oo-ui-indicatorElement-noIndicator'></span></div></div></div></div><span id='mw-input-testfield--HTMLFormFieldCloner1x--delete' class='mw-htmlform-submit mw-htmlform-cloner-delete-button oo-ui-widget oo-ui-widget-enabled oo-ui-inputWidget oo-ui-buttonElement oo-ui-buttonElement-framed oo-ui-labelElement oo-ui-flaggedElement-primary oo-ui-flaggedElement-progressive oo-ui-buttonInputWidget' data-ooui='{"_":"OO.ui.ButtonInputWidget","type":"submit","name":"testfield[HTMLFormFieldCloner1x][delete]","value":"(htmlform-cloner-delete)","label":"(htmlform-cloner-delete)","flags":["primary","progressive"],"classes":["mw-htmlform-submit","mw-htmlform-cloner-delete-button"]}'><button type='submit' tabindex='0' name='testfield[HTMLFormFieldCloner1x][delete]' value='(htmlform-cloner-delete)' class='oo-ui-inputWidget-input oo-ui-buttonElement-button'><span class='oo-ui-iconElement-icon oo-ui-iconElement-noIcon'></span><span class='oo-ui-labelElement-label'>(htmlform-cloner-delete)</span><span class='oo-ui-indicatorElement-indicator oo-ui-indicatorElement-noIndicator'></span></button></span> </div>\" data-unique-id=\"HTMLFormFieldCloner1x\"></ul><span id='mw-input-testfield--create' class='mw-htmlform-submit mw-htmlform-cloner-create-button oo-ui-widget oo-ui-widget-enabled oo-ui-inputWidget oo-ui-buttonElement oo-ui-buttonElement-framed oo-ui-labelElement oo-ui-flaggedElement-primary oo-ui-flaggedElement-progressive oo-ui-buttonInputWidget' data-ooui='{\"_\":\"OO.ui.ButtonInputWidget\",\"type\":\"submit\",\"name\":\"testfield[create]\",\"value\":\"(htmlform-cloner-create)\",\"label\":\"(htmlform-cloner-create)\",\"flags\":[\"primary\",\"progressive\"],\"classes\":[\"mw-htmlform-submit\",\"mw-htmlform-cloner-create-button\"]}'><button type='submit' tabindex='0' name='testfield[create]' value='(htmlform-cloner-create)' class='oo-ui-inputWidget-input oo-ui-buttonElement-button'><span class='oo-ui-iconElement-icon oo-ui-iconElement-noIcon'></span><span class='oo-ui-labelElement-label'>(htmlform-cloner-create)</span><span class='oo-ui-indicatorElement-indicator oo-ui-indicatorElement-noIndicator'></span></button></span>"
+ ];
+
+ yield 'with legend' => [
+ [
+ 'row-legend' => 'some-legend-msg',
+ 'fields' => [
+ [
+ 'label' => 'Test',
+ 'type' => 'text',
+ ],
+ ]
+ ],
+ [],
+ "<ul id=\"mw-htmlform-cloner-list-mw-input-testfield\" class=\"mw-htmlform-cloner-ul\" data-template=\"<fieldset><legend>some-legend-msg</legend><div class="mw-htmlform-cloner-row"> <div id='ooui-php-2' class='mw-htmlform-field-HTMLTextField oo-ui-layout oo-ui-labelElement oo-ui-fieldLayout oo-ui-fieldLayout-align-top' data-ooui='{"_":"mw.htmlform.FieldLayout","fieldWidget":{"tag":"mw-input-testfield--HTMLFormFieldCloner1x--0"},"align":"top","helpInline":true,"\$overlay":true,"label":{"html":"Test"},"classes":["mw-htmlform-field-HTMLTextField"]}'><div class='oo-ui-fieldLayout-body'><span class='oo-ui-fieldLayout-header'><label for='ooui-php-1' class='oo-ui-labelElement-label'>Test</label></span><div class='oo-ui-fieldLayout-field'><div id='mw-input-testfield--HTMLFormFieldCloner1x--0' class='oo-ui-widget oo-ui-widget-enabled oo-ui-inputWidget oo-ui-textInputWidget oo-ui-textInputWidget-type-text oo-ui-textInputWidget-php' data-ooui='{"_":"OO.ui.TextInputWidget","name":"testfield[HTMLFormFieldCloner1x][0]","inputId":"ooui-php-1","required":false}'><input type='text' tabindex='0' name='testfield[HTMLFormFieldCloner1x][0]' value='' id='ooui-php-1' class='oo-ui-inputWidget-input' /><span class='oo-ui-iconElement-icon oo-ui-iconElement-noIcon'></span><span class='oo-ui-indicatorElement-indicator oo-ui-indicatorElement-noIndicator'></span></div></div></div></div><span id='mw-input-testfield--HTMLFormFieldCloner1x--delete' class='mw-htmlform-submit mw-htmlform-cloner-delete-button oo-ui-widget oo-ui-widget-enabled oo-ui-inputWidget oo-ui-buttonElement oo-ui-buttonElement-framed oo-ui-labelElement oo-ui-flaggedElement-primary oo-ui-flaggedElement-progressive oo-ui-buttonInputWidget' data-ooui='{"_":"OO.ui.ButtonInputWidget","type":"submit","name":"testfield[HTMLFormFieldCloner1x][delete]","value":"(htmlform-cloner-delete)","label":"(htmlform-cloner-delete)","flags":["primary","progressive"],"classes":["mw-htmlform-submit","mw-htmlform-cloner-delete-button"]}'><button type='submit' tabindex='0' name='testfield[HTMLFormFieldCloner1x][delete]' value='(htmlform-cloner-delete)' class='oo-ui-inputWidget-input oo-ui-buttonElement-button'><span class='oo-ui-iconElement-icon oo-ui-iconElement-noIcon'></span><span class='oo-ui-labelElement-label'>(htmlform-cloner-delete)</span><span class='oo-ui-indicatorElement-indicator oo-ui-indicatorElement-noIndicator'></span></button></span> </div></fieldset>\" data-unique-id=\"HTMLFormFieldCloner1x\"></ul><span id='mw-input-testfield--create' class='mw-htmlform-submit mw-htmlform-cloner-create-button oo-ui-widget oo-ui-widget-enabled oo-ui-inputWidget oo-ui-buttonElement oo-ui-buttonElement-framed oo-ui-labelElement oo-ui-flaggedElement-primary oo-ui-flaggedElement-progressive oo-ui-buttonInputWidget' data-ooui='{\"_\":\"OO.ui.ButtonInputWidget\",\"type\":\"submit\",\"name\":\"testfield[create]\",\"value\":\"(htmlform-cloner-create)\",\"label\":\"(htmlform-cloner-create)\",\"flags\":[\"primary\",\"progressive\"],\"classes\":[\"mw-htmlform-submit\",\"mw-htmlform-cloner-create-button\"]}'><button type='submit' tabindex='0' name='testfield[create]' value='(htmlform-cloner-create)' class='oo-ui-inputWidget-input oo-ui-buttonElement-button'><span class='oo-ui-iconElement-icon oo-ui-iconElement-noIcon'></span><span class='oo-ui-labelElement-label'>(htmlform-cloner-create)</span><span class='oo-ui-indicatorElement-indicator oo-ui-indicatorElement-noIndicator'></span></button></span>"
+ ];
+ }
+}
diff --git a/tests/phpunit/integration/includes/HTMLForm/HTMLFormFieldTestCase.php b/tests/phpunit/integration/includes/HTMLForm/HTMLFormFieldTestCase.php
index 4f2aba72bff..bcc0cb802aa 100644
--- a/tests/phpunit/integration/includes/HTMLForm/HTMLFormFieldTestCase.php
+++ b/tests/phpunit/integration/includes/HTMLForm/HTMLFormFieldTestCase.php
@@ -5,6 +5,7 @@ namespace MediaWiki\Tests\Integration\HTMLForm;
use InvalidArgumentException;
use MediaWiki\HTMLForm\HTMLForm;
use MediaWiki\HTMLForm\HTMLFormField;
+use MediaWiki\Language\RawMessage;
use MediaWikiIntegrationTestCase;
abstract class HTMLFormFieldTestCase extends MediaWikiIntegrationTestCase {
@@ -33,8 +34,17 @@ abstract class HTMLFormFieldTestCase extends MediaWikiIntegrationTestCase {
'HTMLFormFieldTestCase subclass ' . __CLASS__ . ' must override $className or constructField()'
);
}
+
+ $form = $this->createMock( HTMLForm::class );
+ $form->method( 'getLanguage' )
+ ->willReturnCallback(
+ fn () => $this->getServiceContainer()->getLanguageFactory()->getLanguage( 'qqx' )
+ );
+ $form->method( 'msg' )
+ ->willReturnCallback( static fn ( ...$args ) => new RawMessage( ...$args ) );
+
return new $this->className( $params + [
- 'parent' => $this->createMock( HTMLForm::class ),
+ 'parent' => $form,
'name' => 'testfield'
] );
}
File Metadata
Details
Attached
Mime Type
text/x-diff
Expires
Sat, Jul 5, 5:32 AM (11 h, 55 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
227569
Default Alt Text
(15 KB)
Attached To
Mode
rMW mediawiki
Attached
Detach File
Event Timeline
Log In to Comment