Merge "RCFilters: Actually read/write highlight parameter"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Fri, 12 May 2017 13:15:47 +0000 (13:15 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Fri, 12 May 2017 13:15:48 +0000 (13:15 +0000)
includes/changetags/ChangeTags.php
includes/media/DjVu.php
resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.SavedLinksListWidget.js

index 9bde056..146d9c6 100644 (file)
@@ -925,23 +925,13 @@ class ChangeTags {
        }
 
        /**
-        * Is it OK to allow the user to create this tag?
+        * Is the tag name valid?
         *
         * @param string $tag Tag that you are interested in creating
-        * @param User|null $user User whose permission you wish to check, or null if
-        * you don't care (e.g. maintenance scripts)
         * @return Status
-        * @since 1.25
+        * @since 1.30
         */
-       public static function canCreateTag( $tag, User $user = null ) {
-               if ( !is_null( $user ) ) {
-                       if ( !$user->isAllowed( 'managechangetags' ) ) {
-                               return Status::newFatal( 'tags-manage-no-permission' );
-                       } elseif ( $user->isBlocked() ) {
-                               return Status::newFatal( 'tags-manage-blocked', $user->getName() );
-                       }
-               }
-
+       public static function isTagNameValid( $tag ) {
                // no empty tags
                if ( $tag === '' ) {
                        return Status::newFatal( 'tags-create-no-name' );
@@ -962,6 +952,32 @@ class ChangeTags {
                        return Status::newFatal( 'tags-create-invalid-title-chars' );
                }
 
+               return Status::newGood();
+       }
+
+       /**
+        * Is it OK to allow the user to create this tag?
+        *
+        * @param string $tag Tag that you are interested in creating
+        * @param User|null $user User whose permission you wish to check, or null if
+        * you don't care (e.g. maintenance scripts)
+        * @return Status
+        * @since 1.25
+        */
+       public static function canCreateTag( $tag, User $user = null ) {
+               if ( !is_null( $user ) ) {
+                       if ( !$user->isAllowed( 'managechangetags' ) ) {
+                               return Status::newFatal( 'tags-manage-no-permission' );
+                       } elseif ( $user->isBlocked() ) {
+                               return Status::newFatal( 'tags-manage-blocked', $user->getName() );
+                       }
+               }
+
+               $status = self::isTagNameValid( $tag );
+               if ( !$status->isGood() ) {
+                       return $status;
+               }
+
                // does the tag already exist?
                $tagUsage = self::tagUsageStatistics();
                if ( isset( $tagUsage[$tag] ) || in_array( $tag, self::listDefinedTags() ) ) {
index a852215..374e166 100644 (file)
@@ -304,11 +304,28 @@ class DjVuHandler extends ImageHandler {
                        return false;
                }
 
+               $trees = $this->extractTreesFromMetadata( $metadata );
+               $image->djvuTextTree = $trees['TextTree'];
+               $image->dejaMetaTree = $trees['MetaTree'];
+
+               if ( $gettext ) {
+                       return $image->djvuTextTree;
+               } else {
+                       return $image->dejaMetaTree;
+               }
+       }
+
+       /**
+        * Extracts metadata and text trees from metadata XML in string form
+        * @param string $metadata XML metadata as a string
+        * @return array
+        */
+       protected function extractTreesFromMetadata( $metadata ) {
                MediaWiki\suppressWarnings();
                try {
                        // Set to false rather than null to avoid further attempts
-                       $image->dejaMetaTree = false;
-                       $image->djvuTextTree = false;
+                       $metaTree = false;
+                       $textTree = false;
                        $tree = new SimpleXMLElement( $metadata, LIBXML_PARSEHUGE );
                        if ( $tree->getName() == 'mw-djvu' ) {
                                /** @var SimpleXMLElement $b */
@@ -316,23 +333,20 @@ class DjVuHandler extends ImageHandler {
                                        if ( $b->getName() == 'DjVuTxt' ) {
                                                // @todo File::djvuTextTree and File::dejaMetaTree are declared
                                                // dynamically. Add a public File::$data to facilitate this?
-                                               $image->djvuTextTree = $b;
+                                               $textTree = $b;
                                        } elseif ( $b->getName() == 'DjVuXML' ) {
-                                               $image->dejaMetaTree = $b;
+                                               $metaTree = $b;
                                        }
                                }
                        } else {
-                               $image->dejaMetaTree = $tree;
+                               $metaTree = $tree;
                        }
                } catch ( Exception $e ) {
-                       wfDebug( "Bogus multipage XML metadata on '{$image->getName()}'\n" );
+                       wfDebug( "Bogus multipage XML metadata\n" );
                }
                MediaWiki\restoreWarnings();
-               if ( $gettext ) {
-                       return $image->djvuTextTree;
-               } else {
-                       return $image->dejaMetaTree;
-               }
+
+               return [ 'MetaTree' => $metaTree, 'TextTree' => $textTree ];
        }
 
        function getImageSize( $image, $path ) {
@@ -394,30 +408,39 @@ class DjVuHandler extends ImageHandler {
                        $cache::TTL_INDEFINITE,
                        function () use ( $file ) {
                                $tree = $this->getMetaTree( $file );
-                               if ( !$tree ) {
-                                       return false;
-                               }
-
-                               $dimsByPage = [];
-                               $count = count( $tree->xpath( '//OBJECT' ) );
-                               for ( $i = 0; $i < $count; $i++ ) {
-                                       $o = $tree->BODY[0]->OBJECT[$i];
-                                       if ( $o ) {
-                                               $dimsByPage[$i] = [
-                                                       'width' => (int)$o['width'],
-                                                       'height' => (int)$o['height'],
-                                               ];
-                                       } else {
-                                               $dimsByPage[$i] = false;
-                                       }
-                               }
-
-                               return [ 'pageCount' => $count, 'dimensionsByPage' => $dimsByPage ];
+                               return $this->getDimensionInfoFromMetaTree( $tree );
                        },
                        [ 'pcTTL' => $cache::TTL_INDEFINITE ]
                );
        }
 
+       /**
+        * Given an XML metadata tree, returns dimension information about the document
+        * @param bool|SimpleXMLElement $metatree The file's XML metadata tree
+        * @return bool|array
+        */
+       protected function getDimensionInfoFromMetaTree( $metatree ) {
+               if ( !$metatree ) {
+                       return false;
+               }
+
+               $dimsByPage = [];
+               $count = count( $metatree->xpath( '//OBJECT' ) );
+               for ( $i = 0; $i < $count; $i++ ) {
+                       $o = $metatree->BODY[0]->OBJECT[$i];
+                       if ( $o ) {
+                               $dimsByPage[$i] = [
+                                       'width' => (int)$o['width'],
+                                       'height' => (int)$o['height'],
+                               ];
+                       } else {
+                               $dimsByPage[$i] = false;
+                       }
+               }
+
+               return [ 'pageCount' => $count, 'dimensionsByPage' => $dimsByPage ];
+       }
+
        /**
         * @param File $image
         * @param int $page Page number to get information for
@@ -438,4 +461,40 @@ class DjVuHandler extends ImageHandler {
                        return false;
                }
        }
+
+       /**
+       * Get useful response headers for GET/HEAD requests for a file with the given metadata
+       * @param $metadata Array Contains this handler's unserialized getMetadata() for a file
+       * @return array
+       */
+       public function getContentHeaders( $metadata ) {
+               if ( !is_array( $metadata ) || !isset( $metadata['xml'] ) ) {
+                       return [];
+               }
+
+               $trees = $this->extractTreesFromMetadata( $metadata['xml'] );
+               $dimensionInfo = $this->getDimensionInfoFromMetaTree( $trees['MetaTree'] );
+
+               if ( !$dimensionInfo ) {
+                       return [];
+               }
+
+               $pagesByDimensions = [];
+               $count = $dimensionInfo['pageCount'];
+
+               for ( $i = 1; $i <= $count; $i++ ) {
+                       $dimensions = $dimensionInfo['dimensionsByPage'][ $i - 1 ];
+                       $dimensionString = $dimensions['width'] . 'x' . $dimensions['height'];
+
+                       if ( isset ( $pagesByDimensions[ $dimensionString ] ) ) {
+                               $pagesByDimensions[ $dimensionString ][] = $i;
+                       } else {
+                               $pagesByDimensions[ $dimensionString ] = [ $i ];
+                       }
+               }
+
+               $pageRangesByDimensions = MediaHandler::getPageRangesByDimensions( $pagesByDimensions );
+
+               return [ 'X-Content-Dimensions' => $pageRangesByDimensions ];
+       }
 }
index 9ae1d34..3f701ea 100644 (file)
@@ -30,6 +30,7 @@
                        classes: [ 'mw-rcfilters-ui-savedLinksListWidget-button' ],
                        label: mw.msg( 'rcfilters-quickfilters' ),
                        icon: 'unClip',
+                       indicator: 'down',
                        $overlay: this.$overlay,
                        popup: {
                                width: 300,
@@ -86,7 +87,6 @@
         */
        mw.rcfilters.ui.SavedLinksListWidget.prototype.onMenuItemRemove = function ( item ) {
                this.controller.removeSavedQuery( item.getID() );
-               this.menu.removeItems( [ item ] );
        };
 
        /**
         * @param {mw.rcfilters.ui.SavedLinksListItemWidget} item Menu item
         */
        mw.rcfilters.ui.SavedLinksListWidget.prototype.onModelRemoveItem = function ( item ) {
-               this.menu.removeItems( [ this.model.getItemByID( item.getID() ) ] );
+               this.menu.removeItems( [ this.menu.getItemFromData( item.getID() ) ] );
                this.button.toggle( !this.menu.isEmpty() );
        };
 }( mediaWiki ) );