Merge "Ensure whether user can rollback page in ChangesList"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Mon, 9 Jul 2018 22:34:40 +0000 (22:34 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Mon, 9 Jul 2018 22:34:40 +0000 (22:34 +0000)
1  2 
includes/changes/ChangesList.php

@@@ -107,7 -107,7 +107,7 @@@ class ChangesList extends ContextSourc
         *
         * @param RecentChange &$rc Passed by reference
         * @param bool $watched (default false)
 -       * @param int $linenumber (default null)
 +       * @param int|null $linenumber (default null)
         *
         * @return string|bool
         */
                throw new RuntimeException( 'recentChangesLine should be implemented' );
        }
  
 +      /**
 +       * Get the container for highlights that are used in the new StructuredFilters
 +       * system
 +       *
 +       * @return string HTML structure of the highlight container div
 +       */
 +      protected function getHighlightsContainerDiv() {
 +              $highlightColorDivs = '';
 +              foreach ( [ 'none', 'c1', 'c2', 'c3', 'c4', 'c5' ] as $color ) {
 +                      $highlightColorDivs .= Html::rawElement(
 +                              'div',
 +                              [
 +                                      'class' => 'mw-rcfilters-ui-highlights-color-' . $color,
 +                                      'data-color' => $color
 +                              ]
 +                      );
 +              }
 +
 +              return Html::rawElement(
 +                      'div',
 +                      [ 'class' => 'mw-rcfilters-ui-highlights' ],
 +                      $highlightColorDivs
 +              );
 +      }
 +
        /**
         * Sets the list to use a "<li class='watchlist-(namespace)-(page)'>" tag
         * @param bool $value
         * @param string $nothing To use for empty space
         * @return string
         */
 -      public function recentChangesFlags( $flags, $nothing = '&#160;' ) {
 +      public function recentChangesFlags( $flags, $nothing = "\u{00A0}" ) {
                $f = '';
                foreach ( array_keys( $this->getConfig()->get( 'RecentChangesFlags' ) ) as $flag ) {
                        $f .= isset( $flags[$flag] ) && $flags[$flag]
                        $classes[] = Sanitizer::escapeClass( self::CSS_CLASS_PREFIX . 'ns' .
                                $rc->mAttribs['rc_namespace'] . '-' . $rc->mAttribs['rc_title'] );
                }
 -              $classes[] = Sanitizer::escapeClass( self::CSS_CLASS_PREFIX . 'ns-' .
 -                      $rc->mAttribs['rc_namespace'] );
  
                // Indicate watched status on the line to allow for more
                // comprehensive styling.
        }
  
        /**
 -       * Get an array of CSS classes attributed to filters for this row
 +       * Get an array of CSS classes attributed to filters for this row. Used for highlighting
 +       * in the front-end.
         *
         * @param RecentChange $rc
         * @return array Array of CSS classes
        protected function getHTMLClassesForFilters( $rc ) {
                $classes = [];
  
 +              $classes[] = Sanitizer::escapeClass( self::CSS_CLASS_PREFIX . 'ns-' .
 +                      $rc->mAttribs['rc_namespace'] );
 +
                if ( $this->filterGroups !== null ) {
                        foreach ( $this->filterGroups as $filterGroup ) {
                                foreach ( $filterGroup->getFilters() as $filter ) {
         * bot edit, or unpatrolled edit. In English it typically contains "N", "m", "b", or "!".
         *
         * @param string $flag One key of $wgRecentChangesFlags
 -       * @param IContextSource $context
 +       * @param IContextSource|null $context
         * @return string HTML
         */
        public static function flag( $flag, IContextSource $context = null ) {
                                $flagInfos[$key]['letter'] = $value['letter'];
                                $flagInfos[$key]['title'] = $value['title'];
                                // Allow customized class name, fall back to flag name
 -                              $flagInfos[$key]['class'] = isset( $value['class'] ) ? $value['class'] : $key;
 +                              $flagInfos[$key]['class'] = $value['class'] ?? $key;
                        }
                }
  
         *
         * @param int $old Number of bytes
         * @param int $new Number of bytes
 -       * @param IContextSource $context
 +       * @param IContextSource|null $context
         * @return string
         */
        public static function showCharacterDifference( $old, $new, IContextSource $context = null ) {
         * Format the character difference of one or several changes.
         *
         * @param RecentChange $old
 -       * @param RecentChange $new Last change to use, if not provided, $old will be used
 +       * @param RecentChange|null $new Last change to use, if not provided, $old will be used
         * @return string HTML fragment
         */
        public function formatCharacterDifference( RecentChange $old, RecentChange $new = null ) {
         * field of this revision, if it's marked as deleted.
         * @param RCCacheEntry|RecentChange $rc
         * @param int $field
 -       * @param User $user User object to check, or null to use $wgUser
 +       * @param User|null $user User object to check, or null to use $wgUser
         * @return bool
         */
        public static function userCan( $rc, $field, User $user = null ) {
                }
        }
  
-       /** Inserts a rollback link
+       /**
+        * Insert a rollback link
         *
         * @param string &$s
         * @param RecentChange &$rc
                if ( $rc->mAttribs['rc_type'] == RC_EDIT
                        && $rc->mAttribs['rc_this_oldid']
                        && $rc->mAttribs['rc_cur_id']
+                       && $rc->getAttribute( 'page_latest' ) == $rc->mAttribs['rc_this_oldid']
                ) {
-                       $page = $rc->getTitle();
-                       /** Check for rollback and edit permissions, disallow special pages, and only
+                       $title = $rc->getTitle();
+                       /** Check for rollback permissions, disallow special pages, and only
                         * show a link on the top-most revision */
-                       if ( $this->getUser()->isAllowed( 'rollback' )
-                               && $rc->mAttribs['page_latest'] == $rc->mAttribs['rc_this_oldid']
-                       ) {
+                       if ( $title->quickUserCan( 'rollback', $this->getUser() ) ) {
                                $rev = new Revision( [
-                                       'title' => $page,
+                                       'title' => $title,
                                        'id' => $rc->mAttribs['rc_this_oldid'],
                                        'user' => $rc->mAttribs['rc_user'],
                                        'user_text' => $rc->mAttribs['rc_user_text'],
 -                                      'actor' => isset( $rc->mAttribs['rc_actor'] ) ? $rc->mAttribs['rc_actor'] : null,
 +                                      'actor' => $rc->mAttribs['rc_actor'] ?? null,
                                        'deleted' => $rc->mAttribs['rc_deleted']
                                ] );
                                $s .= ' ' . Linker::generateRollback( $rev, $this->getContext() );