15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// MediaGalleriesPrivateEventRouter implementation. 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/api/media_galleries_private/media_galleries_private_event_router.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/values.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/extensions/api/media_galleries_private.h" 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/browser_thread.h" 13f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/browser/event_router.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)namespace media_galleries_private = extensions::api::media_galleries_private; 163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace extensions { 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)using media_galleries_private::GalleryChangeDetails; 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MediaGalleriesPrivateEventRouter::MediaGalleriesPrivateEventRouter( 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile) 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : profile_(profile) { 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(profile_); 25effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch DCHECK_CURRENTLY_ON(content::BrowserThread::UI); 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MediaGalleriesPrivateEventRouter::~MediaGalleriesPrivateEventRouter() { 29effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch DCHECK_CURRENTLY_ON(content::BrowserThread::UI); 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void MediaGalleriesPrivateEventRouter::OnGalleryChanged( 33d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) MediaGalleryPrefId gallery_id, 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::set<std::string>& extension_ids) { 35effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch DCHECK_CURRENTLY_ON(content::BrowserThread::UI); 360529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch EventRouter* router = EventRouter::Get(profile_); 373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (!router->HasEventListener( 383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) media_galleries_private::OnGalleryChanged::kEventName)) 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (std::set<std::string>::const_iterator it = extension_ids.begin(); 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) it != extension_ids.end(); ++it) { 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GalleryChangeDetails details; 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) details.gallery_id = gallery_id; 45eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_ptr<base::ListValue> args(new base::ListValue()); 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) args->Append(details.ToValue().release()); 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<extensions::Event> event(new extensions::Event( 483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) media_galleries_private::OnGalleryChanged::kEventName, 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) args.Pass())); 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Use DispatchEventToExtension() instead of BroadcastEvent(). 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // BroadcastEvent() sends the gallery changed events to all the extensions 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // who have added a listener to the onGalleryChanged event. There is a 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // chance that an extension might have added an onGalleryChanged() listener 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // without calling addGalleryWatch(). Therefore, use 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // DispatchEventToExtension() to dispatch the gallery changed event only to 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // the watching extensions. 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) router->DispatchEventToExtension(*it, event.Pass()); 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace extensions 62