summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authortommycli@chromium.org <tommycli@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-02-11 21:42:55 +0000
committertommycli@chromium.org <tommycli@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-02-11 21:42:55 +0000
commitc138296a8ff077a3aba17588abd18fed9bd7fba2 (patch)
tree92af52e76ca3fc03ea64ae95513b2ec6a8db62a4
parent2cdd2a0ffdc7a530e2d5ca8fb00e202cf4796ab5 (diff)
downloadchromium_src-c138296a8ff077a3aba17588abd18fed9bd7fba2.zip
chromium_src-c138296a8ff077a3aba17588abd18fed9bd7fba2.tar.gz
chromium_src-c138296a8ff077a3aba17588abd18fed9bd7fba2.tar.bz2
Media Galleries API Scanning: Give cached scan results if no user gesture.
BUG=161119 Review URL: https://codereview.chromium.org/141203004 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@250517 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--chrome/browser/extensions/api/media_galleries/media_galleries_api.cc4
-rw-r--r--chrome/browser/media_galleries/media_galleries_preferences.cc16
-rw-r--r--chrome/browser/media_galleries/media_galleries_preferences.h5
-rw-r--r--chrome/browser/media_galleries/media_scan_manager.cc51
-rw-r--r--chrome/browser/media_galleries/media_scan_manager.h9
-rw-r--r--chrome/browser/media_galleries/media_scan_manager_unittest.cc3
-rw-r--r--chrome/common/pref_names.cc3
-rw-r--r--chrome/common/pref_names.h1
8 files changed, 74 insertions, 18 deletions
diff --git a/chrome/browser/extensions/api/media_galleries/media_galleries_api.cc b/chrome/browser/extensions/api/media_galleries/media_galleries_api.cc
index bc56c96..73ea1c9 100644
--- a/chrome/browser/extensions/api/media_galleries/media_galleries_api.cc
+++ b/chrome/browser/extensions/api/media_galleries/media_galleries_api.cc
@@ -657,7 +657,7 @@ void MediaGalleriesStartMediaScanFunction::OnPreferencesInit() {
return;
}
- media_scan_manager()->StartScan(GetProfile(), GetExtension()->id());
+ media_scan_manager()->StartScan(GetProfile(), GetExtension(), user_gesture());
SendResponse(true);
}
@@ -678,7 +678,7 @@ bool MediaGalleriesCancelMediaScanFunction::RunImpl() {
void MediaGalleriesCancelMediaScanFunction::OnPreferencesInit() {
DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
- media_scan_manager()->CancelScan(GetProfile(), GetExtension()->id());
+ media_scan_manager()->CancelScan(GetProfile(), GetExtension());
SendResponse(true);
}
diff --git a/chrome/browser/media_galleries/media_galleries_preferences.cc b/chrome/browser/media_galleries/media_galleries_preferences.cc
index 741d0a2..006fee9 100644
--- a/chrome/browser/media_galleries/media_galleries_preferences.cc
+++ b/chrome/browser/media_galleries/media_galleries_preferences.cc
@@ -1088,6 +1088,18 @@ const MediaGalleriesPrefInfoMap& MediaGalleriesPreferences::known_galleries()
return known_galleries_;
}
+base::Time MediaGalleriesPreferences::GetLastScanCompletionTime() const {
+ int64 last_scan_time_internal =
+ profile_->GetPrefs()->GetInt64(prefs::kMediaGalleriesLastScanTime);
+ return base::Time::FromInternalValue(last_scan_time_internal);
+}
+
+void MediaGalleriesPreferences::SetLastScanCompletionTime(
+ const base::Time& time) {
+ profile_->GetPrefs()->SetInt64(prefs::kMediaGalleriesLastScanTime,
+ time.ToInternalValue());
+}
+
void MediaGalleriesPreferences::Shutdown() {
weak_factory_.InvalidateWeakPtrs();
profile_ = NULL;
@@ -1109,6 +1121,10 @@ void MediaGalleriesPreferences::RegisterProfilePrefs(
prefs::kMediaGalleriesUniqueId,
kInvalidMediaGalleryPrefId + 1,
user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
+ registry->RegisterInt64Pref(
+ prefs::kMediaGalleriesLastScanTime,
+ base::Time().ToInternalValue(),
+ user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
}
bool MediaGalleriesPreferences::SetGalleryPermissionInPrefs(
diff --git a/chrome/browser/media_galleries/media_galleries_preferences.h b/chrome/browser/media_galleries/media_galleries_preferences.h
index 9b3be73..f868aa3 100644
--- a/chrome/browser/media_galleries/media_galleries_preferences.h
+++ b/chrome/browser/media_galleries/media_galleries_preferences.h
@@ -248,6 +248,11 @@ class MediaGalleriesPreferences : public BrowserContextKeyedService,
const MediaGalleriesPrefInfoMap& known_galleries() const;
+ // These keep track of when we last successfully completed a media scan.
+ // This is used to provide cached results when appropriate.
+ base::Time GetLastScanCompletionTime() const;
+ void SetLastScanCompletionTime(const base::Time& time);
+
// BrowserContextKeyedService implementation:
virtual void Shutdown() OVERRIDE;
diff --git a/chrome/browser/media_galleries/media_scan_manager.cc b/chrome/browser/media_galleries/media_scan_manager.cc
index 5aebe16..338fe00 100644
--- a/chrome/browser/media_galleries/media_scan_manager.cc
+++ b/chrome/browser/media_galleries/media_scan_manager.cc
@@ -7,6 +7,7 @@
#include "base/file_util.h"
#include "base/files/file_enumerator.h"
#include "base/logging.h"
+#include "base/time/time.h"
#include "chrome/browser/chrome_notification_types.h"
#include "chrome/browser/extensions/extension_service.h"
#include "chrome/browser/media_galleries/media_galleries_preferences.h"
@@ -32,6 +33,9 @@ typedef std::set<std::string /*extension id*/> ScanningExtensionIdSet;
// directories in the parent directory must be scan results.
const int kContainerDirectoryMinimumPercent = 80;
+// How long after a completed media scan can we provide the cached results.
+const int kScanResultsExpiryTimeInHours = 24;
+
struct LocationInfo {
LocationInfo()
: pref_id(kInvalidMediaGalleryPrefId),
@@ -307,19 +311,39 @@ void MediaScanManager::CancelScansForProfile(Profile* profile) {
}
void MediaScanManager::StartScan(Profile* profile,
- const std::string& extension_id) {
+ const extensions::Extension* extension,
+ bool user_gesture) {
+ DCHECK(extension);
DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
ScanObserverMap::iterator scans_for_profile = observers_.find(profile);
// We expect that an MediaScanManagerObserver has already been registered.
DCHECK(scans_for_profile != observers_.end());
- bool start_scan = !ScanInProgress();
+ bool scan_in_progress = ScanInProgress();
// Ignore requests for extensions that are already scanning.
ScanningExtensionIdSet* scanning_extensions;
scanning_extensions = &scans_for_profile->second.scanning_extensions;
- if (!start_scan && ContainsKey(*scanning_extensions, extension_id))
+ if (scan_in_progress && ContainsKey(*scanning_extensions, extension->id()))
return;
+ // Provide cached result if there is not already a scan in progress,
+ // there is no user gesture, and the previous results are unexpired.
+ MediaGalleriesPreferences* preferences =
+ MediaGalleriesPreferencesFactory::GetForProfile(profile);
+ base::TimeDelta time_since_last_scan =
+ base::Time::Now() - preferences->GetLastScanCompletionTime();
+ if (!scan_in_progress && !user_gesture && time_since_last_scan <
+ base::TimeDelta::FromHours(kScanResultsExpiryTimeInHours)) {
+ MediaGalleryScanResult file_counts;
+ int gallery_count =
+ CountScanResultsForExtension(preferences, extension, &file_counts);
+ scans_for_profile->second.observer->OnScanStarted(extension->id());
+ scans_for_profile->second.observer->OnScanFinished(extension->id(),
+ gallery_count,
+ file_counts);
+ return;
+ }
+
// On first scan for the |profile|, register to listen for extension unload.
if (scanning_extensions->empty()) {
registrar_.Add(
@@ -328,8 +352,8 @@ void MediaScanManager::StartScan(Profile* profile,
content::Source<Profile>(profile));
}
- scanning_extensions->insert(extension_id);
- scans_for_profile->second.observer->OnScanStarted(extension_id);
+ scanning_extensions->insert(extension->id());
+ scans_for_profile->second.observer->OnScanStarted(extension->id());
if (folder_finder_)
return;
@@ -346,17 +370,17 @@ void MediaScanManager::StartScan(Profile* profile,
}
void MediaScanManager::CancelScan(Profile* profile,
- const std::string& extension_id) {
+ const extensions::Extension* extension) {
DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
// Erases the logical scan if found, early exit otherwise.
ScanObserverMap::iterator scans_for_profile = observers_.find(profile);
if (scans_for_profile == observers_.end() ||
- !scans_for_profile->second.scanning_extensions.erase(extension_id)) {
+ !scans_for_profile->second.scanning_extensions.erase(extension->id())) {
return;
}
- scans_for_profile->second.observer->OnScanCancelled(extension_id);
+ scans_for_profile->second.observer->OnScanCancelled(extension->id());
// No more scanning extensions for |profile|, so stop listening for unloads.
if (scans_for_profile->second.scanning_extensions.empty()) {
@@ -389,7 +413,7 @@ void MediaScanManager::Observe(
content::Details<extensions::UnloadedExtensionInfo>(
details)->extension);
DCHECK(extension);
- CancelScan(profile, extension->id());
+ CancelScan(profile, extension);
break;
}
default:
@@ -437,11 +461,11 @@ void MediaScanManager::OnFoundContainerDirectories(
++scans_for_profile) {
if (scans_for_profile->second.scanning_extensions.empty())
continue;
+ Profile* profile = scans_for_profile->first;
MediaGalleriesPreferences* preferences =
- MediaGalleriesPreferencesFactory::GetForProfile(
- scans_for_profile->first);
- ExtensionService* extension_service = extensions::ExtensionSystem::Get(
- scans_for_profile->first)->extension_service();;
+ MediaGalleriesPreferencesFactory::GetForProfile(profile);
+ ExtensionService* extension_service =
+ extensions::ExtensionSystem::Get(profile)->extension_service();
if (!extension_service)
continue;
@@ -465,6 +489,7 @@ void MediaScanManager::OnFoundContainerDirectories(
}
}
scanning_extensions->clear();
+ preferences->SetLastScanCompletionTime(base::Time::Now());
}
registrar_.RemoveAll();
folder_finder_.reset();
diff --git a/chrome/browser/media_galleries/media_scan_manager.h b/chrome/browser/media_galleries/media_scan_manager.h
index 8a60403..a04e7ea 100644
--- a/chrome/browser/media_galleries/media_scan_manager.h
+++ b/chrome/browser/media_galleries/media_scan_manager.h
@@ -21,6 +21,10 @@
class Profile;
class MediaScanManagerObserver;
+namespace extensions {
+class Extension;
+} // namespace extensions
+
// The MediaScanManager is owned by MediaFileSystemRegistry, which is global.
// This class manages multiple 'virtual' media scans, up to one per extension
// per profile, and also manages the one physical scan backing them.
@@ -41,8 +45,9 @@ class MediaScanManager : public content::NotificationObserver {
// The results of the scan are reported to the registered
// MediaScanManagerObserver via OnScanFinished. There must be an observer
// registered for |profile| before the scan starts.
- void StartScan(Profile* profile, const std::string& extension_id);
- void CancelScan(Profile* profile, const std::string& extension_id);
+ void StartScan(Profile* profile, const extensions::Extension* extension,
+ bool user_gesture);
+ void CancelScan(Profile* profile, const extensions::Extension* extension);
protected:
friend class MediaGalleriesPlatformAppBrowserTest;
diff --git a/chrome/browser/media_galleries/media_scan_manager_unittest.cc b/chrome/browser/media_galleries/media_scan_manager_unittest.cc
index a64b265..6d23369 100644
--- a/chrome/browser/media_galleries/media_scan_manager_unittest.cc
+++ b/chrome/browser/media_galleries/media_scan_manager_unittest.cc
@@ -190,7 +190,8 @@ class MediaScanManagerTest : public MediaScanManagerObserver,
}
void StartScan() {
- media_scan_manager_->StartScan(profile_.get(), extension_->id());
+ media_scan_manager_->StartScan(profile_.get(), extension_,
+ true /* user_gesture */);
}
MediaGalleriesPreferences* gallery_prefs() {
diff --git a/chrome/common/pref_names.cc b/chrome/common/pref_names.cc
index 8290853..af9398c 100644
--- a/chrome/common/pref_names.cc
+++ b/chrome/common/pref_names.cc
@@ -2431,6 +2431,9 @@ const char kMediaGalleriesUniqueId[] = "media_galleries.gallery_id";
const char kMediaGalleriesRememberedGalleries[] =
"media_galleries.remembered_galleries";
+// The last time a media scan completed.
+const char kMediaGalleriesLastScanTime[] = "media_galleries.last_scan_time";
+
#if defined(USE_ASH)
// |kShelfAlignment| and |kShelfAutoHideBehavior| have a local variant. The
// local variant is not synced and is used if set. If the local variant is not
diff --git a/chrome/common/pref_names.h b/chrome/common/pref_names.h
index 39b59b2..06bbaca 100644
--- a/chrome/common/pref_names.h
+++ b/chrome/common/pref_names.h
@@ -836,6 +836,7 @@ extern const char kComponentUpdaterState[];
extern const char kMediaGalleriesUniqueId[];
extern const char kMediaGalleriesRememberedGalleries[];
+extern const char kMediaGalleriesLastScanTime[];
#if defined(USE_ASH)
extern const char kShelfAlignment[];