| Index: content/public/common/manifest_struct_traits.cc
|
| diff --git a/content/public/common/manifest_struct_traits.cc b/content/public/common/manifest_struct_traits.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..9509023f7c5a6b98676975dc194bf6589007207a
|
| --- /dev/null
|
| +++ b/content/public/common/manifest_struct_traits.cc
|
| @@ -0,0 +1,121 @@
|
| +// Copyright 2016 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/manifest_struct_traits.h"
|
| +
|
| +namespace mojo {
|
| +namespace {
|
| +
|
| +bool ValidateColor(int64_t color) {
|
| + if (color < std::numeric_limits<int32_t>::min() &&
|
| + color > std::numeric_limits<int32_t>::max() &&
|
| + color != content::Manifest::kInvalidOrMissingColor) {
|
| + return false;
|
| + }
|
| + return true;
|
| +}
|
| +
|
| +// A wrapper around base::NullableString16 so a custom StringTraits
|
| +// specialization can enforce maximum string length.
|
| +struct TruncatedNullableString16 {
|
| + base::NullableString16 string;
|
| +};
|
| +
|
| +} // namespace
|
| +
|
| +template <>
|
| +struct StringTraits<TruncatedNullableString16> {
|
| + static void SetToNull(TruncatedNullableString16* output) {
|
| + output->string = base::NullableString16();
|
| + }
|
| +
|
| + static bool Read(StringDataView input, TruncatedNullableString16* output) {
|
| + if (!StringTraits<base::NullableString16>::Read(input, &output->string))
|
| + return false;
|
| +
|
| + return (output->string.is_null() ||
|
| + output->string.string().size() <=
|
| + content::Manifest::kMaxIPCStringLength);
|
| + }
|
| +};
|
| +
|
| +bool StructTraits<blink::mojom::Manifest, content::Manifest>::Read(
|
| + blink::mojom::ManifestDataView data,
|
| + content::Manifest* out) {
|
| + TruncatedNullableString16 string;
|
| + if (!data.ReadName(&string))
|
| + return false;
|
| + out->name = string.string;
|
| +
|
| + if (!data.ReadShortName(&string))
|
| + return false;
|
| + out->short_name = string.string;
|
| +
|
| + if (!data.ReadGcmSenderId(&string))
|
| + return false;
|
| + out->gcm_sender_id = string.string;
|
| +
|
| + if (!data.ReadStartUrl(&out->start_url))
|
| + return false;
|
| +
|
| + if (!data.ReadIcons(&out->icons))
|
| + return false;
|
| +
|
| + if (!data.ReadRelatedApplications(&out->related_applications))
|
| + return false;
|
| +
|
| + out->prefer_related_applications = data.prefer_related_applications();
|
| + out->theme_color = data.theme_color();
|
| + if (!ValidateColor(out->theme_color))
|
| + return false;
|
| +
|
| + out->background_color = data.background_color();
|
| + if (!ValidateColor(out->background_color))
|
| + return false;
|
| +
|
| + out->display = static_cast<blink::WebDisplayMode>(data.display());
|
| + out->orientation =
|
| + static_cast<blink::WebScreenOrientationLockType>(data.orientation());
|
| +
|
| + return true;
|
| +}
|
| +
|
| +bool StructTraits<blink::mojom::ManifestIcon, content::Manifest::Icon>::Read(
|
| + blink::mojom::ManifestIconDataView data,
|
| + content::Manifest::Icon* out) {
|
| + if (!data.ReadSrc(&out->src))
|
| + return false;
|
| +
|
| + TruncatedNullableString16 string;
|
| + if (!data.ReadType(&string))
|
| + return false;
|
| +
|
| + out->type = string.string;
|
| +
|
| + if (!data.ReadSizes(&out->sizes))
|
| + return false;
|
| +
|
| + return true;
|
| +}
|
| +
|
| +bool StructTraits<blink::mojom::RelatedApplication,
|
| + content::Manifest::RelatedApplication>::
|
| + Read(blink::mojom::RelatedApplicationDataView data,
|
| + content::Manifest::RelatedApplication* out) {
|
| + TruncatedNullableString16 string;
|
| + if (!data.ReadPlatform(&string))
|
| + return false;
|
| + out->platform = string.string;
|
| +
|
| + if (!data.ReadUrl(&out->url))
|
| + return false;
|
| +
|
| + if (!data.ReadId(&string))
|
| + return false;
|
| + out->id = string.string;
|
| +
|
| + return true;
|
| +}
|
| +
|
| +} // namespace mojo
|
|
|