12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// GalleryWatchManager implementation. 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/extensions/api/media_galleries_private/gallery_watch_manager.h" 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <list> 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <set> 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/bind.h" 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/callback.h" 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/compiler_specific.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path_watcher.h" 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/location.h" 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/memory/ref_counted.h" 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/stl_util.h" 19eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h" 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/extensions/api/media_galleries_private/media_galleries_private_event_router.h" 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/browser_thread.h" 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace extensions { 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace { 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using content::BrowserThread; 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Map to keep track of profile specific GalleryWatchManager objects. 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Key: Profile identifier. 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Value: GalleryWatchManager*. 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// This map owns the GalleryWatchManager object. 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)typedef std::map<void*, extensions::GalleryWatchManager*> WatchManagerMap; 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WatchManagerMap* g_gallery_watch_managers = NULL; 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Dispatches the gallery changed event on the UI thread. 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SendGalleryChangedEventOnUIThread( 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::WeakPtr<MediaGalleriesPrivateEventRouter> event_router, 39d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) MediaGalleryPrefId gallery_id, 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::set<std::string>& extension_ids) { 41effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch DCHECK_CURRENTLY_ON(BrowserThread::UI); 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (event_router.get()) 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) event_router->OnGalleryChanged(gallery_id, extension_ids); 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/////////////////////////////////////////////////////////////////////////////// 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// GalleryWatchManager::GalleryFilePathWatcher // 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/////////////////////////////////////////////////////////////////////////////// 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// This class does a recursive watch on the gallery file path and holds a list 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// of extensions that are watching the gallery. When there is a file system 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// activity within the gallery, GalleryFilePathWatcher notifies the interested 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// extensions. This class lives on the file thread. 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class GalleryWatchManager::GalleryFilePathWatcher 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : public base::RefCounted<GalleryFilePathWatcher> { 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // |on_destroyed_callback| is called when the last GalleryFilePathWatcher 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // reference goes away. 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GalleryFilePathWatcher( 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::WeakPtr<MediaGalleriesPrivateEventRouter> event_router, 63d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) MediaGalleryPrefId gallery_id, 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& path, 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& extension_id, 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::Closure& on_destroyed_callback); 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Adds the extension reference to the watched gallery. 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void AddExtension(const std::string& extension_id); 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Removes the extension reference to the watched gallery. 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void RemoveExtension(const std::string& extension_id); 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Handles the extension unloaded/uninstalled event. 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void OnExtensionUnloaded(const std::string& extension_id); 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Sets up the watch operation for the specified |gallery_path_|. On 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // success, returns true. 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool SetupWatch(); 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Removes all the extension references when the browser profile is in 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // shutdown mode. 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void RemoveAllWatchReferences(); 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) friend class base::RefCounted<GalleryFilePathWatcher>; 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Key: Extension identifier, e.g "qoueruoweuroiwueroiwujkshdf". 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Value: Time at which the last gallery changed event is dispatched. 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Initialized to null Time value. 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) typedef std::map<std::string, base::Time> ExtensionWatchInfoMap; 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Private because GalleryFilePathWatcher is ref-counted. 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~GalleryFilePathWatcher(); 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // FilePathWatcher callback. 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void OnFilePathChanged(const base::FilePath& path, bool error); 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Remove the watch references for the extension specified by the 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // |extension_id|. 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void RemoveExtensionReferences(const std::string& extension_id); 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Used to notify the interested extensions about the gallery changed event. 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::WeakPtr<MediaGalleriesPrivateEventRouter> event_router_; 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The gallery identifier, e.g "1". 107d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) MediaGalleryPrefId gallery_id_; 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The gallery file path watcher. 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePathWatcher file_watcher_; 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The gallery file path, e.g "C:\My Pictures". 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath gallery_path_; 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // A callback to call when |this| object is destroyed. 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Closure on_destroyed_callback_; 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Map to keep track of the extension and its corresponding watch count. 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ExtensionWatchInfoMap extension_watch_info_map_; 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Used to provide a weak pointer to FilePathWatcher callback. 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::WeakPtrFactory<GalleryFilePathWatcher> weak_ptr_factory_; 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(GalleryFilePathWatcher); 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)GalleryWatchManager::GalleryFilePathWatcher::GalleryFilePathWatcher( 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::WeakPtr<MediaGalleriesPrivateEventRouter> event_router, 129d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) MediaGalleryPrefId gallery_id, 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& path, 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& extension_id, 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::Closure& on_destroyed_callback) 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : event_router_(event_router), 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gallery_id_(gallery_id), 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) on_destroyed_callback_(on_destroyed_callback), 136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) weak_ptr_factory_(this) { 137effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch DCHECK_CURRENTLY_ON(BrowserThread::FILE); 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gallery_path_ = path; 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddExtension(extension_id); 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void GalleryWatchManager::GalleryFilePathWatcher::AddExtension( 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& extension_id) { 144effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch DCHECK_CURRENTLY_ON(BrowserThread::FILE); 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (ContainsKey(extension_watch_info_map_, extension_id)) 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extension_watch_info_map_[extension_id] = base::Time(); 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddRef(); 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void GalleryWatchManager::GalleryFilePathWatcher::RemoveExtension( 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& extension_id) { 153effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch DCHECK_CURRENTLY_ON(BrowserThread::FILE); 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (extension_watch_info_map_.erase(extension_id) == 1) 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Release(); 1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void GalleryWatchManager::GalleryFilePathWatcher::OnExtensionUnloaded( 1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& extension_id) { 160effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch DCHECK_CURRENTLY_ON(BrowserThread::FILE); 1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RemoveExtensionReferences(extension_id); 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GalleryWatchManager::GalleryFilePathWatcher::SetupWatch() { 165effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch DCHECK_CURRENTLY_ON(BrowserThread::FILE); 1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return file_watcher_.Watch( 1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gallery_path_, true, 1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&GalleryFilePathWatcher::OnFilePathChanged, 1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) weak_ptr_factory_.GetWeakPtr())); 1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void GalleryWatchManager::GalleryFilePathWatcher::RemoveAllWatchReferences() { 173effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch DCHECK_CURRENTLY_ON(BrowserThread::FILE); 1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::set<std::string> extension_ids; 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (ExtensionWatchInfoMap::iterator iter = extension_watch_info_map_.begin(); 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) iter != extension_watch_info_map_.end(); ++iter) 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extension_ids.insert(iter->first); 1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (std::set<std::string>::const_iterator it = extension_ids.begin(); 1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) it != extension_ids.end(); ++it) 1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RemoveExtensionReferences(*it); 1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)GalleryWatchManager::GalleryFilePathWatcher::~GalleryFilePathWatcher() { 185effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch DCHECK_CURRENTLY_ON(BrowserThread::FILE); 1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) on_destroyed_callback_.Run(); 1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void GalleryWatchManager::GalleryFilePathWatcher::OnFilePathChanged( 1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& path, 1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool error) { 192effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch DCHECK_CURRENTLY_ON(BrowserThread::FILE); 1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (error || (path != gallery_path_)) 1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::set<std::string> extension_ids; 1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (ExtensionWatchInfoMap::iterator iter = extension_watch_info_map_.begin(); 1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) iter != extension_watch_info_map_.end(); ++iter) { 1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!iter->second.is_null()) { 2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Ignore gallery change event if it is received too frequently. 2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // For example, when an user copies/deletes 1000 media files from a 2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // gallery, this callback is called 1000 times within a span of 10ms. 2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // GalleryWatchManager should not send 1000 gallery changed events to 2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // the watching extension. 2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const int kMinSecondsToIgnoreGalleryChangedEvent = 3; 2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::TimeDelta diff = base::Time::Now() - iter->second; 2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (diff.InSeconds() < kMinSecondsToIgnoreGalleryChangedEvent) 2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) continue; 2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) iter->second = base::Time::Now(); 2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extension_ids.insert(iter->first); 2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!extension_ids.empty()) { 2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::BrowserThread::PostTask( 2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::BrowserThread::UI, FROM_HERE, 2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(SendGalleryChangedEventOnUIThread, event_router_, 2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gallery_id_, extension_ids)); 2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void GalleryWatchManager::GalleryFilePathWatcher::RemoveExtensionReferences( 2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& extension_id) { 223effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch DCHECK_CURRENTLY_ON(BrowserThread::FILE); 2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ExtensionWatchInfoMap::iterator it = 2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extension_watch_info_map_.find(extension_id); 2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (it == extension_watch_info_map_.end()) 2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extension_watch_info_map_.erase(it); 2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Release(); 2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/////////////////////////////////////////////////////////////////////////////// 2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// GalleryWatchManager // 2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/////////////////////////////////////////////////////////////////////////////// 2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static 2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)GalleryWatchManager* GalleryWatchManager::GetForProfile( 2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void* profile_id) { 239effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch DCHECK_CURRENTLY_ON(BrowserThread::FILE); 2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(profile_id); 2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool has_watch_manager = (g_gallery_watch_managers && 2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GalleryWatchManager::HasForProfile(profile_id)); 2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!g_gallery_watch_managers) 2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) g_gallery_watch_managers = new WatchManagerMap; 2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!has_watch_manager) 2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (*g_gallery_watch_managers)[profile_id] = new GalleryWatchManager; 2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return (*g_gallery_watch_managers)[profile_id]; 2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static 2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GalleryWatchManager::HasForProfile(void* profile_id) { 252effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch DCHECK_CURRENTLY_ON(BrowserThread::FILE); 2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(profile_id); 2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!g_gallery_watch_managers) 2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WatchManagerMap::const_iterator it = 2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) g_gallery_watch_managers->find(profile_id); 2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return (it != g_gallery_watch_managers->end()); 2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static 2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void GalleryWatchManager::OnProfileShutdown(void* profile_id) { 263effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch DCHECK_CURRENTLY_ON(BrowserThread::FILE); 2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(profile_id); 2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!g_gallery_watch_managers || g_gallery_watch_managers->empty()) 2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WatchManagerMap::iterator it = g_gallery_watch_managers->find(profile_id); 2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (it == g_gallery_watch_managers->end()) 2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delete it->second; 2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) g_gallery_watch_managers->erase(it); 2720529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch if (g_gallery_watch_managers->empty()) { 2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delete g_gallery_watch_managers; 2740529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch g_gallery_watch_managers = NULL; 2750529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch } 2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static 2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GalleryWatchManager::SetupGalleryWatch( 2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void* profile_id, 281d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) MediaGalleryPrefId gallery_id, 2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& watch_path, 2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& extension_id, 2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::WeakPtr<MediaGalleriesPrivateEventRouter> event_router) { 285effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch DCHECK_CURRENTLY_ON(BrowserThread::FILE); 2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return GalleryWatchManager::GetForProfile(profile_id)->StartGalleryWatch( 2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gallery_id, watch_path, extension_id, event_router); 2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static 2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void GalleryWatchManager::RemoveGalleryWatch(void* profile_id, 2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& watch_path, 2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& extension_id) { 294effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch DCHECK_CURRENTLY_ON(BrowserThread::FILE); 2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!GalleryWatchManager::HasForProfile(profile_id)) 2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GalleryWatchManager::GetForProfile(profile_id)->StopGalleryWatch( 2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) watch_path, extension_id); 2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void GalleryWatchManager::OnExtensionUnloaded(void* profile_id, 3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& extension_id) { 303effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch DCHECK_CURRENTLY_ON(BrowserThread::FILE); 3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!GalleryWatchManager::HasForProfile(profile_id)) 3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GalleryWatchManager::GetForProfile(profile_id)->HandleExtensionUnloadedEvent( 3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extension_id); 3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)GalleryWatchManager::GalleryWatchManager() { 311effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch DCHECK_CURRENTLY_ON(BrowserThread::FILE); 3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)GalleryWatchManager::~GalleryWatchManager() { 315effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch DCHECK_CURRENTLY_ON(BrowserThread::FILE); 3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DeleteAllWatchers(); 3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GalleryWatchManager::StartGalleryWatch( 320d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) MediaGalleryPrefId gallery_id, 3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& watch_path, 3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& extension_id, 3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::WeakPtr<MediaGalleriesPrivateEventRouter> event_router) { 324effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch DCHECK_CURRENTLY_ON(BrowserThread::FILE); 3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WatcherMap::const_iterator iter = gallery_watchers_.find(watch_path); 3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (iter != gallery_watchers_.end()) { 3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Already watched. 3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) iter->second->AddExtension(extension_id); 3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Need to add a new watcher. 3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<GalleryFilePathWatcher> watch( 3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new GalleryFilePathWatcher( 3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) event_router, gallery_id, watch_path, extension_id, 3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&GalleryWatchManager::RemoveGalleryFilePathWatcherEntry, 3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Unretained(this), 3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) watch_path))); 3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!watch->SetupWatch()) 3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gallery_watchers_[watch_path] = watch.get(); 3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void GalleryWatchManager::StopGalleryWatch( 3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& watch_path, 3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& extension_id) { 348effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch DCHECK_CURRENTLY_ON(BrowserThread::FILE); 3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WatcherMap::iterator iter = gallery_watchers_.find(watch_path); 3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (iter == gallery_watchers_.end()) 3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Remove the renderer process for this watch. 3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) iter->second->RemoveExtension(extension_id); 3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void GalleryWatchManager::HandleExtensionUnloadedEvent( 3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& extension_id) { 358effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch DCHECK_CURRENTLY_ON(BrowserThread::FILE); 3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::list<base::FilePath> watchers_to_notify; 3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (WatcherMap::iterator iter = gallery_watchers_.begin(); 3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) iter != gallery_watchers_.end(); ++iter) 3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) watchers_to_notify.push_back(iter->first); 3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (std::list<base::FilePath>::const_iterator path = 3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) watchers_to_notify.begin(); 3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) path != watchers_to_notify.end(); ++path) { 3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WatcherMap::iterator iter = gallery_watchers_.find(*path); 3682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (iter == gallery_watchers_.end()) 3692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) continue; 3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) iter->second->OnExtensionUnloaded(extension_id); 3712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void GalleryWatchManager::DeleteAllWatchers() { 375effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch DCHECK_CURRENTLY_ON(BrowserThread::FILE); 3762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (gallery_watchers_.empty()) 3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Create a copy of |gallery_watchers_| to delete because 3802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // GalleryFilePathWatcher::RemoveAllWatchReferences will 3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // eventually call GalleryWatchManager::RemoveGalleryFilePathWatcherEntry() 3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // and modify |gallery_watchers_|. 3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WatcherMap watchers_to_delete(gallery_watchers_); 3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (WatcherMap::const_iterator iter = watchers_to_delete.begin(); 3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) iter != watchers_to_delete.end(); ++iter) 3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) iter->second->RemoveAllWatchReferences(); 3872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void GalleryWatchManager::RemoveGalleryFilePathWatcherEntry( 3902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& watch_path) { 391effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch DCHECK_CURRENTLY_ON(BrowserThread::FILE); 3922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gallery_watchers_.erase(watch_path); 3932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace extensions 396