Merge "Only generate date header when rendering is guaranteed"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Tue, 4 Mar 2014 16:32:14 +0000 (16:32 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Tue, 4 Mar 2014 16:32:14 +0000 (16:32 +0000)
31 files changed:
includes/DefaultSettings.php
includes/PoolCounter.php
includes/Setup.php
includes/SkinTemplate.php
includes/User.php
includes/api/ApiQueryUserContributions.php
includes/filebackend/SwiftFileBackend.php
includes/installer/OracleUpdater.php
includes/specials/SpecialRecentchanges.php
languages/messages/MessagesEn.php
languages/messages/MessagesQqq.php
maintenance/oracle/archives/patch-user_password_expire.sql [new file with mode: 0644]
resources/oojs-ui/i18n/bg.json
resources/oojs-ui/i18n/de.json
resources/oojs-ui/i18n/fr.json
resources/oojs-ui/i18n/hsb.json
resources/oojs-ui/i18n/it.json
resources/oojs-ui/i18n/ja.json
resources/oojs-ui/i18n/mk.json
resources/oojs-ui/i18n/om.json
resources/oojs-ui/i18n/pl.json
resources/oojs-ui/i18n/qqq.json
resources/oojs-ui/i18n/ro.json
resources/oojs-ui/i18n/ru.json
resources/oojs-ui/i18n/sl.json
resources/oojs-ui/i18n/sr-ec.json
resources/oojs-ui/i18n/zh-hans.json
resources/oojs-ui/i18n/zh-hant.json
resources/oojs-ui/oojs-ui.js
resources/oojs-ui/oojs-ui.svg.css
tests/phpunit/includes/SkinTemplateTest.php [new file with mode: 0644]

index 1dae5e7..4ad2188 100644 (file)
@@ -4739,6 +4739,8 @@ $wgRateLimits = array(
 
 /**
  * Set to a filename to log rate limiter hits.
+ *
+ * @deprecated since 1.23, use $wgDebugLogGroups['ratelimit'] instead
  */
 $wgRateLimitLog = null;
 
index b4f14c2..3d4c464 100644 (file)
@@ -186,7 +186,7 @@ abstract class PoolCounterWork {
         * @return void
         */
        function logError( $status ) {
-               wfDebugLog( 'poolcounter', "Pool key '{$this->key}':"
+               wfDebugLog( 'poolcounter', "Pool key '{$this->key}': "
                        . $status->getMessage()->inLanguage( 'en' )->useDatabase( false )->text() );
        }
 
index 0ae6e9b..209edef 100644 (file)
@@ -452,6 +452,11 @@ if ( !$wgHTCPRouting && $wgHTCPMulticastAddress ) {
        );
 }
 
+// Back compatibility for $wgRateLimitLog deprecated with 1.23
+if ( $wgRateLimitLog && ! array_key_exists( 'ratelimit', $wgDebugLogGroups ) ) {
+       $wgDebugLogGroups['ratelimit'] = $wgRateLimitLog;
+}
+
 wfProfileOut( $fname . '-defaults2' );
 wfProfileIn( $fname . '-misc1' );
 
index b13d285..8bccaec 100644 (file)
@@ -1840,7 +1840,7 @@ abstract class BaseTemplate extends QuickTemplate {
         *
         * @param $key string, usually a key from the list you are generating this link from.
         * @param $item array, of list item data containing some of a specific set of keys.
-        * The "id" and "class" keys will be used as attributes for the list item,
+        * The "id", "class" and "itemtitle" keys will be used as attributes for the list item,
         * if "active" contains a value of true a "active" class will also be appended to class.
         *
         * @param $options array
@@ -1857,7 +1857,8 @@ abstract class BaseTemplate extends QuickTemplate {
         * list item directly so they will not be passed to makeLink
         * (however the link will still support a tooltip and accesskey from it)
         * If you need an id or class on a single link you should include a "links"
-        * array with just one link item inside of it.
+        * array with just one link item inside of it. If you want to add a title
+        * to the list item itself, you can set "itemtitle" to the value.
         * $options is also passed on to makeLink calls
         *
         * @return string
@@ -1871,7 +1872,7 @@ abstract class BaseTemplate extends QuickTemplate {
                } else {
                        $link = $item;
                        // These keys are used by makeListItem and shouldn't be passed on to the link
-                       foreach ( array( 'id', 'class', 'active', 'tag' ) as $k ) {
+                       foreach ( array( 'id', 'class', 'active', 'tag', 'itemtitle' ) as $k ) {
                                unset( $link[$k] );
                        }
                        if ( isset( $item['id'] ) && !isset( $item['single-id'] ) ) {
@@ -1896,6 +1897,9 @@ abstract class BaseTemplate extends QuickTemplate {
                        $attrs['class'] .= ' active';
                        $attrs['class'] = trim( $attrs['class'] );
                }
+               if ( isset( $item['itemtitle'] ) ) {
+                       $attrs['title'] = $item['itemtitle'];
+               }
                return Html::rawElement( isset( $options['tag'] ) ? $options['tag'] : 'li', $attrs, $html );
        }
 
index 0b28f66..e728323 100644 (file)
@@ -1602,7 +1602,7 @@ class User {
                        return false;
                }
 
-               global $wgMemc, $wgRateLimitLog;
+               global $wgMemc;
                wfProfileIn( __METHOD__ );
 
                $limits = $wgRateLimits[$action];
@@ -1665,12 +1665,7 @@ class User {
                        // Already pinged?
                        if ( $count ) {
                                if ( $count >= $max ) {
-                                       wfDebug( __METHOD__ . ": tripped! $key at $count $summary\n" );
-                                       if ( $wgRateLimitLog ) {
-                                               wfSuppressWarnings();
-                                               file_put_contents( $wgRateLimitLog, wfTimestamp( TS_MW ) . ' ' . wfWikiID() . ': ' . $this->getName() . " tripped $key at $count $summary\n", FILE_APPEND );
-                                               wfRestoreWarnings();
-                                       }
+                                       wfDebugLog( 'ratelimit', $this->getName() . " tripped! $key at $count $summary");
                                        $triggered = true;
                                } else {
                                        wfDebug( __METHOD__ . ": ok. $key at $count $summary\n" );
index 9ad77d4..16108a2 100644 (file)
@@ -56,6 +56,11 @@ class ApiQueryContributions extends ApiQueryBase {
                $this->fld_patrolled = isset( $prop['patrolled'] );
                $this->fld_tags = isset( $prop['tags'] );
 
+               // Most of this code will use the 'contributions' group DB, which can map to slaves
+               // with extra user based indexes or partioning by user. The additional metadata
+               // queries should use a regular slave since the lookup pattern is not all by user.
+               $dbSecondary = $this->getDB(); // any random slave
+
                // TODO: if the query is going only against the revision table, should this be done?
                $this->selectNamedDB( 'contributions', DB_SLAVE, 'contributions' );
 
@@ -90,7 +95,7 @@ class ApiQueryContributions extends ApiQueryBase {
                                        $revIds[] = $row->rev_parent_id;
                                }
                        }
-                       $this->parentLens = Revision::getParentLengths( $this->getDB(), $revIds );
+                       $this->parentLens = Revision::getParentLengths( $dbSecondary, $revIds );
                        $res->rewind(); // reset
                }
 
index a5c835e..706da96 100644 (file)
@@ -617,8 +617,9 @@ class SwiftFileBackend extends FileBackendStore {
        }
 
        protected function doGetFileStat( array $params ) {
-               $params['concurrency'] = 1;
-               $stats = $this->doGetFileStatMulti( array( 'srcs' => array( $params['src'] ) ) + $params );
+               $params = array( 'srcs' => array( $params['src'] ), 'concurrency' => 1 ) + $params;
+               unset( $params['src'] );
+               $stats = $this->doGetFileStatMulti( $params );
 
                return reset( $stats );
        }
index 6c56b3a..02116ea 100644 (file)
@@ -96,6 +96,7 @@ class OracleUpdater extends DatabaseUpdater {
                        //1.23
                        array( 'addIndex', 'logging', 'i06', 'patch-logging_user_text_type_time_index.sql' ),
                        array( 'addIndex', 'logging', 'i07', 'patch-logging_user_text_time_index.sql' ),
+                       array( 'addField', 'user', 'user_password_expires', 'patch-user_password_expire.sql' ),
 
                        // KEEP THIS AT THE BOTTOM!!
                        array( 'doRebuildDuplicateFunction' ),
index f5a5206..a5710a9 100644 (file)
@@ -753,13 +753,15 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
                // show from this onward link
                $timestamp = wfTimestampNow();
                $now = $lang->userTimeAndDate( $timestamp, $user );
-               $tl = $this->makeOptionsLink(
-                       $now, array( 'from' => $timestamp ), $nondefaults
-               );
-
+               $timenow = $lang->userTime( $timestamp, $user );
+               $datenow = $lang->userDate( $timestamp, $user );
                $rclinks = $this->msg( 'rclinks' )->rawParams( $cl, $dl, $lang->pipeList( $links ) )
                        ->parse();
-               $rclistfrom = $this->msg( 'rclistfrom' )->rawParams( $tl )->parse();
+               $rclistfrom = $this->makeOptionsLink(
+                       $this->msg( 'rclistfrom' )->rawParams( $now, $timenow, $datenow )->parse(),
+                       array( 'from' => $timestamp ),
+                       $nondefaults
+               );
 
                return "{$note}$rclinks<br />$rclistfrom";
        }
index fd2b47f..4210c0c 100644 (file)
@@ -1287,8 +1287,8 @@ You may have already successfully changed your password or requested a new tempo
 To finish logging in, you must set a new password here:',
 'resetpass-temp-password'   => 'Temporary password:',
 'resetpass-abort-generic'   => 'Password change has been aborted by an extension.',
-'resetpass-expired'         => 'Your password has expired. Please set a new password to login.',
-'resetpass-expired-soft'    => 'Your password has expired, and needs to be reset. Please choose a new password now, or click cancel to reset it later.',
+'resetpass-expired'         => 'Your password has expired. Please set a new password to log in.',
+'resetpass-expired-soft'    => 'Your password has expired and needs to be reset. Please choose a new password now, or click "{{int:resetpass-submit-cancel}}" to reset it later.',
 
 # Special:PasswordReset
 'passwordreset'                    => 'Reset password',
@@ -2207,7 +2207,7 @@ Your email address is not revealed when other users contact you.',
 'recentchanges-legend-newpage'      => '(also see [[Special:NewPages|list of new pages]])',
 'recentchanges-legend-plusminus'    => '(<em>±123</em>)', # only translate this message to other languages if you have to change it
 'rcnotefrom'                        => 'Below are the changes since <strong>$2</strong> (up to <strong>$1</strong> shown).',
-'rclistfrom'                        => 'Show new changes starting from $1',
+'rclistfrom'                        => 'Show new changes starting from $2, $3',
 'rcshowhideminor'                   => '$1 minor edits',
 'rcshowhideminor-show'              => 'Show',
 'rcshowhideminor-hide'              => 'Hide',
@@ -3089,7 +3089,7 @@ Deletion of such pages has been restricted to prevent accidental disruption of {
 'delete-warning-toobig'      => 'This page has a large edit history, over $1 {{PLURAL:$1|revision|revisions}}.
 Deleting it may disrupt database operations of {{SITENAME}};
 proceed with caution.',
-'deleting-backlinks-warning' => "'''Warning:''' Other pages link to or transclude from the page you are about to delete.",
+'deleting-backlinks-warning' => "'''Warning:''' Other pages link to or transclude the page you are about to delete.",
 
 # Rollback
 'rollback'                   => 'Roll back edits',
index b9805a9..9e1240c 100644 (file)
@@ -3682,7 +3682,7 @@ Preceded by legend example {{msg-mw|Recentchanges-legend-plusminus}}.',
 A plus/minus sign with a number for the legend.',
 'rcnotefrom' => 'This message is displayed at [[Special:RecentChanges]] when viewing recentchanges from some specific time.
 
-The corresponding message is {{msg-mw|Rclistfrom}} (without split of date and time, [[bugzilla:19104|Bug 19104]]).
+The corresponding message is {{msg-mw|Rclistfrom}} (split into date and time).
 
 Parameters:
 * $1 - the maximum number of changes that are displayed
@@ -3692,7 +3692,9 @@ Parameters:
 'rclistfrom' => 'Used on [[Special:RecentChanges]].
 
 Parameters:
-* $1 - a link to the revision of a specific date and time. The date and the time are the link description (without split of date and time, [[bugzilla:19104|Bug 19104]]).
+* $1 - Revision of a specific date and time. The date and the time adds to the rclistfrom description. No longer used.
+* $2 - Revision of a specific time. The time adds to the rclistfrom link description (with split of date and time).
+* $3 - Revision of a specific date. The date adds to the rclistfrom link description (with split of date and time).
 
 The corresponding message is {{msg-mw|Rcnotefrom}}.',
 'rcshowhideminor' => 'Option text in [[Special:RecentChanges]]. Parameters:
diff --git a/maintenance/oracle/archives/patch-user_password_expire.sql b/maintenance/oracle/archives/patch-user_password_expire.sql
new file mode 100644 (file)
index 0000000..8e752da
--- /dev/null
@@ -0,0 +1,3 @@
+define mw_prefix='{$wgDBprefix}';
+
+ALTER TABLE &mw_prefix.mwuser ADD user_password_expires TIMESTAMP(6) WITH TIME ZONE NULL DEFAULT NULL;
index 67e664b..939719b 100644 (file)
@@ -3,9 +3,11 @@
         "authors": [
             "DCLXVI",
             "Hristofor.mirchev",
-            "පසිඳු කාවින්ද"
+            "පසිඳු කාවින්ද",
+            "Mitzev"
         ]
     },
     "ooui-dialog-action-close": "Затваряне",
+    "ooui-outline-control-remove": "Премахване на обекти",
     "ooui-toolbar-more": "Още"
 }
\ No newline at end of file
index 3a66648..bed2b2c 100644 (file)
@@ -16,5 +16,6 @@
     "ooui-dialog-action-close": "Schließen",
     "ooui-outline-control-move-down": "Element nach unten verschieben",
     "ooui-outline-control-move-up": "Element nach oben verschieben",
+    "ooui-outline-control-remove": "Element entfernen",
     "ooui-toolbar-more": "Mehr"
 }
\ No newline at end of file
index eb24b5a..7674d2f 100644 (file)
@@ -31,5 +31,6 @@
     "ooui-dialog-action-close": "Fermer",
     "ooui-outline-control-move-down": "Faire descendre l’élément",
     "ooui-outline-control-move-up": "Faire monter l’élément",
+    "ooui-outline-control-remove": "Supprimer l’élément",
     "ooui-toolbar-more": "Plus"
 }
\ No newline at end of file
index b20c5f3..f674cd2 100644 (file)
@@ -8,5 +8,6 @@
     "ooui-dialog-action-close": "Začinić",
     "ooui-outline-control-move-down": "Zapisk dele přesunyć",
     "ooui-outline-control-move-up": "Zapisk horje přesunyć",
+    "ooui-outline-control-remove": "Zapisk wotstronić",
     "ooui-toolbar-more": "Wjace"
 }
\ No newline at end of file
index 6158cff..747ec79 100644 (file)
@@ -17,5 +17,6 @@
     "ooui-dialog-action-close": "Chiudi",
     "ooui-outline-control-move-down": "Sposta in basso",
     "ooui-outline-control-move-up": "Sposta in alto",
+    "ooui-outline-control-remove": "Rimuovi elemento",
     "ooui-toolbar-more": "Altro"
 }
\ No newline at end of file
index 789fbeb..c7c0851 100644 (file)
@@ -10,5 +10,6 @@
     "ooui-dialog-action-close": "閉じる",
     "ooui-outline-control-move-down": "項目を下に移動させる",
     "ooui-outline-control-move-up": "項目を上に移動させる",
+    "ooui-outline-control-remove": "項目を除去",
     "ooui-toolbar-more": "その他"
 }
\ No newline at end of file
index b363a45..22fd037 100644 (file)
@@ -9,5 +9,6 @@
     "ooui-dialog-action-close": "Затвори",
     "ooui-outline-control-move-down": "Помести надолу",
     "ooui-outline-control-move-up": "Помести нагоре",
+    "ooui-outline-control-remove": "Отстрани ставка",
     "ooui-toolbar-more": "Повеќе"
 }
\ No newline at end of file
index dca7b7d..cd22c40 100644 (file)
@@ -8,5 +8,6 @@
     "ooui-dialog-action-close": "Cufi",
     "ooui-outline-control-move-down": "Gad buusi",
     "ooui-outline-control-move-up": "Ol baasi",
+    "ooui-outline-control-remove": "Balleessi",
     "ooui-toolbar-more": "Dabalata"
 }
\ No newline at end of file
index ba33322..8798603 100644 (file)
             "Ty221",
             "WTM",
             "Woytecr",
-            "Wpedzich"
+            "Wpedzich",
+            "Jacenty359"
         ]
     },
     "ooui-dialog-action-close": "Zamknij",
     "ooui-outline-control-move-down": "Przenieś niżej",
     "ooui-outline-control-move-up": "Przenieś wyżej",
