Commit 5c9431a8 authored by Satoshi Niwa's avatar Satoshi Niwa Committed by Commit Bot

Move two functions (Write|Read)FileSystemFilesToPickle to content/public/common/drop_data.cc

from web_contents_view_aura.cc

There is a need to read URL(s) from a pickle in exo for correctly handling a URL
when the user drag&drops a filesystem file onto an Arc app. (chromium:767982)

See crrev.com/c/867807 for how it will be used in exo.

Bug: chromium:767982
Test: out/Default/content_unittests --gtest_filter="DropDataTest.*"
Change-Id: I00c827c6af9e20fd38c33b3e4796207cb5dedeb3
Reviewed-on: https://chromium-review.googlesource.com/888278
Commit-Queue: Satoshi Niwa <niwa@chromium.org>
Reviewed-by: default avatarKinuko Yasuda <kinuko@chromium.org>
Reviewed-by: default avatarDaichi Hirono <hirono@chromium.org>
Reviewed-by: default avatarDaniel Cheng <dcheng@chromium.org>
Cr-Commit-Position: refs/heads/master@{#532273}
parent 7533fa08
...@@ -236,48 +236,6 @@ const ui::Clipboard::FormatType& GetFileSystemFileFormatType() { ...@@ -236,48 +236,6 @@ const ui::Clipboard::FormatType& GetFileSystemFileFormatType() {
return format; return format;
} }
// Writes file system files to the pickle.
void WriteFileSystemFilesToPickle(
const std::vector<DropData::FileSystemFileInfo>& file_system_files,
base::Pickle* pickle) {
pickle->WriteUInt32(file_system_files.size());
for (size_t i = 0; i < file_system_files.size(); ++i) {
pickle->WriteString(file_system_files[i].url.spec());
pickle->WriteInt64(file_system_files[i].size);
pickle->WriteString(file_system_files[i].filesystem_id);
}
}
// Reads file system files from the pickle.
bool ReadFileSystemFilesFromPickle(
const base::Pickle& pickle,
std::vector<DropData::FileSystemFileInfo>* file_system_files) {
base::PickleIterator iter(pickle);
uint32_t num_files = 0;
if (!iter.ReadUInt32(&num_files))
return false;
file_system_files->resize(num_files);
for (uint32_t i = 0; i < num_files; ++i) {
std::string url_string;
int64_t size = 0;
std::string filesystem_id;
if (!iter.ReadString(&url_string) || !iter.ReadInt64(&size) ||
!iter.ReadString(&filesystem_id)) {
return false;
}
GURL url(url_string);
if (!url.is_valid())
return false;
(*file_system_files)[i].url = url;
(*file_system_files)[i].size = size;
(*file_system_files)[i].filesystem_id = filesystem_id;
}
return true;
}
// Utility to fill a ui::OSExchangeDataProvider object from DropData. // Utility to fill a ui::OSExchangeDataProvider object from DropData.
void PrepareDragData(const DropData& drop_data, void PrepareDragData(const DropData& drop_data,
...@@ -311,7 +269,8 @@ void PrepareDragData(const DropData& drop_data, ...@@ -311,7 +269,8 @@ void PrepareDragData(const DropData& drop_data,
provider->SetFilenames(drop_data.filenames); provider->SetFilenames(drop_data.filenames);
if (!drop_data.file_system_files.empty()) { if (!drop_data.file_system_files.empty()) {
base::Pickle pickle; base::Pickle pickle;
WriteFileSystemFilesToPickle(drop_data.file_system_files, &pickle); DropData::FileSystemFileInfo::WriteFileSystemFilesToPickle(
drop_data.file_system_files, &pickle);
provider->SetPickledData(GetFileSystemFileFormatType(), pickle); provider->SetPickledData(GetFileSystemFileFormatType(), pickle);
} }
if (!drop_data.custom_data.empty()) { if (!drop_data.custom_data.empty()) {
...@@ -353,7 +312,8 @@ void PrepareDropData(DropData* drop_data, const ui::OSExchangeData& data) { ...@@ -353,7 +312,8 @@ void PrepareDropData(DropData* drop_data, const ui::OSExchangeData& data) {
base::Pickle pickle; base::Pickle pickle;
std::vector<DropData::FileSystemFileInfo> file_system_files; std::vector<DropData::FileSystemFileInfo> file_system_files;
if (data.GetPickledData(GetFileSystemFileFormatType(), &pickle) && if (data.GetPickledData(GetFileSystemFileFormatType(), &pickle) &&
ReadFileSystemFilesFromPickle(pickle, &file_system_files)) DropData::FileSystemFileInfo::ReadFileSystemFilesFromPickle(
pickle, &file_system_files))
drop_data->file_system_files = file_system_files; drop_data->file_system_files = file_system_files;
if (data.GetPickledData(ui::Clipboard::GetWebCustomDataFormatType(), &pickle)) if (data.GetPickledData(ui::Clipboard::GetWebCustomDataFormatType(), &pickle))
......
...@@ -71,4 +71,48 @@ base::Optional<base::FilePath> DropData::GetSafeFilenameForImageFileContents() ...@@ -71,4 +71,48 @@ base::Optional<base::FilePath> DropData::GetSafeFilenameForImageFileContents()
return base::nullopt; return base::nullopt;
} }
// static
void DropData::FileSystemFileInfo::WriteFileSystemFilesToPickle(
const std::vector<FileSystemFileInfo>& file_system_files,
base::Pickle* pickle) {
pickle->WriteUInt32(file_system_files.size());
for (const auto& file_system_file : file_system_files) {
pickle->WriteString(file_system_file.url.spec());
pickle->WriteInt64(file_system_file.size);
pickle->WriteString(file_system_file.filesystem_id);
}
}
// static
bool DropData::FileSystemFileInfo::ReadFileSystemFilesFromPickle(
const base::Pickle& pickle,
std::vector<FileSystemFileInfo>* file_system_files) {
base::PickleIterator iter(pickle);
uint32_t num_files = 0;
if (!iter.ReadUInt32(&num_files))
return false;
file_system_files->resize(num_files);
for (uint32_t i = 0; i < num_files; ++i) {
std::string url_string;
int64_t size = 0;
std::string filesystem_id;
if (!iter.ReadString(&url_string) || !iter.ReadInt64(&size) ||
!iter.ReadString(&filesystem_id)) {
return false;
}
GURL url(url_string);
if (!url.is_valid()) {
return false;
}
(*file_system_files)[i].url = url;
(*file_system_files)[i].size = size;
(*file_system_files)[i].filesystem_id = filesystem_id;
}
return true;
}
} // namespace content } // namespace content
...@@ -27,12 +27,19 @@ ...@@ -27,12 +27,19 @@
namespace content { namespace content {
struct CONTENT_EXPORT DropData { struct CONTENT_EXPORT DropData {
struct FileSystemFileInfo { struct CONTENT_EXPORT FileSystemFileInfo {
FileSystemFileInfo() : size(0) {} // Writes file system files to the pickle.
~FileSystemFileInfo() {} static void WriteFileSystemFilesToPickle(
const std::vector<FileSystemFileInfo>& file_system_files,
base::Pickle* pickle);
// Reads file system files from the pickle.
static bool ReadFileSystemFilesFromPickle(
const base::Pickle& pickle,
std::vector<FileSystemFileInfo>* file_system_files);
GURL url; GURL url;
int64_t size; int64_t size = 0;
std::string filesystem_id; std::string filesystem_id;
}; };
......
...@@ -20,6 +20,8 @@ ...@@ -20,6 +20,8 @@
namespace content { namespace content {
using FileSystemFileInfo = DropData::FileSystemFileInfo;
TEST(DropDataTest, GetSafeFilenameForImageFileContents) { TEST(DropDataTest, GetSafeFilenameForImageFileContents) {
static constexpr struct { static constexpr struct {
const char* const extension; const char* const extension;
...@@ -72,6 +74,43 @@ TEST(DropDataTest, GetSafeFilenameForImageFileContents) { ...@@ -72,6 +74,43 @@ TEST(DropDataTest, GetSafeFilenameForImageFileContents) {
} }
} }
TEST(DropDataTest, ReadFileSystemFilesFromPickle) {
{
std::vector<FileSystemFileInfo> in_files = {
{GURL("filesystem:http://www.example.com/path1"), 1000, "filesystem1"},
{GURL("filesystem:http://www.example.com/path2"), 2000, "filesystem2"},
{GURL("filesystem:http://www.example.com/path3"), 3000, "filesystem3"},
};
std::vector<FileSystemFileInfo> out_files;
base::Pickle pickle;
FileSystemFileInfo::WriteFileSystemFilesToPickle(in_files, &pickle);
EXPECT_TRUE(
FileSystemFileInfo::ReadFileSystemFilesFromPickle(pickle, &out_files));
ASSERT_EQ(in_files.size(), out_files.size());
for (size_t i = 0; i < in_files.size(); i++) {
EXPECT_EQ(in_files[i].url, out_files[i].url);
EXPECT_EQ(in_files[i].size, out_files[i].size);
EXPECT_EQ(in_files[i].filesystem_id, out_files[i].filesystem_id);
}
}
{
std::vector<FileSystemFileInfo> in_files = {
{GURL("invalid-url"), 1000, "filesystem1"},
};
std::vector<FileSystemFileInfo> out_files;
base::Pickle pickle;
FileSystemFileInfo::WriteFileSystemFilesToPickle(in_files, &pickle);
EXPECT_FALSE(
FileSystemFileInfo::ReadFileSystemFilesFromPickle(pickle, &out_files));
}
}
} // namespace content } // namespace content
#undef CONVERT_IF_NEEDED #undef CONVERT_IF_NEEDED
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment