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

Unified Diff: chrome/browser/media_galleries/fileapi/media_file_system_backend.cc

Issue 185393012: Change media galleries to external file system type to add toURL support (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: checkpoint Created 6 years, 9 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/media_galleries/fileapi/media_file_system_backend.cc
diff --git a/chrome/browser/media_galleries/fileapi/media_file_system_backend.cc b/chrome/browser/media_galleries/fileapi/media_file_system_backend.cc
index 5b344deeed3f51ce1e0c168049aa44a70324cb0a..24a4337983f136d28ec72be4db6273482ebe96a1 100644
--- a/chrome/browser/media_galleries/fileapi/media_file_system_backend.cc
+++ b/chrome/browser/media_galleries/fileapi/media_file_system_backend.cc
@@ -12,19 +12,30 @@
#include "base/message_loop/message_loop_proxy.h"
#include "base/platform_file.h"
#include "base/sequenced_task_runner.h"
+#include "base/strings/string_number_conversions.h"
+#include "base/strings/string_util.h"
#include "base/threading/sequenced_worker_pool.h"
+#include "chrome/browser/browser_process.h"
+#include "chrome/browser/extensions/extension_service.h"
#include "chrome/browser/media_galleries/fileapi/device_media_async_file_util.h"
#include "chrome/browser/media_galleries/fileapi/media_file_validator_factory.h"
#include "chrome/browser/media_galleries/fileapi/media_path_filter.h"
#include "chrome/browser/media_galleries/fileapi/native_media_file_util.h"
+#include "chrome/browser/media_galleries/media_file_system_registry.h"
+#include "chrome/browser/profiles/profile.h"
#include "content/public/browser/browser_thread.h"
+#include "content/public/browser/render_process_host.h"
+#include "content/public/browser/render_view_host.h"
+#include "content/public/browser/resource_request_info.h"
+#include "extensions/browser/extension_system.h"
+#include "net/url_request/url_request.h"
#include "webkit/browser/blob/file_stream_reader.h"
#include "webkit/browser/fileapi/copy_or_move_file_validator.h"
#include "webkit/browser/fileapi/file_stream_writer.h"
#include "webkit/browser/fileapi/file_system_context.h"
#include "webkit/browser/fileapi/file_system_operation.h"
#include "webkit/browser/fileapi/file_system_operation_context.h"
-#include "webkit/browser/fileapi/isolated_context.h"
+#include "webkit/browser/fileapi/file_system_url.h"
#include "webkit/browser/fileapi/native_file_util.h"
#include "webkit/common/fileapi/file_system_types.h"
#include "webkit/common/fileapi/file_system_util.h"
@@ -87,6 +98,104 @@ MediaFileSystemBackend::MediaTaskRunner() {
return pool->GetSequencedTaskRunner(media_sequence_token);
}
+//static
+std::string MediaFileSystemBackend::ConstructMountName(
+ Profile* profile,
+ const std::string& extension_id,
+ MediaGalleryPrefId pref_id) {
+ std::string name = "media_galleries-";
+ name.append(profile->GetPath().BaseName().MaybeAsASCII());
+ name.append("-");
+ name.append(extension_id);
+ name.append("-");
+ if (pref_id != kInvalidMediaGalleryPrefId)
+ name.append(base::Uint64ToString(pref_id));
+ base::ReplaceChars(name, " /", "_", &name);
+ return name;
+}
+
+void OnFileSystems(
+ MediaGalleryPrefId pref_id,
+ const base::Callback<void(base::File::Error result)>& callback,
+ const std::vector<MediaFileSystemInfo>& filesystems) {
+ for (size_t i = 0; i < filesystems.size(); i++) {
+ if (filesystems[i].pref_id == pref_id) {
+ callback.Run(base::File::FILE_OK);
+ return;
+ }
+ }
+ callback.Run(base::File::FILE_ERROR_NOT_FOUND);
+}
+
+//static
+bool MediaFileSystemBackend::AttemptAutoMountForURLRequest(
+ const net::URLRequest* url_request,
+ const fileapi::FileSystemURL& filesystem_url,
+ const std::string& storage_domain,
+ const base::Callback<void(base::File::Error result)>& callback) {
+ if (storage_domain.empty())
+ return false;
+
+ if (filesystem_url.type() != fileapi::kFileSystemTypeExternal)
+ return false;
+
+ const base::FilePath& virtual_path = filesystem_url.path();
+ if (virtual_path.ReferencesParent())
+ return false;
+ std::vector<base::FilePath::StringType> components;
+ virtual_path.GetComponents(&components);
+ if (components.size() < 1)
+ return false;
+
+ const content::ResourceRequestInfo* request_info =
+ content::ResourceRequestInfo::ForRequest(url_request);
+ if (!request_info)
+ return false;
+ content::RenderViewHost* rvh =
+ content::RenderViewHost::FromID(request_info->GetChildID(),
+ request_info->GetRouteID());
+ if (!rvh)
+ return false;
+ Profile* profile =
+ Profile::FromBrowserContext(rvh->GetProcess()->GetBrowserContext());
+
+ ExtensionService* extension_service =
+ extensions::ExtensionSystem::Get(profile)->extension_service();
+ const extensions::Extension* extension =
+ extension_service->GetExtensionById(storage_domain,
+ false /*include disabled*/);
+ if (!extension)
+ return false;
+
+ std::string expected_name_prefix =
+ ConstructMountName(profile, extension->id(), kInvalidMediaGalleryPrefId);
+ // TODO - handle wstring case
+ if (components[0].compare(0, expected_name_prefix.size(),
+ expected_name_prefix) != 0) {
+ return false;
+ }
+ MediaGalleryPrefId pref_id = kInvalidMediaGalleryPrefId;
+ // TODO - handle wstring case
+ if (!base::StringToUint64(
+ components[0].substr(expected_name_prefix.size()),
+ &pref_id) || pref_id == kInvalidMediaGalleryPrefId) {
+ return false;
+ }
+
+ // TODO(vandebo) add a call to get just this file system. No unretained.
+ base::Closure check_fs_callback =
+ base::Bind(&MediaFileSystemRegistry::GetMediaFileSystemsForExtension,
+ base::Unretained(g_browser_process->media_file_system_registry()),
+ rvh,
+ extension,
+ base::Bind(&OnFileSystems, pref_id, callback));
+
+ MediaGalleriesPreferences* preferences =
+ g_browser_process->media_file_system_registry()->GetPreferences(profile);
+ preferences->EnsureInitialized(check_fs_callback);
+ return true;
+}
+
bool MediaFileSystemBackend::CanHandleType(
fileapi::FileSystemType type) const {
switch (type) {
@@ -112,7 +221,7 @@ void MediaFileSystemBackend::ResolveURL(
const FileSystemURL& url,
fileapi::OpenFileSystemMode mode,
const OpenFileSystemCallback& callback) {
- // We never allow opening a new isolated FileSystem via usual ResolveURL.
+ // We never allow opening a new FileSystem via usual ResolveURL.
base::MessageLoopProxy::current()->PostTask(
FROM_HERE,
base::Bind(callback,

Powered by Google App Engine
This is Rietveld 408576698