Commit 68c74195 authored by Peter E Conn's avatar Peter E Conn Committed by Commit Bot

👹 Read MASKABLE purpose from Web App Manifests.

Web App Manifest icons can have the MASKABLE purpose specifying they
were designed with all of their important content sufficiently far from
the edges to allow the User Agent to apply a mask [1].

This CL just adds code to read in that purpose, which will be used in
upcoming CLs.

[1] https://w3c.github.io/manifest/#purpose-member

Bug: 904354
Change-Id: Ib62eb7af9226d14199d0d74615cb5bbf2666abda
Reviewed-on: https://chromium-review.googlesource.com/c/1329792
Commit-Queue: Peter Conn <peconn@chromium.org>
Reviewed-by: default avatarMounir Lamouri <mlamouri@chromium.org>
Reviewed-by: default avatarDominick Ng <dominickn@chromium.org>
Reviewed-by: default avatarPeter Beverloo <peter@chromium.org>
Cr-Commit-Position: refs/heads/master@{#608448}
parent 938ba0e6
...@@ -73,6 +73,7 @@ message BackgroundFetchOptions { ...@@ -73,6 +73,7 @@ message BackgroundFetchOptions {
enum Purpose { enum Purpose {
ANY = 1; ANY = 1;
BADGE = 2; BADGE = 2;
MASKABLE = 3;
} }
// blink::Manifest::ImageResource::Purpose enum. // blink::Manifest::ImageResource::Purpose enum.
......
...@@ -270,6 +270,10 @@ void CreateMetadataTask::InitializeMetadataProto() { ...@@ -270,6 +270,10 @@ void CreateMetadataTask::InitializeMetadataProto() {
image_resource_proto->add_purpose( image_resource_proto->add_purpose(
proto::BackgroundFetchOptions_ImageResource_Purpose_BADGE); proto::BackgroundFetchOptions_ImageResource_Purpose_BADGE);
break; break;
case blink::Manifest::ImageResource::Purpose::MASKABLE:
image_resource_proto->add_purpose(
proto::BackgroundFetchOptions_ImageResource_Purpose_MASKABLE);
break;
} }
} }
} }
......
...@@ -294,6 +294,8 @@ ManifestParser::ParseIconPurpose(const base::DictionaryValue& icon) { ...@@ -294,6 +294,8 @@ ManifestParser::ParseIconPurpose(const base::DictionaryValue& icon) {
purposes.push_back(blink::Manifest::ImageResource::Purpose::ANY); purposes.push_back(blink::Manifest::ImageResource::Purpose::ANY);
} else if (base::LowerCaseEqualsASCII(keyword, "badge")) { } else if (base::LowerCaseEqualsASCII(keyword, "badge")) {
purposes.push_back(blink::Manifest::ImageResource::Purpose::BADGE); purposes.push_back(blink::Manifest::ImageResource::Purpose::BADGE);
} else if (base::LowerCaseEqualsASCII(keyword, "maskable")) {
purposes.push_back(blink::Manifest::ImageResource::Purpose::MASKABLE);
} else { } else {
AddErrorInfo( AddErrorInfo(
"found icon with invalid purpose. " "found icon with invalid purpose. "
......
...@@ -965,12 +965,14 @@ TEST_F(ManifestParserTest, IconPurposeParseRules) { ...@@ -965,12 +965,14 @@ TEST_F(ManifestParserTest, IconPurposeParseRules) {
{ {
blink::Manifest manifest = ParseManifest( blink::Manifest manifest = ParseManifest(
"{ \"icons\": [ {\"src\": \"\"," "{ \"icons\": [ {\"src\": \"\","
"\"purpose\": \"Any Badge\" } ] }"); "\"purpose\": \"Any Badge Maskable\" } ] }");
ASSERT_EQ(manifest.icons[0].purpose.size(), 2u); ASSERT_EQ(manifest.icons[0].purpose.size(), 3u);
EXPECT_EQ(manifest.icons[0].purpose[0], EXPECT_EQ(manifest.icons[0].purpose[0],
blink::Manifest::ImageResource::Purpose::ANY); blink::Manifest::ImageResource::Purpose::ANY);
EXPECT_EQ(manifest.icons[0].purpose[1], EXPECT_EQ(manifest.icons[0].purpose[1],
blink::Manifest::ImageResource::Purpose::BADGE); blink::Manifest::ImageResource::Purpose::BADGE);
EXPECT_EQ(manifest.icons[0].purpose[2],
blink::Manifest::ImageResource::Purpose::MASKABLE);
EXPECT_EQ(0u, GetErrorCount()); EXPECT_EQ(0u, GetErrorCount());
} }
......
...@@ -32,7 +32,8 @@ struct BLINK_COMMON_EXPORT Manifest { ...@@ -32,7 +32,8 @@ struct BLINK_COMMON_EXPORT Manifest {
enum class Purpose { enum class Purpose {
ANY = 0, ANY = 0,
BADGE, BADGE,
IMAGE_RESOURCE_PURPOSE_LAST = BADGE, MASKABLE,
IMAGE_RESOURCE_PURPOSE_LAST = MASKABLE,
}; };
ImageResource(); ImageResource();
......
...@@ -212,6 +212,8 @@ struct BLINK_COMMON_EXPORT ...@@ -212,6 +212,8 @@ struct BLINK_COMMON_EXPORT
return blink::mojom::ManifestImageResource_Purpose::ANY; return blink::mojom::ManifestImageResource_Purpose::ANY;
case ::blink::Manifest::ImageResource::Purpose::BADGE: case ::blink::Manifest::ImageResource::Purpose::BADGE:
return blink::mojom::ManifestImageResource_Purpose::BADGE; return blink::mojom::ManifestImageResource_Purpose::BADGE;
case ::blink::Manifest::ImageResource::Purpose::MASKABLE:
return blink::mojom::ManifestImageResource_Purpose::MASKABLE;
} }
NOTREACHED(); NOTREACHED();
return blink::mojom::ManifestImageResource_Purpose::ANY; return blink::mojom::ManifestImageResource_Purpose::ANY;
...@@ -225,6 +227,9 @@ struct BLINK_COMMON_EXPORT ...@@ -225,6 +227,9 @@ struct BLINK_COMMON_EXPORT
case blink::mojom::ManifestImageResource_Purpose::BADGE: case blink::mojom::ManifestImageResource_Purpose::BADGE:
*out = ::blink::Manifest::ImageResource::Purpose::BADGE; *out = ::blink::Manifest::ImageResource::Purpose::BADGE;
return true; return true;
case blink::mojom::ManifestImageResource_Purpose::MASKABLE:
*out = ::blink::Manifest::ImageResource::Purpose::MASKABLE;
return true;
} }
return false; return false;
......
...@@ -63,6 +63,7 @@ struct ManifestImageResource { ...@@ -63,6 +63,7 @@ struct ManifestImageResource {
enum Purpose { enum Purpose {
ANY = 0, ANY = 0,
BADGE, BADGE,
MASKABLE,
}; };
// MUST be a valid url. If an icon doesn't have a valid URL, it will not be // MUST be a valid url. If an icon doesn't have a valid URL, it will not be
......
...@@ -64,6 +64,8 @@ WTF::Vector<Purpose> ParsePurpose(const WTF::String& purpose) { ...@@ -64,6 +64,8 @@ WTF::Vector<Purpose> ParsePurpose(const WTF::String& purpose) {
purpose_enum = Purpose::ANY; purpose_enum = Purpose::ANY;
} else if (lowercase_purpose == "badge") { } else if (lowercase_purpose == "badge") {
purpose_enum = Purpose::BADGE; purpose_enum = Purpose::BADGE;
} else if (lowercase_purpose == "maskable") {
purpose_enum = Purpose::MASKABLE;
} else { } else {
// TODO(rayankans): Issue developer warning. // TODO(rayankans): Issue developer warning.
continue; continue;
...@@ -119,10 +121,20 @@ Manifest::ImageResource ConvertManifestImageResource( ...@@ -119,10 +121,20 @@ Manifest::ImageResource ConvertManifestImageResource(
const auto purposes = mojo::ParsePurpose(icon->purpose()); const auto purposes = mojo::ParsePurpose(icon->purpose());
// ParsePurpose() would've weeded out any purposes that're not ANY or BADGE. // ParsePurpose() would've weeded out any purposes that're not ANY or BADGE.
for (auto purpose : purposes) { for (auto purpose : purposes) {
manifest_icon.purpose.emplace_back( switch (purpose) {
purpose == mojo::Purpose::ANY case mojo::Purpose::ANY:
? Manifest::ImageResource::Purpose::ANY manifest_icon.purpose.emplace_back(
: Manifest::ImageResource::Purpose::BADGE); Manifest::ImageResource::Purpose::ANY);
break;
case mojo::Purpose::BADGE:
manifest_icon.purpose.emplace_back(
Manifest::ImageResource::Purpose::BADGE);
break;
case mojo::Purpose::MASKABLE:
manifest_icon.purpose.emplace_back(
Manifest::ImageResource::Purpose::MASKABLE);
break;
}
} }
// Parse 'sizes'. // Parse 'sizes'.
WTF::Vector<WebSize> sizes = mojo::ParseSizes(icon->sizes()); WTF::Vector<WebSize> sizes = mojo::ParseSizes(icon->sizes());
......
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