Index: content/renderer/manifest/manifest_parser.cc |
diff --git a/content/renderer/manifest/manifest_parser.cc b/content/renderer/manifest/manifest_parser.cc |
index 3f340ba7dd3e3936661c3b69aa6d5efd6a163a28..3f2f9893b9a70e53b7aa4b7a46685e2e6de64b77 100644 |
--- a/content/renderer/manifest/manifest_parser.cc |
+++ b/content/renderer/manifest/manifest_parser.cc |
@@ -38,6 +38,20 @@ base::NullableString16 ParseString(const base::DictionaryValue& dictionary, |
return base::NullableString16(value, false); |
} |
+// Helper function to parse URLs present on a given |dictionary| in a given |
+// field identified by its |key|. The URL is first parsed as a string then |
+// resolved using |base_url|. |
+// Returns a GURL. If the parsing failed, the GURL will not be valid. |
+GURL ParseURL(const base::DictionaryValue& dictionary, |
+ const std::string& key, |
+ const GURL& base_url) { |
+ base::NullableString16 url_str = ParseString(dictionary, key, NoTrim); |
+ if (url_str.is_null()) |
+ return GURL(); |
+ |
+ return base_url.Resolve(url_str.string()); |
+} |
+ |
// Parses the 'name' field of the manifest, as defined in: |
// http://w3c.github.io/manifest/#dfn-steps-for-processing-the-name-member |
// Returns the parsed string if any, a null string if the parsing failed. |
@@ -59,13 +73,7 @@ base::NullableString16 ParseShortName( |
GURL ParseStartURL(const base::DictionaryValue& dictionary, |
const GURL& manifest_url, |
const GURL& document_url) { |
- base::NullableString16 start_url_str = |
- ParseString(dictionary, "start_url", NoTrim); |
- |
- if (start_url_str.is_null()) |
- return GURL(); |
- |
- GURL start_url = manifest_url.Resolve(start_url_str.string()); |
+ GURL start_url = ParseURL(dictionary, "start_url", manifest_url); |
if (!start_url.is_valid()) |
return GURL(); |
@@ -131,6 +139,65 @@ blink::WebScreenOrientationLockType ParseOrientation( |
return blink::WebScreenOrientationLockDefault; |
} |
+// Parses the 'src' field of an icon, as defined in: |
+// http://w3c.github.io/manifest/#dfn-steps-for-processing-the-src-member-of-an-icon |
+// Returns the parsed GURL if any, an empty GURL if the parsing failed. |
+GURL ParseIconSrc(const base::DictionaryValue& icon, |
+ const GURL& manifest_url) { |
+ return ParseURL(icon, "src", manifest_url); |
+} |
+ |
+// Parses the 'type' field of an icon, as defined in: |
+// http://w3c.github.io/manifest/#dfn-steps-for-processing-the-type-member-of-an-icon |
+// Returns the parsed string if any, a null string if the parsing failed. |
+base::NullableString16 ParseIconType(const base::DictionaryValue& icon) { |
+ return ParseString(icon, "type", Trim); |
+} |
+ |
+// Parses the 'density' field of an icon, as defined in: |
+// http://w3c.github.io/manifest/#dfn-steps-for-processing-a-density-member-of-an-icon |
+// Returns the parsed double if any, Manifest::Icon::kDefaultDensity if the |
+// parsing failed. |
+double ParseIconDensity(const base::DictionaryValue& icon) { |
+ double density; |
+ if (!icon.GetDouble("density", &density) || density <= 0) |
+ return Manifest::Icon::kDefaultDensity; |
+ return density; |
+} |
+ |
+std::vector<Manifest::Icon> ParseIcons(const base::DictionaryValue& dictionary, |
+ const GURL& manifest_url) { |
+ std::vector<Manifest::Icon> icons; |
+ if (!dictionary.HasKey("icons")) |
+ return icons; |
+ |
+ const base::ListValue* icons_list = 0; |
+ if (!dictionary.GetList("icons", &icons_list)) { |
+ // TODO(mlamouri): provide a custom message to the developer console about |
+ // the property being incorrectly set. |
+ return icons; |
+ } |
+ |
+ for (size_t i = 0; i < icons_list->GetSize(); ++i) { |
+ const base::DictionaryValue* icon_dictionary = 0; |
+ if (!icons_list->GetDictionary(i, &icon_dictionary)) |
+ continue; |
+ |
+ Manifest::Icon icon; |
+ icon.src = ParseIconSrc(*icon_dictionary, manifest_url); |
+ // An icon MUST have a valid src. If it does not, it MUST be ignored. |
+ if (!icon.src.is_valid()) |
+ continue; |
+ icon.type = ParseIconType(*icon_dictionary); |
+ icon.density = ParseIconDensity(*icon_dictionary); |
+ // TODO(mlamouri): icon.sizes |
+ |
+ icons.push_back(icon); |
+ } |
+ |
+ return icons; |
+} |
+ |
} // anonymous namespace |
Manifest ManifestParser::Parse(const base::StringPiece& json, |
@@ -162,6 +229,7 @@ Manifest ManifestParser::Parse(const base::StringPiece& json, |
manifest.start_url = ParseStartURL(*dictionary, manifest_url, document_url); |
manifest.display = ParseDisplay(*dictionary); |
manifest.orientation = ParseOrientation(*dictionary); |
+ manifest.icons = ParseIcons(*dictionary, manifest_url); |
return manifest; |
} |