Index: chrome/browser/extensions/api/media_galleries_private/media_galleries_private_event_router.cc |
diff --git a/chrome/browser/extensions/api/media_galleries_private/media_galleries_private_event_router.cc b/chrome/browser/extensions/api/media_galleries_private/media_galleries_private_event_router.cc |
index b270fad6a5104d53cc21f0fafd6feb3abd8f8256..fe7f002400fa54aefbba4d7cab4efa70adc33eb7 100644 |
--- a/chrome/browser/extensions/api/media_galleries_private/media_galleries_private_event_router.cc |
+++ b/chrome/browser/extensions/api/media_galleries_private/media_galleries_private_event_router.cc |
@@ -9,6 +9,7 @@ |
#include <map> |
#include "base/utf_string_conversions.h" |
+#include "base/values.h" |
#include "chrome/browser/browser_process.h" |
#include "chrome/browser/extensions/event_names.h" |
#include "chrome/browser/extensions/event_router.h" |
@@ -16,6 +17,7 @@ |
#include "chrome/browser/media_gallery/media_file_system_registry.h" |
#include "chrome/browser/profiles/profile.h" |
#include "chrome/common/extensions/api/media_galleries_private.h" |
+#include "content/public/browser/browser_thread.h" |
namespace extensions { |
@@ -31,27 +33,59 @@ std::string GetTransientIdForDeviceId(const std::string& device_id) { |
using extensions::api::media_galleries_private::DeviceAttachmentDetails; |
using extensions::api::media_galleries_private::DeviceDetachmentDetails; |
+using extensions::api::media_galleries_private::GalleryChangeDetails; |
MediaGalleriesPrivateEventRouter::MediaGalleriesPrivateEventRouter( |
Profile* profile) |
: profile_(profile) { |
- CHECK(profile_); |
- |
+ DCHECK(profile_); |
+ DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
base::SystemMonitor* system_monitor = base::SystemMonitor::Get(); |
if (system_monitor) |
system_monitor->AddDevicesChangedObserver(this); |
} |
MediaGalleriesPrivateEventRouter::~MediaGalleriesPrivateEventRouter() { |
+ DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
base::SystemMonitor* system_monitor = base::SystemMonitor::Get(); |
if (system_monitor) |
system_monitor->RemoveDevicesChangedObserver(this); |
} |
+void MediaGalleriesPrivateEventRouter::OnGalleryChanged( |
+ chrome::MediaGalleryPrefId gallery_id, |
+ const std::set<std::string>& extension_ids) { |
+ DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
+ EventRouter* router = |
+ extensions::ExtensionSystem::Get(profile_)->event_router(); |
+ if (!router->HasEventListener(event_names::kOnGalleryChangedEventName)) |
+ return; |
+ |
+ for (std::set<std::string>::const_iterator it = extension_ids.begin(); |
+ it != extension_ids.end(); ++it) { |
+ GalleryChangeDetails details; |
+ details.gallery_id = gallery_id; |
+ scoped_ptr<ListValue> args(new ListValue()); |
+ args->Append(details.ToValue().release()); |
+ scoped_ptr<extensions::Event> event(new extensions::Event( |
+ event_names::kOnGalleryChangedEventName, |
+ args.Pass())); |
+ // Use DispatchEventToExtension() instead of BroadcastEvent(). |
+ // BroadcastEvent() sends the gallery changed events to all the extensions |
+ // who have added a listener to the onGalleryChanged event. There is a |
+ // chance that an extension might have added an onGalleryChanged() listener |
+ // without calling addGalleryWatch(). Therefore, use |
+ // DispatchEventToExtension() to dispatch the gallery changed event only to |
+ // the watching extensions. |
+ router->DispatchEventToExtension(*it, event.Pass()); |
+ } |
+} |
+ |
void MediaGalleriesPrivateEventRouter::OnRemovableStorageAttached( |
const std::string& id, |
const string16& name, |
const FilePath::StringType& location) { |
+ DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
EventRouter* router = |
extensions::ExtensionSystem::Get(profile_)->event_router(); |
if (!router->HasEventListener(event_names::kOnAttachEventName)) |
@@ -68,6 +102,7 @@ void MediaGalleriesPrivateEventRouter::OnRemovableStorageAttached( |
void MediaGalleriesPrivateEventRouter::OnRemovableStorageDetached( |
const std::string& id) { |
+ DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
EventRouter* router = |
extensions::ExtensionSystem::Get(profile_)->event_router(); |
if (!router->HasEventListener(event_names::kOnDetachEventName)) |
@@ -84,6 +119,7 @@ void MediaGalleriesPrivateEventRouter::OnRemovableStorageDetached( |
void MediaGalleriesPrivateEventRouter::DispatchEvent( |
const std::string& event_name, |
scoped_ptr<base::ListValue> event_args) { |
+ DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
EventRouter* router = |
extensions::ExtensionSystem::Get(profile_)->event_router(); |
if (!router) |