+    "ooui-outline-control-remove": "Usuń przedmiot",
     "ooui-toolbar-more": "Więcej"
 }
\ No newline at end of file
index c5b8ffa..75bbec4 100644 (file)
@@ -22,6 +22,6 @@
     "ooui-dialog-action-close": "Label text for button to exit from dialog.\n\n{{Identical|Close}}",
     "ooui-outline-control-move-down": "Tool tip for a button that moves items in a list down one place",
     "ooui-outline-control-move-up": "Tool tip for a button that moves items in a list up one place",
-    "ooui-outline-control-remove": "Tool tip for a button that removes items from a list",
+    "ooui-outline-control-remove": "Tool tip for a button that removes items from a list.\n{{Identical|Remove item}}",
     "ooui-toolbar-more": "Label for the toolbar group that contains a list of all other available tools.\n{{Identical|More}}"
 }
\ No newline at end of file
index 861b2fe..4892975 100644 (file)
@@ -10,5 +10,6 @@
     "ooui-dialog-action-close": "Închide",
     "ooui-outline-control-move-down": "Mută elementul mai jos",
     "ooui-outline-control-move-up": "Mută elementul mai sus",
+    "ooui-outline-control-remove": "Elimină elementul",
     "ooui-toolbar-more": "Mai mult"
 }
