diff --git a/library/HTMLPurifier/AttrValidator.php b/library/HTMLPurifier/AttrValidator.php index ba4510e3..9d692513 100644 --- a/library/HTMLPurifier/AttrValidator.php +++ b/library/HTMLPurifier/AttrValidator.php @@ -49,15 +49,23 @@ class HTMLPurifier_AttrValidator // do global transformations (pre) // nothing currently utilizes this foreach ($definition->info_attr_transform_pre as $transform) { + if ($e) $e->start(); $attr = $transform->transform($o = $attr, $config, $context); - if ($e && ($attr != $o)) $e->send(E_NOTICE, 'AttrValidator: Attributes transformed', $o, $attr); + if ($e) { + if ($attr != $o) $e->end(E_NOTICE, 'AttrValidator: Attributes transformed', $o, $attr); + else $e->end(); + } } // do local transformations only applicable to this element (pre) // ex.
to
foreach ($definition->info[$token->name]->attr_transform_pre as $transform) {
+ if ($e) $e->start();
$attr = $transform->transform($o = $attr, $config, $context);
- if ($e && ($attr != $o)) $e->send(E_NOTICE, 'AttrValidator: Attributes transformed', $o, $attr);
+ if ($e) {
+ if ($attr != $o) $e->end(E_NOTICE, 'AttrValidator: Attributes transformed', $o, $attr);
+ else $e->end();
+ }
}
// create alias to this element's attribute definition array, see
@@ -72,6 +80,7 @@ class HTMLPurifier_AttrValidator
// Watch out for name collisions: $key has previously been used
foreach ($attr as $attr_key => $value) {
+ if ($e) $e->start();
// call the definition
if ( isset($defs[$attr_key]) ) {
// there is a local definition defined
@@ -103,7 +112,7 @@ class HTMLPurifier_AttrValidator
if ($result === false || $result === null) {
// this is a generic error message that should replaced
// with more specific ones when possible
- if ($e) $e->send(E_ERROR, 'AttrValidator: Attribute removed');
+ if ($e) $e->end(E_ERROR, 'AttrValidator: Attribute removed');
// remove the attribute
unset($attr[$attr_key]);
@@ -114,6 +123,9 @@ class HTMLPurifier_AttrValidator
// simple substitution
$attr[$attr_key] = $result;
+ if ($e) $e->end();
+ } else {
+ if ($e) $e->end();
}
// we'd also want slightly more complicated substitution
@@ -129,14 +141,22 @@ class HTMLPurifier_AttrValidator
// global (error reporting untested)
foreach ($definition->info_attr_transform_post as $transform) {
+ if ($e) $e->start();
$attr = $transform->transform($o = $attr, $config, $context);
- if ($e && ($attr != $o)) $e->send(E_NOTICE, 'AttrValidator: Attributes transformed', $o, $attr);
+ if ($e) {
+ if ($attr != $o) $e->end(E_NOTICE, 'AttrValidator: Attributes transformed', $o, $attr);
+ else $e->end();
+ }
}
// local (error reporting untested)
foreach ($definition->info[$token->name]->attr_transform_post as $transform) {
+ if ($e) $e->start();
$attr = $transform->transform($o = $attr, $config, $context);
- if ($e && ($attr != $o)) $e->send(E_NOTICE, 'AttrValidator: Attributes transformed', $o, $attr);
+ if ($e) {
+ if ($attr != $o) $e->end(E_NOTICE, 'AttrValidator: Attributes transformed', $o, $attr);
+ else $e->end();
+ }
}
$token->attr = $attr;
diff --git a/library/HTMLPurifier/ErrorCollector.php b/library/HTMLPurifier/ErrorCollector.php
index fe8c8eff..9d101e42 100644
--- a/library/HTMLPurifier/ErrorCollector.php
+++ b/library/HTMLPurifier/ErrorCollector.php
@@ -25,10 +25,9 @@ class HTMLPurifier_ErrorCollector
public function __construct($context) {
$this->locale =& $context->get('Locale');
- $this->generator =& $context->get('Generator');
$this->context = $context;
$this->_current =& $this->_stacks[0];
- $this->errors =& $this->_stacks[0];
+ $this->errors =& $this->_stacks[0];
}
/**
@@ -141,6 +140,7 @@ class HTMLPurifier_ErrorCollector
public function getHTMLFormatted($config, $errors = null) {
$ret = array();
+ $generator = new HTMLPurifier_Generator($config, $this->context);
if ($errors === null) $errors = $this->errors;
// sort error array by line
@@ -161,7 +161,7 @@ class HTMLPurifier_ErrorCollector
list($line, $severity, $msg, $children) = $error;
$string = '';
$string .= '' . $this->locale->getErrorName($severity) . ': ';
- $string .= $this->generator->escape($msg);
+ $string .= $generator->escape($msg);
if ($line) {
// have javascript link generation that causes
// textarea to skip to the specified line
diff --git a/tests/HTMLPurifier/AttrValidator_ErrorsTest.php b/tests/HTMLPurifier/AttrValidator_ErrorsTest.php
index d3242c06..a8e61cad 100644
--- a/tests/HTMLPurifier/AttrValidator_ErrorsTest.php
+++ b/tests/HTMLPurifier/AttrValidator_ErrorsTest.php
@@ -3,6 +3,15 @@
class HTMLPurifier_AttrValidator_ErrorsTest extends HTMLPurifier_ErrorsHarness
{
+ public function setup() {
+ parent::setup();
+ $config = HTMLPurifier_Config::createDefault();
+ $this->language = HTMLPurifier_LanguageFactory::instance()->create($config, $this->context);
+ $this->context->register('Locale', $this->language);
+ $this->collector = new HTMLPurifier_ErrorCollector($this->context);
+ $this->context->register('Generator', new HTMLPurifier_Generator($config, $this->context));
+ }
+
protected function invoke($input) {
$validator = new HTMLPurifier_AttrValidator();
$validator->validateToken($input, $this->config, $this->context);
@@ -18,28 +27,40 @@ class HTMLPurifier_AttrValidator_ErrorsTest extends HTMLPurifier_ErrorsHarness
$output = array('class' => 'value'); // must be valid
$transform->setReturnValue('transform', $output, array($input, new AnythingExpectation(), new AnythingExpectation()));
$def->info_attr_transform_pre[] = $transform;
- $this->expectErrorCollection(E_NOTICE, 'AttrValidator: Attributes transformed', $input, $output);
+
$token = new HTMLPurifier_Token_Start('span', $input, 1);
$this->invoke($token);
+
+ $result = $this->collector->getRaw();
+ $expect = array(
+ array(1, E_NOTICE, 'Attributes on transformed from original to class', array()),
+ );
+ $this->assertIdentical($result, $expect);
}
function testAttributesTransformedLocalPre() {
$this->config->set('HTML', 'TidyLevel', 'heavy');
$input = array('align' => 'right');
$output = array('style' => 'text-align:right;');
- $this->expectErrorCollection(E_NOTICE, 'AttrValidator: Attributes transformed', $input, $output);
$token = new HTMLPurifier_Token_Start('p', $input, 1);
$this->invoke($token);
+ $result = $this->collector->getRaw();
+ $expect = array(
+ array(1, E_NOTICE, 'Attributes on transformed from align to style', array()),
+ );
+ $this->assertIdentical($result, $expect);
}
// too lazy to check for global post and global pre
function testAttributeRemoved() {
- $this->expectErrorCollection(E_ERROR, 'AttrValidator: Attribute removed');
- $this->expectContext('CurrentAttr', 'foobar');
$token = new HTMLPurifier_Token_Start('p', array('foobar' => 'right'), 1);
- $this->expectContext('CurrentToken', $token);
$this->invoke($token);
+ $result = $this->collector->getRaw();
+ $expect = array(
+ array(1, E_ERROR, 'foobar attribute on removed', array()),
+ );
+ $this->assertIdentical($result, $expect);
}
}