3 namespace Drupal\Tests\Core\Render\Element;
5 use Drupal\Core\Render\Markup;
6 use Drupal\Tests\Core\Render\RendererTestBase;
7 use Drupal\Core\Render\Element\HtmlTag;
10 * @coversDefaultClass \Drupal\Core\Render\Element\HtmlTag
13 class HtmlTagTest extends RendererTestBase {
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);
27 * @covers ::preRenderHtmlTag
28 * @dataProvider providerPreRenderHtmlTag
30 public function testPreRenderHtmlTag($element, $expected) {
31 $result = HtmlTag::preRenderHtmlTag($element);
32 foreach ($result as &$child) {
33 if (is_array($child) && isset($child['#tag'])) {
34 $child = HtmlTag::preRenderHtmlTag($child);
37 $this->assertEquals($expected, (string) $this->renderer->renderRoot($result));
41 * Data provider for preRenderHtmlTag test.
43 public function providerPreRenderHtmlTag() {
46 // Value prefix/suffix.
51 $tags['value'] = [$element, '<p>value</p>' . "\n"];
53 // Normal element without a value should not result in a void element.
58 $tags['no-value'] = [$element, "<p></p>\n"];
64 $tags['void-element'] = [$element, "<br />\n"];
69 '#attributes' => ['class' => 'test', 'id' => 'id'],
72 $tags['attributes'] = [$element, '<div class="test" id="id">value</div>' . "\n"];
75 $element['#noscript'] = TRUE;
76 $tags['noscript'] = [$element, '<noscript><div class="test" id="id">value</div>' . "\n" . '</noscript>'];
78 // Ensure that #tag is sanitised.
80 '#tag' => 'p><script>alert()</script><p',
83 $tags['sanitized-tag'] = [$element, "<p><script>alert()</script><p>value</p><script>alert()</script><p>\n"];
85 // Ensure that #value is not filtered if it is marked as safe.
88 '#value' => Markup::create('<script>value</script>'),
90 $tags['value-safe'] = [$element, "<p><script>value</script></p>\n"];
92 // Ensure that #value is filtered if it is not safe.
95 '#value' => '<script>value</script>',
97 $tags['value-not-safe'] = [$element, "<p>value</p>\n"];
99 // Ensure that nested render arrays render properly.
104 ['#markup' => '<b>value1</b>'],
105 ['#markup' => '<b>value2</b>'],
108 $tags['nested'] = [$element, "<p><b>value1</b><b>value2</b></p>\n"];
110 // Ensure svg elements.
120 $tags['rect'] = [$element, '<rect width="25" height="25" x="5" y="10" />' . "\n"];
130 $tags['circle'] = [$element, '<circle cx="100" cy="100" r="100" />' . "\n"];
135 'points' => '60,20 100,40 100,80 60,100 20,80 20,40',
138 $tags['polygon'] = [$element, '<polygon points="60,20 100,40 100,80 60,100 20,80 20,40" />' . "\n"];
149 $tags['ellipse'] = [$element, '<ellipse cx="60" cy="60" rx="50" ry="25" />' . "\n"];
160 $tags['use'] = [$element, '<use x="50" y="10" width="50" height="50" />' . "\n"];
165 'd' => 'M 100 100 L 300 100 L 200 300 z',
171 $tags['path'] = [$element, '<path d="M 100 100 L 300 100 L 200 300 z" fill="orange" stroke="black" stroke-width="3" />' . "\n"];
177 'stop-color' => '#F60',
180 $tags['stop'] = [$element, '<stop offset="5%" stop-color="#F60" />' . "\n"];
182 // Nested svg elements.
184 '#tag' => 'linearGradient',
191 'stop-color' => '#F60',
199 'stop-color' => '#FF6',
203 $tags['linearGradient'] = [$element, '<linearGradient><stop offset="5%" stop-color="#F60" />' . "\n" . '<stop offset="95%" stop-color="#FF6" />' . "\n" . '</linearGradient>' . "\n"];
209 $tags['link'] = [HtmlTag::preRenderConditionalComments($element), '<link />' . "\n"];
219 $tags['conditional-link'] = [HtmlTag::preRenderConditionalComments($element), "\n" . '<!--[if IE]>' . "\n" . '<link />' . "\n" . '<![endif]-->' . "\n"];
225 * @covers ::preRenderConditionalComments
226 * @dataProvider providerPreRenderConditionalComments
228 public function testPreRenderConditionalComments($element, $expected, $set_safe = FALSE) {
230 $element['#prefix'] = Markup::create($element['#prefix']);
231 $element['#suffix'] = Markup::create($element['#suffix']);
233 $this->assertEquals($expected, HtmlTag::preRenderConditionalComments($element));
237 * Data provider for conditional comments test.
239 public function providerPreRenderConditionalComments() {
240 // No browser specification.
244 $tags['no-browser'] = [$element, $element];
246 // Specify all browsers.
247 $element['#browsers'] = [
251 $tags['all-browsers'] = [$element, $element];
261 $expected = $element;
262 $expected['#prefix'] = "\n<!--[if IE]>\n";
263 $expected['#suffix'] = "<![endif]-->\n";
264 $tags['all-ie'] = [$element, $expected];
273 $expected = $element;
274 $expected['#prefix'] = "\n<!--[if !IE]><!-->\n";
275 $expected['#suffix'] = "<!--<![endif]-->\n";
276 $tags['no-ie'] = [$element, $expected];
285 $expected = $element;
286 $expected['#prefix'] = "\n<!--[if gt IE 8]><!-->\n";
287 $expected['#suffix'] = "<!--<![endif]-->\n";
288 $tags['ie9plus'] = [$element, $expected];
290 // Prefix and suffix filtering if not safe.
296 '#prefix' => '<blink>prefix</blink>',
297 '#suffix' => '<blink>suffix</blink>',
299 $expected = $element;
300 $expected['#prefix'] = "\n<!--[if !IE]><!-->\nprefix";
301 $expected['#suffix'] = "suffix<!--<![endif]-->\n";
302 $tags['non-ie-unsafe'] = [$element, $expected];
304 // Prefix and suffix filtering if marked as safe. This has to come after the
305 // previous test case.
306 $expected['#prefix'] = "\n<!--[if !IE]><!-->\n<blink>prefix</blink>";
307 $expected['#suffix'] = "<blink>suffix</blink><!--<![endif]-->\n";
308 $tags['non-ie-safe'] = [$element, $expected, TRUE];