// Copyright 2013 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "content/public/common/drop_data.h" #include "base/strings/utf_string_conversions.h" #include "net/base/filename_util.h" #include "net/base/mime_util.h" namespace content { DropData::Metadata::Metadata() {} // static DropData::Metadata DropData::Metadata::CreateForMimeType( const Kind& kind, const base::string16& mime_type) { Metadata metadata; metadata.kind = kind; metadata.mime_type = mime_type; return metadata; } // static DropData::Metadata DropData::Metadata::CreateForFilePath( const base::FilePath& filename) { Metadata metadata; metadata.kind = Kind::FILENAME; metadata.filename = filename; return metadata; } // static DropData::Metadata DropData::Metadata::CreateForFileSystemUrl( const GURL& file_system_url) { Metadata metadata; metadata.kind = Kind::FILESYSTEMFILE; metadata.file_system_url = file_system_url; return metadata; } DropData::Metadata::Metadata(const DropData::Metadata& other) = default; DropData::Metadata::~Metadata() {} DropData::DropData() : did_originate_from_renderer(false), referrer_policy(network::mojom::ReferrerPolicy::kDefault), key_modifiers(0) {} DropData::DropData(const DropData& other) = default; DropData::~DropData() {} base::Optional DropData::GetSafeFilenameForImageFileContents() const { base::FilePath file_name = net::GenerateFileName( file_contents_source_url, file_contents_content_disposition, std::string(), // referrer_charset std::string(), // suggested_name std::string(), // mime_type std::string()); // default_name std::string mime_type; if (net::GetWellKnownMimeTypeFromExtension(file_contents_filename_extension, &mime_type) && base::StartsWith(mime_type, "image/", base::CompareCase::INSENSITIVE_ASCII)) { return file_name.ReplaceExtension(file_contents_filename_extension); } return base::nullopt; } // static void DropData::FileSystemFileInfo::WriteFileSystemFilesToPickle( const std::vector& 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* 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