| Index: chrome/browser/media_galleries/fileapi/media_path_filter.cc | 
| =================================================================== | 
| --- chrome/browser/media_galleries/fileapi/media_path_filter.cc	(revision 247534) | 
| +++ chrome/browser/media_galleries/fileapi/media_path_filter.cc	(working copy) | 
| @@ -12,7 +12,7 @@ | 
|  | 
| namespace { | 
|  | 
| -const base::FilePath::CharType* const kExtraSupportedExtensions[] = { | 
| +const base::FilePath::CharType* const kExtraSupportedImageExtensions[] = { | 
| // RAW picture file types. | 
| // Some of which are just image/tiff. | 
| FILE_PATH_LITERAL("3fr"),  // (Hasselblad) | 
| @@ -45,8 +45,9 @@ | 
| // - Leica / Panasonic RAW files - image/x-panasonic-raw | 
| // - Phase One RAW files - image/x-phaseone-raw | 
| FILE_PATH_LITERAL("raw"), | 
| +}; | 
|  | 
| -  // Video files types. | 
| +const base::FilePath::CharType* const kExtraSupportedVideoExtensions[] = { | 
| FILE_PATH_LITERAL("3gp"), | 
| FILE_PATH_LITERAL("3gpp"), | 
| FILE_PATH_LITERAL("avi"), | 
| @@ -58,9 +59,11 @@ | 
| FILE_PATH_LITERAL("mpegps"), | 
| FILE_PATH_LITERAL("mpg"), | 
| FILE_PATH_LITERAL("wmv"), | 
| +}; | 
|  | 
| -  // Audio file types. Many of these file types are audio files in the same | 
| -  // containers that the MIME sniffer already detects as video/subtype. | 
| +const base::FilePath::CharType* const kExtraSupportedAudioExtensions[] = { | 
| +  // Many of these file types are audio files in the same containers that the | 
| +  // MIME sniffer already detects as video/subtype. | 
| FILE_PATH_LITERAL("aac"),   // audio/mpeg | 
| FILE_PATH_LITERAL("alac"),  // video/mp4 | 
| FILE_PATH_LITERAL("flac"),  // audio/x-flac | 
| @@ -75,6 +78,18 @@ | 
| !net::IsSupportedMimeType(mime_type); | 
| } | 
|  | 
| +std::vector<base::FilePath::StringType> GetMediaExtensionList( | 
| +    const std::string& mime_type) { | 
| +  std::vector<base::FilePath::StringType> extensions; | 
| +  net::GetExtensionsForMimeType(mime_type, &extensions); | 
| +  std::vector<base::FilePath::StringType>::iterator new_end = | 
| +      std::remove_if(extensions.begin(), | 
| +                     extensions.end(), | 
| +                     &IsUnsupportedExtension); | 
| +  extensions.erase(new_end, extensions.end()); | 
| +  return extensions; | 
| +} | 
| + | 
| }  // namespace | 
|  | 
| MediaPathFilter::MediaPathFilter() | 
| @@ -86,10 +101,16 @@ | 
| } | 
|  | 
| bool MediaPathFilter::Match(const base::FilePath& path) { | 
| +  return GetType(path) != MEDIA_GALLERY_SCAN_FILE_TYPE_UNKNOWN; | 
| +} | 
| + | 
| +MediaGalleryScanFileType MediaPathFilter::GetType(const base::FilePath& path) { | 
| EnsureInitialized(); | 
| -  return std::binary_search(media_file_extensions_.begin(), | 
| -                            media_file_extensions_.end(), | 
| -                            StringToLowerASCII(path.Extension())); | 
| +  MediaFileExtensionMap::const_iterator it = | 
| +      media_file_extensions_map_.find(StringToLowerASCII(path.Extension())); | 
| +  if (it == media_file_extensions_map_.end()) | 
| +    return MEDIA_GALLERY_SCAN_FILE_TYPE_UNKNOWN; | 
| +  return static_cast<MediaGalleryScanFileType>(it->second); | 
| } | 
|  | 
| void MediaPathFilter::EnsureInitialized() { | 
| @@ -97,26 +118,51 @@ | 
| if (initialized_) | 
| return; | 
|  | 
| -  // This may require I/O, so doing this in the ctor and removing | 
| -  // |initialized_| would result in a ThreadRestrictions failure. | 
| -  net::GetExtensionsForMimeType("image/*", &media_file_extensions_); | 
| -  net::GetExtensionsForMimeType("audio/*", &media_file_extensions_); | 
| -  net::GetExtensionsForMimeType("video/*", &media_file_extensions_); | 
| +  // This may require I/O when it calls net::GetExtensionsForMimeType(), so | 
| +  // doing this in the ctor and removing |initialized_| would result in a | 
| +  // ThreadRestrictions failure. | 
| +  AddExtensionsToMediaFileExtensionMap(GetMediaExtensionList("image/*"), | 
| +                                       MEDIA_GALLERY_SCAN_FILE_TYPE_IMAGE); | 
| +  AddExtensionsToMediaFileExtensionMap(GetMediaExtensionList("audio/*"), | 
| +                                       MEDIA_GALLERY_SCAN_FILE_TYPE_AUDIO); | 
| +  AddExtensionsToMediaFileExtensionMap(GetMediaExtensionList("video/*"), | 
| +                                       MEDIA_GALLERY_SCAN_FILE_TYPE_VIDEO); | 
| +  AddAdditionalExtensionsToMediaFileExtensionMap( | 
| +      kExtraSupportedImageExtensions, | 
| +      arraysize(kExtraSupportedImageExtensions), | 
| +      MEDIA_GALLERY_SCAN_FILE_TYPE_IMAGE); | 
| +  AddAdditionalExtensionsToMediaFileExtensionMap( | 
| +      kExtraSupportedAudioExtensions, | 
| +      arraysize(kExtraSupportedAudioExtensions), | 
| +      MEDIA_GALLERY_SCAN_FILE_TYPE_AUDIO); | 
| +  AddAdditionalExtensionsToMediaFileExtensionMap( | 
| +      kExtraSupportedVideoExtensions, | 
| +      arraysize(kExtraSupportedVideoExtensions), | 
| +      MEDIA_GALLERY_SCAN_FILE_TYPE_VIDEO); | 
|  | 
| -  MediaFileExtensionList::iterator new_end = | 
| -      std::remove_if(media_file_extensions_.begin(), | 
| -                     media_file_extensions_.end(), | 
| -                     &IsUnsupportedExtension); | 
| -  media_file_extensions_.erase(new_end, media_file_extensions_.end()); | 
| +  initialized_ = true; | 
| +} | 
|  | 
| -  // Add other common extensions. | 
| -  for (size_t i = 0; i < arraysize(kExtraSupportedExtensions); ++i) | 
| -    media_file_extensions_.push_back(kExtraSupportedExtensions[i]); | 
| +void MediaPathFilter::AddExtensionsToMediaFileExtensionMap( | 
| +    const MediaFileExtensionList& extensions_list, | 
| +    MediaGalleryScanFileType type) { | 
| +  for (size_t i = 0; i < extensions_list.size(); ++i) | 
| +    AddExtensionToMediaFileExtensionMap(extensions_list[i].c_str(), type); | 
| +} | 
|  | 
| -  for (MediaFileExtensionList::iterator itr = media_file_extensions_.begin(); | 
| -       itr != media_file_extensions_.end(); ++itr) | 
| -    *itr = base::FilePath::kExtensionSeparator + *itr; | 
| -  std::sort(media_file_extensions_.begin(), media_file_extensions_.end()); | 
| +void MediaPathFilter::AddAdditionalExtensionsToMediaFileExtensionMap( | 
| +    const base::FilePath::CharType* const* extensions_list, | 
| +    size_t extensions_list_size, | 
| +    MediaGalleryScanFileType type) { | 
| +  for (size_t i = 0; i < extensions_list_size; ++i) | 
| +    AddExtensionToMediaFileExtensionMap(extensions_list[i], type); | 
| +} | 
|  | 
| -  initialized_ = true; | 
| +void MediaPathFilter::AddExtensionToMediaFileExtensionMap( | 
| +    const base::FilePath::CharType* extension, | 
| +    MediaGalleryScanFileType type) { | 
| +  base::FilePath::StringType extension_with_sep = | 
| +      base::FilePath::kExtensionSeparator + | 
| +      base::FilePath::StringType(extension); | 
| +  media_file_extensions_map_[extension_with_sep] |= type; | 
| } | 
|  |