void AddFilters()

in libcef/browser/native/file_dialog_runner_mac.mm [48:123]


void AddFilters(NSPopUpButton* button,
                const std::vector<std::u16string>& accept_filters,
                bool include_all_files,
                std::vector<std::vector<std::u16string>>* all_extensions) {
  for (size_t i = 0; i < accept_filters.size(); ++i) {
    const std::u16string& filter = accept_filters[i];
    if (filter.empty())
      continue;

    std::vector<std::u16string> extensions;
    std::u16string description;

    size_t sep_index = filter.find('|');
    if (sep_index != std::string::npos) {
      // Treat as a filter of the form "Filter Name|.ext1;.ext2;.ext3".
      description = filter.substr(0, sep_index);

      const std::vector<std::u16string>& ext =
          base::SplitString(filter.substr(sep_index + 1), u";",
                            base::TRIM_WHITESPACE, base::SPLIT_WANT_NONEMPTY);
      for (size_t x = 0; x < ext.size(); ++x) {
        const std::u16string& file_ext = ext[x];
        if (!file_ext.empty() && file_ext[0] == '.')
          extensions.push_back(file_ext);
      }
    } else if (filter[0] == '.') {
      // Treat as an extension beginning with the '.' character.
      extensions.push_back(filter);
    } else {
      // Otherwise convert mime type to one or more extensions.
      const std::string& ascii = base::UTF16ToASCII(filter);
      std::vector<base::FilePath::StringType> ext;
      net::GetExtensionsForMimeType(ascii, &ext);
      if (!ext.empty()) {
        for (size_t x = 0; x < ext.size(); ++x)
          extensions.push_back(u"." + base::ASCIIToUTF16(ext[x]));
        description = GetDescriptionFromMimeType(ascii);
      }
    }

    if (extensions.empty())
      continue;

    // Don't display a crazy number of extensions since the NSPopUpButton width
    // will keep growing.
    const size_t kMaxExtensions = 10;

    std::u16string ext_str;
    for (size_t x = 0; x < std::min(kMaxExtensions, extensions.size()); ++x) {
      const std::u16string& pattern = u"*" + extensions[x];
      if (x != 0)
        ext_str += u";";
      ext_str += pattern;
    }

    if (extensions.size() > kMaxExtensions)
      ext_str += u";...";

    if (description.empty()) {
      description = ext_str;
    } else {
      description += u" (" + ext_str + u")";
    }

    [button addItemWithTitle:base::SysUTF16ToNSString(description)];

    all_extensions->push_back(extensions);
  }

  // Add the *.* filter, but only if we have added other filters (otherwise it
  // is implied).
  if (include_all_files && !all_extensions->empty()) {
    [button addItemWithTitle:base::SysUTF8ToNSString("All Files (*)")];
    all_extensions->push_back(std::vector<std::u16string>());
  }
}