From: daniel Date: Sun, 13 May 2012 22:02:29 +0000 (+0200) Subject: Use integers for content_model and content_format. X-Git-Tag: 1.31.0-rc.0~22097^2^2~174 X-Git-Url: http://git.cyclocoop.org/%22%20.%20generer_url_ecrire%28%22upgrade%22%2C%22reinstall=non%22%29%20.%20%22?a=commitdiff_plain;h=cbc2014b2d0532202fb7858dc640b957715cd403;p=lhc%2Fweb%2Fwiklou.git Use integers for content_model and content_format. Representing content_model and content_format as integers in the database was suggested by Asher mainly to save space. This change entails some refactoring and renaming, but no big change in logic. --- diff --git a/docs/hooks.txt b/docs/hooks.txt index 79ba13ad4f..d8a1252836 100644 --- a/docs/hooks.txt +++ b/docs/hooks.txt @@ -739,7 +739,7 @@ for a given title. May be used to assign a different model for that title. $title: the Title in question &$model: the model name. Use with CONTENT_MODEL_XXX constants. -'ContentHandlerForModelName': Called when a ContentHandler is requested for a given +'ContentHandlerForModelID': Called when a ContentHandler is requested for a given cointent model name, but no entry for that model exists in $wgContentHandlers. $modeName: the requested content model name &$handler: set this to a ContentHandler object, if desired. diff --git a/includes/Content.php b/includes/Content.php index 162920352c..91a078435c 100644 --- a/includes/Content.php +++ b/includes/Content.php @@ -12,9 +12,9 @@ abstract class Content { * Name of the content model this Content object represents. * Use with CONTENT_MODEL_XXX constants * - * @var String $model_name + * @var String $model_id */ - protected $model_name; + protected $model_id; /** * @return String a string representing the content in a way useful for building a full text search index. @@ -58,31 +58,34 @@ abstract class Content { public abstract function getSize( ); /** - * @param $model_name + * @param int $model_id */ - public function __construct( $model_name = null ) { - $this->model_name = $model_name; + public function __construct( $model_id = null ) { + $this->model_id = $model_id; } /** - * Returns the name of the content model used by this content objects. + * Returns the id of the content model used by this content objects. * Corresponds to the CONTENT_MODEL_XXX constants. * - * @return String the model name + * @return int the model id */ - public function getModelName() { - return $this->model_name; + public function getModel() { + return $this->model_id; } /** - * Throws an MWException if $model_name is not the name of the content model + * Throws an MWException if $model_id is not the id of the content model * supported by this Content object. * - * @param String $model_name the model to check + * @param int $model_id the model to check */ - protected function checkModelName( $model_name ) { - if ( $model_name !== $this->model_name ) { - throw new MWException( "Bad content model: expected " . $this->model_name . " but got found " . $model_name ); + protected function checkModelID( $model_id ) { + if ( $model_id !== $this->model_id ) { + $model_name = ContentHandler::getContentModelName( $model_id ); + $own_model_name = ContentHandler::getContentModelName( $this->model_id ); + + throw new MWException( "Bad content model: expected {$this->model_id} ($own_model_name) but got found $model_id ($model_name)." ); } } @@ -150,7 +153,7 @@ abstract class Content { */ protected function checkFormat( $format ) { if ( !$this->isSupportedFormat( $format ) ) { - throw new MWException( "Format $format is not supported for content model " . $this->getModelName() ); + throw new MWException( "Format $format is not supported for content model " . $this->getModel() ); } } @@ -180,7 +183,7 @@ abstract class Content { * * Will returns false if $that is null. * Will return true if $that === $this. - * Will return false if $that->getModleName() != $this->getModelName(). + * Will return false if $that->getModleName() != $this->getModel(). * Will return false if $that->getNativeData() is not equal to $this->getNativeData(), * where the meaning of "equal" depends on the actual data model. * @@ -201,7 +204,7 @@ abstract class Content { return true; } - if ( $that->getModelName() !== $this->getModelName() ) { + if ( $that->getModel() !== $this->getModel() ) { return false; } @@ -213,7 +216,7 @@ abstract class Content { * if $copy = $original->copy() * * * get_class($original) === get_class($copy) - * * $original->getModelName() === $copy->getModelName() + * * $original->getModel() === $copy->getModel() * * $original->equals( $copy ) * * If and only if the Content object is imutable, the copy() method can and should @@ -370,8 +373,8 @@ abstract class Content { */ abstract class TextContent extends Content { - public function __construct( $text, $model_name = null ) { - parent::__construct( $model_name ); + public function __construct( $text, $model_id = null ) { + parent::__construct( $model_id ); $this->mText = $text; } @@ -532,11 +535,15 @@ class WikitextContent extends TextContent { public function replaceSection( $section, Content $with, $sectionTitle = '' ) { wfProfileIn( __METHOD__ ); - $myModelName = $this->getModelName(); - $sectionModelName = $with->getModelName(); + $myModelId = $this->getModel(); + $sectionModelId = $with->getModel(); + + if ( $sectionModelId != $myModelId ) { + $myModelName = ContentHandler::getContentModelName( $myModelId ); + $sectionModelName = ContentHandler::getContentModelName( $sectionModelId ); - if ( $sectionModelName != $myModelName ) { - throw new MWException( "Incompatible content model for section: document uses $myModelName, section uses $sectionModelName." ); + throw new MWException( "Incompatible content model for section: document uses $myModelId ($myModelName), " + . "section uses $sectionModelId ($sectionModelName)." ); } $oldtext = $this->getNativeData(); diff --git a/includes/ContentHandler.php b/includes/ContentHandler.php index ac54be3686..33445374e0 100644 --- a/includes/ContentHandler.php +++ b/includes/ContentHandler.php @@ -57,7 +57,7 @@ abstract class ContentHandler { } if ( $wgContentHandlerTextFallback == 'fail' ) { - throw new MWException( "Attempt to get text from Content with model " . $content->getModelName() ); + throw new MWException( "Attempt to get text from Content with model " . $content->getModel() ); } if ( $wgContentHandlerTextFallback == 'serialize' ) { @@ -70,25 +70,25 @@ abstract class ContentHandler { /** * Conveniance function for creating a Content object from a given textual representation. * - * $text will be deserialized into a Content object of the model specified by $modelName (or, - * if that is not given, $title->getContentModelName()) using the given format. + * $text will be deserialized into a Content object of the model specified by $modelId (or, + * if that is not given, $title->getContentModel()) using the given format. * * @static * @param string $text the textual represenation, will be unserialized to create the Content object * @param Title $title the title of the page this text belongs to, required as a context for deserialization - * @param null|String $modelName the model to deserialize to. If not provided, $title->getContentModelName() is used. + * @param null|String $modelId the model to deserialize to. If not provided, $title->getContentModel() is used. * @param null|String $format the format to use for deserialization. If not given, the model's default format is used. * * @return Content a Content object representing $text * @throw MWException if $model or $format is not supported or if $text can not be unserialized using $format. */ - public static function makeContent( $text, Title $title, $modelName = null, $format = null ) { + public static function makeContent( $text, Title $title, $modelId = null, $format = null ) { - if ( is_null( $modelName ) ) { - $modelName = $title->getContentModelName(); + if ( is_null( $modelId ) ) { + $modelId = $title->getContentModel(); } - $handler = ContentHandler::getForModelName( $modelName ); + $handler = ContentHandler::getForModelID( $modelId ); return $handler->unserializeContent( $text, $format ); } @@ -96,7 +96,7 @@ abstract class ContentHandler { * Returns the name of the default content model to be used for the page with the given title. * * Note: There should rarely be need to call this method directly. - * To determine the actual content model for a given page, use Title::getContentModelName(). + * To determine the actual content model for a given page, use Title::getContentModel(). * * Which model is to be used per default for the page is determined based on several factors: * * The global setting $wgNamespaceContentModels specifies a content model per namespace. @@ -108,7 +108,7 @@ abstract class ContentHandler { * * If none of the above applies, the wikitext model is used. * - * Note: this is used by, and may thus not use, Title::getContentModelName() + * Note: this is used by, and may thus not use, Title::getContentModel() * * @static * @param Title $title @@ -117,8 +117,8 @@ abstract class ContentHandler { public static function getDefaultModelFor( Title $title ) { global $wgNamespaceContentModels; - // NOTE: this method must not rely on $title->getContentModelName() directly or indirectly, - // because it is used to initialized the mContentModelName memebr. + // NOTE: this method must not rely on $title->getContentModel() directly or indirectly, + // because it is used to initialized the mContentModel memebr. $ns = $title->getNamespace(); @@ -183,8 +183,8 @@ abstract class ContentHandler { * @return ContentHandler */ public static function getForTitle( Title $title ) { - $modelName = $title->getContentModelName(); - return ContentHandler::getForModelName( $modelName ); + $modelId = $title->getContentModel(); + return ContentHandler::getForModelID( $modelId ); } /** @@ -195,12 +195,12 @@ abstract class ContentHandler { * @return ContentHandler */ public static function getForContent( Content $content ) { - $modelName = $content->getModelName(); - return ContentHandler::getForModelName( $modelName ); + $modelId = $content->getModel(); + return ContentHandler::getForModelID( $modelId ); } /** - * returns the ContentHandler singleton for the given model name. Use the CONTENT_MODEL_XXX constants to + * returns the ContentHandler singleton for the given model id. Use the CONTENT_MODEL_XXX constants to * identify the desired content model. * * ContentHandler singletons are take from the global $wgContentHandlers array. Keys in that array are @@ -210,48 +210,120 @@ abstract class ContentHandler { * If a class name in encountered when looking up the singleton for a given model name, the class is * instantiated and the class name is replaced by te resulting singleton in $wgContentHandlers. * - * If no ContentHandler is defined for the desired $modelName, the ContentHandler may be provided by the - * a ContentHandlerForModelName hook. if no Contenthandler can be determined, an MWException is raised. + * If no ContentHandler is defined for the desired $modelId, the ContentHandler may be provided by the + * a ContentHandlerForModelID hook. if no Contenthandler can be determined, an MWException is raised. * * @static - * @param $modelName String the name of the content model for which to get a handler. Use CONTENT_MODEL_XXX constants. - * @return ContentHandler the ContentHandler singleton for handling the model given by $modelName - * @throws MWException if no handler is known for $modelName. + * @param $modelId int the id of the content model for which to get a handler. Use CONTENT_MODEL_XXX constants. + * @return ContentHandler the ContentHandler singleton for handling the model given by $modelId + * @throws MWException if no handler is known for $modelId. */ - public static function getForModelName( $modelName ) { + public static function getForModelID( $modelId ) { global $wgContentHandlers; - if ( empty( $wgContentHandlers[$modelName] ) ) { + if ( empty( $wgContentHandlers[$modelId] ) ) { $handler = null; - wfRunHooks( 'ContentHandlerForModelName', array( $modelName, &$handler ) ); + wfRunHooks( 'ContentHandlerForModelID', array( $modelId, &$handler ) ); if ( $handler ) { // NOTE: may be a string or an object, either is fine! - $wgContentHandlers[$modelName] = $handler; + $wgContentHandlers[$modelId] = $handler; } else { - throw new MWException( "No handler for model $modelName registered in \$wgContentHandlers" ); + throw new MWException( "No handler for model #$modelId registered in \$wgContentHandlers" ); } } - if ( is_string( $wgContentHandlers[$modelName] ) ) { - $class = $wgContentHandlers[$modelName]; - $wgContentHandlers[$modelName] = new $class( $modelName ); + if ( is_string( $wgContentHandlers[$modelId] ) ) { + $class = $wgContentHandlers[$modelId]; + $wgContentHandlers[$modelId] = new $class( $modelId ); } - return $wgContentHandlers[$modelName]; + return $wgContentHandlers[$modelId]; + } + + /** + * Returns the appropriate mime type for a given content format, + * or null if no mime type is known for this format. + * + * Mime types can be registered in the global array $wgContentFormatMimeTypes. + * + * @static + * @param int $id the content format id, as given by a CONTENT_FORMAT_XXX constant + * or returned by Revision::getContentFormat(). + * + * @return String|null the content format's mime type. + */ + public static function getContentFormatMimeType( $id ) { + global $wgContentFormatMimeTypes; + + if ( !isset( $wgContentFormatMimeTypes[ $id ] ) ) { + return null; + } + + return $wgContentFormatMimeTypes[ $id ]; + } + + /** + * Returns the content format if for a given mime type, + * or null if no format id if known for this mime type. + * + * Mime types can be registered in the global array $wgContentFormatMimeTypes. + * + * @static + * @param String $mime the mime type + * + * @return int|null the format id, as defined by a CONTENT_FORMAT_XXX constant + */ + public static function getContentFormatID( $mime ) { + global $wgContentFormatMimeTypes; + + static $format_ids = null; + + if ( $format_ids === null ) { + $format_ids = array_flip( $wgContentFormatMimeTypes ); + } + + if ( !isset( $format_ids[ $mime ] ) ) { + return null; + } + + return $format_ids[ $mime ]; + } + + /** + * Returns the localized name for a given content model, + * or null of no mime type is known. + * + * Model names are localized using system messages. Message keys + * have the form conent-model-$id. + * + * @static + * @param int $id the content model id, as given by a CONTENT_MODEL_XXX constant + * or returned by Revision::getContentModel(). + * + * @return String|null the content format's mime type. + */ + public static function getContentModelName( $id ) { + $key = "content-model-$id"; + + if ( wfEmptyMsg( $key ) ) return null; + else return wfMsg( $key ); } // ---------------------------------------------------------------------------------------------------------- + protected $mModelID; + protected $mSupportedFormats; + /** - * Constructor, initializing the ContentHandler instance with it's model name and a list of supported formats. + * Constructor, initializing the ContentHandler instance with it's model id and a list of supported formats. * Values for the parameters are typically provided as literals by subclasses' constructors. * - * @param String $modelName (use CONTENT_MODEL_XXX constants). + * @param int $modelId (use CONTENT_MODEL_XXX constants). * @param array $formats list for supported serialization formats (typically as MIME types) */ - public function __construct( $modelName, $formats ) { - $this->mModelName = $modelName; + public function __construct( $modelId, $formats ) { + $this->mModelID = $modelId; $this->mSupportedFormats = $formats; } @@ -284,23 +356,27 @@ abstract class ContentHandler { public abstract function makeEmptyContent(); /** - * Returns the model name that identifies the content model this ContentHandler can handle. + * Returns the model id that identifies the content model this ContentHandler can handle. * Use with the CONTENT_MODEL_XXX constants. * - * @return String the model name + * @return int the model id */ - public function getModelName() { - return $this->mModelName; + public function getModelID() { + return $this->mModelID; } /** - * Throws an MWException if $modelName is not the content model handeled by this ContentHandler. + * Throws an MWException if $model_id is not the id of the content model + * supported by this ContentHandler. * - * @param String $modelName the model name to check + * @param int $model_id the model to check */ - protected function checkModelName( $modelName ) { - if ( $modelName !== $this->mModelName ) { - throw new MWException( "Bad content model: expected " . $this->mModelName . " but got found " . $modelName ); + protected function checkModelID( $model_id ) { + if ( $model_id !== $this->mModelID ) { + $model_name = ContentHandler::getContentModelName( $model_id ); + $own_model_name = ContentHandler::getContentModelName( $this->mModelID ); + + throw new MWException( "Bad content model: expected {$this->mModelID} ($own_model_name) but got found $model_id ($model_name)." ); } } @@ -353,7 +429,7 @@ abstract class ContentHandler { */ protected function checkFormat( $format ) { if ( !$this->isSupportedFormat( $format ) ) { - throw new MWException( "Format $format is not supported for content model " . $this->getModelName() ); + throw new MWException( "Format $format is not supported for content model " . $this->getModelID() ); } } @@ -381,7 +457,7 @@ abstract class ContentHandler { * @todo Article really defines the view of the content... rename this method to createViewPage ? */ public function createArticle( Title $title ) { - $this->checkModelName( $title->getContentModelName() ); + $this->checkModelID( $title->getContentModel() ); $article = new Article($title); return $article; @@ -394,7 +470,7 @@ abstract class ContentHandler { * @return EditPage */ public function createEditPage( Article $article ) { - $this->checkModelName( $article->getContentModelName() ); + $this->checkModelID( $article->getPage()->getContentModel() ); $editPage = new EditPage( $article ); return $editPage; @@ -408,7 +484,7 @@ abstract class ContentHandler { * @todo does anyone or anythign actually use the external edit facility? Can we just deprecate and ignore it? */ public function createExternalEdit( IContextSource $context ) { - $this->checkModelName( $context->getTitle()->getContentModelName() ); + $this->checkModelID( $context->getTitle()->getContentModel() ); $externalEdit = new ExternalEdit( $context ); return $externalEdit; @@ -428,7 +504,7 @@ abstract class ContentHandler { public function createDifferenceEngine( IContextSource $context, $old = 0, $new = 0, $rcid = 0, #FIMXE: use everywhere! $refreshCache = false, $unhide = false ) { - $this->checkModelName( $context->getTitle()->getContentModelName() ); + $this->checkModelID( $context->getTitle()->getContentModel() ); $diffEngineClass = $this->getDiffEngineClass(); @@ -671,8 +747,8 @@ abstract class ContentHandler { abstract class TextContentHandler extends ContentHandler { - public function __construct( $modelName, $formats ) { - parent::__construct( $modelName, $formats ); + public function __construct( $modelId, $formats ) { + parent::__construct( $modelId, $formats ); } public function serializeContent( Content $content, $format = null ) { @@ -694,9 +770,9 @@ abstract class TextContentHandler extends ContentHandler { * @return Content|Bool */ public function merge3( Content $oldContent, Content $myContent, Content $yourContent ) { - $this->checkModelName( $oldContent->getModelName() ); - $this->checkModelName( $myContent->getModelName() ); - $this->checkModelName( $yourContent->getModelName() ); + $this->checkModelID( $oldContent->getModel() ); + $this->checkModelID( $myContent->getModel() ); + $this->checkModelID( $yourContent->getModel() ); $format = $this->getDefaultFormat(); @@ -722,8 +798,8 @@ abstract class TextContentHandler extends ContentHandler { } class WikitextContentHandler extends TextContentHandler { - public function __construct( $modelName = CONTENT_MODEL_WIKITEXT ) { - parent::__construct( $modelName, array( 'text/x-wiki' ) ); + public function __construct( $modelId = CONTENT_MODEL_WIKITEXT ) { + parent::__construct( $modelId, array( CONTENT_FORMAT_WIKITEXT ) ); } public function unserializeContent( $text, $format = null ) { @@ -743,8 +819,8 @@ class WikitextContentHandler extends TextContentHandler { class JavaScriptContentHandler extends TextContentHandler { - public function __construct( $modelName = CONTENT_MODEL_WIKITEXT ) { - parent::__construct( $modelName, array( 'text/javascript' ) ); #XXX: or use $wgJsMimeType? this is for internal storage, not HTTP... + public function __construct( $modelId = CONTENT_MODEL_JAVASCRIPT ) { + parent::__construct( $modelId, array( CONTENT_FORMAT_JAVASCRIPT ) ); } public function unserializeContent( $text, $format = null ) { @@ -760,8 +836,8 @@ class JavaScriptContentHandler extends TextContentHandler { class CssContentHandler extends TextContentHandler { - public function __construct( $modelName = CONTENT_MODEL_WIKITEXT ) { - parent::__construct( $modelName, array( 'text/css' ) ); + public function __construct( $modelId = CONTENT_MODEL_CSS ) { + parent::__construct( $modelId, array( CONTENT_FORMAT_CSS ) ); } public function unserializeContent( $text, $format = null ) { diff --git a/includes/DefaultSettings.php b/includes/DefaultSettings.php index 6cbc868580..771d9a409e 100644 --- a/includes/DefaultSettings.php +++ b/includes/DefaultSettings.php @@ -642,7 +642,7 @@ $wgMediaHandlers = array( /** * Plugins for page content model handling. - * Each entry in the array maps a model name type to a class name + * Each entry in the array maps a model id to a class name */ $wgContentHandlers = array( CONTENT_MODEL_WIKITEXT => 'WikitextContentHandler', // the usual case @@ -651,6 +651,29 @@ $wgContentHandlers = array( CONTENT_MODEL_TEXT => 'TextContentHandler', // dumb plain text in
 );
 