\ No newline at end of file
index be7c6a5..f6e76a6 100644 (file)
@@ -21,5 +21,6 @@
     "ooui-dialog-action-close": "Закрыть",
     "ooui-outline-control-move-down": "Переместить элемент вниз",
     "ooui-outline-control-move-up": "Переместить элемент вверх",
+    "ooui-outline-control-remove": "Удалить пункт",
     "ooui-toolbar-more": "Ещё"
 }
\ No newline at end of file
index d5bffd9..b14d47b 100644 (file)
@@ -10,5 +10,6 @@
     "ooui-dialog-action-close": "Zapri",
     "ooui-outline-control-move-down": "Prestavi predmet nižje",
     "ooui-outline-control-move-up": "Prestavi predmet višje",
+    "ooui-outline-control-remove": "Odstrani vnos",
     "ooui-toolbar-more": "Več"
 }
\ No newline at end of file
index 973baec..7eaaacd 100644 (file)
@@ -9,5 +9,6 @@
     "ooui-dialog-action-close": "Затвори",
     "ooui-outline-control-move-down": "Премести ставку на доле",
     "ooui-outline-control-move-up": "Премести ставку на горе",
+    "ooui-outline-control-remove": "Уклони ставку",
     "ooui-toolbar-more": "Више"
 }
