Chromium Code Reviews| Index: chrome/browser/media_galleries/media_folder_finder.cc |
| =================================================================== |
| --- chrome/browser/media_galleries/media_folder_finder.cc (revision 252098) |
| +++ chrome/browser/media_galleries/media_folder_finder.cc (working copy) |
| @@ -14,6 +14,7 @@ |
| #include "base/strings/string_util.h" |
| #include "base/task_runner_util.h" |
| #include "base/threading/sequenced_worker_pool.h" |
| +#include "chrome/browser/extensions/api/file_system/file_system_api.h" |
| #include "chrome/browser/media_galleries/fileapi/media_path_filter.h" |
| #include "components/storage_monitor/storage_monitor.h" |
| #include "content/public/browser/browser_thread.h" |
| @@ -33,6 +34,20 @@ |
| const int64 kMinimumAudioSize = 500 * 1024; // 500 KB |
| const int64 kMinimumVideoSize = 1024 * 1024; // 1 MB |
| +const int kPrunedPaths[] = { |
| + base::DIR_CACHE, |
| + base::DIR_TEMP, |
|
vandebo (ex-Chrome)
2014/02/20 23:00:23
It's not clear that we want to prune the temp dir.
Lei Zhang
2014/02/20 23:04:52
On Windows, it's buried and not easily accessible
|
| +#if defined(OS_WIN) |
| + base::DIR_IE_INTERNET_CACHE, |
| + base::DIR_PROGRAM_FILES, |
| + base::DIR_PROGRAM_FILESX86, |
| + base::DIR_WINDOWS, |
| +#endif |
| +#if defined(OS_MACOSX) && !defined(OS_IOS) |
| + DIR_USER_LIBRARY, |
| +#endif |
| +}; |
| + |
| bool IsValidScanPath(const base::FilePath& path) { |
| return !path.empty() && path.IsAbsolute(); |
| } |
| @@ -146,13 +161,16 @@ |
| // SequencedTaskRunner. |
| class MediaFolderFinder::Worker { |
| public: |
| - Worker(); |
| + explicit Worker(const std::vector<base::FilePath>& graylisted_folders); |
| ~Worker(); |
| // Scans |path| and return the results. |
| WorkerReply ScanFolder(const base::FilePath& path); |
| private: |
| + const std::vector<base::FilePath> graylisted_folders_; |
| + std::vector<base::FilePath> pruned_folders_; |
| + |
| scoped_ptr<MediaPathFilter> filter_; |
| base::SequenceChecker sequence_checker_; |
| @@ -160,9 +178,18 @@ |
| DISALLOW_COPY_AND_ASSIGN(Worker); |
| }; |
| -MediaFolderFinder::Worker::Worker() { |
| +MediaFolderFinder::Worker::Worker( |
| + const std::vector<base::FilePath>& graylisted_folders) |
| + : graylisted_folders_(graylisted_folders), |
| + filter_(new MediaPathFilter) { |
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| - filter_.reset(new MediaPathFilter); |
| + |
| + for (size_t i = 0; i < arraysize(kPrunedPaths); ++i) { |
| + base::FilePath path; |
| + if (PathService::Get(kPrunedPaths[i], &path)) |
| + pruned_folders_.push_back(path); |
| + } |
| + |
| sequence_checker_.DetachFromSequence(); |
| } |
| @@ -177,6 +204,15 @@ |
| WorkerReply reply; |
| bool folder_meets_size_requirement = false; |
| + bool is_graylisted_folder = false; |
| + for (size_t i = 0; i < graylisted_folders_.size(); ++i) { |
| + if (path == graylisted_folders_[i] || |
| + path.IsParent(graylisted_folders_[i])) { |
| + is_graylisted_folder = true; |
| + break; |
| + } |
| + } |
| + |
| base::FileEnumerator enumerator( |
| path, |
| false, /* recursive? */ |
| @@ -184,17 +220,33 @@ |
| #if defined(OS_POSIX) |
| | base::FileEnumerator::SHOW_SYM_LINKS // show symlinks, not follow. |
| #endif |
| - ); |
| + ); // NOLINT |
| while (!enumerator.Next().empty()) { |
| base::FileEnumerator::FileInfo file_info = enumerator.GetInfo(); |
| base::FilePath full_path = path.Append(file_info.GetName()); |
| if (MediaPathFilter::ShouldSkip(full_path)) |
| continue; |
| + // * Enumerating a directory. |
|
vandebo (ex-Chrome)
2014/02/20 23:00:23
nit: remove *
|
| if (file_info.IsDirectory()) { |
| - reply.new_folders.push_back(full_path); |
| + bool is_pruned_folder = false; |
| + for (size_t i = 0; i < pruned_folders_.size(); ++i) { |
| + if (full_path == pruned_folders_[i]) { |
| + is_pruned_folder = true; |
| + break; |
| + } |
| + } |
| + |
| + if (!is_pruned_folder) |
| + reply.new_folders.push_back(full_path); |
| continue; |
| } |
| + |
| + // * Enumerating a file. |
|
vandebo (ex-Chrome)
2014/02/20 23:00:23
ditto
|
| + // Do not include scan results for graylisted folders. |
| + if (is_graylisted_folder) |
| + continue; |
| + |
| MediaGalleryScanFileType type = filter_->GetType(full_path); |
| if (type == MEDIA_GALLERY_SCAN_FILE_TYPE_UNKNOWN) |
| continue; |
| @@ -214,8 +266,10 @@ |
| MediaFolderFinder::MediaFolderFinder( |
| const MediaFolderFinderResultsCallback& callback) |
| : results_callback_(callback), |
| + graylisted_folders_( |
| + extensions::file_system_api::GetGrayListedDirectories()), |
| scan_state_(SCAN_STATE_NOT_STARTED), |
| - worker_(new Worker()), |
| + worker_(new Worker(graylisted_folders_)), |
| has_roots_for_testing_(false), |
| weak_factory_(this) { |
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| @@ -233,7 +287,10 @@ |
| return; |
| MediaFolderFinderResults empty_results; |
| - results_callback_.Run(false /* success? */, empty_results); |
| + std::vector<base::FilePath> empty_sensitive_locations; |
| + results_callback_.Run(false /* success? */, |
| + empty_results, |
| + empty_sensitive_locations); |
| } |
| void MediaFolderFinder::StartScan() { |
| @@ -304,7 +361,7 @@ |
| if (folders_to_scan_.empty()) { |
| scan_state_ = SCAN_STATE_FINISHED; |
| - results_callback_.Run(true /* success? */, results_); |
| + results_callback_.Run(true /* success? */, results_, graylisted_folders_); |
| return; |
| } |