2011-07-04 19:51:35 +00:00
|
|
|
<?php
|
|
|
|
|
/** tests for includes/Html.php */
|
|
|
|
|
|
|
|
|
|
class HtmlTest extends MediaWikiTestCase {
|
|
|
|
|
private static $oldLang;
|
2011-08-05 15:10:08 +00:00
|
|
|
private static $oldContLang;
|
2012-01-25 03:45:01 +00:00
|
|
|
private static $oldLanguageCode;
|
2012-01-25 03:25:54 +00:00
|
|
|
private static $oldNamespaces;
|
2012-08-30 09:56:21 +00:00
|
|
|
private static $oldHTML5;
|
2011-07-04 19:51:35 +00:00
|
|
|
|
|
|
|
|
public function setUp() {
|
2012-08-30 09:56:21 +00:00
|
|
|
global $wgLang, $wgContLang, $wgLanguageCode, $wgHTML5;
|
|
|
|
|
|
|
|
|
|
// Save globals
|
2011-07-04 19:51:35 +00:00
|
|
|
self::$oldLang = $wgLang;
|
2011-08-05 15:10:08 +00:00
|
|
|
self::$oldContLang = $wgContLang;
|
2012-01-27 13:00:26 +00:00
|
|
|
self::$oldNamespaces = $wgContLang->getNamespaces();
|
2012-01-25 03:45:01 +00:00
|
|
|
self::$oldLanguageCode = $wgLanguageCode;
|
2012-08-30 09:56:21 +00:00
|
|
|
self::$oldHTML5 = $wgHTML5;
|
|
|
|
|
|
2011-07-04 19:51:35 +00:00
|
|
|
$wgLanguageCode = 'en';
|
2011-08-05 15:10:08 +00:00
|
|
|
$wgContLang = $wgLang = Language::factory( $wgLanguageCode );
|
2012-01-25 03:25:54 +00:00
|
|
|
|
|
|
|
|
// Hardcode namespaces during test runs,
|
|
|
|
|
// so that html output based on existing namespaces
|
|
|
|
|
// can be properly evaluated.
|
2012-01-27 13:00:26 +00:00
|
|
|
$wgContLang->setNamespaces( array(
|
2012-01-25 03:25:54 +00:00
|
|
|
-2 => 'Media',
|
|
|
|
|
-1 => 'Special',
|
|
|
|
|
0 => '',
|
|
|
|
|
1 => 'Talk',
|
|
|
|
|
2 => 'User',
|
|
|
|
|
3 => 'User_talk',
|
|
|
|
|
4 => 'MyWiki',
|
|
|
|
|
5 => 'MyWiki_Talk',
|
|
|
|
|
6 => 'File',
|
|
|
|
|
7 => 'File_talk',
|
|
|
|
|
8 => 'MediaWiki',
|
|
|
|
|
9 => 'MediaWiki_talk',
|
|
|
|
|
10 => 'Template',
|
|
|
|
|
11 => 'Template_talk',
|
2012-02-13 14:53:40 +00:00
|
|
|
14 => 'Category',
|
|
|
|
|
15 => 'Category_talk',
|
2012-01-25 03:25:54 +00:00
|
|
|
100 => 'Custom',
|
|
|
|
|
101 => 'Custom_talk',
|
2012-01-27 13:00:26 +00:00
|
|
|
) );
|
2011-07-04 19:51:35 +00:00
|
|
|
}
|
2012-08-30 09:56:21 +00:00
|
|
|
|
2011-07-04 19:51:35 +00:00
|
|
|
public function tearDown() {
|
2012-08-30 09:56:21 +00:00
|
|
|
global $wgLang, $wgContLang, $wgLanguageCode, $wgHTML5;
|
2012-01-25 03:45:01 +00:00
|
|
|
|
2012-08-30 09:56:21 +00:00
|
|
|
// Restore globals
|
2012-01-27 13:00:26 +00:00
|
|
|
$wgContLang->setNamespaces( self::$oldNamespaces );
|
2011-07-04 19:51:35 +00:00
|
|
|
$wgLang = self::$oldLang;
|
2011-08-05 15:10:08 +00:00
|
|
|
$wgContLang = self::$oldContLang;
|
2012-01-25 03:45:01 +00:00
|
|
|
$wgLanguageCode = self::$oldLanguageCode;
|
2012-08-30 09:56:21 +00:00
|
|
|
$wgHTML5 = self::$oldHTML5;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Wrapper to easily set $wgHTML5 = true.
|
|
|
|
|
* Original value will be restored after test completion.
|
|
|
|
|
* @todo Move to MediaWikiTestCase
|
|
|
|
|
*/
|
|
|
|
|
public function enableHTML5() {
|
|
|
|
|
global $wgHTML5;
|
|
|
|
|
$wgHTML5 = true;
|
|
|
|
|
}
|
|
|
|
|
/**
|
|
|
|
|
* Wrapper to easily set $wgHTML5 = false
|
|
|
|
|
* Original value will be restored after test completion.
|
|
|
|
|
* @todo Move to MediaWikiTestCase
|
|
|
|
|
*/
|
|
|
|
|
public function disableHTML5() {
|
|
|
|
|
global $wgHTML5;
|
|
|
|
|
$wgHTML5 = false;
|
2011-07-04 19:51:35 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function testExpandAttributesSkipsNullAndFalse() {
|
|
|
|
|
|
|
|
|
|
### EMPTY ########
|
|
|
|
|
$this->AssertEmpty(
|
2011-09-03 01:42:43 +00:00
|
|
|
Html::expandAttributes( array( 'foo' => null ) ),
|
2011-07-04 19:51:35 +00:00
|
|
|
'skip keys with null value'
|
|
|
|
|
);
|
|
|
|
|
$this->AssertEmpty(
|
2011-09-03 01:42:43 +00:00
|
|
|
Html::expandAttributes( array( 'foo' => false ) ),
|
2011-07-04 19:51:35 +00:00
|
|
|
'skip keys with false value'
|
|
|
|
|
);
|
|
|
|
|
$this->AssertNotEmpty(
|
2011-09-03 01:42:43 +00:00
|
|
|
Html::expandAttributes( array( 'foo' => '' ) ),
|
2011-07-04 19:51:35 +00:00
|
|
|
'keep keys with an empty string'
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function testExpandAttributesForBooleans() {
|
2011-07-19 22:10:05 +00:00
|
|
|
global $wgHtml5;
|
2011-07-04 19:51:35 +00:00
|
|
|
$this->AssertEquals(
|
|
|
|
|
'',
|
2011-09-03 01:42:43 +00:00
|
|
|
Html::expandAttributes( array( 'selected' => false ) ),
|
2011-07-04 19:51:35 +00:00
|
|
|
'Boolean attributes do not generates output when value is false'
|
|
|
|
|
);
|
|
|
|
|
$this->AssertEquals(
|
|
|
|
|
'',
|
2011-09-03 01:42:43 +00:00
|
|
|
Html::expandAttributes( array( 'selected' => null ) ),
|
2011-07-04 19:51:35 +00:00
|
|
|
'Boolean attributes do not generates output when value is null'
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
$this->AssertEquals(
|
2011-07-19 22:10:05 +00:00
|
|
|
$wgHtml5 ? ' selected=""' : ' selected="selected"',
|
2011-09-03 01:42:43 +00:00
|
|
|
Html::expandAttributes( array( 'selected' => true ) ),
|
2011-07-04 19:51:35 +00:00
|
|
|
'Boolean attributes skip value output'
|
|
|
|
|
);
|
|
|
|
|
$this->AssertEquals(
|
2011-07-19 22:10:05 +00:00
|
|
|
$wgHtml5 ? ' selected=""' : ' selected="selected"',
|
2011-07-04 19:51:35 +00:00
|
|
|
Html::expandAttributes( array( 'selected' ) ),
|
|
|
|
|
'Boolean attributes (ex: selected) do not need a value'
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Test for Html::expandAttributes()
|
|
|
|
|
* Please note it output a string prefixed with a space!
|
|
|
|
|
*/
|
|
|
|
|
public function testExpandAttributesVariousExpansions() {
|
|
|
|
|
### NOT EMPTY ####
|
|
|
|
|
$this->AssertEquals(
|
|
|
|
|
' empty_string=""',
|
2011-09-03 01:42:43 +00:00
|
|
|
Html::expandAttributes( array( 'empty_string' => '' ) ),
|
2011-07-04 19:51:35 +00:00
|
|
|
'Value with an empty string'
|
|
|
|
|
);
|
|
|
|
|
$this->AssertEquals(
|
|
|
|
|
' key="value"',
|
2011-09-03 01:42:43 +00:00
|
|
|
Html::expandAttributes( array( 'key' => 'value' ) ),
|
2011-07-04 19:51:35 +00:00
|
|
|
'Value is a string'
|
|
|
|
|
);
|
|
|
|
|
$this->AssertEquals(
|
|
|
|
|
' one="1"',
|
2011-09-03 01:42:43 +00:00
|
|
|
Html::expandAttributes( array( 'one' => 1 ) ),
|
2011-07-04 19:51:35 +00:00
|
|
|
'Value is a numeric one'
|
|
|
|
|
);
|
|
|
|
|
$this->AssertEquals(
|
|
|
|
|
' zero="0"',
|
2011-09-03 01:42:43 +00:00
|
|
|
Html::expandAttributes( array( 'zero' => 0 ) ),
|
2011-07-04 19:51:35 +00:00
|
|
|
'Value is a numeric zero'
|
|
|
|
|
);
|
|
|
|
|
}
|
2011-09-03 03:55:23 +00:00
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Html::expandAttributes has special features for HTML
|
|
|
|
|
* attributes that use space separated lists and also
|
|
|
|
|
* allows arrays to be used as values.
|
|
|
|
|
*/
|
|
|
|
|
public function testExpandAttributesListValueAttributes() {
|
|
|
|
|
### STRING VALUES
|
|
|
|
|
$this->AssertEquals(
|
|
|
|
|
' class="redundant spaces here"',
|
|
|
|
|
Html::expandAttributes( array( 'class' => ' redundant spaces here ' ) ),
|
|
|
|
|
'Normalization should strip redundant spaces'
|
|
|
|
|
);
|
|
|
|
|
$this->AssertEquals(
|
|
|
|
|
' class="foo bar"',
|
|
|
|
|
Html::expandAttributes( array( 'class' => 'foo bar foo bar bar' ) ),
|
|
|
|
|
'Normalization should remove duplicates in string-lists'
|
|
|
|
|
);
|
|
|
|
|
### "EMPTY" ARRAY VALUES
|
|
|
|
|
$this->AssertEquals(
|
|
|
|
|
' class=""',
|
|
|
|
|
Html::expandAttributes( array( 'class' => array() ) ),
|
|
|
|
|
'Value with an empty array'
|
|
|
|
|
);
|
|
|
|
|
$this->AssertEquals(
|
|
|
|
|
' class=""',
|
|
|
|
|
Html::expandAttributes( array( 'class' => array( null, '', ' ', ' ' ) ) ),
|
|
|
|
|
'Array with null, empty string and spaces'
|
|
|
|
|
);
|
|
|
|
|
### NON-EMPTY ARRAY VALUES
|
|
|
|
|
$this->AssertEquals(
|
|
|
|
|
' class="foo bar"',
|
|
|
|
|
Html::expandAttributes( array( 'class' => array(
|
|
|
|
|
'foo',
|
|
|
|
|
'bar',
|
|
|
|
|
'foo',
|
|
|
|
|
'bar',
|
|
|
|
|
'bar',
|
|
|
|
|
) ) ),
|
|
|
|
|
'Normalization should remove duplicates in the array'
|
|
|
|
|
);
|
|
|
|
|
$this->AssertEquals(
|
|
|
|
|
' class="foo bar"',
|
|
|
|
|
Html::expandAttributes( array( 'class' => array(
|
|
|
|
|
'foo bar',
|
|
|
|
|
'bar foo',
|
|
|
|
|
'foo',
|
|
|
|
|
'bar bar',
|
|
|
|
|
) ) ),
|
|
|
|
|
'Normalization should remove duplicates in string-lists in the array'
|
|
|
|
|
);
|
|
|
|
|
}
|
2011-10-24 17:45:45 +00:00
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Test feature added by r96188, let pass attributes values as
|
|
|
|
|
* a PHP array. Restricted to class,rel, accesskey.
|
|
|
|
|
*/
|
|
|
|
|
function testExpandAttributesSpaceSeparatedAttributesWithBoolean() {
|
|
|
|
|
$this->assertEquals(
|
|
|
|
|
' class="booltrue one"',
|
|
|
|
|
Html::expandAttributes( array( 'class' => array(
|
|
|
|
|
'booltrue' => true,
|
|
|
|
|
'one' => 1,
|
|
|
|
|
|
|
|
|
|
# Method use isset() internally, make sure we do discard
|
|
|
|
|
# attributes values which have been assigned well known values
|
|
|
|
|
'emptystring' => '',
|
|
|
|
|
'boolfalse' => false,
|
|
|
|
|
'zero' => 0,
|
|
|
|
|
'null' => null,
|
|
|
|
|
)))
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* How do we handle duplicate keys in HTML attributes expansion?
|
|
|
|
|
* We could pass a "class" the values: 'GREEN' and array( 'GREEN' => false )
|
|
|
|
|
* The later will take precedence.
|
|
|
|
|
*
|
|
|
|
|
* Feature added by r96188
|
|
|
|
|
*/
|
|
|
|
|
function testValueIsAuthoritativeInSpaceSeparatedAttributesArrays() {
|
|
|
|
|
$this->assertEquals(
|
|
|
|
|
' class=""',
|
2011-10-27 15:54:49 +00:00
|
|
|
Html::expandAttributes( array( 'class' => array(
|
2011-10-24 17:45:45 +00:00
|
|
|
'GREEN',
|
|
|
|
|
'GREEN' => false,
|
|
|
|
|
'GREEN',
|
|
|
|
|
)))
|
|
|
|
|
);
|
|
|
|
|
}
|
2012-01-25 03:25:54 +00:00
|
|
|
|
|
|
|
|
function testNamespaceSelector() {
|
|
|
|
|
$this->assertEquals(
|
2012-03-07 19:14:20 +00:00
|
|
|
'<select>' . "\n" .
|
2012-02-02 18:42:02 +00:00
|
|
|
'<option value="0">(Main)</option>' . "\n" .
|
|
|
|
|
'<option value="1">Talk</option>' . "\n" .
|
|
|
|
|
'<option value="2">User</option>' . "\n" .
|
|
|
|
|
'<option value="3">User talk</option>' . "\n" .
|
|
|
|
|
'<option value="4">MyWiki</option>' . "\n" .
|
|
|
|
|
'<option value="5">MyWiki Talk</option>' . "\n" .
|
|
|
|
|
'<option value="6">File</option>' . "\n" .
|
|
|
|
|
'<option value="7">File talk</option>' . "\n" .
|
|
|
|
|
'<option value="8">MediaWiki</option>' . "\n" .
|
|
|
|
|
'<option value="9">MediaWiki talk</option>' . "\n" .
|
|
|
|
|
'<option value="10">Template</option>' . "\n" .
|
|
|
|
|
'<option value="11">Template talk</option>' . "\n" .
|
2012-02-13 14:53:40 +00:00
|
|
|
'<option value="14">Category</option>' . "\n" .
|
|
|
|
|
'<option value="15">Category talk</option>' . "\n" .
|
2012-02-02 18:42:02 +00:00
|
|
|
'<option value="100">Custom</option>' . "\n" .
|
|
|
|
|
'<option value="101">Custom talk</option>' . "\n" .
|
|
|
|
|
'</select>',
|
2012-01-25 03:25:54 +00:00
|
|
|
Html::namespaceSelector(),
|
|
|
|
|
'Basic namespace selector without custom options'
|
|
|
|
|
);
|
2012-03-07 19:14:20 +00:00
|
|
|
|
2012-01-25 03:25:54 +00:00
|
|
|
$this->assertEquals(
|
2012-02-02 18:42:02 +00:00
|
|
|
'<label for="mw-test-namespace">Select a namespace:</label> ' .
|
|
|
|
|
'<select id="mw-test-namespace" name="wpNamespace">' . "\n" .
|
|
|
|
|
'<option value="all">all</option>' . "\n" .
|
|
|
|
|
'<option value="0">(Main)</option>' . "\n" .
|
|
|
|
|
'<option value="1">Talk</option>' . "\n" .
|
|
|
|
|
'<option value="2" selected="">User</option>' . "\n" .
|
|
|
|
|
'<option value="3">User talk</option>' . "\n" .
|
|
|
|
|
'<option value="4">MyWiki</option>' . "\n" .
|
|
|
|
|
'<option value="5">MyWiki Talk</option>' . "\n" .
|
|
|
|
|
'<option value="6">File</option>' . "\n" .
|
|
|
|
|
'<option value="7">File talk</option>' . "\n" .
|
|
|
|
|
'<option value="8">MediaWiki</option>' . "\n" .
|
|
|
|
|
'<option value="9">MediaWiki talk</option>' . "\n" .
|
|
|
|
|
'<option value="10">Template</option>' . "\n" .
|
|
|
|
|
'<option value="11">Template talk</option>' . "\n" .
|
2012-02-13 14:53:40 +00:00
|
|
|
'<option value="14">Category</option>' . "\n" .
|
|
|
|
|
'<option value="15">Category talk</option>' . "\n" .
|
2012-02-02 18:42:02 +00:00
|
|
|
'<option value="100">Custom</option>' . "\n" .
|
|
|
|
|
'<option value="101">Custom talk</option>' . "\n" .
|
|
|
|
|
'</select>',
|
2012-01-25 03:25:54 +00:00
|
|
|
Html::namespaceSelector(
|
|
|
|
|
array( 'selected' => '2', 'all' => 'all', 'label' => 'Select a namespace:' ),
|
|
|
|
|
array( 'name' => 'wpNamespace', 'id' => 'mw-test-namespace' )
|
|
|
|
|
),
|
|
|
|
|
'Basic namespace selector with custom values'
|
|
|
|
|
);
|
2012-02-14 09:59:59 +00:00
|
|
|
|
2012-03-07 19:14:20 +00:00
|
|
|
$this->assertEquals(
|
|
|
|
|
'<label>Select a namespace:</label> ' .
|
|
|
|
|
'<select>' . "\n" .
|
|
|
|
|
'<option value="0">(Main)</option>' . "\n" .
|
|
|
|
|
'<option value="1">Talk</option>' . "\n" .
|
|
|
|
|
'<option value="2">User</option>' . "\n" .
|
|
|
|
|
'<option value="3">User talk</option>' . "\n" .
|
|
|
|
|
'<option value="4">MyWiki</option>' . "\n" .
|
|
|
|
|
'<option value="5">MyWiki Talk</option>' . "\n" .
|
|
|
|
|
'<option value="6">File</option>' . "\n" .
|
|
|
|
|
'<option value="7">File talk</option>' . "\n" .
|
|
|
|
|
'<option value="8">MediaWiki</option>' . "\n" .
|
|
|
|
|
'<option value="9">MediaWiki talk</option>' . "\n" .
|
|
|
|
|
'<option value="10">Template</option>' . "\n" .
|
|
|
|
|
'<option value="11">Template talk</option>' . "\n" .
|
|
|
|
|
'<option value="14">Category</option>' . "\n" .
|
|
|
|
|
'<option value="15">Category talk</option>' . "\n" .
|
|
|
|
|
'<option value="100">Custom</option>' . "\n" .
|
|
|
|
|
'<option value="101">Custom talk</option>' . "\n" .
|
|
|
|
|
'</select>',
|
|
|
|
|
Html::namespaceSelector(
|
|
|
|
|
array( 'label' => 'Select a namespace:' )
|
|
|
|
|
),
|
|
|
|
|
'Basic namespace selector with a custom label but no id attribtue for the <select>'
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function testCanFilterOutNamespaces() {
|
|
|
|
|
$this->assertEquals(
|
|
|
|
|
'<select>' . "\n" .
|
2012-02-13 15:08:26 +00:00
|
|
|
'<option value="2">User</option>' . "\n" .
|
|
|
|
|
'<option value="4">MyWiki</option>' . "\n" .
|
|
|
|
|
'<option value="5">MyWiki Talk</option>' . "\n" .
|
|
|
|
|
'<option value="6">File</option>' . "\n" .
|
|
|
|
|
'<option value="7">File talk</option>' . "\n" .
|
|
|
|
|
'<option value="8">MediaWiki</option>' . "\n" .
|
|
|
|
|
'<option value="9">MediaWiki talk</option>' . "\n" .
|
|
|
|
|
'<option value="10">Template</option>' . "\n" .
|
|
|
|
|
'<option value="11">Template talk</option>' . "\n" .
|
2012-02-14 09:59:59 +00:00
|
|
|
'<option value="14">Category</option>' . "\n" .
|
2012-02-13 15:08:26 +00:00
|
|
|
'<option value="15">Category talk</option>' . "\n" .
|
|
|
|
|
'</select>',
|
|
|
|
|
Html::namespaceSelector(
|
2012-02-14 09:59:59 +00:00
|
|
|
array( 'exclude' => array( 0, 1, 3, 100, 101 ) )
|
2012-02-13 15:08:26 +00:00
|
|
|
),
|
2012-02-14 09:59:59 +00:00
|
|
|
'Namespace selector namespace filtering.'
|
|
|
|
|
);
|
2012-03-07 19:14:20 +00:00
|
|
|
}
|
2012-02-14 09:59:59 +00:00
|
|
|
|
2012-03-07 19:14:20 +00:00
|
|
|
function testCanDisableANamespaces() {
|
|
|
|
|
$this->assertEquals(
|
|
|
|
|
'<select>' . "\n" .
|
2012-02-14 09:59:59 +00:00
|
|
|
'<option disabled="" value="0">(Main)</option>' . "\n" .
|
|
|
|
|
'<option disabled="" value="1">Talk</option>' . "\n" .
|
|
|
|
|
'<option disabled="" value="2">User</option>' . "\n" .
|
|
|
|
|
'<option disabled="" value="3">User talk</option>' . "\n" .
|
|
|
|
|
'<option disabled="" value="4">MyWiki</option>' . "\n" .
|
|
|
|
|
'<option value="5">MyWiki Talk</option>' . "\n" .
|
|
|
|
|
'<option value="6">File</option>' . "\n" .
|
|
|
|
|
'<option value="7">File talk</option>' . "\n" .
|
|
|
|
|
'<option value="8">MediaWiki</option>' . "\n" .
|
|
|
|
|
'<option value="9">MediaWiki talk</option>' . "\n" .
|
|
|
|
|
'<option value="10">Template</option>' . "\n" .
|
|
|
|
|
'<option value="11">Template talk</option>' . "\n" .
|
|
|
|
|
'<option value="14">Category</option>' . "\n" .
|
|
|
|
|
'<option value="15">Category talk</option>' . "\n" .
|
|
|
|
|
'<option value="100">Custom</option>' . "\n" .
|
|
|
|
|
'<option value="101">Custom talk</option>' . "\n" .
|
|
|
|
|
'</select>',
|
|
|
|
|
Html::namespaceSelector( array(
|
|
|
|
|
'disable' => array( 0, 1, 2, 3, 4 )
|
|
|
|
|
) ),
|
|
|
|
|
'Namespace selector namespace disabling'
|
2012-02-13 15:08:26 +00:00
|
|
|
);
|
2012-01-25 03:25:54 +00:00
|
|
|
}
|
2012-01-30 10:39:51 +00:00
|
|
|
|
2011-07-04 19:51:35 +00:00
|
|
|
}
|