mirror of
https://github.com/ezyang/htmlpurifier.git
synced 2025-01-03 05:11:52 +00:00
- Gracefully error out of obscure bug involving non-static autoloaders
- Test multiple autoloaders - Remove local URL test; doesn't work for other people git-svn-id: http://htmlpurifier.org/svnroot/htmlpurifier/trunk@1565 48356398-32a2-884e-a903-53898d9a118a
This commit is contained in:
parent
a4abc45505
commit
21cf2c94d4
@ -5,7 +5,8 @@
|
|||||||
* Convenience file that registers autoload handler for HTML Purifier.
|
* Convenience file that registers autoload handler for HTML Purifier.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (function_exists('spl_autoload_register')) {
|
if (function_exists('spl_autoload_register') && function_exists('spl_autoload_unregister')) {
|
||||||
|
// We need unregister for our pre-registering functionality
|
||||||
HTMLPurifier_Bootstrap::registerAutoload();
|
HTMLPurifier_Bootstrap::registerAutoload();
|
||||||
if (function_exists('__autoload')) {
|
if (function_exists('__autoload')) {
|
||||||
// Be polite and ensure that userland autoload gets retained
|
// Be polite and ensure that userland autoload gets retained
|
||||||
|
@ -62,8 +62,30 @@ class HTMLPurifier_Bootstrap
|
|||||||
$autoload = array('HTMLPurifier_Bootstrap', 'autoload');
|
$autoload = array('HTMLPurifier_Bootstrap', 'autoload');
|
||||||
if ( ($funcs = spl_autoload_functions()) === false ) {
|
if ( ($funcs = spl_autoload_functions()) === false ) {
|
||||||
spl_autoload_register($autoload);
|
spl_autoload_register($autoload);
|
||||||
} else {
|
} elseif (function_exists('spl_autoload_unregister')) {
|
||||||
foreach ($funcs as $func) spl_autoload_unregister($func);
|
$compat = version_compare(PHP_VERSION, '5.1.2', '<=') &&
|
||||||
|
version_compare(PHP_VERSION, '5.1.0', '>=');
|
||||||
|
foreach ($funcs as $func) {
|
||||||
|
if (is_array($func)) {
|
||||||
|
// :TRICKY: There are some compatibility issues and some
|
||||||
|
// places where we need to error out
|
||||||
|
$reflector = new ReflectionMethod($func[0], $func[1]);
|
||||||
|
if (!$reflector->isStatic()) {
|
||||||
|
throw new Exception('
|
||||||
|
HTML Purifier autoloader registrar is not compatible
|
||||||
|
with non-static object methods due to PHP Bug #44144;
|
||||||
|
Please do not use HTMLPurifier.autoload.php (or any
|
||||||
|
file that includes this file); instead, place the code:
|
||||||
|
spl_autoload_register(array(\'HTMLPurifier_Bootstrap\', \'autoload\'))
|
||||||
|
after your own autoloaders.
|
||||||
|
');
|
||||||
|
}
|
||||||
|
// Suprisingly, spl_autoload_register supports the
|
||||||
|
// Class::staticMethod callback format, although call_user_func doesn't
|
||||||
|
if ($compat) $func = implode('::', $func);
|
||||||
|
}
|
||||||
|
spl_autoload_unregister($func);
|
||||||
|
}
|
||||||
spl_autoload_register($autoload);
|
spl_autoload_register($autoload);
|
||||||
foreach ($funcs as $func) spl_autoload_register($func);
|
foreach ($funcs as $func) spl_autoload_register($func);
|
||||||
}
|
}
|
||||||
|
@ -12,6 +12,16 @@ function my_autoload($class) {
|
|||||||
eval("class $class {}");
|
eval("class $class {}");
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
class MyClass {
|
||||||
|
public static function myAutoload($class) {
|
||||||
|
if ($class == 'Foo') {
|
||||||
|
echo "Special autoloading Foo..." . PHP_EOL;
|
||||||
|
eval("class $class {}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
spl_autoload_register(array('MyClass', 'myAutoload'));
|
||||||
spl_autoload_register('my_autoload');
|
spl_autoload_register('my_autoload');
|
||||||
|
|
||||||
require '../library/HTMLPurifier.auto.php';
|
require '../library/HTMLPurifier.auto.php';
|
||||||
@ -20,9 +30,11 @@ $config = HTMLPurifier_Config::createDefault();
|
|||||||
$purifier = new HTMLPurifier($config);
|
$purifier = new HTMLPurifier($config);
|
||||||
echo $purifier->purify('<b>Salsa!') . PHP_EOL;
|
echo $purifier->purify('<b>Salsa!') . PHP_EOL;
|
||||||
|
|
||||||
// purposely invoke older autoload
|
// purposely invoke older autoloads
|
||||||
|
$foo = new Foo();
|
||||||
$bar = new Bar();
|
$bar = new Bar();
|
||||||
|
|
||||||
--EXPECT--
|
--EXPECT--
|
||||||
<b>Salsa!</b>
|
<b>Salsa!</b>
|
||||||
|
Special autoloading Foo...
|
||||||
Autoloading Bar...
|
Autoloading Bar...
|
||||||
|
@ -0,0 +1,29 @@
|
|||||||
|
--TEST--
|
||||||
|
Error when registering autoload with non-static autoload already on SPL stack
|
||||||
|
--SKIPIF--
|
||||||
|
<?php
|
||||||
|
if (!function_exists('spl_autoload_register')) {
|
||||||
|
echo "skip - spl_autoload_register() not available";
|
||||||
|
}
|
||||||
|
--FILE--
|
||||||
|
<?php
|
||||||
|
class NotStatic
|
||||||
|
{
|
||||||
|
public function autoload($class) {
|
||||||
|
echo "Autoloading... $class" . PHP_EOL;
|
||||||
|
eval("class $class {}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$obj = new NotStatic();
|
||||||
|
spl_autoload_register(array($obj, 'autoload'));
|
||||||
|
|
||||||
|
try {
|
||||||
|
require '../library/HTMLPurifier.auto.php';
|
||||||
|
} catch (Exception $e) {
|
||||||
|
echo 'Caught error gracefully';
|
||||||
|
assert('strpos($e->getMessage(), "44144") !== false');
|
||||||
|
}
|
||||||
|
|
||||||
|
--EXPECT--
|
||||||
|
Caught error gracefully
|
@ -106,7 +106,6 @@ foreach ($versions_to_test as $version) {
|
|||||||
|
|
||||||
// This is the HTML Purifier website's test XML file. We could
|
// This is the HTML Purifier website's test XML file. We could
|
||||||
// add more websites, i.e. more configurations to test.
|
// add more websites, i.e. more configurations to test.
|
||||||
$test->addTestCase(new RemoteTestCase('http://localhost/htmlpurifier/tests/?xml=1', 'http://localhost/htmlpurifier/tests/?xml=1&dry=1'));
|
|
||||||
$test->addTestCase(new RemoteTestCase('http://htmlpurifier.org/dev/tests/?xml=1', 'http://htmlpurifier.org/dev/tests/?xml=1&dry=1'));
|
$test->addTestCase(new RemoteTestCase('http://htmlpurifier.org/dev/tests/?xml=1', 'http://htmlpurifier.org/dev/tests/?xml=1&dry=1'));
|
||||||
|
|
||||||
if ($AC['xml']) {
|
if ($AC['xml']) {
|
||||||
|
Loading…
Reference in New Issue
Block a user