| Index: chrome/browser/media_gallery/media_file_system_registry.cc
|
| ===================================================================
|
| --- chrome/browser/media_gallery/media_file_system_registry.cc (revision 141436)
|
| +++ chrome/browser/media_gallery/media_file_system_registry.cc (working copy)
|
| @@ -9,9 +9,11 @@
|
| #include <set>
|
|
|
| #include "base/path_service.h"
|
| -#include "base/sys_string_conversions.h"
|
| #include "chrome/common/chrome_paths.h"
|
| #include "content/public/browser/browser_thread.h"
|
| +#include "content/public/browser/notification_source.h"
|
| +#include "content/public/browser/notification_types.h"
|
| +#include "content/public/browser/render_process_host.h"
|
| #include "webkit/fileapi/isolated_context.h"
|
|
|
| namespace chrome {
|
| @@ -20,19 +22,41 @@
|
| g_media_file_system_registry = LAZY_INSTANCE_INITIALIZER;
|
|
|
| using content::BrowserThread;
|
| +using content::RenderProcessHost;
|
| using fileapi::IsolatedContext;
|
|
|
| +/******************
|
| + * Public methods
|
| + ******************/
|
| +
|
| // static
|
| MediaFileSystemRegistry* MediaFileSystemRegistry::GetInstance() {
|
| return g_media_file_system_registry.Pointer();
|
| }
|
|
|
| std::vector<MediaFileSystemRegistry::MediaFSIDAndPath>
|
| -MediaFileSystemRegistry::GetMediaFileSystems() const {
|
| +MediaFileSystemRegistry::GetMediaFileSystems(
|
| + const content::RenderProcessHost* rph) {
|
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| +
|
| std::vector<MediaFSIDAndPath> results;
|
| - for (MediaPathToFSIDMap::const_iterator it = media_fs_map_.begin();
|
| - it != media_fs_map_.end();
|
| + std::pair<ChildIdToMediaFSMap::iterator, bool> ret =
|
| + media_fs_map_.insert(std::make_pair(rph, MediaPathToFSIDMap()));
|
| + ChildIdToMediaFSMap::iterator& child_it = ret.first;
|
| + if (ret.second) {
|
| + // Never seen a GetMediaFileSystems call from this RPH. Initialize its
|
| + // file system mappings.
|
| + RegisterForRPHGoneNotifications(rph);
|
| + FilePath pictures_path;
|
| + if (PathService::Get(chrome::DIR_USER_PICTURES, &pictures_path)) {
|
| + std::string fsid = RegisterPathAsFileSystem(pictures_path);
|
| + child_it->second.insert(std::make_pair(pictures_path, fsid));
|
| + }
|
| + }
|
| +
|
| + MediaPathToFSIDMap& child_map = child_it->second;
|
| + for (MediaPathToFSIDMap::const_iterator it = child_map.begin();
|
| + it != child_map.end();
|
| ++it) {
|
| const FilePath path = it->first;
|
| const std::string fsid = it->second;
|
| @@ -41,17 +65,50 @@
|
| return results;
|
| }
|
|
|
| +void MediaFileSystemRegistry::Observe(
|
| + int type,
|
| + const content::NotificationSource& source,
|
| + const content::NotificationDetails& details) {
|
| + DCHECK(type == content::NOTIFICATION_RENDERER_PROCESS_CLOSED ||
|
| + type == content::NOTIFICATION_RENDERER_PROCESS_TERMINATED);
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| + const RenderProcessHost* rph =
|
| + content::Source<content::RenderProcessHost>(source).ptr();
|
| + ChildIdToMediaFSMap::iterator child_it = media_fs_map_.find(rph);
|
| + CHECK(child_it != media_fs_map_.end());
|
| + // No need to revoke the isolated file systems. The RPH will do that.
|
| + media_fs_map_.erase(child_it);
|
| + UnregisterForRPHGoneNotifications(rph);
|
| +}
|
| +
|
| +/******************
|
| + * Private methods
|
| + ******************/
|
| +
|
| MediaFileSystemRegistry::MediaFileSystemRegistry() {
|
| - FilePath pictures_path;
|
| - if (PathService::Get(chrome::DIR_USER_PICTURES, &pictures_path)) {
|
| - RegisterPathAsFileSystem(pictures_path);
|
| - }
|
| }
|
|
|
| MediaFileSystemRegistry::~MediaFileSystemRegistry() {
|
| }
|
|
|
| -void MediaFileSystemRegistry::RegisterPathAsFileSystem(const FilePath& path) {
|
| +void MediaFileSystemRegistry::RegisterForRPHGoneNotifications(
|
| + const content::RenderProcessHost* rph) {
|
| + registrar_.Add(this, content::NOTIFICATION_RENDERER_PROCESS_TERMINATED,
|
| + content::Source<RenderProcessHost>(rph));
|
| + registrar_.Add(this, content::NOTIFICATION_RENDERER_PROCESS_CLOSED,
|
| + content::Source<RenderProcessHost>(rph));
|
| +}
|
| +
|
| +void MediaFileSystemRegistry::UnregisterForRPHGoneNotifications(
|
| + const content::RenderProcessHost* rph) {
|
| + registrar_.Remove(this, content::NOTIFICATION_RENDERER_PROCESS_TERMINATED,
|
| + content::Source<RenderProcessHost>(rph));
|
| + registrar_.Remove(this, content::NOTIFICATION_RENDERER_PROCESS_CLOSED,
|
| + content::Source<RenderProcessHost>(rph));
|
| +}
|
| +
|
| +std::string MediaFileSystemRegistry::RegisterPathAsFileSystem(
|
| + const FilePath& path) {
|
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
|
|
| // Sanity checks for |path|.
|
| @@ -67,7 +124,7 @@
|
| const std::string fsid =
|
| IsolatedContext::GetInstance()->RegisterIsolatedFileSystem(fileset);
|
| CHECK(!fsid.empty());
|
| - media_fs_map_.insert(std::make_pair(path, fsid));
|
| + return fsid;
|
| }
|
|
|
| } // namespace chrome
|
|
|