#include "base/compiler_specific.h"
#include "base/memory/scoped_ptr.h"
#include "base/memory/weak_ptr.h"
+#include "base/scoped_observer.h"
+#include "base/time/time.h"
#include "chrome/browser/media_galleries/media_folder_finder.h"
#include "chrome/browser/media_galleries/media_scan_types.h"
-#include "content/public/browser/notification_observer.h"
-#include "content/public/browser/notification_registrar.h"
+#include "extensions/browser/extension_registry_observer.h"
-class Profile;
class MediaScanManagerObserver;
+class Profile;
namespace extensions {
class Extension;
-} // namespace extensions
+class ExtensionRegistry;
+}
// 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.
// This class lives and is called on the UI thread.
-class MediaScanManager : public content::NotificationObserver {
+class MediaScanManager : public extensions::ExtensionRegistryObserver {
public:
MediaScanManager();
- virtual ~MediaScanManager();
+ ~MediaScanManager() override;
// There can only be ever one observer registered per profile. Does not take
// ownership of |observer|. An observer must be registered before scanning.
protected:
friend class MediaGalleriesPlatformAppBrowserTest;
+ friend class MediaScanManagerTest;
typedef base::Callback<MediaFolderFinder*(
const MediaFolderFinder::MediaFolderFinderResultsCallback&)>
void SetMediaFolderFinderFactory(const MediaFolderFinderFactory& factory);
+ // Here so that friend MediaScanManagerTest can access it.
+ static MediaFolderFinder::MediaFolderFinderResults FindContainerScanResults(
+ const MediaFolderFinder::MediaFolderFinderResults& found_folders,
+ const std::vector<base::FilePath>& sensitive_locations);
+
private:
struct ScanObservers {
ScanObservers();
};
typedef std::map<Profile*, ScanObservers> ScanObserverMap;
- // content::NotificationObserver implementation.
- virtual void Observe(int type,
- const content::NotificationSource& source,
- const content::NotificationDetails& details) OVERRIDE;
+ // extensions::ExtensionRegistryObserver implementation.
+ void OnExtensionUnloaded(
+ content::BrowserContext* browser_context,
+ const extensions::Extension* extension,
+ extensions::UnloadedExtensionInfo::Reason reason) override;
bool ScanInProgress() const;
scoped_ptr<MediaFolderFinder> folder_finder_;
+ base::Time scan_start_time_;
+
// If not NULL, used to create |folder_finder_|. Used for testing.
MediaFolderFinderFactory testing_folder_finder_factory_;
// Set of extensions (on all profiles) that have an in-progress scan.
ScanObserverMap observers_;
- // Used to listen for NOTIFICATION_EXTENSION_UNLOADED events.
- content::NotificationRegistrar registrar_;
+ ScopedObserver<extensions::ExtensionRegistry,
+ extensions::ExtensionRegistryObserver>
+ scoped_extension_registry_observer_;
base::WeakPtrFactory<MediaScanManager> weak_factory_;