Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(477)

Unified Diff: chrome/browser/extensions/api/media_galleries/media_galleries_api.cc

Issue 440813002: Expose gallery watching functionality to the public mediaGalleries API. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix race condition in the apitest. Created 6 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/extensions/api/media_galleries/media_galleries_api.cc
diff --git a/chrome/browser/extensions/api/media_galleries/media_galleries_api.cc b/chrome/browser/extensions/api/media_galleries/media_galleries_api.cc
index b72bec4ee3543a2f646e6e2798ac2aa1549c23ef..1dd6f813420b765f5472e1972f6c1d786f1177a5 100644
--- a/chrome/browser/extensions/api/media_galleries/media_galleries_api.cc
+++ b/chrome/browser/extensions/api/media_galleries/media_galleries_api.cc
@@ -68,6 +68,9 @@ namespace MediaGalleries = api::media_galleries;
namespace DropPermissionForMediaFileSystem =
MediaGalleries::DropPermissionForMediaFileSystem;
namespace GetMediaFileSystems = MediaGalleries::GetMediaFileSystems;
+namespace AddGalleryWatch = MediaGalleries::AddGalleryWatch;
+namespace RemoveGalleryWatch = MediaGalleries::RemoveGalleryWatch;
+namespace GetAllGalleryWatch = MediaGalleries::GetAllGalleryWatch;
namespace {
@@ -75,7 +78,7 @@ const char kDisallowedByPolicy[] =
"Media Galleries API is disallowed by policy: ";
const char kFailedToSetGalleryPermission[] =
"Failed to set gallery permission.";
-const char kInvalidGalleryId[] = "Invalid gallery id.";
+const char kInvalidGalleryIdMsg[] = "Invalid gallery id.";
const char kMissingEventListener[] = "Missing event listener registration.";
const char kNonExistentGalleryId[] = "Non-existent gallery id.";
const char kNoScanPermission[] = "No permission to scan.";
@@ -93,6 +96,8 @@ const char kBlobUUIDKey[] = "blobUUID";
const char kTypeKey[] = "type";
const char kSizeKey[] = "size";
+const char kInvalidGalleryId[] = "-1";
+
MediaFileSystemRegistry* media_file_system_registry() {
return g_browser_process->media_file_system_registry();
}
@@ -121,6 +126,27 @@ bool Setup(Profile* profile, std::string* error, base::Closure callback) {
return true;
}
+// Returns true and sets |gallery_file_path| and |gallery_pref_id| if the
+// |gallery_id| is valid and returns false otherwise.
+bool GetGalleryFilePathAndId(const std::string& gallery_id,
+ Profile* profile,
+ const Extension* extension,
+ base::FilePath* gallery_file_path,
+ MediaGalleryPrefId* gallery_pref_id) {
+ MediaGalleryPrefId pref_id;
+ if (!base::StringToUint64(gallery_id, &pref_id))
+ return false;
+ MediaGalleriesPreferences* preferences =
+ g_browser_process->media_file_system_registry()->GetPreferences(profile);
+ base::FilePath file_path(
+ preferences->LookUpGalleryPathForExtension(pref_id, extension, false));
+ if (file_path.empty())
+ return false;
+ *gallery_pref_id = pref_id;
+ *gallery_file_path = file_path;
+ return true;
+}
+
WebContents* GetWebContents(content::RenderViewHost* rvh,
Profile* profile,
const std::string& app_id) {
@@ -399,7 +425,7 @@ void MediaGalleriesEventRouter::OnGalleryChanged(
const std::string& extension_id, MediaGalleryPrefId gallery_id) {
MediaGalleries::GalleryChangeDetails details;
details.type = MediaGalleries::GALLERY_CHANGE_TYPE_CONTENTS_CHANGED;
- details.gallery_id = gallery_id;
+ details.gallery_id = base::Uint64ToString(gallery_id);
DispatchEventToExtension(
extension_id,
MediaGalleries::OnGalleryChanged::kEventName,
@@ -425,6 +451,9 @@ void MediaGalleriesEventRouter::OnListenerRemoved(
}
}
+///////////////////////////////////////////////////////////////////////////////
+// MediaGalleriesGetMediaFileSystemsFunction //
+///////////////////////////////////////////////////////////////////////////////
MediaGalleriesGetMediaFileSystemsFunction::
~MediaGalleriesGetMediaFileSystemsFunction() {}
@@ -532,6 +561,10 @@ void MediaGalleriesGetMediaFileSystemsFunction::GetMediaFileSystemsForExtension(
render_view_host(), extension(), cb);
}
+
+///////////////////////////////////////////////////////////////////////////////
+// MediaGalleriesGetAllMediaFileSystemMetadataFunction //
+///////////////////////////////////////////////////////////////////////////////
MediaGalleriesGetAllMediaFileSystemMetadataFunction::
~MediaGalleriesGetAllMediaFileSystemMetadataFunction() {}
@@ -594,6 +627,9 @@ void MediaGalleriesGetAllMediaFileSystemMetadataFunction::OnGetGalleries(
SendResponse(true);
}
+///////////////////////////////////////////////////////////////////////////////
+// MediaGalleriesAddUserSelectedFolderFunction //
+///////////////////////////////////////////////////////////////////////////////
MediaGalleriesAddUserSelectedFolderFunction::
~MediaGalleriesAddUserSelectedFolderFunction() {}
@@ -703,6 +739,9 @@ MediaGalleriesAddUserSelectedFolderFunction::GetMediaFileSystemsForExtension(
render_view_host(), extension(), cb);
}
+///////////////////////////////////////////////////////////////////////////////
+// MediaGalleriesDropPermissionForMediaFileSystemFunction //
+///////////////////////////////////////////////////////////////////////////////
MediaGalleriesDropPermissionForMediaFileSystemFunction::
~MediaGalleriesDropPermissionForMediaFileSystemFunction() {}
@@ -715,7 +754,7 @@ bool MediaGalleriesDropPermissionForMediaFileSystemFunction::RunAsync() {
EXTENSION_FUNCTION_VALIDATE(params.get());
MediaGalleryPrefId pref_id;
if (!base::StringToUint64(params->gallery_id, &pref_id)) {
- error_ = kInvalidGalleryId;
+ error_ = kInvalidGalleryIdMsg;
return false;
}
@@ -746,6 +785,9 @@ void MediaGalleriesDropPermissionForMediaFileSystemFunction::OnPreferencesInit(
SendResponse(dropped);
}
+///////////////////////////////////////////////////////////////////////////////
+// MediaGalleriesStartMediaScanFunction //
+///////////////////////////////////////////////////////////////////////////////
MediaGalleriesStartMediaScanFunction::~MediaGalleriesStartMediaScanFunction() {}
bool MediaGalleriesStartMediaScanFunction::RunAsync() {
@@ -772,6 +814,9 @@ void MediaGalleriesStartMediaScanFunction::OnPreferencesInit() {
SendResponse(true);
}
+///////////////////////////////////////////////////////////////////////////////
+// MediaGalleriesCancelMediaScanFunction //
+///////////////////////////////////////////////////////////////////////////////
MediaGalleriesCancelMediaScanFunction::
~MediaGalleriesCancelMediaScanFunction() {
}
@@ -793,6 +838,9 @@ void MediaGalleriesCancelMediaScanFunction::OnPreferencesInit() {
SendResponse(true);
}
+///////////////////////////////////////////////////////////////////////////////
+// MediaGalleriesAddScanResultsFunction //
+///////////////////////////////////////////////////////////////////////////////
MediaGalleriesAddScanResultsFunction::~MediaGalleriesAddScanResultsFunction() {}
bool MediaGalleriesAddScanResultsFunction::RunAsync() {
@@ -867,6 +915,9 @@ void MediaGalleriesAddScanResultsFunction::ReturnGalleries(
SendResponse(true);
}
+///////////////////////////////////////////////////////////////////////////////
+// MediaGalleriesGetMetadataFunction //
+///////////////////////////////////////////////////////////////////////////////
MediaGalleriesGetMetadataFunction::~MediaGalleriesGetMetadataFunction() {}
bool MediaGalleriesGetMetadataFunction::RunAsync() {
@@ -1034,4 +1085,194 @@ void MediaGalleriesGetMetadataFunction::ConstructNextBlob(
SendResponse(true);
}
+///////////////////////////////////////////////////////////////////////////////
+// MediaGalleriesAddGalleryWatchFunction //
+///////////////////////////////////////////////////////////////////////////////
+MediaGalleriesAddGalleryWatchFunction::
+ ~MediaGalleriesAddGalleryWatchFunction() {
+}
+
+bool MediaGalleriesAddGalleryWatchFunction::RunAsync() {
+ DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
+ DCHECK(GetProfile());
+ if (!render_view_host() || !render_view_host()->GetProcess())
+ return false;
+
+ scoped_ptr<AddGalleryWatch::Params> params(
+ AddGalleryWatch::Params::Create(*args_));
+ EXTENSION_FUNCTION_VALIDATE(params.get());
+
+ MediaGalleriesPreferences* preferences =
+ g_browser_process->media_file_system_registry()->GetPreferences(
+ GetProfile());
+ preferences->EnsureInitialized(
+ base::Bind(&MediaGalleriesAddGalleryWatchFunction::OnPreferencesInit,
+ this,
+ params->gallery_id));
+
+ return true;
+}
+
+void MediaGalleriesAddGalleryWatchFunction::OnPreferencesInit(
+ const std::string& pref_id) {
+ base::FilePath gallery_file_path;
+ MediaGalleryPrefId gallery_pref_id = kInvalidMediaGalleryPrefId;
+ if (!GetGalleryFilePathAndId(pref_id,
+ GetProfile(),
+ extension(),
+ &gallery_file_path,
+ &gallery_pref_id)) {
+ api::media_galleries::AddGalleryWatchResult result;
+ error_ = kInvalidGalleryIdMsg;
+ result.gallery_id = kInvalidGalleryId;
+ result.success = false;
+ SetResult(result.ToValue().release());
+ SendResponse(false);
+ return;
+ }
+
+ gallery_watch_manager()->AddWatch(
+ GetProfile(),
+ extension(),
+ gallery_pref_id,
+ base::Bind(&MediaGalleriesAddGalleryWatchFunction::HandleResponse,
+ this,
+ gallery_pref_id));
+}
+
+void MediaGalleriesAddGalleryWatchFunction::HandleResponse(
+ MediaGalleryPrefId gallery_id,
+ const std::string& error) {
+ DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
+
+ // If an app added a file watch without any event listeners on the
+ // onGalleryChanged event, that's an error.
+ MediaGalleriesEventRouter* api = MediaGalleriesEventRouter::Get(GetProfile());
+ api::media_galleries::AddGalleryWatchResult result;
+ result.gallery_id = base::Uint64ToString(gallery_id);
+
+ if (!api->ExtensionHasGalleryChangeListener(extension()->id())) {
+ result.success = false;
+ SetResult(result.ToValue().release());
+ error_ = kMissingEventListener;
+ SendResponse(false);
+ return;
+ }
+
+ result.success = error.empty();
+ SetResult(result.ToValue().release());
+ if (error.empty()) {
+ SendResponse(true);
+ } else {
+ error_ = error.c_str();
+ SendResponse(false);
+ }
+}
+
+///////////////////////////////////////////////////////////////////////////////
+// MediaGalleriesRemoveGalleryWatchFunction //
+///////////////////////////////////////////////////////////////////////////////
+
+MediaGalleriesRemoveGalleryWatchFunction::
+ ~MediaGalleriesRemoveGalleryWatchFunction() {
+}
+
+bool MediaGalleriesRemoveGalleryWatchFunction::RunAsync() {
+ DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
+ if (!render_view_host() || !render_view_host()->GetProcess())
+ return false;
+
+ scoped_ptr<RemoveGalleryWatch::Params> params(
+ RemoveGalleryWatch::Params::Create(*args_));
+ EXTENSION_FUNCTION_VALIDATE(params.get());
+
+ MediaGalleriesPreferences* preferences =
+ g_browser_process->media_file_system_registry()->GetPreferences(
+ GetProfile());
+ preferences->EnsureInitialized(
+ base::Bind(&MediaGalleriesRemoveGalleryWatchFunction::OnPreferencesInit,
+ this,
+ params->gallery_id));
+ return true;
+}
+
+void MediaGalleriesRemoveGalleryWatchFunction::OnPreferencesInit(
+ const std::string& pref_id) {
+ base::FilePath gallery_file_path;
+ MediaGalleryPrefId gallery_pref_id = 0;
+ if (!GetGalleryFilePathAndId(pref_id,
+ GetProfile(),
+ extension(),
+ &gallery_file_path,
+ &gallery_pref_id)) {
+ error_ = kInvalidGalleryIdMsg;
+ SendResponse(false);
+ return;
+ }
+
+ gallery_watch_manager()->RemoveWatch(
+ GetProfile(), extension_id(), gallery_pref_id);
+ SendResponse(true);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+// MediaGalleriesGetAllGalleryWatchFunction //
+///////////////////////////////////////////////////////////////////////////////
+
+MediaGalleriesGetAllGalleryWatchFunction::
+ ~MediaGalleriesGetAllGalleryWatchFunction() {
+}
+
+bool MediaGalleriesGetAllGalleryWatchFunction::RunAsync() {
+ DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
+ if (!render_view_host() || !render_view_host()->GetProcess())
+ return false;
+
+ MediaGalleriesPreferences* preferences =
+ g_browser_process->media_file_system_registry()->GetPreferences(
+ GetProfile());
+ preferences->EnsureInitialized(base::Bind(
+ &MediaGalleriesGetAllGalleryWatchFunction::OnPreferencesInit, this));
+ return true;
+}
+
+void MediaGalleriesGetAllGalleryWatchFunction::OnPreferencesInit() {
+ std::vector<std::string> result;
+ MediaGalleryPrefIdSet gallery_ids =
+ gallery_watch_manager()->GetWatchSet(GetProfile(), extension_id());
+ for (MediaGalleryPrefIdSet::const_iterator iter = gallery_ids.begin();
+ iter != gallery_ids.end();
+ ++iter) {
+ result.push_back(base::Uint64ToString(*iter));
+ }
+ results_ = GetAllGalleryWatch::Results::Create(result);
+ SendResponse(true);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+// MediaGalleriesRemoveAllGalleryWatchFunction //
+///////////////////////////////////////////////////////////////////////////////
+
+MediaGalleriesRemoveAllGalleryWatchFunction::
+ ~MediaGalleriesRemoveAllGalleryWatchFunction() {
+}
+
+bool MediaGalleriesRemoveAllGalleryWatchFunction::RunAsync() {
+ DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
+ if (!render_view_host() || !render_view_host()->GetProcess())
+ return false;
+
+ MediaGalleriesPreferences* preferences =
+ g_browser_process->media_file_system_registry()->GetPreferences(
+ GetProfile());
+ preferences->EnsureInitialized(base::Bind(
+ &MediaGalleriesRemoveAllGalleryWatchFunction::OnPreferencesInit, this));
+ return true;
+}
+
+void MediaGalleriesRemoveAllGalleryWatchFunction::OnPreferencesInit() {
+ gallery_watch_manager()->RemoveAllWatches(GetProfile(), extension_id());
+ SendResponse(true);
+}
+
} // namespace extensions

Powered by Google App Engine
This is Rietveld 408576698