Uploaded image for project: 'Qt'
  1. Qt
  2. QTBUG-116905

QMimeDatabase doesn't return all glob patterns for mime types specified in multiple locations

    XMLWordPrintable

Details

    • Bug
    • Resolution: Fixed
    • P1: Critical
    • 6.7.0 Beta1
    • 6.3, 6.6.0
    • Core: Other
    • None
    • Linux/X11
    • 4e9944e6c (dev), 705118a55 (6.6)

    Description

      On linux it's common to have mime types defined in xml files that ship with
      the system in /usr/share/mime/ and to have user installed ones in
      ~/.local/share/mime/. On Qt5, if a mimetype was specified in multiple
      locations, QMimeDatabase would combine the glob patterns and suffixes from
      both locations. On Qt6 it no longer does.

      Here is a downstream report where this affects the file picker in QtWebEngine: https://github.com/qutebrowser/qutebrowser/issues/7866

      I've tested all the Qt6 builds I have lying around (6.2.2, 6.3.0, 6.4.2, 6.5.2 and 6.6 (a local build from May, sha=b4e7e6cfa724ad)) and it looks like this regression was introduced some time between 6.2.2 and 6.3.0.

      Here is a reproducer based off of an observed installation (mine!):

      # Create two directories to serve as mime search paths.
      # `a` corresponds to the `~/local/share/mime/` and `b` to `/usr/share/mime/`.
      mkdir -p {a,b}/mime/packages/
      
      # Write an XML file installed by a user application (wine)
      cat > a/mime/packages/x-wine-extension-jfif.xml <<EOF
      <?xml version="1.0" encoding="UTF-8"?>
      <mime-info xmlns="http://www.freedesktop.org/standards/shared-mime-info">
        <mime-type type="image/jpeg">
          <glob pattern="*.jfif"/>
          <comment>JPEG Image</comment>
        </mime-type>
      </mime-info>
      EOF
      
      # And the part of the system file with the same mime type
      cat > b/mime/packages/freedesktop.org.xml <<EOF
      <?xml version="1.0" encoding="UTF-8"?>
      <mime-info xmlns="http://www.freedesktop.org/standards/shared-mime-info">
        <mime-type type="image/jpeg">
          <comment>JPEG image</comment>
          <acronym>JPEG</acronym>
          <expanded-acronym>Joint Photographic Experts Group</expanded-acronym>
          <magic>
            <match type="string" value="\377\330\377" offset="0"/>
            <match type="big16" value="0xffd8" offset="0"/>
          </magic>
          <glob pattern="*.jpg"/>
          <glob pattern="*.jpeg"/>
          <glob pattern="*.jpe"/>
          <alias type="image/pjpeg"/>
        </mime-type>
      </mime-info>
      EOF
      
      # Create a mime database in each directory
      for d in a b; do update-mime-database $d/mime/ ;done
      
      
      # Write a simple test applications using `QMimeType.globPatterns()`
      # (`.suffixes()` has the same behaviour.)
      cat > main.cpp <<EOF
      #include <iostream>
      #include <QMimeDatabase>
      
      int main(int argc, char *argv[])
      {
          QMimeDatabase db;
          for (auto p : db.mimeTypeForFile("foo.jpg").globPatterns()) {
              std::cout << p.toStdString() << std::endl;
          }
          return 0;
      }
      EOF
      g++ -o main-qt5 main.cpp `pkgconf --libs --cflags Qt5Core` -fPIC
      g++ -o main-qt6 main.cpp `pkgconf --libs --cflags Qt6Core` -fPIC
      
      # And run them
      # XDG_DATA_DIRS is set to the directories created above, in a specific order.
      # XDG_DATA_HOME is set to a non-existent directory to stop it from looking in
      # your real home dir.
      printf "\nFound by Qt5:\n" && XDG_DATA_DIRS="$PWD/a:$PWD/b" XDG_DATA_HOME='/tmp/nope' ./main-qt5
      printf "\nFound by Qt6:\n" && XDG_DATA_DIRS="$PWD/a:$PWD/b" XDG_DATA_HOME='/tmp/nope' ./main-qt6
      

      This should print out:

      Found by Qt5:
      *.jpg
      *.jpeg
      *.jpe
      *.jfif
      
      Found by Qt6:
      *.jfif
      

      Note that, in the cpp application, I'm looking up the mime type using a suffix
      that is only specified in the system location, but when I list the glob patterns it's only
      listing the one from the user location.

      Switching the order of the paths in XDG_DATA_DIRS yields:

      Found by Qt5:
      *.jfif
      *.jpg
      *.jpeg
      *.jpe
      
      Found by Qt6:
      *.jpg
      *.jpeg
      *.jpe
      

      Again, it's only listing the glob patterns from the first location.

      Attachments

        For Gerrit Dashboard: QTBUG-116905
        # Subject Branch Project Status CR V

        Activity

          People

            dfaure_kdab David Faure
            toofar toofar
            Votes:
            1 Vote for this issue
            Watchers:
            3 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved:

              Gerrit Reviews

                There are no open Gerrit changes