From cd466d25fefb03969b57e4ca27abd0031835e9ae Mon Sep 17 00:00:00 2001 From: Kevin Ushey Date: Mon, 25 Apr 2022 12:14:16 -0700 Subject: [PATCH] fix: support mixed-case extensions in Linux file dialogs --- shell/browser/ui/file_dialog_gtk.cc | 27 +++++++++++++++++++++------ 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/shell/browser/ui/file_dialog_gtk.cc b/shell/browser/ui/file_dialog_gtk.cc index 7e5c7698cadfa..74df37b57d5f1 100644 --- a/shell/browser/ui/file_dialog_gtk.cc +++ b/shell/browser/ui/file_dialog_gtk.cc @@ -31,6 +31,25 @@ namespace { static const int kPreviewWidth = 256; static const int kPreviewHeight = 512; +std::string MakeCaseInsensitivePattern(const std::string& extension) { + std::string pattern("*."); + + for (std::size_t i = 0, n = extension.size(); i < n; i++) { + char ch = extension[i]; + if (!base::IsAsciiAlpha(ch)) { + pattern.push_back(ch); + continue; + } + + pattern.push_back('['); + pattern.push_back(base::ToLowerASCII(ch)); + pattern.push_back(base::ToUpperASCII(ch)); + pattern.push_back(']'); + } + + return pattern; +} + class FileChooserDialog { public: FileChooserDialog(GtkFileChooserAction action, const DialogSettings& settings) @@ -252,12 +271,8 @@ void FileChooserDialog::AddFilters(const Filters& filters) { GtkFileFilter* gtk_filter = gtk_file_filter_new(); for (const auto& extension : filter.second) { - // guarantee a pure lowercase variant - std::string file_extension = base::ToLowerASCII("*." + extension); - gtk_file_filter_add_pattern(gtk_filter, file_extension.c_str()); - // guarantee a pure uppercase variant - file_extension = base::ToUpperASCII("*." + extension); - gtk_file_filter_add_pattern(gtk_filter, file_extension.c_str()); + std::string pattern = MakeCaseInsensitivePattern(extension); + gtk_file_filter_add_pattern(gtk_filter, pattern.c_str()); } gtk_file_filter_set_name(gtk_filter, filter.first.c_str());