Index: content/public/common/media_metadata.cc |
diff --git a/content/public/common/media_metadata.cc b/content/public/common/media_metadata.cc |
index dc3824c25b0cdc82b515387caec50f9ea356f6b7..fa647649faac1c436bbf4147459b0193d07eceef 100644 |
--- a/content/public/common/media_metadata.cc |
+++ b/content/public/common/media_metadata.cc |
@@ -4,20 +4,67 @@ |
#include "content/public/common/media_metadata.h" |
+#include <algorithm> |
+#include <iterator> |
+ |
namespace content { |
+namespace { |
+ |
+const size_t kMaxArtworkSrcLength = 4 * 1024; |
+// Maximum type length of Artwork, which conforms to RFC 4288 |
+// (https://tools.ietf.org/html/rfc4288). |
+const size_t kMaxArtworkTypeLength = 2 * 127 + 1; |
+const size_t kMaxNumberOfArtworkSizes = 10; |
+ |
+} // anonymous namespace |
+ |
const size_t MediaMetadata::kMaxIPCStringLength = 4 * 1024; |
+const size_t MediaMetadata::kMaxNumberOfArtworkImages = 10; |
MediaMetadata::MediaMetadata() = default; |
MediaMetadata::~MediaMetadata() = default; |
+MediaMetadata::MediaMetadata(const MediaMetadata& other) = default; |
+ |
bool MediaMetadata::operator==(const MediaMetadata& other) const { |
- return title == other.title && artist == other.artist && album == other.album; |
+ return title == other.title && artist == other.artist && |
+ album == other.album && artwork == other.artwork; |
} |
bool MediaMetadata::operator!=(const MediaMetadata& other) const { |
return !this->operator==(other); |
} |
+base::Optional<MediaMetadata::Artwork> MediaMetadata::SanitizeArtwork( |
+ const MediaMetadata::Artwork& artwork) { |
+ if (!artwork.src.is_valid() || !artwork.src.IsStandard() || |
+ (!artwork.src.SchemeIsHTTPOrHTTPS() && |
+ !artwork.src.SchemeIsFile()) || |
+ artwork.src.spec().size() > kMaxArtworkSrcLength) { |
+ return base::nullopt; |
+ } |
+ // Early return if artwork is sane. |
+ if (artwork.type.string().size() <= kMaxArtworkTypeLength && |
+ artwork.sizes.size() <= kMaxNumberOfArtworkSizes) { |
+ return artwork; |
+ } |
+ |
+ Artwork sanitized_artwork; |
+ sanitized_artwork.src = artwork.src; |
+ sanitized_artwork.type = artwork.type.is_null() ? |
+ base::NullableString16() : |
+ base::NullableString16( |
+ artwork.type.string().substr(0, kMaxArtworkTypeLength), |
+ false); |
+ for (size_t i = 0; |
+ i < std::min(artwork.sizes.size(), kMaxNumberOfArtworkSizes); |
+ ++i) { |
+ sanitized_artwork.sizes.push_back(artwork.sizes[i]); |
+ } |
+ |
+ return sanitized_artwork; |
+} |
+ |
} // namespace content |