+/**
+ * Mime types for content formats.
+ * Each entry in the array maps a content format to a mime type.
+ *
+ * Extensions that define their own content formats can register
+ * the appropriate mime types in this array.
+ *
+ * Such extensions shall use content format IDs
+ * larger than 100 and register the ids they use at
+ * 
+ * to avoid conflicts with other extensions.
+ */
+$wgContentFormatMimeTypes = array(
+	CONTENT_FORMAT_WIKITEXT => 'text/x-wiki',
+	CONTENT_FORMAT_JAVASCRIPT => 'text/javascript',
+	CONTENT_FORMAT_CSS => 'text/css',
+	CONTENT_FORMAT_TEXT => 'text/plain',
+	CONTENT_FORMAT_HTML => 'text/html',
+	CONTENT_FORMAT_XML => 'application/xml',
+	CONTENT_FORMAT_JSON => 'application/json',
+	CONTENT_FORMAT_SERIALIZED => 'application/vnd.php.serialized',
+);
+
 /**
  * Resizing can be done using PHP's internal image libraries or using
  * ImageMagick or another third-party converter, e.g. GraphicMagick.
diff --git a/includes/Defines.php b/includes/Defines.php
index 610d0a5952..f915b08741 100644
--- a/includes/Defines.php
+++ b/includes/Defines.php
@@ -244,7 +244,7 @@ define( 'APCOND_BLOCKED', 8 );
 define( 'APCOND_ISBOT', 9 );
 /**@}*/
 
