From d9022f63880ce039446fba8364f68e656b7bf4cb Mon Sep 17 00:00:00 2001 From: Pierre Schmitz Date: Thu, 3 May 2012 13:01:35 +0200 Subject: Update to MediaWiki 1.19.0 --- includes/context/ContextSource.php | 170 ++++++++++++++ includes/context/DerivativeContext.php | 286 +++++++++++++++++++++++ includes/context/IContextSource.php | 110 +++++++++ includes/context/RequestContext.php | 398 +++++++++++++++++++++++++++++++++ 4 files changed, 964 insertions(+) create mode 100644 includes/context/ContextSource.php create mode 100644 includes/context/DerivativeContext.php create mode 100644 includes/context/IContextSource.php create mode 100644 includes/context/RequestContext.php (limited to 'includes/context') diff --git a/includes/context/ContextSource.php b/includes/context/ContextSource.php new file mode 100644 index 00000000..45bd6fff --- /dev/null +++ b/includes/context/ContextSource.php @@ -0,0 +1,170 @@ +context === null ) { + $class = get_class( $this ); + wfDebug( __METHOD__ . " ($class): called and \$context is null. Using RequestContext::getMain() for sanity\n" ); + $this->context = RequestContext::getMain(); + } + return $this->context; + } + + /** + * Set the IContextSource object + * + * @since 1.18 + * @param $context IContextSource + */ + public function setContext( IContextSource $context ) { + $this->context = $context; + } + + /** + * Get the WebRequest object + * + * @since 1.18 + * @return WebRequest + */ + public function getRequest() { + return $this->getContext()->getRequest(); + } + + /** + * Get the Title object + * + * @since 1.18 + * @return Title + */ + public function getTitle() { + return $this->getContext()->getTitle(); + } + + /** + * Check whether a WikiPage object can be get with getWikiPage(). + * Callers should expect that an exception is thrown from getWikiPage() + * if this method returns false. + * + * @since 1.19 + * @return bool + */ + public function canUseWikiPage() { + return $this->getContext()->canUseWikiPage(); + } + + /** + * Get the WikiPage object. + * May throw an exception if there's no Title object set or the Title object + * belongs to a special namespace that doesn't have WikiPage, so use first + * canUseWikiPage() to check whether this method can be called safely. + * + * @since 1.19 + * @return WikiPage + */ + public function getWikiPage() { + return $this->getContext()->getWikiPage(); + } + + /** + * Get the OutputPage object + * + * @since 1.18 + * @return OutputPage object + */ + public function getOutput() { + return $this->getContext()->getOutput(); + } + + /** + * Get the User object + * + * @since 1.18 + * @return User + */ + public function getUser() { + return $this->getContext()->getUser(); + } + + /** + * Get the Language object + * + * @deprecated 1.19 Use getLanguage instead + * @return Language + */ + public function getLang() { + wfDeprecated( __METHOD__, '1.19' ); + return $this->getLanguage(); + } + + /** + * Get the Language object + * + * @since 1.19 + * @return Language + */ + public function getLanguage() { + return $this->getContext()->getLanguage(); + } + + /** + * Get the Skin object + * + * @since 1.18 + * @return Skin + */ + public function getSkin() { + return $this->getContext()->getSkin(); + } + + /** + * Get a Message object with context set + * Parameters are the same as wfMessage() + * + * @since 1.18 + * @return Message object + */ + public function msg( /* $args */ ) { + $args = func_get_args(); + return call_user_func_array( array( $this->getContext(), 'msg' ), $args ); + } + +} + diff --git a/includes/context/DerivativeContext.php b/includes/context/DerivativeContext.php new file mode 100644 index 00000000..5adf3621 --- /dev/null +++ b/includes/context/DerivativeContext.php @@ -0,0 +1,286 @@ +setContext( $context ); + } + + /** + * Set the WebRequest object + * + * @param $r WebRequest object + */ + public function setRequest( WebRequest $r ) { + $this->request = $r; + } + + /** + * Get the WebRequest object + * + * @return WebRequest + */ + public function getRequest() { + if ( !is_null( $this->request ) ) { + return $this->request; + } else { + return $this->getContext()->getRequest(); + } + } + + /** + * Set the Title object + * + * @param $t Title object + */ + public function setTitle( Title $t ) { + $this->title = $t; + } + + /** + * Get the Title object + * + * @return Title + */ + public function getTitle() { + if ( !is_null( $this->title ) ) { + return $this->title; + } else { + return $this->getContext()->getTitle(); + } + } + + /** + * Check whether a WikiPage object can be get with getWikiPage(). + * Callers should expect that an exception is thrown from getWikiPage() + * if this method returns false. + * + * @since 1.19 + * @return bool + */ + public function canUseWikiPage() { + if ( $this->wikipage !== null ) { + return true; + } elseif ( $this->title !== null ) { + return $this->title->canExist(); + } else { + return $this->getContext()->canUseWikiPage(); + } + } + + /** + * Set the WikiPage object + * + * @since 1.19 + * @param $p WikiPage object + */ + public function setWikiPage( WikiPage $p ) { + $this->wikipage = $p; + } + + /** + * Get the WikiPage object. + * May throw an exception if there's no Title object set or the Title object + * belongs to a special namespace that doesn't have WikiPage, so use first + * canUseWikiPage() to check whether this method can be called safely. + * + * @since 1.19 + * @return WikiPage + */ + public function getWikiPage() { + if ( !is_null( $this->wikipage ) ) { + return $this->wikipage; + } else { + return $this->getContext()->getWikiPage(); + } + } + + /** + * Set the OutputPage object + * + * @param $o OutputPage + */ + public function setOutput( OutputPage $o ) { + $this->output = $o; + } + + /** + * Get the OutputPage object + * + * @return OutputPage object + */ + public function getOutput() { + if ( !is_null( $this->output ) ) { + return $this->output; + } else { + return $this->getContext()->getOutput(); + } + } + + /** + * Set the User object + * + * @param $u User + */ + public function setUser( User $u ) { + $this->user = $u; + } + + /** + * Get the User object + * + * @return User + */ + public function getUser() { + if ( !is_null( $this->user ) ) { + return $this->user; + } else { + return $this->getContext()->getUser(); + } + } + + /** + * Set the Language object + * + * @deprecated 1.19 Use setLanguage instead + * @param $l Mixed Language instance or language code + */ + public function setLang( $l ) { + wfDeprecated( __METHOD__, '1.19' ); + $this->setLanguage( $l ); + } + + /** + * Set the Language object + * + * @param $l Mixed Language instance or language code + * @since 1.19 + */ + public function setLanguage( $l ) { + if ( $l instanceof Language ) { + $this->lang = $l; + } elseif ( is_string( $l ) ) { + $l = RequestContext::sanitizeLangCode( $l ); + $obj = Language::factory( $l ); + $this->lang = $obj; + } else { + throw new MWException( __METHOD__ . " was passed an invalid type of data." ); + } + } + + /** + * @deprecated 1.19 Use getLanguage instead + * @return Language + */ + public function getLang() { + wfDeprecated( __METHOD__, '1.19' ); + $this->getLanguage(); + } + + /** + * Get the Language object + * + * @return Language + * @since 1.19 + */ + public function getLanguage() { + if ( !is_null( $this->lang ) ) { + return $this->lang; + } else { + return $this->getContext()->getLanguage(); + } + } + + /** + * Set the Skin object + * + * @param $s Skin + */ + public function setSkin( Skin $s ) { + $this->skin = clone $s; + $this->skin->setContext( $this ); + } + + /** + * Get the Skin object + * + * @return Skin + */ + public function getSkin() { + if ( !is_null( $this->skin ) ) { + return $this->skin; + } else { + return $this->getContext()->getSkin(); + } + } + +} + diff --git a/includes/context/IContextSource.php b/includes/context/IContextSource.php new file mode 100644 index 00000000..476035b5 --- /dev/null +++ b/includes/context/IContextSource.php @@ -0,0 +1,110 @@ +request = $r; + } + + /** + * Get the WebRequest object + * + * @return WebRequest + */ + public function getRequest() { + if ( $this->request === null ) { + global $wgRequest; # fallback to $wg till we can improve this + $this->request = $wgRequest; + } + return $this->request; + } + + /** + * Set the Title object + * + * @param $t Title object + */ + public function setTitle( Title $t ) { + $this->title = $t; + } + + /** + * Get the Title object + * + * @return Title + */ + public function getTitle() { + if ( $this->title === null ) { + global $wgTitle; # fallback to $wg till we can improve this + $this->title = $wgTitle; + } + return $this->title; + } + + /** + * Check whether a WikiPage object can be get with getWikiPage(). + * Callers should expect that an exception is thrown from getWikiPage() + * if this method returns false. + * + * @since 1.19 + * @return bool + */ + public function canUseWikiPage() { + if ( $this->wikipage !== null ) { + # If there's a WikiPage object set, we can for sure get it + return true; + } + $title = $this->getTitle(); + if ( $title === null ) { + # No Title, no WikiPage + return false; + } else { + # Only namespaces whose pages are stored in the database can have WikiPage + return $title->canExist(); + } + } + + /** + * Set the WikiPage object + * + * @since 1.19 + * @param $p WikiPage object + */ + public function setWikiPage( WikiPage $p ) { + $this->wikipage = $p; + } + + /** + * Get the WikiPage object. + * May throw an exception if there's no Title object set or the Title object + * belongs to a special namespace that doesn't have WikiPage, so use first + * canUseWikiPage() to check whether this method can be called safely. + * + * @since 1.19 + * @return WikiPage + */ + public function getWikiPage() { + if ( $this->wikipage === null ) { + $title = $this->getTitle(); + if ( $title === null ) { + throw new MWException( __METHOD__ . ' called without Title object set' ); + } + $this->wikipage = WikiPage::factory( $title ); + } + return $this->wikipage; + } + + /** + * @param $o OutputPage + */ + public function setOutput( OutputPage $o ) { + $this->output = $o; + } + + /** + * Get the OutputPage object + * + * @return OutputPage object + */ + public function getOutput() { + if ( $this->output === null ) { + $this->output = new OutputPage( $this ); + } + return $this->output; + } + + /** + * Set the User object + * + * @param $u User + */ + public function setUser( User $u ) { + $this->user = $u; + } + + /** + * Get the User object + * + * @return User + */ + public function getUser() { + if ( $this->user === null ) { + $this->user = User::newFromSession( $this->getRequest() ); + } + return $this->user; + } + + /** + * 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 + * @return string + */ + public static function sanitizeLangCode( $code ) { + global $wgLanguageCode; + + // BCP 47 - letter case MUST NOT carry meaning + $code = strtolower( $code ); + + # Validate $code + if( empty( $code ) || !Language::isValidCode( $code ) || ( $code === 'qqq' ) ) { + wfDebug( "Invalid user language code\n" ); + $code = $wgLanguageCode; + } + + return $code; + } + + /** + * Set the Language object + * + * @deprecated 1.19 Use setLanguage instead + * @param $l Mixed Language instance or language code + */ + public function setLang( $l ) { + wfDeprecated( __METHOD__, '1.19' ); + $this->setLanguage( $l ); + } + + /** + * Set the Language object + * + * @param $l Mixed Language instance or language code + * @since 1.19 + */ + public function setLanguage( $l ) { + if ( $l instanceof Language ) { + $this->lang = $l; + } elseif ( is_string( $l ) ) { + $l = self::sanitizeLangCode( $l ); + $obj = Language::factory( $l ); + $this->lang = $obj; + } else { + throw new MWException( __METHOD__ . " was passed an invalid type of data." ); + } + } + + /** + * @deprecated 1.19 Use getLanguage instead + * @return Language + */ + public function getLang() { + wfDeprecated( __METHOD__, '1.19' ); + return $this->getLanguage(); + } + + /** + * Get the Language object + * + * @return Language + * @since 1.19 + */ + public function getLanguage() { + if ( $this->lang === null ) { + global $wgLanguageCode, $wgContLang; + $code = $this->getRequest()->getVal( + 'uselang', + $this->getUser()->getOption( 'language' ) + ); + $code = self::sanitizeLangCode( $code ); + + wfRunHooks( 'UserGetLanguageObject', array( $this->getUser(), &$code ) ); + + if( $code === $wgLanguageCode ) { + $this->lang = $wgContLang; + } else { + $obj = Language::factory( $code ); + $this->lang = $obj; + } + } + return $this->lang; + } + + /** + * Set the Skin object + * + * @param $s Skin + */ + public function setSkin( Skin $s ) { + $this->skin = clone $s; + $this->skin->setContext( $this ); + } + + /** + * Get the Skin object + * + * @return Skin + */ + public function getSkin() { + if ( $this->skin === null ) { + wfProfileIn( __METHOD__ . '-createskin' ); + + $skin = null; + wfRunHooks( 'RequestContextCreateSkin', array( $this, &$skin ) ); + + // If the hook worked try to set a skin from it + if ( $skin instanceof Skin ) { + $this->skin = $skin; + } elseif ( is_string($skin) ) { + $this->skin = Skin::newFromKey( $skin ); + } + + // If this is still null (the hook didn't run or didn't work) + // then go through the normal processing to load a skin + if ( $this->skin === null ) { + global $wgHiddenPrefs; + if( !in_array( 'skin', $wgHiddenPrefs ) ) { + # get the user skin + $userSkin = $this->getUser()->getOption( 'skin' ); + $userSkin = $this->getRequest()->getVal( 'useskin', $userSkin ); + } else { + # if we're not allowing users to override, then use the default + global $wgDefaultSkin; + $userSkin = $wgDefaultSkin; + } + + $this->skin = Skin::newFromKey( $userSkin ); + } + + // After all that set a context on whatever skin got created + $this->skin->setContext( $this ); + wfProfileOut( __METHOD__ . '-createskin' ); + } + return $this->skin; + } + + /** Helpful methods **/ + + /** + * Get a Message object with context set + * Parameters are the same as wfMessage() + * + * @return Message object + */ + public function msg() { + $args = func_get_args(); + return call_user_func_array( 'wfMessage', $args )->setContext( $this ); + } + + /** Static methods **/ + + /** + * Get the RequestContext object associated with the main request + * + * @return RequestContext object + */ + public static function getMain() { + static $instance = null; + if ( $instance === null ) { + $instance = new self; + } + return $instance; + } + + /** + * Create a new extraneous context. The context is filled with information + * external to the current session. + * - Title is specified by argument + * - Request is a FauxRequest, or a FauxRequest can be specified by argument + * - User is an anonymous user, for separation IPv4 localhost is used + * - Language will be based on the anonymous user and request, may be content + * 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 + * @return RequestContext + */ + public static function newExtraneousContext( Title $title, $request=array() ) { + $context = new self; + $context->setTitle( $title ); + if ( $request instanceof WebRequest ) { + $context->setRequest( $request ); + } else { + $context->setRequest( new FauxRequest( $request ) ); + } + $context->user = User::newFromName( '127.0.0.1', false ); + return $context; + } + +} + -- cgit v1.2.2