<?php class HTMLPurifier_Strategy_FixNestingTest extends HTMLPurifier_StrategyHarness { function setUp() { parent::setUp(); $this->obj = new HTMLPurifier_Strategy_FixNesting(); } function testPreserveInlineInRoot() { $this->assertResult('<b>Bold text</b>'); } function testPreserveInlineAndBlockInRoot() { $this->assertResult('<a href="about:blank">Blank</a><div>Block</div>'); } function testRemoveBlockInInline() { $this->assertResult( '<b><div>Illegal div.</div></b>', '<b>Illegal div.</b>' ); } function testEscapeBlockInInline() { $this->config->set('Core', 'EscapeInvalidChildren', true); $this->assertResult( '<b><div>Illegal div.</div></b>', '<b><div>Illegal div.</div></b>' ); } function testRemoveNodeWithMissingRequiredElements() { $this->assertResult('<ul></ul>', ''); } function testRemoveIllegalPCDATA() { $this->assertResult( '<ul>Illegal text<li>Legal item</li></ul>', '<ul><li>Legal item</li></ul>' ); } function testCustomTableDefinition() { $this->assertResult('<table><tr><td>Cell 1</td></tr></table>'); } function testRemoveEmptyTable() { $this->assertResult('<table></table>', ''); } function testChameleonRemoveBlockInNodeInInline() { $this->assertResult( '<span><ins><div>Not allowed!</div></ins></span>', '<span><ins>Not allowed!</ins></span>' ); } function testChameleonRemoveBlockInBlockNodeWithInlineContent() { $this->assertResult( '<h1><ins><div>Not allowed!</div></ins></h1>', '<h1><ins>Not allowed!</ins></h1>' ); } function testNestedChameleonRemoveBlockInNodeWithInlineContent() { $this->assertResult( '<h1><ins><del><div>Not allowed!</div></del></ins></h1>', '<h1><ins><del>Not allowed!</del></ins></h1>' ); } function testNestedChameleonPreserveBlockInBlock() { $this->assertResult( '<div><ins><del><div>Allowed!</div></del></ins></div>' ); } function testChameleonEscapeInvalidBlockInInline() { $this->config->set('Core', 'EscapeInvalidChildren', true); $this->assertResult( // alt config '<span><ins><div>Not allowed!</div></ins></span>', '<span><ins><div>Not allowed!</div></ins></span>' ); } function testExclusionsIntegration() { // test exclusions $this->assertResult( '<a><span><a>Not allowed</a></span></a>', '<a><span></span></a>' ); } function testPreserveInlineNodeInInlineRootNode() { $this->config->set('HTML', 'Parent', 'span'); $this->assertResult('<b>Bold</b>'); } function testRemoveBlockNodeInInlineRootNode() { $this->config->set('HTML', 'Parent', 'span'); $this->assertResult('<div>Reject</div>', 'Reject'); } function testInvalidParentError() { // test fallback to div $this->config->set('HTML', 'Parent', 'obviously-impossible'); $this->config->set('Cache', 'DefinitionImpl', null); $this->expectError('Cannot use unrecognized element as parent'); $this->assertResult('<div>Accept</div>'); } function testCascadingRemovalOfNodesMissingRequiredChildren() { $this->assertResult('<table><tr></tr></table>', ''); } function testCascadingRemovalSpecialCaseCannotScrollOneBack() { $this->assertResult('<table><tr></tr><tr></tr></table>', ''); } function testLotsOfCascadingRemovalOfNodes() { $this->assertResult('<table><tbody><tr></tr><tr></tr></tbody><tr></tr><tr></tr></table>', ''); } function testAdjacentRemovalOfNodeMissingRequiredChildren() { $this->assertResult('<table></table><table></table>', ''); } function testStrictBlockquoteInHTML401() { $this->config->set('HTML', 'Doctype', 'HTML 4.01 Strict'); $this->assertResult('<blockquote>text</blockquote>', '<blockquote><p>text</p></blockquote>'); } }