| 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,
|
| +#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,34 @@
|
| #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.
|
| 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.
|
| + //
|
| + // 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 +267,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));
|
| @@ -249,6 +304,11 @@
|
| roots_for_testing_);
|
| }
|
|
|
| +const std::vector<base::FilePath>&
|
| +MediaFolderFinder::graylisted_folders() const {
|
| + return graylisted_folders_;
|
| +}
|
| +
|
| void MediaFolderFinder::SetRootsForTesting(
|
| const std::vector<base::FilePath>& roots) {
|
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
|
|