Merge "Addition of a parser test for page= parameter of image inclusion"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Tue, 29 Apr 2014 19:29:20 +0000 (19:29 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Tue, 29 Apr 2014 19:29:20 +0000 (19:29 +0000)
29 files changed:
includes/Skin.php
includes/UserMailer.php
includes/WikiPage.php
includes/context/ContextSource.php
includes/context/DerivativeContext.php
includes/context/IContextSource.php
includes/context/RequestContext.php
maintenance/jsduck/MetaTags.rb [deleted file]
maintenance/jsduck/config.json
maintenance/mwjsduck-gen
resources/src/jquery/jquery.byteLength.js
resources/src/jquery/jquery.checkboxShiftClick.js
resources/src/jquery/jquery.footHovzer.js
resources/src/jquery/jquery.getAttrs.js
resources/src/jquery/jquery.hidpi.js
resources/src/jquery/jquery.tabIndex.js
resources/src/mediawiki.action/mediawiki.action.edit.preview.js
resources/src/mediawiki.action/mediawiki.action.edit.styles.css
resources/src/mediawiki.action/mediawiki.action.history.js
resources/src/mediawiki.action/mediawiki.action.view.dblClickEdit.js
resources/src/mediawiki.action/mediawiki.action.view.metadata.js
resources/src/mediawiki.action/mediawiki.action.view.redirectToFragment.js
resources/src/mediawiki.action/mediawiki.action.view.rightClickEdit.js
resources/src/mediawiki.page/mediawiki.page.gallery.js
resources/src/mediawiki.page/mediawiki.page.image.pagination.js
resources/src/mediawiki.page/mediawiki.page.patrol.ajax.js
resources/src/mediawiki/mediawiki.js
resources/src/mediawiki/mediawiki.user.js
skins/common/wikibits.js

index d3fa607..8300da7 100644 (file)
@@ -683,7 +683,7 @@ abstract class Skin extends ContextSource {
                        // oldid not available for non existing pages
                        $url = htmlspecialchars( wfExpandIRI( $this->getTitle()->getCanonicalURL() ) );
                }
-               return $this->msg( 'retrievedfrom', '<a href="' . $url . '">' . $url . '</a>' )->text();
+               return $this->msg( 'retrievedfrom', '<a dir="ltr" href="' . $url . '">' . $url . '</a>' )->text();
        }
 
        /**
index 2094b62..025d704 100644 (file)
@@ -738,13 +738,13 @@ class EmailNotification {
                                        ->inContentLanguage()->text();
                        }
                        $keys['$OLDID'] = $this->oldid;
-                       // @deprecated Remove in MediaWiki 1.23.
+                       // Deprecated since MediaWiki 1.21, not used by default. Kept for backwards-compatibility.
                        $keys['$CHANGEDORCREATED'] = wfMessage( 'changed' )->inContentLanguage()->text();
                } else {
                        # clear $OLDID placeholder in the message template
                        $keys['$OLDID'] = '';
                        $keys['$NEWPAGE'] = '';
-                       // @deprecated Remove in MediaWiki 1.23.
+                       // Deprecated since MediaWiki 1.21, not used by default. Kept for backwards-compatibility.
                        $keys['$CHANGEDORCREATED'] = wfMessage( 'created' )->inContentLanguage()->text();
                }
 
index 42dc134..d53acd0 100644 (file)
@@ -2173,19 +2173,17 @@ class WikiPage implements Page, IDBAccessObject {
 
                if ( !$options['changed'] ) {
                        $good = 0;
-                       $total = 0;
                } elseif ( $options['created'] ) {
                        $good = (int)$this->isCountable( $editInfo );
-                       $total = 1;
                } elseif ( $options['oldcountable'] !== null ) {
                        $good = (int)$this->isCountable( $editInfo ) - (int)$options['oldcountable'];
-                       $total = 0;
                } else {
                        $good = 0;
-                       $total = 0;
                }
+               $edits = $options['changed'] ? 1 : 0;
+               $total = $options['created'] ? 1 : 0;
 
-               DeferredUpdates::addUpdate( new SiteStatsUpdate( 0, 1, $good, $total ) );
+               DeferredUpdates::addUpdate( new SiteStatsUpdate( 0, $edits, $good, $total ) );
                DeferredUpdates::addUpdate( new SearchUpdate( $id, $title, $content ) );
 
                // If this is another user's talk page, update newtalk.
index 9e55059..4a3c2cb 100644 (file)
@@ -83,7 +83,7 @@ abstract class ContextSource implements IContextSource {
         * Get the Title object
         *
         * @since 1.18
-        * @return Title
+        * @return Title|null
         */
        public function getTitle() {
                return $this->getContext()->getTitle();
index f5616e0..32a650f 100644 (file)
@@ -138,7 +138,7 @@ class DerivativeContext extends ContextSource {
        /**
         * Get the Title object
         *
-        * @return Title
+        * @return Title|null
         */
        public function getTitle() {
                if ( !is_null( $this->title ) ) {
index f892b02..5534ee3 100644 (file)
@@ -37,7 +37,7 @@ interface IContextSource {
        /**
         * Get the Title object
         *
-        * @return Title
+        * @return Title|null
         */
        public function getTitle();
 
index 6f27a7a..4291e44 100644 (file)
@@ -131,7 +131,7 @@ class RequestContext implements IContextSource {
        /**
         * Get the Title object
         *
-        * @return Title
+        * @return Title|null
         */
        public function getTitle() {
                if ( $this->title === null ) {
diff --git a/maintenance/jsduck/MetaTags.rb b/maintenance/jsduck/MetaTags.rb
deleted file mode 100644 (file)
index cde7d3b..0000000
+++ /dev/null
@@ -1,103 +0,0 @@
-# Custom tags for JSDuck 4.x
-# See also:
-# - https://github.com/senchalabs/jsduck/wiki/Tags
-# - https://github.com/senchalabs/jsduck/wiki/Custom-tags
-# - https://github.com/senchalabs/jsduck/wiki/Custom-tags/7f5c32e568eab9edc8e3365e935bcb836cb11f1d
-require 'jsduck/meta_tag'
-
-class SourceTag < JsDuck::MetaTag
-  def initialize
-    # This defines the name of the @tag
-    @name = 'source'
-  end
-
-  # Generate HTML output for this tag.
-  # One can make use of the #format method to easily support
-  # Markdown and {@link} tags inside the contents of the tag.
-  #
-  # @param tags All matches of this tag on one class.
-  def to_html(tags)
-    '<h3 class="pa">Source</h3>' + tags.map {|tag| format(tag) }.join("\n")
-  end
-end
-
-class ContextTag < JsDuck::MetaTag
-  def initialize
-    @name = 'context'
-  end
-
-  # @param tags All matches of this tag on one class.
-  def to_html(tags)
-    return '<h3 class="pa">Context</h3>' +  render_long_context(tags.last)
-  end
-
-  def render_long_context(tag)
-    if tag =~ /\A([^\s]+)/m
-      name = $1
-      return format("`this` : {@link #{name}}")
-    end
-  end
-end
-
-class SeeTag < JsDuck::MetaTag
-  def initialize
-    @name = 'see'
-    @multiline = true
-  end
-
-  # @param tags All matches of this tag on one class.
-  def to_html(tags)
-    doc = []
-    doc << '<h3 class="pa">Related</h3>'
-    doc << [
-        '<ul>',
-        tags.map {|tag| render_long_see(tag) },
-        '</ul>',
-      ]
-    doc
-  end
-
-  def render_long_see(tag)
-    if tag =~ /\A([^\s]+)( .*)?\Z/m
-      name = $1
-      doc = $2 ? ': ' + $2 : ''
-      return [
-        '<li>',
-        format("{@link #{name}} #{doc}"),
-        '</li>'
-      ]
-    end
-  end
-end
-
-# As of JSDuck 5 this is in core
-class FiresTag < JsDuck::MetaTag
-  def initialize
-    @name = 'fires'
-    @multiline = true
-  end
-
-  # @param tags All matches of this tag on one class.
-  def to_html(tags)
-    doc = []
-    doc << '<h3 class="pa">Fires</h3>'
-    doc << [
-        '<ul>',
-        tags.map {|tag| render_long_event(tag) },
-        '</ul>',
-      ]
-    doc
-  end
-
-  def render_long_event(tag)
-    if tag =~ /\A(\w+)( .*)?\Z/m
-      name = $1
-      doc = $2 ? ': ' + $2 : ''
-      return [
-        '<li>',
-        format("{@link #event-#{name}} #{doc}"),
-        '</li>'
-      ]
-    end
-  end
-end
index 5d2e304..65ead02 100644 (file)
@@ -1,30 +1,37 @@
 {
        "--title": "MediaWiki core - Documentation",
-       "--footer": "Documentation for MediaWiki core. Generated on {DATE} by {JSDUCK} {VERSION}.",
        "--categories": "./categories.json",
        "--eg-iframe": "./eg-iframe.html",
+       "--tags": "./CustomTags.rb",
+       "--warnings": ["-nodoc(class,public)"],
        "--builtin-classes": true,
-       "--output": "../../docs/js",
+       "--warnings-exit-nonzero": true,
        "--external": "HTMLElement,HTMLDocument,Window",
+       "--footer": "Documentation for MediaWiki core. Generated on {DATE} by {JSDUCK} {VERSION}.",
+       "--output": "../../docs/js",
        "--": [
                "./external.js",
                "../../resources/src/mediawiki",
-               "../../resources/src/mediawiki.action/mediawiki.action.edit.js",
-               "../../resources/src/mediawiki.action/mediawiki.action.view.postEdit.js",
-               "../../resources/src/mediawiki.page/mediawiki.page.startup.js",
-               "../../resources/src/mediawiki.page/mediawiki.page.watch.ajax.js",
+               "../../resources/src/mediawiki.action",
+               "../../resources/src/mediawiki.page",
                "../../resources/src/mediawiki.api",
                "../../resources/src/mediawiki.language",
                "../../resources/src/jquery/jquery.accessKeyLabel.js",
                "../../resources/src/jquery/jquery.arrowSteps.js",
                "../../resources/src/jquery/jquery.autoEllipsis.js",
                "../../resources/src/jquery/jquery.badge.js",
+               "../../resources/src/jquery/jquery.byteLength.js",
                "../../resources/src/jquery/jquery.byteLimit.js",
+               "../../resources/src/jquery/jquery.checkboxShiftClick.js",
                "../../resources/src/jquery/jquery.client.js",
                "../../resources/src/jquery/jquery.colorUtil.js",
+               "../../resources/src/jquery/jquery.footHovzer.js",
+               "../../resources/src/jquery/jquery.getAttrs.js",
+               "../../resources/src/jquery/jquery.hidpi.js",
                "../../resources/src/jquery/jquery.localize.js",
                "../../resources/src/jquery/jquery.makeCollapsible.js",
                "../../resources/src/jquery/jquery.spinner.js",
+               "../../resources/src/jquery/jquery.tabIndex.js",
                "../../resources/lib/oojs",
                "../../resources/lib/oojs-ui"
        ]
index 442163e..cc42307 100755 (executable)
@@ -14,18 +14,9 @@ fi
 
 MWCORE_DIR=$(cd $(dirname $0)/..; pwd)
 
-# Support jsduck 4.x and 5.x
-JSDUCK_VERSION="$(jsduck --version | sed -e 's/[.].*//')"
-if [  "$JSDUCK_VERSION" = "JSDuck 4" ]; then
-       JSDUCK_VERSION_OPT="--meta-tags $MWCORE_DIR/maintenance/jsduck/MetaTags.rb --warnings=-no_doc"
-else
-       JSDUCK_VERSION_OPT="--tags $MWCORE_DIR/maintenance/jsduck/CustomTags.rb --warnings=-nodoc(class,public)"
-fi
-
 jsduck \
 --config=$MWCORE_DIR/maintenance/jsduck/config.json \
-$JSDUCK_VERSION_OPT \
 --footer="Documentation for branch ($JSDUCK_MWVERSION) on {DATE} by {JSDUCK} {VERSION}." \
---processes 0 --warnings-exit-nonzero \
+--processes 0 \
 && echo 'JSDuck execution finished.' \
 && ln -s ../../resources $MWCORE_DIR/docs/js/modules
index 398937e..0b8f9da 100644 (file)
@@ -1,14 +1,16 @@
 /**
- * jQuery.byteLength
- *
- * Calculate the byte length of a string (accounting for UTF-8).
- *
+ * @class jQuery.plugin.byteLength
  * @author Jan Paul Posma, 2011
  * @author Timo Tijhof, 2012
  * @author David Chan, 2013
  */
-jQuery.byteLength = function ( str ) {
 
+/**
+ * Calculate the byte length of a string (accounting for UTF-8).
+ *
+ * @static
+ */
+jQuery.byteLength = function ( str ) {
        // This basically figures out how many bytes a UTF-16 string (which is what js sees)
        // will take in UTF-8 by replacing a 2 byte character with 2 *'s, etc, and counting that.
        // Note, surrogate (\uD800-\uDFFF) characters are counted as 2 bytes, since there's two of them
@@ -27,5 +29,9 @@ jQuery.byteLength = function ( str ) {
                .replace( /[\u0080-\u07FF\uD800-\uDFFF]/g, '**' )
                .replace( /[\u0800-\uD7FF\uE000-\uFFFF]/g, '***' )
                .length;
-
 };
+
+/**
+ * @class jQuery
+ * @mixins jQuery.plugin.byteLength
+ */
index b206566..d99e9f0 100644 (file)
@@ -1,13 +1,15 @@
 /**
- * jQuery checkboxShiftClick
- *
- * This will enable checkboxes to be checked or unchecked in a row by clicking one,
- * holding shift and clicking another one.
- *
- * @author Timo Tijhof, 2011 - 2012
- * @license GPL v2
+ * @class jQuery.plugin.checkboxShiftClick
  */
 ( function ( $ ) {
+
+       /**
+        * Enable checkboxes to be checked or unchecked in a row by clicking one,
+        * holding shift and clicking another one.
+        *
+        * @return {jQuery}
+        * @chainable
+        */
        $.fn.checkboxShiftClick = function () {
                var prevCheckbox = null,
                        $box = this;
                } );
                return $box;
        };
+
+       /**
+        * @class jQuery
+        * @mixins jQuery.plugin.checkboxShiftClick
+        */
+
 }( jQuery ) );
index 56fc32d..de745c3 100644 (file)
@@ -1,14 +1,5 @@
 /**
- * Utility to stack stuff in an overlay fixed on the bottom of the page.
- *
- * Usage:
- * <code>
- *     var hovzer = $.getFootHovzer();
- *     hovzer.$.append( $myCollection );
- *     hovzer.update();
- * </code>
- *
- * @author Timo Tijhof, 2012
+ * @class jQuery.plugin.footHovzer
  */
 ( function ( $ ) {
        var $hovzer, footHovzer, prevHeight, newHeight;
                return $hovzer;
        }
 
+       /**
+        * Utility to stack stuff in an overlay fixed on the bottom of the page.
+        *
+        * Usage:
+        *
+        *     var hovzer = $.getFootHovzer();
+        *     hovzer.$.append( $myCollection );
+        *     hovzer.update();
+        *
+        * @static
+        * @inheritable
+        * @return {jQuery.footHovzer}
+        */
+       $.getFootHovzer = function () {
+               footHovzer.$ = getHovzer();
+               return footHovzer;
+       };
+
+       /**
+        * @private
+        * @class jQuery.footHovzer
+        */
        footHovzer = {
+
+               /**
+                * @property {jQuery} $ The stack container
+                */
+
+               /**
+                * Update dimensions of stack to account for changes in the subtree.
+                */
                update: function () {
                        var $body;
 
                        $body = $( 'body' );
                        if ( prevHeight === undefined ) {
-                               prevHeight = getHovzer().outerHeight( /*includeMargin=*/true );
+                               prevHeight = getHovzer().outerHeight( /* includeMargin = */ true );
                                $body.css( 'paddingBottom', '+=' + prevHeight + 'px' );
                        } else {
                                newHeight = getHovzer().outerHeight( true );
@@ -37,9 +58,9 @@
                }
        };
 
-       $.getFootHovzer = function () {
-               footHovzer.$ = getHovzer();
-               return footHovzer;
-       };
+       /**
+        * @class jQuery
+        * @mixins jQuery.plugin.footHovzer
+        */
 
 }( jQuery ) );
index 25b806b..c44831c 100644 (file)
@@ -1,7 +1,24 @@
 /**
- * Utility to get all attributes of an element directy as an object.
+ * @class jQuery.plugin.getAttrs
+ */
+
+/**
+ * Get the attributes of an element directy as a plain object.
+ *
+ * If there are more elements in the collection, like most jQuery get/read methods,
+ * this method will use the first element in the collection.
+ *
+ * In IE6, the `attributes` map of a node includes *all* allowed attributes
+ * for an element (including those not set). Those will have values like
+ * `undefined`, `null`, `0`, `false`, `""` or `"inherit"`.
  *
- * @author Timo Tijhof, 2011
+ * However there may be attributes genuinely set to one of those values, and there
+ * is no way to distinguish between attributes set to that and those not set and
+ * it being the default. If you need them, set `all` to `true`. They are filtered out
+ * by default.
+ *
+ * @param {boolean} [all=false]
+ * @return {Object}
  */
 jQuery.fn.getAttrs = function ( all ) {
        var map = this[0].attributes,
@@ -10,10 +27,6 @@ jQuery.fn.getAttrs = function ( all ) {
                i, v;
 
        for ( i = 0; i < len; i++ ) {
-               // IE6 includes *all* allowed attributes for thew element (including those
-               // not set). Those have values like undefined, null, 0, false, "" or "inherit".
-               // However there may be genuine attributes set to that. If you need them,
-               // set all to true. They are excluded by default.
                v = map[i].nodeValue;
                if ( all || ( v && v !== 'inherit' ) ) {
                        attrs[ map[i].nodeName ] = v;
@@ -22,3 +35,8 @@ jQuery.fn.getAttrs = function ( all ) {
 
        return attrs;
 };
+
+/**
+ * @class jQuery
+ * @mixins jQuery.plugin.getAttrs
+ */
index eb29db9..99889f1 100644 (file)
@@ -1,21 +1,26 @@
 /**
- * Responsive images based on 'srcset' and 'window.devicePixelRatio' emulation where needed.
+ * Responsive images based on `srcset` and `window.devicePixelRatio` emulation where needed.
  *
- * Call $().hidpi() on a document or part of a document to replace image srcs in that section.
+ * Call `.hidpi()` on a document or part of a document to proces image srcsets within that section.
  *
- * $.devicePixelRatio() can be used to supplement window.devicePixelRatio with support on
- * some additional browsers.
+ * `$.devicePixelRatio()` can be used as a substitute for `window.devicePixelRatio`.
+ * It provides a familiar interface to retrieve the pixel ratio for browsers that don't
+ * implement `window.devicePixelRatio` but do have a different way of getting it.
+ *
+ * @class jQuery.plugin.hidpi
  */
 ( function ( $ ) {
 
 /**
- * Detect reported or approximate device pixel ratio.
- * 1.0 means 1 CSS pixel is 1 hardware pixel
- * 2.0 means 1 CSS pixel is 2 hardware pixels
- * etc
+ * Get reported or approximate device pixel ratio.
+ *
+ * - 1.0 means 1 CSS pixel is 1 hardware pixel
+ * - 2.0 means 1 CSS pixel is 2 hardware pixels
+ * - etc.
  *
- * Uses window.devicePixelRatio if available, or CSS media queries on IE.
+ * Uses `window.devicePixelRatio` if available, or CSS media queries on IE.
  *
+ * @static
  * @return {number} Device pixel ratio
  */
 $.devicePixelRatio = function () {
@@ -51,6 +56,7 @@ $.devicePixelRatio = function () {
  * native srcset support.
  *
  * @return {jQuery} This selection
+ * @chainable
  */
 $.fn.hidpi = function () {
        var $target = this,
@@ -81,9 +87,11 @@ $.fn.hidpi = function () {
  *
  * Exposed for testing.
  *
+ * @private
+ * @static
  * @param {number} devicePixelRatio
  * @param {string} srcset
- * @return {mixed} null or the matching src string
+ * @return {Mixed} null or the matching src string
  */
 $.matchSrcSet = function ( devicePixelRatio, srcset ) {
        var candidates,
@@ -112,4 +120,9 @@ $.matchSrcSet = function ( devicePixelRatio, srcset ) {
        return selectedSrc;
 };
 
+/**
+ * @class jQuery
+ * @mixins jQuery.plugin.hidpi
+ */
+
 }( jQuery ) );
index cdae0ba..46cc8f2 100644 (file)
@@ -1,12 +1,12 @@
 /**
- * jQuery tabIndex
+ * @class jQuery.plugin.tabIndex
  */
 ( function ( $ ) {
 
        /**
-        * Finds the lowerst tabindex in use within a selection
+        * Find the lowest tabindex in use within a selection.
         *
-        * @return number Lowest tabindex on the page
+        * @return {number} Lowest tabindex on the page
         */
        $.fn.firstTabIndex = function () {
                var minTabIndex = null;
@@ -29,9 +29,9 @@
        };
 
        /**
-        * Finds the highest tabindex in use within a selection
+        * Find the highest tabindex in use within a selection.
         *
-        * @return number Highest tabindex on the page
+        * @return {number} Highest tabindex on the page
         */
        $.fn.lastTabIndex = function () {
                var maxTabIndex = null;
@@ -49,4 +49,9 @@
                return maxTabIndex;
        };
 
+       /**
+        * @class jQuery
+        * @mixins jQuery.plugin.tabIndex
+        */
+
 }( jQuery ) );
index 4c2fc3a..6b212c2 100644 (file)
@@ -1,9 +1,10 @@
-/**
+/*!
  * Live edit preview.
  */
 ( function ( mw, $ ) {
 
        /**
+        * @ignore
         * @param {jQuery.Event} e
         */
        function doLivePreview( e ) {
index 2a02d87..8aa5a1f 100644 (file)
@@ -1,4 +1,4 @@
-/**
+/*!
  * JavaScript for History action
  */
 jQuery( function ( $ ) {
@@ -7,6 +7,7 @@ jQuery( function ( $ ) {
                $lis = $( '#pagehistory > li' );
 
        /**
+        * @ignore
         * @context {Element} input
         * @param e {jQuery.Event}
         */
index 727a525..2ded40c 100644 (file)
@@ -1,5 +1,5 @@
-/**
- * This module enables double-click-to-edit functionality.
+/*!
+ * Enables double-click-to-edit functionality.
  */
 ( function ( mw, $ ) {
        $( function () {
index 21f40c5..712cf29 100644 (file)
@@ -1,4 +1,4 @@
-/**
+/*!
  * Exif metadata display for MediaWiki file uploads
  *
  * Add an expand/collapse link and collapse by default if set to
index 93befe3..ada101e 100644 (file)
@@ -1,4 +1,4 @@
-/**
+/*!
  * JavaScript to enable right click edit functionality.
  * When the user right-clicks in a heading, it will open the
  * edit screen.
index f92d372..671cec6 100644 (file)
@@ -1,4 +1,4 @@
-/**
+/*!
  * Show gallery captions when focused. Copied directly from jquery.mw-jump.js.
  * Also Dynamically resize images to justify them.
  */
index 50301bd..4819be0 100644 (file)
@@ -1,4 +1,4 @@
-/**
+/*!
  * Change multi-page image navigation so that the current page display can be changed
  * without a page reload. Currently, the only image formats that can be multi-page images are
  * PDF and DjVu files
index 5fb14dd..1fe0e26 100644 (file)
@@ -1,4 +1,4 @@
-/**
+/*!
  * Animate patrol links to use asynchronous API requests to
  * patrol pages, rather than navigating to a different URI.
  *
index f6154ee..1591a94 100644 (file)
@@ -471,7 +471,7 @@ var mw = ( function ( $, undefined ) {
                 *
                 * This was reserved for future use but never ended up being used.
                 *
-                * @deprecated since 1.22: Let deprecated identifiers keep their original name
+                * @deprecated since 1.22 Let deprecated identifiers keep their original name
                 *  and use mw.log#deprecate to create an access container for tracking.
                 * @property
                 */
index 8344111..0cf897a 100644 (file)
@@ -90,7 +90,7 @@
 
                /**
                 * @inheritdoc #getName
-                * @deprecated since 1.20 use #getName instead
+                * @deprecated since 1.20 Use #getName instead
                 */
                name: function () {
                        return user.getName();
 
                /**
                 * @inheritdoc #isAnon
-                * @deprecated since 1.20 use #isAnon instead
+                * @deprecated since 1.20 Use #isAnon instead
                 */
                anonymous: function () {
                        return user.isAnon();
index 8d80ccb..d30f554 100644 (file)
@@ -19,7 +19,6 @@ if ( mw.config.get( 'wgBreakFrames' ) ) {
 
 /**
  * User-agent sniffing.
- * To be removed in MediaWiki 1.23.
  *
  * @deprecated since 1.17 Use jquery.client instead
  */
@@ -51,8 +50,6 @@ mw.log.deprecate( win, 'ie6_bugs', false, msg );
 /**
  * DOM utilities for handling of events, text nodes and selecting elements
  *
- * To be removed in MediaWiki 1.23.
- *
  * @deprecated since 1.17 Use jQuery instead
  */
 msg = 'Use jQuery instead.';
@@ -104,8 +101,6 @@ $( win ).on( 'load', function () {
 /**
  * Toggle checkboxes with shift selection
  *
- * To be removed in MediaWiki 1.23.
- *
  * @deprecated since 1.17 Use jquery.checkboxShiftClick instead
  */
 msg = 'Use jquery.checkboxShiftClick instead.';
@@ -118,8 +113,6 @@ mw.log.deprecate( win, 'checkboxClickHandler', $.noop, msg );
 /**
  * Add a button to the default editor toolbar
  *
- * To be removed in MediaWiki 1.23.
- *
  * @deprecated since 1.17 Use mw.toolbar instead
  */
 mw.log.deprecate( win, 'mwEditButtons', [], 'Use mw.toolbar instead.' );
@@ -128,8 +121,6 @@ mw.log.deprecate( win, 'mwCustomEditButtons', [], 'Use mw.toolbar instead.' );
 /**
  * Spinner creation, injection and removal
  *
- * To be removed in MediaWiki 1.23.
- *
  * @deprecated since 1.18 Use jquery.spinner instead
  */
 mw.log.deprecate( win, 'injectSpinner', $.noop, 'Use jquery.spinner instead.' );
@@ -138,8 +129,6 @@ mw.log.deprecate( win, 'removeSpinner', $.noop, 'Use jquery.spinner instead.' );
 /**
  * Escape utilities
  *
- * To be removed in MediaWiki 1.23.
- *
  * @deprecated since 1.18 Use mw.html instead
  */
 mw.log.deprecate( win, 'escapeQuotes', $.noop, 'Use mw.html instead.' );
@@ -148,8 +137,6 @@ mw.log.deprecate( win, 'escapeQuotesHTML', $.noop, 'Use mw.html instead.' );
 /**
  * Display a message to the user
  *
- * To be removed in MediaWiki 1.23.
- *
  * @deprecated since 1.17 Use mediawiki.notify instead
  * @param {string|HTMLElement} message To be put inside the message box
  */
@@ -167,8 +154,6 @@ mw.log.deprecate( win, 'jsMsg', function ( message ) {
 /**
  * Misc. utilities
  *
- * To be removed in MediaWiki 1.23.
- *
  * @deprecated since 1.17 Use mediawiki.util instead
  */
 msg = 'Use mediawiki.util instead.';