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; |
} |