Version 1
[yaffs-website] / web / core / tests / Drupal / Tests / Core / Render / Element / HtmlTagTest.php
1 <?php
2
3 namespace Drupal\Tests\Core\Render\Element;
4
5 use Drupal\Core\Render\Markup;
6 use Drupal\Tests\UnitTestCase;
7 use Drupal\Core\Render\Element\HtmlTag;
8
9 /**
10  * @coversDefaultClass \Drupal\Core\Render\Element\HtmlTag
11  * @group Render
12  */
13 class HtmlTagTest extends UnitTestCase {
14
15   /**
16    * @covers ::getInfo
17    */
18   public function testGetInfo() {
19     $htmlTag = new HtmlTag([], 'test', 'test');
20     $info = $htmlTag->getInfo();
21     $this->assertArrayHasKey('#pre_render', $info);
22     $this->assertArrayHasKey('#attributes', $info);
23     $this->assertArrayHasKey('#value', $info);
24   }
25
26   /**
27    * @covers ::preRenderHtmlTag
28    * @dataProvider providerPreRenderHtmlTag
29    */
30   public function testPreRenderHtmlTag($element, $expected) {
31     $result = HtmlTag::preRenderHtmlTag($element);
32     $this->assertArrayHasKey('#markup', $result);
33     $this->assertEquals($expected, $result['#markup']);
34   }
35
36   /**
37    * Data provider for preRenderHtmlTag test.
38    */
39   public function providerPreRenderHtmlTag() {
40     $tags = [];
41
42     // Value prefix/suffix.
43     $element = [
44       '#value' => 'value',
45       '#tag' => 'p',
46     ];
47     $tags[] = [$element, '<p>value</p>' . "\n"];
48
49     // Normal element without a value should not result in a void element.
50     $element = [
51       '#tag' => 'p',
52       '#value' => NULL,
53     ];
54     $tags[] = [$element, "<p></p>\n"];
55
56     // A void element.
57     $element = [
58       '#tag' => 'br',
59     ];
60     $tags[] = [$element, "<br />\n"];
61
62     // Attributes.
63     $element = [
64       '#tag' => 'div',
65       '#attributes' => ['class' => 'test', 'id' => 'id'],
66       '#value' => 'value',
67     ];
68     $tags[] = [$element, '<div class="test" id="id">value</div>' . "\n"];
69
70     // No script tags.
71     $element['#noscript'] = TRUE;
72     $tags[] = [$element, '<noscript><div class="test" id="id">value</div>' . "\n" . '</noscript>'];
73
74     // Ensure that #tag is sanitised.
75     $element = [
76       '#tag' => 'p><script>alert()</script><p',
77       '#value' => 'value',
78     ];
79     $tags[] = [$element, "<p&gt;&lt;script&gt;alert()&lt;/script&gt;&lt;p>value</p&gt;&lt;script&gt;alert()&lt;/script&gt;&lt;p>\n"];
80
81     // Ensure that #value is not filtered if it is marked as safe.
82     $element = [
83       '#tag' => 'p',
84       '#value' => Markup::create('<script>value</script>'),
85     ];
86     $tags[] = [$element, "<p><script>value</script></p>\n"];
87
88     // Ensure that #value is filtered if it is not safe.
89     $element = [
90       '#tag' => 'p',
91       '#value' => '<script>value</script>',
92     ];
93     $tags[] = [$element, "<p>value</p>\n"];
94
95     return $tags;
96   }
97
98   /**
99    * @covers ::preRenderConditionalComments
100    * @dataProvider providerPreRenderConditionalComments
101    */
102   public function testPreRenderConditionalComments($element, $expected, $set_safe = FALSE) {
103     if ($set_safe) {
104       $element['#prefix'] = Markup::create($element['#prefix']);
105       $element['#suffix'] = Markup::create($element['#suffix']);
106     }
107     $this->assertEquals($expected, HtmlTag::preRenderConditionalComments($element));
108   }
109
110   /**
111    * Data provider for conditional comments test.
112    */
113   public function providerPreRenderConditionalComments() {
114     // No browser specification.
115     $element = [
116       '#tag' => 'link',
117     ];
118     $tags[] = [$element, $element];
119
120     // Specify all browsers.
121     $element['#browsers'] = [
122       'IE' => TRUE,
123       '!IE' => TRUE,
124     ];
125     $tags[] = [$element, $element];
126
127     // All IE.
128     $element = [
129       '#tag' => 'link',
130       '#browsers' => [
131         'IE' => TRUE,
132         '!IE' => FALSE,
133       ],
134     ];
135     $expected = $element;
136     $expected['#prefix'] = "\n<!--[if IE]>\n";
137     $expected['#suffix'] = "<![endif]-->\n";
138     $tags[] = [$element, $expected];
139
140     // Exclude IE.
141     $element = [
142       '#tag' => 'link',
143       '#browsers' => [
144         'IE' => FALSE,
145       ],
146     ];
147     $expected = $element;
148     $expected['#prefix'] = "\n<!--[if !IE]><!-->\n";
149     $expected['#suffix'] = "<!--<![endif]-->\n";
150     $tags[] = [$element, $expected];
151
152     // IE gt 8
153     $element = [
154       '#tag' => 'link',
155       '#browsers' => [
156         'IE' => 'gt IE 8',
157       ],
158     ];
159     $expected = $element;
160     $expected['#prefix'] = "\n<!--[if gt IE 8]><!-->\n";
161     $expected['#suffix'] = "<!--<![endif]-->\n";
162     $tags[] = [$element, $expected];
163
164     // Prefix and suffix filtering if not safe.
165     $element = [
166       '#tag' => 'link',
167       '#browsers' => [
168         'IE' => FALSE,
169       ],
170       '#prefix' => '<blink>prefix</blink>',
171       '#suffix' => '<blink>suffix</blink>',
172     ];
173     $expected = $element;
174     $expected['#prefix'] = "\n<!--[if !IE]><!-->\nprefix";
175     $expected['#suffix'] = "suffix<!--<![endif]-->\n";
176     $tags[] = [$element, $expected];
177
178     // Prefix and suffix filtering if marked as safe. This has to come after the
179     // previous test case.
180     $expected['#prefix'] = "\n<!--[if !IE]><!-->\n<blink>prefix</blink>";
181     $expected['#suffix'] = "<blink>suffix</blink><!--<![endif]-->\n";
182     $tags[] = [$element, $expected, TRUE];
183
184     return $tags;
185   }
186
187 }