X-Git-Url: https://git.heureux-cyclage.org/?a=blobdiff_plain;f=includes%2Fcontext%2FRequestContext.php;h=09cb409f65a8754cc8f79c6d8d84bb3cc02dc6b7;hb=88e01ff9d6783e2175d6af1124169fcfb087db39;hp=cd2bf556f83cbb1bc654688feef7b549fc53063e;hpb=7d4c391e2574ed3f64fd13d304aa6c38214551ed;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/context/RequestContext.php b/includes/context/RequestContext.php index cd2bf556f8..09cb409f65 100644 --- a/includes/context/RequestContext.php +++ b/includes/context/RequestContext.php @@ -28,7 +28,6 @@ * Group all the pieces relevant to the context of a request into one instance */ class RequestContext implements IContextSource { - /** * @var WebRequest */ @@ -67,7 +66,7 @@ class RequestContext implements IContextSource { /** * Set the WebRequest object * - * @param $r WebRequest object + * @param WebRequest $r */ public function setRequest( WebRequest $r ) { $this->request = $r; @@ -89,10 +88,12 @@ class RequestContext implements IContextSource { /** * Set the Title object * - * @param $t Title object + * @param Title $t */ public function setTitle( Title $t ) { $this->title = $t; + // Erase the WikiPage so a new one with the new title gets created. + $this->wikipage = null; } /** @@ -135,9 +136,15 @@ class RequestContext implements IContextSource { * Set the WikiPage object * * @since 1.19 - * @param $p WikiPage object + * @param WikiPage $p */ public function setWikiPage( WikiPage $p ) { + $contextTitle = $this->getTitle(); + $pageTitle = $p->getTitle(); + if ( !$contextTitle || !$pageTitle->equals( $contextTitle ) ) { + $this->setTitle( $pageTitle ); + } + // Defer this to the end since setTitle sets it to null. $this->wikipage = $p; } @@ -172,7 +179,7 @@ class RequestContext implements IContextSource { /** * Get the OutputPage object * - * @return OutputPage object + * @return OutputPage */ public function getOutput() { if ( $this->output === null ) { @@ -184,7 +191,7 @@ class RequestContext implements IContextSource { /** * Set the User object * - * @param $u User + * @param User $u */ public function setUser( User $u ) { $this->user = $u; @@ -205,7 +212,7 @@ class RequestContext implements IContextSource { /** * Accepts a language code and ensures it's sane. Outputs a cleaned up language * code and replaces with $wgLanguageCode if not sane. - * @param $code string + * @param string $code Language code * @return string */ public static function sanitizeLangCode( $code ) { @@ -215,7 +222,7 @@ class RequestContext implements IContextSource { $code = strtolower( $code ); # Validate $code - if( empty( $code ) || !Language::isValidCode( $code ) || ( $code === 'qqq' ) ) { + if ( empty( $code ) || !Language::isValidCode( $code ) || ( $code === 'qqq' ) ) { wfDebug( "Invalid user language code\n" ); $code = $wgLanguageCode; } @@ -227,7 +234,7 @@ class RequestContext implements IContextSource { * Set the Language object * * @deprecated 1.19 Use setLanguage instead - * @param $l Mixed Language instance or language code + * @param Language|string $l Language instance or language code */ public function setLang( $l ) { wfDeprecated( __METHOD__, '1.19' ); @@ -237,7 +244,7 @@ class RequestContext implements IContextSource { /** * Set the Language object * - * @param $l Mixed Language instance or language code + * @param Language|string $l Language instance or language code * @throws MWException * @since 1.19 */ @@ -263,36 +270,51 @@ class RequestContext implements IContextSource { } /** - * Get the Language object + * Get the Language object. + * Initialization of user or request objects can depend on this. * * @return Language * @since 1.19 */ public function getLanguage() { - if ( $this->lang === null ) { + if ( isset( $this->recursion ) ) { + trigger_error( "Recursion detected in " . __METHOD__, E_USER_WARNING ); + $e = new Exception; + wfDebugLog( 'recursion-guard', "Recursion detected:\n" . $e->getTraceAsString() ); + + global $wgLanguageCode; + $code = ( $wgLanguageCode ) ? $wgLanguageCode : 'en'; + $this->lang = Language::factory( $code ); + } elseif ( $this->lang === null ) { + $this->recursion = true; + global $wgLanguageCode, $wgContLang; - $code = $this->getRequest()->getVal( - 'uselang', - $this->getUser()->getOption( 'language' ) - ); + + $request = $this->getRequest(); + $user = $this->getUser(); + + $code = $request->getVal( 'uselang', $user->getOption( 'language' ) ); $code = self::sanitizeLangCode( $code ); - wfRunHooks( 'UserGetLanguageObject', array( $this->getUser(), &$code ) ); + wfRunHooks( 'UserGetLanguageObject', array( $user, &$code, $this ) ); - if( $code === $wgLanguageCode ) { + if ( $code === $wgLanguageCode ) { $this->lang = $wgContLang; } else { $obj = Language::factory( $code ); $this->lang = $obj; } + + unset( $this->recursion ); } + return $this->lang; } /** * Set the Skin object * - * @param $s Skin + * @param Skin $s */ public function setSkin( Skin $s ) { $this->skin = clone $s; @@ -314,7 +336,7 @@ class RequestContext implements IContextSource { // If the hook worked try to set a skin from it if ( $skin instanceof Skin ) { $this->skin = $skin; - } elseif ( is_string($skin) ) { + } elseif ( is_string( $skin ) ) { $this->skin = Skin::newFromKey( $skin ); } @@ -322,7 +344,7 @@ class RequestContext implements IContextSource { // then go through the normal processing to load a skin if ( $this->skin === null ) { global $wgHiddenPrefs; - if( !in_array( 'skin', $wgHiddenPrefs ) ) { + if ( !in_array( 'skin', $wgHiddenPrefs ) ) { # get the user skin $userSkin = $this->getUser()->getOption( 'skin' ); $userSkin = $this->getRequest()->getVal( 'useskin', $userSkin ); @@ -348,7 +370,7 @@ class RequestContext implements IContextSource { * Get a Message object with context set * Parameters are the same as wfMessage() * - * @return Message object + * @return Message */ public function msg() { $args = func_get_args(); @@ -360,7 +382,7 @@ class RequestContext implements IContextSource { /** * Get the RequestContext object associated with the main request * - * @return RequestContext object + * @return RequestContext */ public static function getMain() { static $instance = null; @@ -380,11 +402,11 @@ class RequestContext implements IContextSource { * language or a uselang param in the fauxrequest data may change the lang * - Skin will be based on the anonymous user, should be the wiki's default skin * - * @param $title Title Title to use for the extraneous request - * @param $request Mixed A WebRequest or data to use for a FauxRequest + * @param Title $title Title to use for the extraneous request + * @param WebRequest|array $request A WebRequest or data to use for a FauxRequest * @return RequestContext */ - public static function newExtraneousContext( Title $title, $request=array() ) { + public static function newExtraneousContext( Title $title, $request = array() ) { $context = new self; $context->setTitle( $title ); if ( $request instanceof WebRequest ) { @@ -395,5 +417,4 @@ class RequestContext implements IContextSource { $context->user = User::newFromName( '127.0.0.1', false ); return $context; } - }