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