Merge "Delete UIDGenerator cache files after unit tests"
[lhc/web/wiklou.git] / includes / Hooks.php
index ed8b3ed..785e717 100644 (file)
@@ -124,12 +124,16 @@ class Hooks {
         *
         * @param string $event Event name
         * @param array $args  Array of parameters passed to hook functions
+        * @param string|null $deprecatedVersion Optionally, mark hook as deprecated with version number
         * @return bool True if no handler aborted the hook
         *
+        * @since 1.22 A hook function is not required to return a value for
+        *   processing to continue. Not returning a value (or explicitly
+        *   returning null) is equivalent to returning true.
         * @throws MWException
         * @throws FatalError
         */
-       public static function run( $event, array $args = array() ) {
+       public static function run( $event, array $args = array(), $deprecatedVersion = null ) {
                wfProfileIn( 'hook: ' . $event );
                foreach ( self::getHandlers( $event ) as $hook ) {
                        // Turn non-array values into an array. (Can't use casting because of objects.)
@@ -192,10 +196,19 @@ class Hooks {
                        // Profile first in case the Profiler causes errors.
                        wfProfileIn( $func );
                        set_error_handler( 'Hooks::hookErrorHandler' );
+
+                       // mark hook as deprecated, if deprecation version is specified
+                       if ( $deprecatedVersion !== null ) {
+                               wfDeprecated( "$event hook (used in $func)", $deprecatedVersion );
+                       }
+
                        try {
                                $retval = call_user_func_array( $callback, $hook_args );
                        } catch ( MWHookException $e ) {
                                $badhookmsg = $e->getMessage();
+                       } catch ( Exception $e ) {
+                               restore_error_handler();
+                               throw $e;
                        }
                        restore_error_handler();
                        wfProfileOut( $func );
@@ -210,14 +223,7 @@ class Hooks {
                                        'Detected bug in an extension! ' .
                                        "Hook $func has invalid call signature; " . $badhookmsg
                                );
-                       } elseif ( $retval === null ) {
-                               // Null was returned. Error.
-                               throw new MWException(
-                                       'Detected bug in an extension! ' .
-                                       "Hook $func failed to return a value; " .
-                                       'should return true to continue hook processing or false to abort.'
-                               );
-                       } elseif ( !$retval ) {
+                       } elseif ( $retval === false ) {
                                wfProfileOut( 'hook: ' . $event );
                                // False was returned. Stop processing, but no error.
                                return false;