0
0
mirror of https://github.com/ezyang/htmlpurifier.git synced 2024-11-14 01:08:41 +00:00
htmlpurifier/tests/HTMLPurifier/Lexer/DirectLexTest.php
Edward Z. Yang 54477c172b Fix infinite loop in Lexer.
Signed-off-by: Edward Z. Yang <ezyang@mit.edu>
2013-10-27 21:41:08 -07:00

132 lines
4.1 KiB
PHP

<?php
class HTMLPurifier_Lexer_DirectLexTest extends HTMLPurifier_Harness
{
protected $DirectLex;
public function setUp()
{
$this->DirectLex = new HTMLPurifier_Lexer_DirectLex();
}
// internals testing
public function test_parseAttributeString()
{
$input[0] = 'href="about:blank" rel="nofollow"';
$expect[0] = array('href'=>'about:blank', 'rel'=>'nofollow');
$input[1] = "href='about:blank'";
$expect[1] = array('href'=>'about:blank');
// note that the single quotes aren't /really/ escaped
$input[2] = 'onclick="javascript:alert(\'asdf\');"';
$expect[2] = array('onclick' => "javascript:alert('asdf');");
$input[3] = 'selected';
$expect[3] = array('selected'=>'selected');
// [INVALID]
$input[4] = '="nokey"';
$expect[4] = array();
// [SIMPLE]
$input[5] = 'color=blue';
$expect[5] = array('color' => 'blue');
// [INVALID]
$input[6] = 'href="about:blank';
$expect[6] = array('href' => 'about:blank');
// [INVALID]
$input[7] = '"=';
$expect[7] = array('"' => '');
// we ought to get array()
$input[8] = 'href ="about:blank"rel ="nofollow"';
$expect[8] = array('href' => 'about:blank', 'rel' => 'nofollow');
$input[9] = 'two bool';
$expect[9] = array('two' => 'two', 'bool' => 'bool');
$input[10] = 'name="input" selected';
$expect[10] = array('name' => 'input', 'selected' => 'selected');
$input[11] = '=""';
$expect[11] = array();
$input[12] = '="" =""';
$expect[12] = array(); // tough to say, just don't throw a loop
$input[13] = 'href="';
$expect[13] = array('href' => '');
$input[14] = 'href=" <';
$expect[14] = array('href' => ' <');
$config = HTMLPurifier_Config::createDefault();
$context = new HTMLPurifier_Context();
$size = count($input);
for($i = 0; $i < $size; $i++) {
$result = $this->DirectLex->parseAttributeString($input[$i], $config, $context);
$this->assertIdentical($expect[$i], $result, 'Test ' . $i . ': %s');
}
}
public function testLineNumbers()
{
// . . . . . . . . . .
// 01234567890123 01234567890123 0123456789012345 0123456789012 012345
$html = "<b>Line 1</b>\n<i>Line 2</i>\nStill Line 2<br\n/>Now Line 4\n\n<br />";
$expect = array(
// line 1
0 => new HTMLPurifier_Token_Start('b')
,1 => new HTMLPurifier_Token_Text('Line 1')
,2 => new HTMLPurifier_Token_End('b')
,3 => new HTMLPurifier_Token_Text("\n")
// line 2
,4 => new HTMLPurifier_Token_Start('i')
,5 => new HTMLPurifier_Token_Text('Line 2')
,6 => new HTMLPurifier_Token_End('i')
,7 => new HTMLPurifier_Token_Text("\nStill Line 2")
// line 3
,8 => new HTMLPurifier_Token_Empty('br')
// line 4
,9 => new HTMLPurifier_Token_Text("Now Line 4\n\n")
// line SIX
,10 => new HTMLPurifier_Token_Empty('br')
);
$context = new HTMLPurifier_Context();
$config = HTMLPurifier_Config::createDefault();
$output = $this->DirectLex->tokenizeHTML($html, $config, $context);
$this->assertIdentical($output, $expect);
$context = new HTMLPurifier_Context();
$config = HTMLPurifier_Config::create(array(
'Core.MaintainLineNumbers' => true
));
$expect[0]->position(1, 0);
$expect[1]->position(1, 3);
$expect[2]->position(1, 9);
$expect[3]->position(2, -1);
$expect[4]->position(2, 0);
$expect[5]->position(2, 3);
$expect[6]->position(2, 9);
$expect[7]->position(3, -1);
$expect[8]->position(3, 12);
$expect[9]->position(4, 2);
$expect[10]->position(6, 0);
$output = $this->DirectLex->tokenizeHTML($html, $config, $context);
$this->assertIdentical($output, $expect);
}
}
// vim: et sw=4 sts=4