diff --git a/NEWS b/NEWS index c3cc766c..c5988571 100644 --- a/NEWS +++ b/NEWS @@ -9,7 +9,7 @@ NEWS ( CHANGELOG and HISTORY ) HTMLPurifier ========================== 1.2.0, unknown projected release date -(feature release) +. Switched to purify()-wide Context object registry 1.1.3, unknown projected release date (bugfix release, may be dropped if no major bugs are found before features) diff --git a/library/HTMLPurifier/Context.php b/library/HTMLPurifier/Context.php new file mode 100644 index 00000000..1f58671e --- /dev/null +++ b/library/HTMLPurifier/Context.php @@ -0,0 +1,57 @@ +_storage[$name])) { + trigger_error('Name collision, cannot re-register', + E_USER_ERROR); + return; + } + $this->_storage[$name] =& $ref; + } + + /** + * Retrieves a variable reference from the context. + * @param $name String name + */ + function &get($name) { + if (!isset($this->_storage[$name])) { + trigger_error('Attempted to retrieve non-existent variable', + E_USER_ERROR); + return; + } + return $this->_storage[$name]; + } + + /** + * Destorys a variable in the context. + * @param $name String name + */ + function destroy($name) { + if (!isset($this->_storage[$name])) { + trigger_error('Attempted to destroy non-existent variable', + E_USER_ERROR); + return; + } + unset($this->_storage[$name]); + } + +} + +?> \ No newline at end of file diff --git a/tests/HTMLPurifier/ContextTest.php b/tests/HTMLPurifier/ContextTest.php new file mode 100644 index 00000000..b8f5014f --- /dev/null +++ b/tests/HTMLPurifier/ContextTest.php @@ -0,0 +1,58 @@ +context = new HTMLPurifier_Context(); + } + + function testStandardUsage() { + + generate_mock_once('HTMLPurifier_IDAccumulator'); + + $accumulator =& new HTMLPurifier_IDAccumulatorMock($this); + $this->context->register('IDAccumulator', $accumulator); + // ... + $accumulator_2 =& $this->context->get('IDAccumulator'); + $this->assertReference($accumulator, $accumulator_2); + + $this->context->destroy('IDAccumulator'); + $accumulator_3 =& $this->context->get('IDAccumulator'); + $this->assertError('Attempted to retrieve non-existent variable'); + $this->assertNull($accumulator_3); + $this->swallowErrors(); + + $this->context->destroy('IDAccumulator'); + $this->assertError('Attempted to destroy non-existent variable'); + $this->swallowErrors(); + + } + + function testReRegister() { + + $var = true; + $this->context->register('OnceOnly', $var); + $this->assertNoErrors(); + + $this->context->register('OnceOnly', $var); + $this->assertError('Name collision, cannot re-register'); + $this->swallowErrors(); + + // destroy it, now registration is okay + $this->context->destroy('OnceOnly'); + $this->context->register('OnceOnly', $var); + $this->assertNoErrors(); + + } + +} + +?> \ No newline at end of file diff --git a/tests/index.php b/tests/index.php index cdb87ec0..0c898af1 100644 --- a/tests/index.php +++ b/tests/index.php @@ -89,6 +89,7 @@ $test_files[] = 'URISchemeTest.php'; $test_files[] = 'EncoderTest.php'; $test_files[] = 'EntityParserTest.php'; $test_files[] = 'Test.php'; +$test_files[] = 'ContextTest.php'; if (version_compare(PHP_VERSION, '5', '>=')) { $test_files[] = 'TokenFactoryTest.php';