-/**
+/** @{
  * Protocol constants for wfExpandUrl()
  */
 define( 'PROTO_HTTP', 'http://' );
@@ -253,12 +253,40 @@ define( 'PROTO_RELATIVE', '//' );
 define( 'PROTO_CURRENT', null );
 define( 'PROTO_CANONICAL', 1 );
 define( 'PROTO_INTERNAL', 2 );
+/**@}*/
 
-/**
- * Content model names, used by Content and ContentHandler
+/**@{
+ * Content model ids, used by Content and ContentHandler
+ *
+ * Extensions that define their own content models shall use IDs
+ * larger than 100 and register the ids they use at
+ * 
+ * to avoid conflicts with other extensions.
+ */
+define( 'CONTENT_MODEL_WIKITEXT', 1 );
+define( 'CONTENT_MODEL_JAVASCRIPT', 2 );
+define( 'CONTENT_MODEL_CSS', 3 );
+define( 'CONTENT_MODEL_TEXT', 4 );
+/**@}*/
+
+/**@{
+ * Content format ids, used by Content and ContentHandler.
+ * Use ContentHander::getFormatMimeType() to get the associated mime type.
+ * Register mime types in $wgContentFormatMimeTypes.
+ *
+ * Extensions that define their own content formats shall use IDs
+ * larger than 100 and register the ids they use at
+ * 
+ * to avoid conflicts with other extensions.
  */
-define('CONTENT_MODEL_WIKITEXT', 'wikitext');
-define('CONTENT_MODEL_JAVASCRIPT', 'javascript');
-define('CONTENT_MODEL_CSS', 'css');
-define('CONTENT_MODEL_TEXT', 'text');
+define( 'CONTENT_FORMAT_WIKITEXT', 1 ); // wikitext
+define( 'CONTENT_FORMAT_JAVASCRIPT', 2 ); // for js pages
+define( 'CONTENT_FORMAT_CSS', 3 );  // for css pages
+define( 'CONTENT_FORMAT_TEXT', 4 ); // for future use, e.g. with some plain-html messages.
+define( 'CONTENT_FORMAT_HTML', 5 ); // for future use, e.g. with some plain-html messages.
+define( 'CONTENT_FORMAT_SERIALIZED', 11 ); // for future use with the api, and for use by extensions
+define( 'CONTENT_FORMAT_JSON', 12 ); // for future use with the api, and for use by extensions
+define( 'CONTENT_FORMAT_XML', 13 ); // for future use with the api, and for use by extensions
+/**@}*/
+
 
diff --git a/includes/EditPage.php b/includes/EditPage.php
index 105590f6f4..b2c8ad4d17 100644
--- a/includes/EditPage.php
+++ b/includes/EditPage.php
@@ -230,9 +230,9 @@ class EditPage {
 		$this->mArticle = $article;
 		$this->mTitle = $article->getTitle();
 
-		$this->content_model = $this->mTitle->getContentModelName();
+		$this->content_model = $this->mTitle->getContentModel();
 
-		$handler = ContentHandler::getForModelName( $this->content_model );
+		$handler = ContentHandler::getForModelID( $this->content_model );
 		$this->content_format = $handler->getDefaultFormat(); #NOTE: should be overridden by format of actual revision
 	}
 