\ No newline at end of file
index 46cbae3..58e8ebe 100644 (file)
@@ -21,5 +21,6 @@
     "ooui-dialog-action-close": "关闭",
     "ooui-outline-control-move-down": "下移项",
     "ooui-outline-control-move-up": "上移项",
+    "ooui-outline-control-remove": "移除项",
     "ooui-toolbar-more": "更多"
 }
\ No newline at end of file
index 9aace2f..6e7b12e 100644 (file)
@@ -18,5 +18,6 @@
     "ooui-dialog-action-close": "關閉",
     "ooui-outline-control-move-down": "向下移項",
     "ooui-outline-control-move-up": "向上移項",
+    "ooui-outline-control-remove": "移除項",
     "ooui-toolbar-more": "更多"
 }
\ No newline at end of file
index 08fe6ae..e915bdf 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.1.0-pre (51f922ba17)
+ * OOjs UI v0.1.0-pre (f3bc5c6)
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2014 OOjs Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: Fri Feb 28 2014 16:33:26 GMT-0800 (PST)
+ * Date: Mon Mar 03 2014 17:03:30 GMT-0800 (PST)
  */
 ( function () {
 
@@ -3865,8 +3865,10 @@ OO.ui.BookletLayout = function OoUiBookletLayout( config ) {
        if ( this.outlined ) {
                this.outlineWidget.connect( this, { 'select': 'onOutlineWidgetSelect' } );
        }
-       // Event 'focus' does not bubble, but 'focusin' does
-       this.stackLayout.onDOMEvent( 'focusin', OO.ui.bind( this.onStackLayoutFocus, this ) );
+       if ( this.autoFocus ) {
+               // Event 'focus' does not bubble, but 'focusin' does
+               this.stackLayout.onDOMEvent( 'focusin', OO.ui.bind( this.onStackLayoutFocus, this ) );
+       }
 
        // Initialization
        this.$element.addClass( 'oo-ui-bookletLayout' );
@@ -4185,21 +4187,22 @@ OO.ui.BookletLayout.prototype.setPage = function ( name ) {
        var selectedItem,
                page = this.pages[name];
 
-       if ( this.outlined ) {
-               selectedItem = this.outlineWidget.getSelectedItem();
-               if ( selectedItem && selectedItem.getData() !== name ) {
-                       this.outlineWidget.selectItem( this.outlineWidget.getItemFromData( name ) );
+       if ( name !== this.currentPageName ) {
+               if ( this.outlined ) {
+                       selectedItem = this.outlineWidget.getSelectedItem();
+                       if ( selectedItem && selectedItem.getData() !== name ) {
+                               this.outlineWidget.selectItem( this.outlineWidget.getItemFromData( name ) );
+                       }
                }
-       }
-
-       if ( page ) {
-               if ( this.currentPageName && this.pages[this.currentPageName] ) {
-                       this.pages[this.currentPageName].setActive( false );
+               if ( page ) {
+                       if ( this.currentPageName && this.pages[this.currentPageName] ) {
+                               this.pages[this.currentPageName].setActive( false );
+                       }
+                       this.currentPageName = name;
+                       this.stackLayout.setItem( page );
+                       page.setActive( true );
+                       this.emit( 'set', page );
                }
-               this.currentPageName = name;
-               this.stackLayout.setItem( page );
-               page.setActive( true );
-               this.emit( 'set', page );
        }
 };
 
@@ -4463,18 +4466,20 @@ OO.ui.StackLayout.prototype.clearItems = function () {
  * @chainable
  */
 OO.ui.StackLayout.prototype.setItem = function ( item ) {
-       if ( !this.continuous ) {
-               this.$items.css( 'display', '' );
-       }
-       if ( $.inArray( item, this.items ) !== -1 ) {
+       if ( item !== this.currentItem ) {
                if ( !this.continuous ) {
-                       item.$element.css( 'display', 'block' );
+                       this.$items.css( 'display', '' );
                }
-       } else {
-               item = null;
+               if ( $.inArray( item, this.items ) !== -1 ) {
+                       if ( !this.continuous ) {
+                               item.$element.css( 'display', 'block' );
+                       }
+               } else {
+                       item = null;
+               }
+               this.currentItem = item;
+               this.emit( 'set', item );
        }
-       this.currentItem = item;
-       this.emit( 'set', item );
 
        return this;
 };
index 718d960..7a22720 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.1.0-pre (51f922ba17)
+ * OOjs UI v0.1.0-pre (f3bc5c6)
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2014 OOjs Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: Fri Feb 28 2014 16:33:26 GMT-0800 (PST)
+ * Date: Mon Mar 03 2014 17:03:30 GMT-0800 (PST)
  */
 
 /* Textures */
   display: inline-block;
   -webkit-transition: opacity 200ms;
      -moz-transition: opacity 200ms;
+      -ms-transition: opacity 200ms;
        -o-transition: opacity 200ms;
           transition: opacity 200ms;
 }
   -webkit-user-select: none;
      -moz-user-select: none;
       -ms-user-select: none;
-       -o-user-select: none;
           user-select: none;
+  -webkit-touch-callout: none;
 }
 
 .oo-ui-toolbar-actions .oo-ui-popupWidget {
   opacity: 0.125;
   -webkit-transition: opacity 500ms ease-in-out;
      -moz-transition: opacity 500ms ease-in-out;
+      -ms-transition: opacity 500ms ease-in-out;
        -o-transition: opacity 500ms ease-in-out;
           transition: opacity 500ms ease-in-out;
 }
      -moz-user-select: none;
       -ms-user-select: none;
           user-select: none;
+  -webkit-touch-callout: none;
 }
 
 .oo-ui-outlineItemWidget.oo-ui-optionWidget-selected {
 }
 
 .oo-ui-popupWidget-transitioning .oo-ui-popupWidget-popup {
-  -webkit-transition: width 100ms, height 100ms, left 100ms;
-     -moz-transition: width 100ms, height 100ms, left 100ms;
-       -o-transition: width 100ms, height 100ms, left 100ms;
-          transition: width 100ms, height 100ms, left 100ms;
-  -webkit-transition-timing-function: ease-in-out;
-     -moz-transition-timing-function: ease-in-out;
-       -o-transition-timing-function: ease-in-out;
-          transition-timing-function: ease-in-out;
+  -webkit-transition: width 100ms ease-in-out, height 100ms ease-in-out, left 100ms ease-in-out;
+     -moz-transition: width 100ms ease-in-out, height 100ms ease-in-out, left 100ms ease-in-out;
+      -ms-transition: width 100ms ease-in-out, height 100ms ease-in-out, left 100ms ease-in-out;
+       -o-transition: width 100ms ease-in-out, height 100ms ease-in-out, left 100ms ease-in-out;
+          transition: width 100ms ease-in-out, height 100ms ease-in-out, left 100ms ease-in-out;
 }
 
 .oo-ui-popupWidget-head {
 
 .oo-ui-indicator-up {
   background-image: /* @embed */ url(images/indicators/up.svg);
-}
\ No newline at end of file
+}
diff --git a/tests/phpunit/includes/SkinTemplateTest.php b/tests/phpunit/includes/SkinTemplateTest.php
new file mode 100644 (file)
index 0000000..8f54714
--- /dev/null
@@ -0,0 +1,38 @@
+<?php
+
+/**
+ * @covers SkinTemplate
+ *
+ * @group Output
+ *
+ * @licence GNU GPL v2+
+ * @author Bene* < benestar.wikimedia@gmail.com >
+ */
+
+class SkinTemplateTest extends MediaWikiTestCase {
+
+       /**
+        * @dataProvider makeListItemProvider
+        */
+       public function testMakeListItem( $expected, $key, $item, $options, $message ) {
+               $template = $this->getMockForAbstractClass( 'BaseTemplate' );
+
+               $this->assertEquals(
+                       $expected,
+                       $template->makeListItem( $key, $item, $options ),
+                       $message
+               );
+       }
+
+       public function makeListItemProvider() {
+               return array(
+                       array(
+                               '<li class="class" title="itemtitle"><a href="url" title="title">text</a></li>',
+                               '',
+                               array( 'class' => 'class', 'itemtitle' => 'itemtitle', 'href' => 'url', 'title' => 'title', 'text' => 'text' ),
+                               array(),
+                               'Test makteListItem with normal values'
+                       )
+               );
+       }
+}