diff --git a/library/HTMLPurifier/ErrorCollector.php b/library/HTMLPurifier/ErrorCollector.php index 0a249f7a..bc99fa33 100644 --- a/library/HTMLPurifier/ErrorCollector.php +++ b/library/HTMLPurifier/ErrorCollector.php @@ -37,8 +37,8 @@ class HTMLPurifier_ErrorCollector $msg = $this->locale->formatMessage($msg, $args); } - $line = $this->context->get('CurrentLine', true); $token = $this->context->get('CurrentToken', true); + $line = $token ? $token->line : $this->context->get('CurrentLine', true); $attr = $this->context->get('CurrentAttr', true); $this->errors[] = array($line, $severity, $msg); diff --git a/library/HTMLPurifier/Lexer/DirectLex.php b/library/HTMLPurifier/Lexer/DirectLex.php index 89a66b24..7159fe64 100644 --- a/library/HTMLPurifier/Lexer/DirectLex.php +++ b/library/HTMLPurifier/Lexer/DirectLex.php @@ -312,7 +312,6 @@ class HTMLPurifier_Lexer_DirectLex extends HTMLPurifier_Lexer $e = false; if ($config->get('Core', 'CollectErrors')) { $e =& $context->get('ErrorCollector'); - $current_line =& $context->get('CurrentLine'); } // let's see if we can abort as quickly as possible diff --git a/library/HTMLPurifier/Strategy/RemoveForeignElements.php b/library/HTMLPurifier/Strategy/RemoveForeignElements.php index b8bb9e85..db872d59 100644 --- a/library/HTMLPurifier/Strategy/RemoveForeignElements.php +++ b/library/HTMLPurifier/Strategy/RemoveForeignElements.php @@ -53,6 +53,9 @@ class HTMLPurifier_Strategy_RemoveForeignElements extends HTMLPurifier_Strategy // converts comments into text tokens when this is equal to a tag name $textify_comments = false; + $token = false; + $context->register('CurrentToken', $token); + foreach($tokens as $token) { if ($remove_until) { if (empty($token->is_tag) || $token->name !== $remove_until) { @@ -134,6 +137,9 @@ class HTMLPurifier_Strategy_RemoveForeignElements extends HTMLPurifier_Strategy } $result[] = $token; } + + $context->destroy('CurrentToken'); + return $result; } diff --git a/tests/HTMLPurifier/Harness.php b/tests/HTMLPurifier/Harness.php index c591db32..78b149c2 100644 --- a/tests/HTMLPurifier/Harness.php +++ b/tests/HTMLPurifier/Harness.php @@ -47,6 +47,11 @@ class HTMLPurifier_Harness extends UnitTestCase */ var $config; + /** + * Default context to fall back on if no context is available + */ + var $context; + function HTMLPurifier_Harness() { $this->lexer = new HTMLPurifier_Lexer_DirectLex(); $this->generator = new HTMLPurifier_Generator(); @@ -77,8 +82,12 @@ class HTMLPurifier_Harness extends UnitTestCase // setup context object. Note that we are operating on a copy of it! // When necessary, extend the test harness to allow post-tests // on the context object - $context = new HTMLPurifier_Context(); - $context->loadArray($context_array); + if (empty($this->context)) { + $context = new HTMLPurifier_Context(); + $context->loadArray($context_array); + } else { + $context =& $this->context; + } if ($this->to_tokens && is_string($input)) { // $func may cause $input to change, so "clone" another copy diff --git a/tests/HTMLPurifier/Lexer/DirectLexTest.php b/tests/HTMLPurifier/Lexer/DirectLexTest.php index 92e230c3..a3813fc5 100644 --- a/tests/HTMLPurifier/Lexer/DirectLexTest.php +++ b/tests/HTMLPurifier/Lexer/DirectLexTest.php @@ -129,7 +129,6 @@ class HTMLPurifier_Lexer_DirectLexTest extends UnitTestCase } - } ?> \ No newline at end of file diff --git a/tests/HTMLPurifier/Lexer/DirectLex_ErrorsTest.php b/tests/HTMLPurifier/Lexer/DirectLex_ErrorsTest.php new file mode 100644 index 00000000..b1783eda --- /dev/null +++ b/tests/HTMLPurifier/Lexer/DirectLex_ErrorsTest.php @@ -0,0 +1,65 @@ +config = HTMLPurifier_Config::create(array('Core.CollectErrors' => true)); + $this->context = new HTMLPurifier_Context(); + generate_mock_once('HTMLPurifier_ErrorCollector'); + $this->collector = new HTMLPurifier_ErrorCollectorMock($this); + $this->context->register('ErrorCollector', $this->collector); + } + + function invoke($input) { + $lexer = new HTMLPurifier_Lexer_DirectLex(); + $lexer->tokenizeHTML($input, $this->config, $this->context); + } + + function invokeAttr($input) { + $lexer = new HTMLPurifier_Lexer_DirectLex(); + $lexer->parseAttributeString($input, $this->config, $this->context); + } + + function expectErrorCollection($severity, $msg) { + $this->collector->expectOnce('send', array($severity, $msg)); + } + + function testUnclosedComment() { + $this->expectErrorCollection(E_WARNING, 'Lexer: Unclosed comment'); + $this->invoke('