Index: net/base/file_stream_context.cc |
diff --git a/net/base/file_stream_context.cc b/net/base/file_stream_context.cc |
index 2e774752045d9c0d0e6a8c82dc3dfc7a6bb9c366..e7fe100df2781a81df2a4e10020b99d0b1cb65f3 100644 |
--- a/net/base/file_stream_context.cc |
+++ b/net/base/file_stream_context.cc |
@@ -11,6 +11,10 @@ |
#include "net/base/file_stream_net_log_parameters.h" |
#include "net/base/net_errors.h" |
+#if defined(OS_ANDROID) |
+#include "base/android/content_uri_utils.h" |
+#endif |
+ |
namespace { |
void CallInt64ToInt(const net::CompletionCallback& callback, int64 result) { |
@@ -193,13 +197,24 @@ void FileStream::Context::BeginOpenEvent(const base::FilePath& path) { |
FileStream::Context::OpenResult FileStream::Context::OpenFileImpl( |
const base::FilePath& path, int open_flags) { |
- // FileStream::Context actually closes the file asynchronously, independently |
- // from FileStream's destructor. It can cause problems for users wanting to |
- // delete the file right after FileStream deletion. Thus we are always |
- // adding SHARE_DELETE flag to accommodate such use case. |
- open_flags |= base::PLATFORM_FILE_SHARE_DELETE; |
- base::PlatformFile file = |
- base::CreatePlatformFile(path, open_flags, NULL, NULL); |
+ base::PlatformFile file; |
+#if defined(OS_ANDROID) |
+ if (path.IsContentUri()) { |
+ // Check that only Read flags are set. |
+ DCHECK_EQ(open_flags & ~base::PLATFORM_FILE_ASYNC, |
+ base::PLATFORM_FILE_OPEN | base::PLATFORM_FILE_READ); |
+ file = base::OpenContentUriForRead(path); |
+ } else { |
+#endif // defined(OS_ANDROID) |
+ // FileStream::Context actually closes the file asynchronously, |
+ // independently from FileStream's destructor. It can cause problems for |
+ // users wanting to delete the file right after FileStream deletion. Thus |
+ // we are always adding SHARE_DELETE flag to accommodate such use case. |
+ open_flags |= base::PLATFORM_FILE_SHARE_DELETE; |
+ file = base::CreatePlatformFile(path, open_flags, NULL, NULL); |
+#if defined(OS_ANDROID) |
+ } |
+#endif // defined(OS_ANDROID) |
if (file == base::kInvalidPlatformFileValue) |
return OpenResult(file, IOResult::FromOSError(GetLastErrno())); |