From 5a43fe6ffbd21cc9a494fa6ed841f877fa09e243 Mon Sep 17 00:00:00 2001 From: "tommycli@chromium.org" Date: Thu, 3 Jul 2014 02:52:37 +0000 Subject: [PATCH] Media Galleries API: Hook GalleryWatchManager up to MediaGalleriesEventRouter. BUG=144491 Review URL: https://codereview.chromium.org/331353007 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@281132 0039d316-1c4b-4281-b951-d872f2087c98 --- .../media_galleries/media_galleries_api.cc | 51 ++++++++++++++++++- .../api/media_galleries/media_galleries_api.h | 16 +++++- .../media_file_system_registry.cc | 7 +++ .../media_file_system_registry.h | 3 ++ .../common/extensions/api/media_galleries.idl | 19 +++++++ 5 files changed, 94 insertions(+), 2 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 f4aa4848bff590..ff309f98ec92ef 100644 --- a/chrome/browser/extensions/api/media_galleries/media_galleries_api.cc +++ b/chrome/browser/extensions/api/media_galleries/media_galleries_api.cc @@ -24,6 +24,7 @@ #include "chrome/browser/extensions/blob_reader.h" #include "chrome/browser/extensions/extension_tab_util.h" #include "chrome/browser/media_galleries/fileapi/safe_media_metadata_parser.h" +#include "chrome/browser/media_galleries/gallery_watch_manager.h" #include "chrome/browser/media_galleries/media_file_system_registry.h" #include "chrome/browser/media_galleries/media_galleries_histograms.h" #include "chrome/browser/media_galleries/media_galleries_permission_controller.h" @@ -45,7 +46,6 @@ #include "content/public/browser/render_view_host.h" #include "content/public/browser/web_contents.h" #include "extensions/browser/blob_holder.h" -#include "extensions/browser/event_router.h" #include "extensions/browser/extension_prefs.h" #include "extensions/browser/extension_system.h" #include "extensions/common/extension.h" @@ -97,6 +97,10 @@ MediaFileSystemRegistry* media_file_system_registry() { return g_browser_process->media_file_system_registry(); } +GalleryWatchManager* gallery_watch_manager() { + return media_file_system_registry()->gallery_watch_manager(); +} + MediaScanManager* media_scan_manager() { return media_file_system_registry()->media_scan_manager(); } @@ -279,6 +283,11 @@ MediaGalleriesEventRouter::MediaGalleriesEventRouter( : profile_(Profile::FromBrowserContext(context)), weak_ptr_factory_(this) { DCHECK_CURRENTLY_ON(content::BrowserThread::UI); DCHECK(profile_); + + EventRouter::Get(profile_)->RegisterObserver( + this, MediaGalleries::OnGalleryChanged::kEventName); + + gallery_watch_manager()->AddObserver(profile_, this); media_scan_manager()->AddObserver(profile_, this); } @@ -288,6 +297,10 @@ MediaGalleriesEventRouter::~MediaGalleriesEventRouter() { void MediaGalleriesEventRouter::Shutdown() { DCHECK_CURRENTLY_ON(content::BrowserThread::UI); weak_ptr_factory_.InvalidateWeakPtrs(); + + EventRouter::Get(profile_)->UnregisterObserver(this); + + gallery_watch_manager()->RemoveObserver(profile_); media_scan_manager()->RemoveObserver(profile_); media_scan_manager()->CancelScansForProfile(profile_); } @@ -311,6 +324,12 @@ MediaGalleriesEventRouter* MediaGalleriesEventRouter::Get( return BrowserContextKeyedAPIFactory::Get(context); } +bool MediaGalleriesEventRouter::ExtensionHasGalleryChangeListener( + const std::string& extension_id) const { + return EventRouter::Get(profile_)->ExtensionHasEventListener( + extension_id, MediaGalleries::OnGalleryChanged::kEventName); +} + bool MediaGalleriesEventRouter::ExtensionHasScanProgressListener( const std::string& extension_id) const { return EventRouter::Get(profile_)->ExtensionHasEventListener( @@ -376,6 +395,36 @@ void MediaGalleriesEventRouter::DispatchEventToExtension( router->DispatchEventToExtension(extension_id, event.Pass()); } +void MediaGalleriesEventRouter::OnGalleryChanged( + const std::string& extension_id, MediaGalleryPrefId gallery_id) { + MediaGalleries::GalleryChangeDetails details; + details.type = MediaGalleries::GALLERY_CHANGE_TYPE_CONTENTS_CHANGED; + details.gallery_id = gallery_id; + DispatchEventToExtension( + extension_id, + MediaGalleries::OnGalleryChanged::kEventName, + MediaGalleries::OnGalleryChanged::Create(details).Pass()); +} + +void MediaGalleriesEventRouter::OnGalleryWatchDropped( + const std::string& extension_id, MediaGalleryPrefId gallery_id) { + MediaGalleries::GalleryChangeDetails details; + details.type = MediaGalleries::GALLERY_CHANGE_TYPE_WATCH_DROPPED; + details.gallery_id = gallery_id; + DispatchEventToExtension( + extension_id, + MediaGalleries::OnGalleryChanged::kEventName, + MediaGalleries::OnGalleryChanged::Create(details).Pass()); +} + +void MediaGalleriesEventRouter::OnListenerRemoved( + const EventListenerInfo& details) { + if (details.event_name == MediaGalleries::OnGalleryChanged::kEventName && + !ExtensionHasGalleryChangeListener(details.extension_id)) { + gallery_watch_manager()->RemoveAllWatches(profile_, details.extension_id); + } +} + MediaGalleriesGetMediaFileSystemsFunction:: ~MediaGalleriesGetMediaFileSystemsFunction() {} diff --git a/chrome/browser/extensions/api/media_galleries/media_galleries_api.h b/chrome/browser/extensions/api/media_galleries/media_galleries_api.h index 184f00dbe911f0..7e1208c3350f4a 100644 --- a/chrome/browser/extensions/api/media_galleries/media_galleries_api.h +++ b/chrome/browser/extensions/api/media_galleries/media_galleries_api.h @@ -15,12 +15,14 @@ #include "base/memory/scoped_ptr.h" #include "base/memory/weak_ptr.h" #include "chrome/browser/extensions/chrome_extension_function.h" +#include "chrome/browser/media_galleries/gallery_watch_manager_observer.h" #include "chrome/browser/media_galleries/media_file_system_registry.h" #include "chrome/browser/media_galleries/media_scan_manager_observer.h" #include "chrome/common/extensions/api/media_galleries.h" #include "chrome/common/media_galleries/metadata_types.h" #include "components/storage_monitor/media_storage_util.h" #include "extensions/browser/browser_context_keyed_api_factory.h" +#include "extensions/browser/event_router.h" namespace MediaGalleries = extensions::api::media_galleries; @@ -42,7 +44,9 @@ class Extension; // The profile-keyed service that manages the media galleries extension API. // Created at the same time as the Profile. This is also the event router. class MediaGalleriesEventRouter : public BrowserContextKeyedAPI, - public MediaScanManagerObserver { + public GalleryWatchManagerObserver, + public MediaScanManagerObserver, + public extensions::EventRouter::Observer { public: // KeyedService implementation. virtual void Shutdown() OVERRIDE; @@ -54,6 +58,7 @@ class MediaGalleriesEventRouter : public BrowserContextKeyedAPI, // Convenience method to get the MediaGalleriesAPI for a profile. static MediaGalleriesEventRouter* Get(content::BrowserContext* context); + bool ExtensionHasGalleryChangeListener(const std::string& extension_id) const; bool ExtensionHasScanProgressListener(const std::string& extension_id) const; // MediaScanManagerObserver implementation. @@ -81,6 +86,15 @@ class MediaGalleriesEventRouter : public BrowserContextKeyedAPI, } static const bool kServiceIsNULLWhileTesting = true; + // GalleryWatchManagerObserver + virtual void OnGalleryChanged(const std::string& extension_id, + MediaGalleryPrefId gallery_id) OVERRIDE; + virtual void OnGalleryWatchDropped(const std::string& extension_id, + MediaGalleryPrefId gallery_id) OVERRIDE; + + // extensions::EventRouter::Observer implementation. + virtual void OnListenerRemoved(const EventListenerInfo& details) OVERRIDE; + // Current profile. Profile* profile_; diff --git a/chrome/browser/media_galleries/media_file_system_registry.cc b/chrome/browser/media_galleries/media_file_system_registry.cc index 01a1c8275faaaa..e0fbdce103c925 100644 --- a/chrome/browser/media_galleries/media_file_system_registry.cc +++ b/chrome/browser/media_galleries/media_file_system_registry.cc @@ -15,6 +15,7 @@ #include "chrome/browser/extensions/extension_service.h" #include "chrome/browser/media_galleries/fileapi/media_file_system_backend.h" #include "chrome/browser/media_galleries/fileapi/mtp_device_map_service.h" +#include "chrome/browser/media_galleries/gallery_watch_manager.h" #include "chrome/browser/media_galleries/imported_media_gallery_registry.h" #include "chrome/browser/media_galleries/media_file_system_context.h" #include "chrome/browser/media_galleries/media_galleries_dialog_controller.h" @@ -576,6 +577,12 @@ MediaScanManager* MediaFileSystemRegistry::media_scan_manager() { return media_scan_manager_.get(); } +GalleryWatchManager* MediaFileSystemRegistry::gallery_watch_manager() { + if (!gallery_watch_manager_) + gallery_watch_manager_.reset(new GalleryWatchManager); + return gallery_watch_manager_.get(); +} + void MediaFileSystemRegistry::OnRemovableStorageDetached( const StorageInfo& info) { DCHECK_CURRENTLY_ON(BrowserThread::UI); diff --git a/chrome/browser/media_galleries/media_file_system_registry.h b/chrome/browser/media_galleries/media_file_system_registry.h index 93446987565dc3..d6d0d1634d038c 100644 --- a/chrome/browser/media_galleries/media_file_system_registry.h +++ b/chrome/browser/media_galleries/media_file_system_registry.h @@ -22,6 +22,7 @@ #include "components/storage_monitor/removable_storage_observer.h" class ExtensionGalleriesHost; +class GalleryWatchManager; class MediaFileSystemContext; class MediaGalleriesPreferences; class MediaScanManager; @@ -95,6 +96,7 @@ class MediaFileSystemRegistry MediaGalleriesPreferences* GetPreferences(Profile* profile); MediaScanManager* media_scan_manager(); + GalleryWatchManager* gallery_watch_manager(); // RemovableStorageObserver implementation. virtual void OnRemovableStorageDetached( @@ -134,6 +136,7 @@ class MediaFileSystemRegistry scoped_ptr file_system_context_; scoped_ptr media_scan_manager_; + scoped_ptr gallery_watch_manager_; DISALLOW_COPY_AND_ASSIGN(MediaFileSystemRegistry); }; diff --git a/chrome/common/extensions/api/media_galleries.idl b/chrome/common/extensions/api/media_galleries.idl index e58e4b125e8e37..d0a979b092c522 100644 --- a/chrome/common/extensions/api/media_galleries.idl +++ b/chrome/common/extensions/api/media_galleries.idl @@ -6,6 +6,14 @@ // images, video) from the user's local disks (with the user's consent). namespace mediaGalleries { + [inline_doc] enum GalleryChangeType { + // The contents of the gallery have changed. + contents_changed, + // The watch has been dropped because the device has been detached, + // the gallery permission has been removed, or any other reason. + watch_dropped + }; + [inline_doc] enum GetMediaFileSystemsInteractivity { // Do not act interactively. no, @@ -36,6 +44,14 @@ namespace mediaGalleries { // The scan encountered an error and could not proceed. error }; + + [inline_doc] dictionary GalleryChangeDetails { + // Type of change event. + GalleryChangeType type; + + // Identifies the modified gallery. + DOMString galleryId; + }; [inline_doc] dictionary MediaFileSystemsDetails { // Whether to prompt the user for permission to additional media galleries @@ -207,6 +223,9 @@ namespace mediaGalleries { }; interface Events { + // Fired when a media gallery is changed or a gallery watch is dropped. + static void onGalleryChanged(GalleryChangeDetails details); + // The pending media scan has changed state. See details for more // information. static void onScanProgress(ScanProgressDetails details);