@@ -713,7 +713,7 @@ class EditPage {
 		$this->nosummary = $request->getBool( 'nosummary' );
 
 		$content_handler = ContentHandler::getForTitle( $this->mTitle );
-		$this->content_model = $request->getText( 'model', $content_handler->getModelName() ); #may be overridden by revision
+		$this->content_model = $request->getText( 'model', $content_handler->getModelID() ); #may be overridden by revision
 		$this->content_format = $request->getText( 'format', $content_handler->getDefaultFormat() ); #may be overridden by revision
 
 		#TODO: check if the desired model is allowed in this namespace, and if a transition from the page's current model to the new model is allowed
@@ -916,8 +916,8 @@ class EditPage {
 		}
 		$revision = $this->mArticle->getRevisionFetched();
 		if ( $revision === null ) {
-			if ( !$this->content_model ) $this->content_model = $this->getTitle()->getContentModelName();
-			$handler = ContentHandler::getForModelName( $this->content_model );
+			if ( !$this->content_model ) $this->content_model = $this->getTitle()->getContentModel();
+			$handler = ContentHandler::getForModelID( $this->content_model );
 
 			return $handler->makeEmptyContent();
 		}
@@ -938,13 +938,13 @@ class EditPage {
 		$content = $rev ? $rev->getContent( Revision::RAW ) : null;
 
 		if ( $content  === false || $content === null ) {
-			if ( !$this->content_model ) $this->content_model = $this->getTitle()->getContentModelName();
-			$handler = ContentHandler::getForModelName( $this->content_model );
+			if ( !$this->content_model ) $this->content_model = $this->getTitle()->getContentModel();
+			$handler = ContentHandler::getForModelID( $this->content_model );
 
 			return $handler->makeEmptyContent();
 		} else {
 			#FIXME: nasty side-effect!
-			$this->content_model = $rev->getContentModelName();
+			$this->content_model = $rev->getContentModel();
 			$this->content_format = $rev->getContentFormat();
 
 			return $content;
@@ -1657,7 +1657,7 @@ class EditPage {
 		}
 		$currentContent = $currentRevision->getContent();
 
-		$handler = ContentHandler::getForModelName( $baseContent->getModelName() );
+		$handler = ContentHandler::getForModelID( $baseContent->getModel() );
 
 		$result = $handler->merge3( $baseContent, $editContent, $currentContent );
 
@@ -2509,7 +2509,7 @@ HTML
 
 		if ( $newtext != $newtext_orig ) {
 						#if the hook changed the text, create a new Content object accordingly.
-						$newContent = ContentHandler::makeContent( $newtext, $this->getTitle(), $newContent->getModelName() ); #XXX: handle parse errors ?
+						$newContent = ContentHandler::makeContent( $newtext, $this->getTitle(), $newContent->getModel() ); #XXX: handle parse errors ?
 		}
 
 		wfRunHooks( 'EditPageGetDiffContent', array( $this, &$newContent ) );
@@ -2616,7 +2616,7 @@ HTML
 			$content1 = ContentHandler::makeContent( $this->textbox1, $this->getTitle(), $this->content_model, $this->content_format ); #XXX: handle parse errors?
 			$content2 = ContentHandler::makeContent( $this->textbox2, $this->getTitle(), $this->content_model, $this->content_format ); #XXX: handle parse errors?
 
-			$handler = ContentHandler::getForModelName( $this->content_model );
+			$handler = ContentHandler::getForModelID( $this->content_model );
 			$de = $handler->createDifferenceEngine( $this->mArticle->getContext() );
 			$de->setContent( $content2, $content1 );
 			$de->showDiff( wfMsgExt( 'yourtext', 'parseinline' ), wfMsg( 'storedversion' ) );
@@ -2772,9 +2772,9 @@ HTML
 					$level = false;
 				}
 
-				if ( $content->getModelName() == CONTENT_MODEL_CSS ) {
+				if ( $content->getModel() == CONTENT_MODEL_CSS ) {
 					$format = 'css';
-				} elseif ( $content->getModelName() == CONTENT_MODEL_JAVASCRIPT ) {
+				} elseif ( $content->getModel() == CONTENT_MODEL_JAVASCRIPT ) {
 					$format = 'js';
 				} else {
 					$format = false;
diff --git a/includes/Export.php b/includes/Export.php
index 379aa4d60e..e3909ceed0 100644
--- a/includes/Export.php
+++ b/includes/Export.php
@@ -595,11 +595,13 @@ class XmlDumpWriter {
 		}
 
 		if ( isset( $row->rev_content_model ) && !is_null( $row->rev_content_model )  ) {
-			$out .= "      " . Xml::element('model', null, strval( $row->rev_content_model ) ) . "\n";
+			$name = ContentHandler::getContentModelName( $row->rev_content_model );
+			$out .= "      " . Xml::element('model', array( 'name' => $name ), strval( $row->rev_content_model ) ) . "\n";
 		}
 
 		if ( isset( $row->rev_content_format ) && !is_null( $row->rev_content_format ) ) {
-			$out .= "      " . Xml::element('format', null, strval( $row->rev_content_format ) ) . "\n";
+			$mime = ContentHandler::getContentFormatMimeType( $row->rev_content_format );
+			$out .= "      " . Xml::element('format', array( 'mime' => $mime ), strval( $row->rev_content_format ) ) . "\n";
 		}
 
 		$text = '';
diff --git a/includes/Import.php b/includes/Import.php
index e8f32d794d..5b182add6a 100644
--- a/includes/Import.php
+++ b/includes/Import.php
@@ -1179,18 +1179,18 @@ class WikiRevision {
 	}
 
 	/**
-	 * @return string
+	 * @return int
 	 */
 	function getModel() {
 		if ( is_null( $this->model ) ) {
-			$this->model = $this->getTitle()->getContentModelName();
+			$this->model = $this->getTitle()->getContentModel();
 		}
 
 		return $this->model;
 	}
 
 	/**
-	 * @return string
+	 * @return int
 	 */
 	function getFormat() {
 		if ( is_null( $this->model ) ) {
diff --git a/includes/Revision.php b/includes/Revision.php
index 5720adf8ba..86ac22f71a 100644
--- a/includes/Revision.php
+++ b/includes/Revision.php
@@ -20,7 +20,7 @@ class Revision {
 	protected $mTextRow;
 	protected $mTitle;
 	protected $mCurrent;
-	protected $mContentModelName;
+	protected $mContentModel;
 	protected $mContentFormat;
 	protected $mContent;
 	protected $mContentHandler;
@@ -440,15 +440,15 @@ class Revision {
 			}
 
 			if( !isset( $row->rev_content_model ) || is_null( $row->rev_content_model ) ) {
-				$this->mContentModelName = null; # determine on demand if needed
+				$this->mContentModel = null; # determine on demand if needed
 			} else {
-				$this->mContentModelName = strval( $row->rev_content_model );
+				$this->mContentModel = intval( $row->rev_content_model );
 			}
 
 			if( !isset( $row->rev_content_format ) || is_null( $row->rev_content_format ) ) {
 				$this->mContentFormat = null; # determine on demand if needed
 			} else {
-				$this->mContentFormat = strval( $row->rev_content_format );
+				$this->mContentFormat = intval( $row->rev_content_format );
 			}
 
 			// Lazy extraction...
@@ -479,7 +479,7 @@ class Revision {
 					throw new MWException( "Text already stored in external store (id {$row['text_id']}), can't serialize content object" );
 				}
 
-				$row['content_model'] = $row['content']->getModelName();
+				$row['content_model'] = $row['content']->getModel();
 				# note: mContentFormat is initializes later accordingly
 				# note: content is serialized later in this method!
 				# also set text to null?
@@ -497,20 +497,20 @@ class Revision {
 			$this->mParentId  = isset( $row['parent_id']  ) ? intval( $row['parent_id']  ) : null;
 			$this->mSha1      = isset( $row['sha1']  )      ? strval( $row['sha1']  )      : null;
 
-			$this->mContentModelName = isset( $row['content_model']  )  ? strval( $row['content_model'] )  : null;
-			$this->mContentFormat    = isset( $row['content_format']  ) ? strval( $row['content_format'] ) : null;
+			$this->mContentModel = isset( $row['content_model']  )  ? intval( $row['content_model'] )  : null;
+			$this->mContentFormat    = isset( $row['content_format']  ) ? intval( $row['content_format'] ) : null;
 
 			// Enforce spacing trimming on supplied text
 			$this->mComment   = isset( $row['comment']    ) ?  trim( strval( $row['comment'] ) ) : null;
 			$this->mText      = isset( $row['text']       ) ? rtrim( strval( $row['text']    ) ) : null;
 			$this->mTextRow   = null;
 
-			# if we have a content object, override mText and mContentModelName
+			# if we have a content object, override mText and mContentModel
 			if ( !empty( $row['content'] ) ) {
 				$handler = $this->getContentHandler();
 				$this->mContent = $row['content'];
 
-				$this->mContentModelName = $this->mContent->getModelName();
+				$this->mContentModel = $this->mContent->getModel();
 				$this->mContentHandler = null;
 
 				$this->mText = $handler->serializeContent( $row['content'], $this->getContentFormat() );
@@ -538,7 +538,7 @@ class Revision {
 				$this->mSha1 = is_null( $this->mText ) ? null : self::base36Sha1( $this->mText );
 			}
 
-			$this->getContentModelName(); # force lazy init
+			$this->getContentModel(); # force lazy init
 			$this->getContentFormat();    # force lazy init
 		} else {
 			throw new MWException( 'Revision constructor passed invalid row format.' );
@@ -879,31 +879,54 @@ class Revision {
 		return $this->mContent;
 	}
 
-	public function getContentModelName() {
-		if ( !$this->mContentModelName ) {
+	/**
+	 * Returns the content model for this revision.
+	 *
+	 * If no content model was stored in the database, $this->getTitle()->getContentModel() is
+	 * used to determine the content model to use. If no title is know, CONTENT_MODEL_WIKITEXT
+	 * is used as a last resort.
+	 *
+	 * @return int the content model id associated with this revision, see the CONTENT_MODEL_XXX constants.
+	 **/
+	public function getContentModel() {
+		if ( !$this->mContentModel ) {
 			$title = $this->getTitle();
-			$this->mContentModelName = ( $title ? $title->getContentModelName() : CONTENT_MODEL_WIKITEXT );
+			$this->mContentModel = ( $title ? $title->getContentModel() : CONTENT_MODEL_WIKITEXT );
+
+			assert( !empty( $this->mContentModel ) );
 		}
 
-		return $this->mContentModelName;
+		return $this->mContentModel;
 	}
 
+	/**
+	 * Returns the content format for this revision.
+	 *
+	 * If no content format was stored in the database, the default format for this
+	 * revision's content model is returned.
+	 *
+	 * @return int the content format id associated with this revision, see the CONTENT_FORMAT_XXX constants.
+	 **/
 	public function getContentFormat() {
 		if ( !$this->mContentFormat ) {
 			$handler = $this->getContentHandler();
 			$this->mContentFormat = $handler->getDefaultFormat();
+
+			assert( !empty( $this->mContentFormat ) );
 		}
 
 		return $this->mContentFormat;
 	}
 
 	/**
+	 * Returns the content handler appropriate for this revision's content model.
+	 *
 	 * @return ContentHandler
 	 */
 	public function getContentHandler() {
 		if ( !$this->mContentHandler ) {
-			$model = $this->getContentModelName();
-			$this->mContentHandler = ContentHandler::getForModelName( $model );
+			$model = $this->getContentModel();
+			$this->mContentHandler = ContentHandler::getForModelID( $model );
 
 			assert( $this->mContentHandler->isSupportedFormat( $this->getContentFormat() ) );
 		}
@@ -1153,7 +1176,7 @@ class Revision {
 		);
 
 		if ( $wgContentHandlerUseDB ) {
-			$row[ 'rev_content_model' ] = $this->getContentModelName();
+			$row[ 'rev_content_model' ] = $this->getContentModel();
 			$row[ 'rev_content_format' ] = $this->getContentFormat();
 		}
 
diff --git a/includes/Title.php b/includes/Title.php
index 5c12f06cbf..7772fad706 100644
--- a/includes/Title.php
+++ b/includes/Title.php
@@ -63,6 +63,7 @@ class Title {
 	var $mFragment;                   // /< Title fragment (i.e. the bit after the #)
 	var $mArticleID = -1;             // /< Article ID, fetched from the link cache on demand
 	var $mLatestID = false;           // /< ID of most recent revision
+	var $mContentModel = false;       // /< ID of the page's content model, i.e. one of the CONTENT_MODEL_XXX constants
 	private $mEstimateRevisions;      // /< Estimated number of revisions; null of not loaded
 	var $mRestrictions = array();     // /< Array of groups allowed to edit this article
 	var $mOldRestrictions = false;
@@ -273,15 +274,15 @@ class Title {
 			if ( isset( $row->page_latest ) )
 				$this->mLatestID = (int)$row->page_latest; # FIXME: whene3ver page_latest is updated, also update page_content_model
 			if ( isset( $row->page_content_model ) )
-				$this->mContentModelName = $row->page_content_model;
+				$this->mContentModel = $row->page_content_model;
 			else
-				$this->mContentModelName = null; # initialized lazily in getContentModelName()
+				$this->mContentModel = null; # initialized lazily in getContentModel()
 		} else { // page not found
 			$this->mArticleID = 0;
 			$this->mLength = 0;
 			$this->mRedirect = false;
 			$this->mLatestID = 0;
-			$this->mContentModelName = null; # initialized lazily in getContentModelName()
+			$this->mContentModel = null; # initialized lazily in getContentModel()
 		}
 	}
 
@@ -307,7 +308,7 @@ class Title {
 		$t->mArticleID = ( $ns >= 0 ) ? -1 : 0;
 		$t->mUrlform = wfUrlencode( $t->mDbkeyform );
 		$t->mTextform = str_replace( '_', ' ', $title );
-		$t->mContentModelName = null; # initialized lazily in getContentModelName()
+		$t->mContentModel = null; # initialized lazily in getContentModel()
 		return $t;
 	}
 
@@ -698,26 +699,27 @@ class Title {
 	}
 
 	/**
-	 * Get the page's content model name
+	 * Get the page's content model id, see the CONTENT_MODEL_XXX constants.
 	 *
-	 * @return Integer: Namespace index
+	 * @return Integer: Content model id
 	 */
-	public function getContentModelName() {
-		if ( empty( $this->mContentModelName ) ) {
-			$this->mContentModelName = ContentHandler::getDefaultModelFor( $this );
+	public function getContentModel() {
+		if ( empty( $this->mContentModel ) ) {
+			$this->mContentModel = ContentHandler::getDefaultModelFor( $this );
 		}
 
-		return $this->mContentModelName;
+		assert( !empty( $this->mContentModel ) );
+		return $this->mContentModel;
 	}
 
 	/**
 	 * Conveniance method for checking a title's content model name
 	 *
-	 * @param $name
-	 * @return true if $this->getContentModelName() == $name
+	 * @param int $id
+	 * @return true if $this->getContentModel() == $id
 	 */
-	public function hasContentModel( $name ) {
-		return $this->getContentModelName() == $name;
+	public function hasContentModel( $id ) {
+		return $this->getContentModel() == $id;
 	}
 
 	/**
diff --git a/includes/WikiPage.php b/includes/WikiPage.php
index 2f54c7c501..1c28d11b12 100644
--- a/includes/WikiPage.php
+++ b/includes/WikiPage.php
@@ -161,14 +161,14 @@ class WikiPage extends Page {
 	/**
 	 * Returns the ContentHandler instance to be used to deal with the content of this WikiPage.
 	 *
-	 * Shorthand for ContentHandler::getForModelName( $this->getContentModelName() );
+	 * Shorthand for ContentHandler::getForModelID( $this->getContentModel() );
 	 *
 	 * @return ContentHandler
 	 *
 	 * @since 1.WD
 	 */
 	public function getContentHandler() {
-		return ContentHandler::getForModelName( $this->getContentModelName() );
+		return ContentHandler::getForModelID( $this->getContentModel() );
 	}
 
 	/**
@@ -380,27 +380,29 @@ class WikiPage extends Page {
 	}
 
 	/**
-	 * Returns the page's content model name. Will use the revisions actual content model if the page exists,
+	 * Returns the page's content model id (see the CONTENT_MODEL_XXX constants).
+	 *
+	 * Will use the revisions actual content model if the page exists,
 	 * and the page's default if the page doesn't exist yet.
 	 *
 	 * @return int
 	 *
 	 * @since 1.WD
 	 */
-	public function getContentModelName() {
+	public function getContentModel() {
 		if ( $this->exists() ) {
 			# look at the revision's actual content model
 			$rev = $this->getRevision();
 
 			if ( $rev !== null ) {
-				return $rev->getContentModelName();
+				return $rev->getContentModel();
 			} else {
 				wfWarn( "Page exists but has no revision!" );
 			}
 		}
 
 		# use the default model for this page
-		return $this->mTitle->getContentModelName();
+		return $this->mTitle->getContentModel();
 	}
 
 	/**
@@ -1099,7 +1101,7 @@ class WikiPage extends Page {
 		);
 
 		if ( $wgContentHandlerUseDB ) {
-			$row[ 'page_content_model' ] = $revision->getContentModelName();
+			$row[ 'page_content_model' ] = $revision->getContentModel();
 		}
 
 		$dbw->update( 'page',
@@ -1518,7 +1520,7 @@ class WikiPage extends Page {
 				'user'       => $user->getId(),
 				'user_text'  => $user->getName(),
 				'timestamp'  => $now,
-				'content_model' => $content->getModelName(),
+				'content_model' => $content->getModel(),
 				'content_format' => $serialisation_format,
 			) );
 
@@ -1625,7 +1627,7 @@ class WikiPage extends Page {
 				'user'       => $user->getId(),
 				'user_text'  => $user->getName(),
 				'timestamp'  => $now,
-				'content_model' => $content->getModelName(),
+				'content_model' => $content->getModel(),
 				'content_format' => $serialisation_format,
 			) );
 			$revisionId = $revision->insertOn( $dbw );
@@ -2661,7 +2663,7 @@ class WikiPage extends Page {
 
 		wfDeprecated( __METHOD__, '1.WD' );
 
-		$handler = ContentHandler::getForModelName( CONTENT_MODEL_WIKITEXT );
+		$handler = ContentHandler::getForModelID( CONTENT_MODEL_WIKITEXT );
 		$oldContent = is_null( $oldtext ) ? null : $handler->unserializeContent( $oldtext );
 		$newContent = is_null( $newtext ) ? null : $handler->unserializeContent( $newtext );
 
@@ -3064,9 +3066,9 @@ class PoolWorkArticleView extends PoolCounterWork {
 	 */
 	function __construct( Page $page, ParserOptions $parserOptions, $revid, $useParserCache, $content = null, IContextSource $context = null ) {
 		if ( is_string($content) ) { #BC: old style call
-			$modelName = $page->getRevision()->getContentModelName();
+			$modelId = $page->getRevision()->getContentModel();
 			$format = $page->getRevision()->getContentFormat();
-			$content = ContentHandler::makeContent( $content, $page->getTitle(), $modelName, $format );
+			$content = ContentHandler::makeContent( $content, $page->getTitle(), $modelId, $format );
 		}
 
 		if ( is_null( $context ) ) {
diff --git a/includes/actions/RawAction.php b/includes/actions/RawAction.php
index f07b5b6ca2..5b6683b173 100644
--- a/includes/actions/RawAction.php
+++ b/includes/actions/RawAction.php
@@ -139,7 +139,7 @@ class RawAction extends FormlessAction {
 
 				if ( !$content instanceof TextContent ) {
 					wfHttpError( 406, "Not Acceptable", "The requeste page uses the content model `"
-														. $content->getModelName() . "` which is not supported via this interface." );
+														. $content->getModel() . "` which is not supported via this interface." );
 					die();
 				}
 
diff --git a/includes/api/ApiComparePages.php b/includes/api/ApiComparePages.php
index cd50030007..bd740e7fca 100644
--- a/includes/api/ApiComparePages.php
+++ b/includes/api/ApiComparePages.php
@@ -35,7 +35,7 @@ class ApiComparePages extends ApiBase {
 		$rev1 = $this->revisionOrTitleOrId( $params['fromrev'], $params['fromtitle'], $params['fromid'] );
 		$rev2 = $this->revisionOrTitleOrId( $params['torev'], $params['totitle'], $params['toid'] );
 
-        $contentHandler = ContentHandler::getForModelName( $rev1->getContentModelName() );
+        $contentHandler = ContentHandler::getForModelID( $rev1->getContentModel() );
         $de = $contentHandler->createDifferenceEngine( $this->getContext(),
 			$rev1,
 			$rev2,
diff --git a/includes/specials/SpecialComparePages.php b/includes/specials/SpecialComparePages.php
index ba433c82d3..ecc0b837a2 100644
--- a/includes/specials/SpecialComparePages.php
+++ b/includes/specials/SpecialComparePages.php
@@ -111,7 +111,7 @@ class SpecialComparePages extends SpecialPage {
 		$rev2 = self::revOrTitle( $data['Revision2'], $data['Page2'] );
 
 		if( $rev1 && $rev2 ) {
-            $contentHandler = ContentHandler::getForModelName( $rev1->getContentModelName() );
+            $contentHandler = ContentHandler::getForModelID( $rev1->getContentModel() );
 			$de = $contentHandler->createDifferenceEngine( $form->getContext(),
 				$rev1,
 				$rev2,
diff --git a/languages/messages/MessagesEn.php b/languages/messages/MessagesEn.php
index a21a7ace31..238f136cfd 100644
--- a/languages/messages/MessagesEn.php
+++ b/languages/messages/MessagesEn.php
@@ -4861,4 +4861,10 @@ Otherwise, you can use the easy form below. Your comment will be added to the pa
 'duration-centuries' => '$1 {{PLURAL:$1|century|centuries}}',
 'duration-millennia' => '$1 {{PLURAL:$1|millennium|millennia}}',
 
+# Content model IDs for the ContentHandler facility; used by ContentHander::getContentModel()
+'content-model-1' => 'wikitext',
+'content-model-2' => 'JavaScript',
+'content-model-3' => 'CSS',
+'content-model-4' => 'plain text',
+
 );
diff --git a/languages/messages/MessagesQqq.php b/languages/messages/MessagesQqq.php
index bd7733e36e..5e543ebcbf 100644
--- a/languages/messages/MessagesQqq.php
+++ b/languages/messages/MessagesQqq.php
@@ -4676,4 +4676,10 @@ $4 is the gender of the target user.',
 'api-error-uploaddisabled' => 'API error message that can be used for client side localisation of API errors.',
 'api-error-verification-error' => 'The word "extension" refers to the part behind the last dot in a file name, that by convention gives a hint about the kind of data format which a files contents are in.',
 
+# Content model IDs for the ContentHandler facility; used by ContentHander::getContentModel()
+'content-model-1' => 'Name for the wikitext content model, used when decribing what type of content a page contains.',
+'content-model-2' => 'Name for the JavaScript content model, used when decribing what type of content a page contains.',
+'content-model-3' => 'Name for the CSS content model, used when decribing what type of content a page contains.',
+'content-model-4' => 'Name for the plain text content model, used when decribing what type of content a page contains.',
+
 );
diff --git a/maintenance/archives/patch-archive-ar_content_format.sql b/maintenance/archives/patch-archive-ar_content_format.sql
index 81f9fca8cb..c62ddfb490 100644
--- a/maintenance/archives/patch-archive-ar_content_format.sql
+++ b/maintenance/archives/patch-archive-ar_content_format.sql
@@ -1,2 +1,2 @@
 ALTER TABLE /*$wgDBprefix*/archive
-  ADD ar_content_format varbinary(64) DEFAULT NULL;
+  ADD ar_content_format int unsigned DEFAULT NULL;
diff --git a/maintenance/archives/patch-archive-ar_content_model.sql b/maintenance/archives/patch-archive-ar_content_model.sql
index 1a8b630e4c..8c18bba9ba 100644
--- a/maintenance/archives/patch-archive-ar_content_model.sql
+++ b/maintenance/archives/patch-archive-ar_content_model.sql
@@ -1,2 +1,2 @@
 ALTER TABLE /*$wgDBprefix*/archive
-  ADD ar_content_model varbinary(32) DEFAULT NULL;
+  ADD ar_content_model int unsigned DEFAULT NULL;
diff --git a/maintenance/archives/patch-page-page_content_model.sql b/maintenance/archives/patch-page-page_content_model.sql
index 30434d93ce..89df112b81 100644
--- a/maintenance/archives/patch-page-page_content_model.sql
+++ b/maintenance/archives/patch-page-page_content_model.sql
@@ -1,2 +1,2 @@
 ALTER TABLE /*$wgDBprefix*/page
-  ADD page_content_model varbinary(32) DEFAULT NULL;
+  ADD page_content_model int unsigned DEFAULT NULL;
diff --git a/maintenance/archives/patch-revision-rev_content_format.sql b/maintenance/archives/patch-revision-rev_content_format.sql
index 22aeb8a760..eed0306656 100644
--- a/maintenance/archives/patch-revision-rev_content_format.sql
+++ b/maintenance/archives/patch-revision-rev_content_format.sql
@@ -1,2 +1,2 @@
 ALTER TABLE /*$wgDBprefix*/revision
-  ADD rev_content_format varbinary(64) DEFAULT NULL;
+  ADD rev_content_format int unsigned DEFAULT NULL;
diff --git a/maintenance/archives/patch-revision-rev_content_model.sql b/maintenance/archives/patch-revision-rev_content_model.sql
index 1ba05721cc..1834b75d20 100644
--- a/maintenance/archives/patch-revision-rev_content_model.sql
+++ b/maintenance/archives/patch-revision-rev_content_model.sql
@@ -1,2 +1,2 @@
 ALTER TABLE /*$wgDBprefix*/revision
-  ADD rev_content_model varbinary(32) DEFAULT NULL;
+  ADD rev_content_model int unsigned DEFAULT NULL;
diff --git a/maintenance/tables.sql b/maintenance/tables.sql
index a0601f1e4a..37effdff3f 100644
--- a/maintenance/tables.sql
+++ b/maintenance/tables.sql
@@ -262,8 +262,8 @@ CREATE TABLE /*_*/page (
   -- Uncompressed length in bytes of the page's current source text.
   page_len int unsigned NOT NULL,
 
-  -- content model
-  page_content_model  varbinary(32) default NULL
+  -- content model, see CONTENT_MODEL_XXX constants
+  page_content_model  int unsigned  default NULL
 ) /*$wgDBTableOptions*/;
 
 CREATE UNIQUE INDEX /*i*/name_title ON /*_*/page (page_namespace,page_title);
@@ -321,11 +321,11 @@ CREATE TABLE /*_*/revision (
   -- SHA-1 text content hash in base-36
   rev_sha1 varbinary(32) NOT NULL default '',
 
-  -- content model
-  rev_content_model  varbinary(32) default NULL,
+  -- content model, see CONTENT_MODEL_XXX constants
+  rev_content_model  int unsigned  default NULL,
 
-  -- content format (mime type)
-  rev_content_format varbinary(64) default NULL
+  -- content format, see CONTENT_FORMAT_XXX constants
+  rev_content_format int unsigned  default NULL
 
 ) /*$wgDBTableOptions*/ MAX_ROWS=10000000 AVG_ROW_LENGTH=1024;
 -- In case tables are created as MyISAM, use row hints for MySQL <5.0 to avoid 4GB limit
@@ -438,11 +438,11 @@ CREATE TABLE /*_*/archive (
   -- SHA-1 text content hash in base-36
   ar_sha1 varbinary(32) NOT NULL default '',
 
-  -- content model
-  ar_content_model  varbinary(32) default NULL,
+  -- content model, see CONTENT_MODEL_XXX constants
+  ar_content_model  int unsigned default NULL,
 
-  -- content format (mime type)
-  ar_content_format varbinary(64) default NULL
+  -- content format, see CONTENT_MODEL_XXX constants
+  ar_content_format int unsigned default NULL
 
 ) /*$wgDBTableOptions*/;
 
diff --git a/tests/phpunit/includes/ContentHandlerTest.php b/tests/phpunit/includes/ContentHandlerTest.php
index ef0d3f8ded..8465c20569 100644
--- a/tests/phpunit/includes/ContentHandlerTest.php
+++ b/tests/phpunit/includes/ContentHandlerTest.php
@@ -1,5 +1,8 @@
 resetNamespaces(); # reset namespace cache
@@ -22,7 +25,7 @@ class ContentHandlerTest extends MediaWikiTestCase {
 		unset( $wgExtraNamespaces[ 12313 ] );
 
 		unset( $wgNamespaceContentModels[ 12312 ] );
-		unset( $wgContentHandlers[ 'DUMMY' ] );
+		unset( $wgContentHandlers[ 999999 ] );
 
 		MWNamespace::getCanonicalNamespaces( true ); # reset namespace cache
 		$wgContLang->resetNamespaces(); # reset namespace cache
@@ -51,9 +54,9 @@ class ContentHandlerTest extends MediaWikiTestCase {
 	/**
 	 * @dataProvider dataGetDefaultModelFor
 	 */
-	public function testGetDefaultModelFor( $title, $expectedModelName ) {
+	public function testGetDefaultModelFor( $title, $expectedModelId ) {
 		$title = Title::newFromText( $title );
-		$this->assertEquals( $expectedModelName, ContentHandler::getDefaultModelFor( $title ) );
+		$this->assertEquals( $expectedModelId, ContentHandler::getDefaultModelFor( $title ) );
 	}
 	/**
 	 * @dataProvider dataGetDefaultModelFor
@@ -61,7 +64,79 @@ class ContentHandlerTest extends MediaWikiTestCase {
 	public function testGetForTitle( $title, $expectedContentModel ) {
 		$title = Title::newFromText( $title );
 		$handler = ContentHandler::getForTitle( $title );
-		$this->assertEquals( $expectedContentModel, $handler->getModelName() );
+		$this->assertEquals( $expectedContentModel, $handler->getModelID() );
+	}
+
+	public function dataGetContentFormatMimeType( ) {
+		return array(
+			array( 0, null ),
+			array( null, null ),
+			array( 99887766, null ),
+
+			array( CONTENT_FORMAT_WIKITEXT, 'text/x-wiki' ),
+			array( CONTENT_FORMAT_JAVASCRIPT, 'text/javascript' ),
+			array( CONTENT_FORMAT_CSS, 'text/css' ),
+			array( CONTENT_FORMAT_JSON, 'application/json' ),
+			array( CONTENT_FORMAT_XML, 'application/xml' ),
+			array( CONTENT_FORMAT_SERIALIZED, 'application/vnd.php.serialized' ),
+		);
+	}
+
+	/**
+	 * @dataProvider dataGetContentFormatMimeType
+	 */
+	public function testGetContentFormatMimeType( $id, $expectedMime ) {
+		$mime = ContentHandler::getContentFormatMimeType( $id );
+
+		$this->assertEquals( $expectedMime, $mime );
+	}
+
+	public function dataGetContentFormatID( ) {
+		return array(
+			array( '', null ),
+			array( 'foo', null ),
+			array( null, null ),
+
+			array( 'text/x-wiki', CONTENT_FORMAT_WIKITEXT ),
+			array( 'text/javascript', CONTENT_FORMAT_JAVASCRIPT ),
+			array( 'text/css', CONTENT_FORMAT_CSS ),
+			array( 'application/json', CONTENT_FORMAT_JSON ),
+			array( 'application/xml', CONTENT_FORMAT_XML ),
+			array( 'application/vnd.php.serialized', CONTENT_FORMAT_SERIALIZED ),
+		);
+	}
+
+	/**
+	 * @dataProvider dataGetContentFormatID
+	 */
+	public function testGetContentFormatID( $mime, $expectedId ) {
+		$id = ContentHandler::getContentFormatID( $mime );
+
+		$this->assertEquals( $expectedId, $id );
+	}
+
+	public function dataGetContentModelName() {
+		return array(
+			array( 0, null ),
+			array( null, null ),
+			array( 99887766, null ),
+
+			array( CONTENT_MODEL_JAVASCRIPT, '/javascript/i' ), //XXX: depends on content language
+		);
+	}
+
+	/**
+	 * @dataProvider dataGetContentModelName
+	 */
+	public function testGetContentModelName( $id, $expected ) {
+		$name = ContentHandler::getContentModelName( $id );
+
+		if ( $expected === null ) {
+			$this->assertNull( $name, "content model name for #$id was expected to be null" );
+		} else {
+			$this->assertNotNull( $name, "no name found for content model #$id" );
+			$this->assertTrue( preg_match( $expected, $name ) > 0 , "content model name for #$id did not match pattern $expected" );
+		}
 	}
 
 	public function testGetContentText_Null( ) {
@@ -124,45 +199,45 @@ class ContentHandlerTest extends MediaWikiTestCase {
 		$this->assertNull( $text );
 	}
 
-	#public static function makeContent( $text, Title $title, $modelName = null, $format = null )
+	#public static function makeContent( $text, Title $title, $modelId = null, $format = null )
 
 	public function dataMakeContent() {
 		return array(
 			array( 'hallo', 'Test', null, null, CONTENT_MODEL_WIKITEXT, 'hallo', false ),
 			array( 'hallo', 'MediaWiki:Test.js', null, null, CONTENT_MODEL_JAVASCRIPT, 'hallo', false ),
-			array( serialize('hallo'), 'Dummy:Test', null, null, 'DUMMY', 'hallo', false ),
+			array( serialize('hallo'), 'Dummy:Test', null, null, 999999, 'hallo', false ),
 
-			array( 'hallo', 'Test', null, 'text/x-wiki', CONTENT_MODEL_WIKITEXT, 'hallo', false ),
-			array( 'hallo', 'MediaWiki:Test.js', null, 'text/javascript', CONTENT_MODEL_JAVASCRIPT, 'hallo', false ),
-			array( serialize('hallo'), 'Dummy:Test', null, 'dummy', 'DUMMY', 'hallo', false ),
+			array( 'hallo', 'Test', null, CONTENT_FORMAT_WIKITEXT, CONTENT_MODEL_WIKITEXT, 'hallo', false ),
+			array( 'hallo', 'MediaWiki:Test.js', null, CONTENT_FORMAT_JAVASCRIPT, CONTENT_MODEL_JAVASCRIPT, 'hallo', false ),
+			array( serialize('hallo'), 'Dummy:Test', null, 999999, 999999, 'hallo', false ),
 
 			array( 'hallo', 'Test', CONTENT_MODEL_CSS, null, CONTENT_MODEL_CSS, 'hallo', false ),
 			array( 'hallo', 'MediaWiki:Test.js', CONTENT_MODEL_CSS, null, CONTENT_MODEL_CSS, 'hallo', false ),
 			array( serialize('hallo'), 'Dummy:Test', CONTENT_MODEL_CSS, null, CONTENT_MODEL_CSS, serialize('hallo'), false ),
 
-			array( 'hallo', 'Test', CONTENT_MODEL_WIKITEXT, 'dummy', null, null, true ),
-			array( 'hallo', 'MediaWiki:Test.js', CONTENT_MODEL_CSS, 'dummy', null, null, true ),
-			array( 'hallo', 'Dummy:Test', CONTENT_MODEL_JAVASCRIPT, 'dummy', null, null, true ),
+			array( 'hallo', 'Test', CONTENT_MODEL_WIKITEXT, 999999, null, null, true ),
+			array( 'hallo', 'MediaWiki:Test.js', CONTENT_MODEL_CSS, 999999, null, null, true ),
+			array( 'hallo', 'Dummy:Test', CONTENT_MODEL_JAVASCRIPT, 999999, null, null, true ),
 		);
 	}
 
 	/**
 	 * @dataProvider dataMakeContent
 	 */
-	public function testMakeContent( $data, $title, $modelName, $format, $expectedModelName, $expectedNativeData, $shouldFail ) {
+	public function testMakeContent( $data, $title, $modelId, $format, $expectedModelId, $expectedNativeData, $shouldFail ) {
 		global $wgExtraNamespaces, $wgNamespaceContentModels, $wgContentHandlers;
 
 		$title = Title::newFromText( $title );
 
 		try {
-			$content = ContentHandler::makeContent( $data, $title, $modelName, $format );
+			$content = ContentHandler::makeContent( $data, $title, $modelId, $format );
 
 			if ( $shouldFail ) $this->fail( "ContentHandler::makeContent should have failed!" );
 
-			$this->assertEquals( $expectedModelName, $content->getModelName(), 'bad model name' );
+			$this->assertEquals( $expectedModelId, $content->getModel(), 'bad model id' );
 			$this->assertEquals( $expectedNativeData, $content->getNativeData(), 'bads native data' );
 		} catch ( MWException $ex ) {
-			if ( !$shouldFail ) $this->fail( "ContentHandler::makeContent failed unexpectedly!" );
+			if ( !$shouldFail ) $this->fail( "ContentHandler::makeContent failed unexpectedly: " . $ex->getMessage() );
 			else $this->assertTrue( true ); // dummy, so we don't get the "test did not perform any assertions" message.
 		}
 
@@ -174,7 +249,7 @@ class ContentHandlerTest extends MediaWikiTestCase {
 class DummyContentHandlerForTesting extends ContentHandler {
 
 	public function __construct( $dataModel ) {
-		parent::__construct( $dataModel, array('dummy') );
+		parent::__construct( $dataModel, array( 999999 ) );
 	}
 
 	/**
@@ -215,7 +290,7 @@ class DummyContentHandlerForTesting extends ContentHandler {
 class DummyContentForTesting extends Content {
 
 	public function __construct( $data ) {
-		parent::__construct( "DUMMY" );
+		parent::__construct( 999999 );
 
 		$this->data = $data;
 	}
@@ -280,7 +355,7 @@ class DummyContentForTesting extends Content {
 	 * if $copy = $original->copy()
 	 *
 	 * * get_class($original) === get_class($copy)
-	 * * $original->getModelName() === $copy->getModelName()
+	 * * $original->getModel() === $copy->getModel()
 	 * * $original->equals( $copy )
 	 *
 	 * If and only if the Content object is imutable, the copy() method can and should
diff --git a/tests/phpunit/includes/CssContentTest.php b/tests/phpunit/includes/CssContentTest.php
index 072a6b0224..66b6e7f633 100644
--- a/tests/phpunit/includes/CssContentTest.php
+++ b/tests/phpunit/includes/CssContentTest.php
@@ -1,5 +1,8 @@
 newContent( "hello world." );
 
-		$this->assertEquals( CONTENT_MODEL_JAVASCRIPT, $content->getModelName() );
+		$this->assertEquals( CONTENT_MODEL_CSS, $content->getModel() );
 	}
 
-	public function getContentHandler() {
+	public function testGetContentHandler() {
 		$content = $this->newContent( "hello world." );
 
-		$this->assertEquals( CONTENT_MODEL_JAVASCRIPT, $content->getContentHandler()->getModelName() );
+		$this->assertEquals( CONTENT_MODEL_CSS, $content->getContentHandler()->getModelID() );
 	}
 
 	public function dataEquals( ) {
diff --git a/tests/phpunit/includes/JavascriptContentTest.php b/tests/phpunit/includes/JavascriptContentTest.php
index 41f9f4ae64..7a12ada5cd 100644
--- a/tests/phpunit/includes/JavascriptContentTest.php
+++ b/tests/phpunit/includes/JavascriptContentTest.php
@@ -1,5 +1,8 @@
 newContent( "hello world." );
 
-		$this->assertEquals( CONTENT_MODEL_JAVASCRIPT, $content->getModelName() );
+		$this->assertEquals( CONTENT_MODEL_JAVASCRIPT, $content->getModel() );
 	}
 
-	public function getContentHandler() {
+	public function testGetContentHandler() {
 		$content = $this->newContent( "hello world." );
 
-		$this->assertEquals( CONTENT_MODEL_JAVASCRIPT, $content->getContentHandler()->getModelName() );
+		$this->assertEquals( CONTENT_MODEL_JAVASCRIPT, $content->getContentHandler()->getModelID() );
 	}
 
 	public function dataEquals( ) {
diff --git a/tests/phpunit/includes/RevisionStorageTest.php b/tests/phpunit/includes/RevisionStorageTest.php
index 5622ddf7fe..e1527781cb 100644
--- a/tests/phpunit/includes/RevisionStorageTest.php
+++ b/tests/phpunit/includes/RevisionStorageTest.php
@@ -3,6 +3,7 @@
 /**
  * Test class for Revision storage.
  *
+ * @group ContentHandler
  * @group Database
  * ^--- important, causes temporary tables to be used instead of the real database
  */
@@ -76,7 +77,7 @@ class RevisionStorageTest extends PHPUnit_Framework_TestCase {
 		$this->assertEquals( $orig->getPage(), $rev->getPage() );
 		$this->assertEquals( $orig->getTimestamp(), $rev->getTimestamp() );
 		$this->assertEquals( $orig->getUser(), $rev->getUser() );
-		$this->assertEquals( $orig->getContentModelName(), $rev->getContentModelName() );
+		$this->assertEquals( $orig->getContentModel(), $rev->getContentModel() );
 		$this->assertEquals( $orig->getContentFormat(), $rev->getContentFormat() );
 		$this->assertEquals( $orig->getSha1(), $rev->getSha1() );
 	}
@@ -251,14 +252,14 @@ class RevisionStorageTest extends PHPUnit_Framework_TestCase {
 	}
 
 	/**
-	 * @covers Revision::getContentModelName
+	 * @covers Revision::getContentModel
 	 */
-	public function testGetContentModelName()
+	public function testGetContentModel()
 	{
 		$orig = $this->makeRevision( array( 'text' => 'hello hello.', 'content_model' => CONTENT_MODEL_JAVASCRIPT ) );
 		$rev = Revision::newFromId( $orig->getId() );
 
-		$this->assertEquals( CONTENT_MODEL_JAVASCRIPT, $rev->getContentModelName() );
+		$this->assertEquals( CONTENT_MODEL_JAVASCRIPT, $rev->getContentModel() );
 	}
 
 	/**
@@ -266,10 +267,10 @@ class RevisionStorageTest extends PHPUnit_Framework_TestCase {
 	 */
 	public function testGetContentFormat()
 	{
-		$orig = $this->makeRevision( array( 'text' => 'hello hello.', 'content_model' => CONTENT_MODEL_JAVASCRIPT, 'content_format' => 'text/javascript' ) );
+		$orig = $this->makeRevision( array( 'text' => 'hello hello.', 'content_model' => CONTENT_MODEL_JAVASCRIPT, 'content_format' => CONTENT_FORMAT_JAVASCRIPT ) );
 		$rev = Revision::newFromId( $orig->getId() );
 
-		$this->assertEquals( 'text/javascript', $rev->getContentFormat() );
+		$this->assertEquals( CONTENT_FORMAT_JAVASCRIPT, $rev->getContentFormat() );
 	}
 
 	/**
diff --git a/tests/phpunit/includes/RevisionStorageTest_ContentHandlerUseDB.php b/tests/phpunit/includes/RevisionStorageTest_ContentHandlerUseDB.php
index 42ec4f2f82..d4bf4e83fd 100644
--- a/tests/phpunit/includes/RevisionStorageTest_ContentHandlerUseDB.php
+++ b/tests/phpunit/includes/RevisionStorageTest_ContentHandlerUseDB.php
@@ -1,7 +1,7 @@
 makeRevision( array( 'text' => 'hello hello.', 'content_model' => CONTENT_MODEL_JAVASCRIPT ) );
 		$rev = Revision::newFromId( $orig->getId() );
 
 		//NOTE: database fields for the content_model are disabled, so the model name is not retained.
 		//      We expect to get the default here instead of what was suppleid when creating the revision.
-		$this->assertEquals( CONTENT_MODEL_WIKITEXT, $rev->getContentModelName() );
+		$this->assertEquals( CONTENT_MODEL_WIKITEXT, $rev->getContentModel() );
 	}
 
 
diff --git a/tests/phpunit/includes/RevisionTest.php b/tests/phpunit/includes/RevisionTest.php
index bbe8641d11..ed7d919a5a 100644
--- a/tests/phpunit/includes/RevisionTest.php
+++ b/tests/phpunit/includes/RevisionTest.php
@@ -1,5 +1,8 @@
 resetNamespaces(); # reset namespace cache
@@ -183,7 +186,7 @@ class RevisionTest extends MediaWikiTestCase {
 		return array(
 			array( 'hello world', 'Hello', null, null, CONTENT_MODEL_WIKITEXT ),
 			array( 'hello world', 'User:hello/there.css', null, null, CONTENT_MODEL_CSS ),
-			array( serialize('hello world'), 'Dummy:Hello', null, null, 'DUMMY' ),
+			array( serialize('hello world'), 'Dummy:Hello', null, null, 999999 ),
 		);
 	}
 
@@ -193,15 +196,15 @@ class RevisionTest extends MediaWikiTestCase {
 	function testGetContentModel( $text, $title, $model, $format, $expectedModel ) {
 		$rev = $this->newTestRevision( $text, $title, $model, $format );
 
-		$this->assertEquals( $expectedModel, $rev->getContentModelName() );
+		$this->assertEquals( $expectedModel, $rev->getContentModel() );
 	}
 
 	function dataGetContentFormat() {
 		return array(
-			array( 'hello world', 'Hello', null, null, 'text/x-wiki' ),
-			array( 'hello world', 'Hello', CONTENT_MODEL_CSS, null, 'text/css' ),
-			array( 'hello world', 'User:hello/there.css', null, null, 'text/css' ),
-			array( serialize('hello world'), 'Dummy:Hello', null, null, 'dummy' ),
+			array( 'hello world', 'Hello', null, null, CONTENT_FORMAT_WIKITEXT ),
+			array( 'hello world', 'Hello', CONTENT_MODEL_CSS, null, CONTENT_FORMAT_CSS ),
+			array( 'hello world', 'User:hello/there.css', null, null, CONTENT_FORMAT_CSS ),
+			array( serialize('hello world'), 'Dummy:Hello', null, null, 999999 ),
 		);
 	}
 
@@ -234,7 +237,7 @@ class RevisionTest extends MediaWikiTestCase {
 	function dataGetContent() {
 		return array(
 			array( 'hello world', 'Hello', null, null, Revision::FOR_PUBLIC, 'hello world' ),
-			array( serialize('hello world'), 'Hello', 'DUMMY', null, Revision::FOR_PUBLIC, serialize('hello world') ),
+			array( serialize('hello world'), 'Hello', 999999, null, Revision::FOR_PUBLIC, serialize('hello world') ),
 			array( serialize('hello world'), 'Dummy:Hello', null, null, Revision::FOR_PUBLIC, serialize('hello world') ),
 		);
 	}
@@ -252,7 +255,7 @@ class RevisionTest extends MediaWikiTestCase {
 	function dataGetText() {
 		return array(
 			array( 'hello world', 'Hello', null, null, Revision::FOR_PUBLIC, 'hello world' ),
-			array( serialize('hello world'), 'Hello', 'DUMMY', null, Revision::FOR_PUBLIC, null ),
+			array( serialize('hello world'), 'Hello', 999999, null, Revision::FOR_PUBLIC, null ),
 			array( serialize('hello world'), 'Dummy:Hello', null, null, Revision::FOR_PUBLIC, null ),
 		);
 	}
@@ -279,7 +282,7 @@ class RevisionTest extends MediaWikiTestCase {
 	public function dataGetSize( ) {
 		return array(
 			array( "hello world.", null, 12 ),
-			array( serialize( "hello world." ), "DUMMY", 12 ),
+			array( serialize( "hello world." ), 999999, 12 ),
 		);
 	}
 
@@ -296,7 +299,7 @@ class RevisionTest extends MediaWikiTestCase {
 	public function dataGetSha1( ) {
 		return array(
 			array( "hello world.", null, Revision::base36Sha1( "hello world." ) ),
-			array( serialize( "hello world." ), "DUMMY", Revision::base36Sha1( serialize( "hello world." ) ) ),
+			array( serialize( "hello world." ), 999999, Revision::base36Sha1( serialize( "hello world." ) ) ),
 		);
 	}
 
@@ -318,8 +321,8 @@ class RevisionTest extends MediaWikiTestCase {
 
 		$this->assertNotNull( $rev->getText(), 'no content text' );
 		$this->assertNotNull( $rev->getContent(), 'no content object available' );
-		$this->assertEquals( CONTENT_MODEL_JAVASCRIPT, $rev->getContent()->getModelName() );
-		$this->assertEquals( CONTENT_MODEL_JAVASCRIPT, $rev->getContentModelName() );
+		$this->assertEquals( CONTENT_MODEL_JAVASCRIPT, $rev->getContent()->getModel() );
+		$this->assertEquals( CONTENT_MODEL_JAVASCRIPT, $rev->getContentModel() );
 	}
 
 	public function testConstructWithContent() {
@@ -331,8 +334,8 @@ class RevisionTest extends MediaWikiTestCase {
 
 		$this->assertNotNull( $rev->getText(), 'no content text' );
 		$this->assertNotNull( $rev->getContent(), 'no content object available' );
-		$this->assertEquals( CONTENT_MODEL_JAVASCRIPT, $rev->getContent()->getModelName() );
-		$this->assertEquals( CONTENT_MODEL_JAVASCRIPT, $rev->getContentModelName() );
+		$this->assertEquals( CONTENT_MODEL_JAVASCRIPT, $rev->getContent()->getModel() );
+		$this->assertEquals( CONTENT_MODEL_JAVASCRIPT, $rev->getContentModel() );
 	}
 
 }
diff --git a/tests/phpunit/includes/TitleMethodsTest.php b/tests/phpunit/includes/TitleMethodsTest.php
index fcf197601f..4edff7285a 100644
--- a/tests/phpunit/includes/TitleMethodsTest.php
+++ b/tests/phpunit/includes/TitleMethodsTest.php
@@ -1,5 +1,8 @@
 assertEquals( $expectedModelName, $title->getContentModelName() );
+		$this->assertEquals( $expectedModelId, $title->getContentModel() );
 	}
 
 	/**
-	 * @dataProvider dataGetContentModelName
+	 * @dataProvider dataGetContentModel
 	 */
-	public function testHasContentModel( $title, $expectedModelName ) {
+	public function testHasContentModel( $title, $expectedModelId ) {
 		$title = Title::newFromText( $title );
-		$this->assertTrue( $title->hasContentModel( $expectedModelName ) );
+		$this->assertTrue( $title->hasContentModel( $expectedModelId ) );
 	}
 
 	public function dataIsCssOrJsPage() {
diff --git a/tests/phpunit/includes/WikiPageTest.php b/tests/phpunit/includes/WikiPageTest.php
index 3db47f3327..3f3ba5aac6 100644
--- a/tests/phpunit/includes/WikiPageTest.php
+++ b/tests/phpunit/includes/WikiPageTest.php
@@ -1,5 +1,6 @@
 assertEquals( "some text", $text );
 	}
 
-	public function testGetContentModelName() {
-		$page = $this->createPage( "WikiPageTest_testGetContentModelName", "some text", CONTENT_MODEL_JAVASCRIPT );
+	public function testGetContentModel() {
+		$page = $this->createPage( "WikiPageTest_testGetContentModel", "some text", CONTENT_MODEL_JAVASCRIPT );
 
 		$page = new WikiPage( $page->getTitle() );
-		$this->assertEquals( CONTENT_MODEL_JAVASCRIPT, $page->getContentModelName() );
+		$this->assertEquals( CONTENT_MODEL_JAVASCRIPT, $page->getContentModel() );
 	}
 
 	public function testGetContentHandler() {
@@ -536,7 +537,7 @@ more stuff
 	public function testReplaceSectionContent( $title, $text, $section, $with, $sectionTitle, $expected ) {
 		$page = $this->createPage( $title, $text );
 
-		$content = ContentHandler::makeContent( $with, $page->getTitle(), $page->getContentModelName() );
+		$content = ContentHandler::makeContent( $with, $page->getTitle(), $page->getContentModel() );
 		$c = $page->replaceSectionContent( $section, $content, $sectionTitle );
 
 		$this->assertEquals( $expected, is_null( $c ) ? null : trim( $c->getNativeData() ) );
@@ -773,7 +774,7 @@ more stuff
 			if ( !empty( $edit[1] ) ) $user->setName( $edit[1] );
 			else $user = $wgUser;
 
-			$content = ContentHandler::makeContent( $edit[0], $page->getTitle(), $page->getContentModelName() );
+			$content = ContentHandler::makeContent( $edit[0], $page->getTitle(), $page->getContentModel() );
 
 			$page->doEditContent( $content, "test edit $c", $c < 2 ? EDIT_NEW : 0, false, $user );
 
diff --git a/tests/phpunit/includes/WikiPageTest_ContentHandlerUseDB.php b/tests/phpunit/includes/WikiPageTest_ContentHandlerUseDB.php
index 91b5f2746f..1af6806b79 100644
--- a/tests/phpunit/includes/WikiPageTest_ContentHandlerUseDB.php
+++ b/tests/phpunit/includes/WikiPageTest_ContentHandlerUseDB.php
@@ -1,7 +1,7 @@
 createPage( "WikiPageTest_testGetContentModelName", "some text", CONTENT_MODEL_JAVASCRIPT );
+	public function testGetContentModel() {
+		$page = $this->createPage( "WikiPageTest_testGetContentModel", "some text", CONTENT_MODEL_JAVASCRIPT );
 
 		$page = new WikiPage( $page->getTitle() );
 
 		// NOTE: since the content model is not recorded in the database,
 		//       we expect to get the default, namely CONTENT_MODEL_WIKITEXT
-		$this->assertEquals( CONTENT_MODEL_WIKITEXT, $page->getContentModelName() );
+		$this->assertEquals( CONTENT_MODEL_WIKITEXT, $page->getContentModel() );
 	}
 
 	public function testGetContentHandler() {
diff --git a/tests/phpunit/includes/WikitextContentHandlerTest.php b/tests/phpunit/includes/WikitextContentHandlerTest.php
index c6b899f3bd..a493aacb0f 100644
--- a/tests/phpunit/includes/WikitextContentHandlerTest.php
+++ b/tests/phpunit/includes/WikitextContentHandlerTest.php
@@ -1,5 +1,8 @@
 handler = ContentHandler::getForModelName( CONTENT_MODEL_WIKITEXT );
+		$this->handler = ContentHandler::getForModelID( CONTENT_MODEL_WIKITEXT );
 	}
 
 	public function teardown() {
@@ -18,7 +21,7 @@ class WikitextContentHandlerTest extends MediaWikiTestCase {
 		$content = new WikitextContent( 'hello world' );
 
 		$this->assertEquals( 'hello world', $this->handler->serializeContent( $content ) );
-		$this->assertEquals( 'hello world', $this->handler->serializeContent( $content, 'text/x-wiki' ) );
+		$this->assertEquals( 'hello world', $this->handler->serializeContent( $content, CONTENT_FORMAT_WIKITEXT ) );
 
 		try {
 			$this->handler->serializeContent( $content, 'dummy/foo' );
@@ -32,7 +35,7 @@ class WikitextContentHandlerTest extends MediaWikiTestCase {
 		$content = $this->handler->unserializeContent( 'hello world' );
 		$this->assertEquals( 'hello world', $content->getNativeData() );
 
-		$content = $this->handler->unserializeContent( 'hello world', 'text/x-wiki' );
+		$content = $this->handler->unserializeContent( 'hello world', CONTENT_FORMAT_WIKITEXT );
 		$this->assertEquals( 'hello world', $content->getNativeData() );
 
 		try {
@@ -53,8 +56,8 @@ class WikitextContentHandlerTest extends MediaWikiTestCase {
 	public function dataIsSupportedFormat( ) {
 		return array(
 			array( null, true ),
-			array( 'text/x-wiki', true ),
-			array( 'dummy/foo', false ),
+			array( CONTENT_FORMAT_WIKITEXT, true ),
+			array( 99887766, false ),
 		);
 	}
 
diff --git a/tests/phpunit/includes/WikitextContentTest.php b/tests/phpunit/includes/WikitextContentTest.php
index 35e2e778cd..57f992adc1 100644
--- a/tests/phpunit/includes/WikitextContentTest.php
+++ b/tests/phpunit/includes/WikitextContentTest.php
@@ -1,5 +1,8 @@
 newContent( "hello world." );
 
-		$this->assertEquals( CONTENT_MODEL_WIKITEXT, $content->getModelName() );
+		$this->assertEquals( CONTENT_MODEL_WIKITEXT, $content->getModel() );
 	}
 
-	public function getContentHandler() {
+	public function testGetContentHandler() {
 		$content = $this->newContent( "hello world." );
 
-		$this->assertEquals( CONTENT_MODEL_WIKITEXT, $content->getContentHandler()->getModelName() );
+		$this->assertEquals( CONTENT_MODEL_WIKITEXT, $content->getContentHandler()->getModelID() );
 	}
 
 	public function dataIsEmpty( ) {