Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(42)

Side by Side Diff: content/renderer/manifest/manifest_parser.cc

Issue 563083004: Add support for 'display' in Manifest. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@add_to_homescreen_manifest
Patch Set: typo Created 6 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "content/renderer/manifest/manifest_parser.h" 5 #include "content/renderer/manifest/manifest_parser.h"
6 6
7 #include "base/json/json_reader.h" 7 #include "base/json/json_reader.h"
8 #include "base/strings/nullable_string16.h" 8 #include "base/strings/nullable_string16.h"
9 #include "base/strings/string_util.h" 9 #include "base/strings/string_util.h"
10 #include "base/strings/utf_string_conversions.h" 10 #include "base/strings/utf_string_conversions.h"
11 #include "base/values.h" 11 #include "base/values.h"
12 #include "content/public/common/manifest.h" 12 #include "content/public/common/manifest.h"
13 13
14 namespace content {
15
14 namespace { 16 namespace {
15 17
18 enum TrimType {
19 Trim,
20 NoTrim
21 };
22
23 base::NullableString16 ParseString(const base::DictionaryValue& dictionary,
24 const std::string& key,
25 TrimType trim) {
26 if (!dictionary.HasKey(key))
27 return base::NullableString16();
28
29 base::string16 value;
30 if (!dictionary.GetString(key, &value)) {
31 // TODO(mlamouri): provide a custom message to the developer console about
32 // the property being incorrectly set.
33 return base::NullableString16();
34 }
35
36 if (trim == Trim) {
37 base::TrimWhitespace(value, base::TRIM_ALL, &value);
38 }
Avi (use Gerrit) 2014/09/18 02:00:02 No {} here; you don't use it above for a one-line
39 return base::NullableString16(value, false);
40 }
41
16 // Parses the 'name' field of the manifest, as defined in: 42 // Parses the 'name' field of the manifest, as defined in:
17 // http://w3c.github.io/manifest/#dfn-steps-for-processing-the-name-member 43 // http://w3c.github.io/manifest/#dfn-steps-for-processing-the-name-member
18 // Returns the parsed string if any, a null string if the parsing failed. 44 // Returns the parsed string if any, a null string if the parsing failed.
19 base::NullableString16 ParseName(const base::DictionaryValue& dictionary) { 45 base::NullableString16 ParseName(const base::DictionaryValue& dictionary) {
20 if (!dictionary.HasKey("name")) 46 return ParseString(dictionary, "name", Trim);
21 return base::NullableString16();
22
23 base::string16 name;
24 if (!dictionary.GetString("name", &name)) {
25 // TODO(mlamouri): provide a custom message to the developer console.
26 return base::NullableString16();
27 }
28
29 base::TrimWhitespace(name, base::TRIM_ALL, &name);
30 return base::NullableString16(name, false);
31 } 47 }
32 48
33 // Parses the 'short_name' field of the manifest, as defined in: 49 // Parses the 'short_name' field of the manifest, as defined in:
34 // http://w3c.github.io/manifest/#dfn-steps-for-processing-the-short-name-member 50 // http://w3c.github.io/manifest/#dfn-steps-for-processing-the-short-name-member
35 // Returns the parsed string if any, a null string if the parsing failed. 51 // Returns the parsed string if any, a null string if the parsing failed.
36 base::NullableString16 ParseShortName( 52 base::NullableString16 ParseShortName(
37 const base::DictionaryValue& dictionary) { 53 const base::DictionaryValue& dictionary) {
38 if (!dictionary.HasKey("short_name")) 54 return ParseString(dictionary, "short_name", Trim);
39 return base::NullableString16();
40
41 base::string16 short_name;
42 if (!dictionary.GetString("short_name", &short_name)) {
43 // TODO(mlamouri): provide a custom message to the developer console.
44 return base::NullableString16();
45 }
46
47 base::TrimWhitespace(short_name, base::TRIM_ALL, &short_name);
48 return base::NullableString16(short_name, false);
49 } 55 }
50 56
51 // Parses the 'start_url' field of the manifest, as defined in: 57 // Parses the 'start_url' field of the manifest, as defined in:
52 // http://w3c.github.io/manifest/#dfn-steps-for-processing-the-start_url-member 58 // http://w3c.github.io/manifest/#dfn-steps-for-processing-the-start_url-member
53 // Returns the parsed GURL if any, an empty GURL if the parsing failed. 59 // Returns the parsed GURL if any, an empty GURL if the parsing failed.
54 GURL ParseStartURL(const base::DictionaryValue& dictionary, 60 GURL ParseStartURL(const base::DictionaryValue& dictionary,
55 const GURL& manifest_url, 61 const GURL& manifest_url,
56 const GURL& document_url) { 62 const GURL& document_url) {
57 if (!dictionary.HasKey("start_url")) 63 base::NullableString16 start_url_str =
64 ParseString(dictionary, "start_url", NoTrim);
65
66 if (start_url_str.is_null())
58 return GURL(); 67 return GURL();
59 68
60 base::string16 start_url_str; 69 GURL start_url = manifest_url.Resolve(start_url_str.string());
61 if (!dictionary.GetString("start_url", &start_url_str)) {
62 // TODO(mlamouri): provide a custom message to the developer console.
63 return GURL();
64 }
65
66 GURL start_url = manifest_url.Resolve(start_url_str);
67 if (!start_url.is_valid()) 70 if (!start_url.is_valid())
68 return GURL(); 71 return GURL();
69 72
70 if (start_url.GetOrigin() != document_url.GetOrigin()) { 73 if (start_url.GetOrigin() != document_url.GetOrigin()) {
71 // TODO(mlamouri): provide a custom message to the developer console. 74 // TODO(mlamouri): provide a custom message to the developer console.
72 return GURL(); 75 return GURL();
73 } 76 }
74 77
75 return start_url; 78 return start_url;
76 } 79 }
77 80
81 // Parses the 'display' field of the manifest, as defined in:
82 // http://w3c.github.io/manifest/#dfn-steps-for-processing-the-display-member
83 // Returns the parsed DisplayMode if any, DISPLAY_MODE_UNSPECIFIED if the
84 // parsing failed.
85 Manifest::DisplayMode ParseDisplay(const base::DictionaryValue& dictionary) {
86 base::NullableString16 display = ParseString(dictionary, "display", Trim);
87
88 if (display.is_null())
89 return Manifest::DISPLAY_MODE_UNSPECIFIED;
90
91 if (LowerCaseEqualsASCII(display.string(), "fullscreen"))
92 return Manifest::DISPLAY_MODE_FULLSCREEN;
93 else if (LowerCaseEqualsASCII(display.string(), "standalone"))
94 return Manifest::DISPLAY_MODE_STANDALONE;
95 else if (LowerCaseEqualsASCII(display.string(), "minimal-ui"))
96 return Manifest::DISPLAY_MODE_MINIMAL_UI;
97 else if (LowerCaseEqualsASCII(display.string(), "browser"))
98 return Manifest::DISPLAY_MODE_BROWSER;
99 else
100 return Manifest::DISPLAY_MODE_UNSPECIFIED;
101 }
102
78 } // anonymous namespace 103 } // anonymous namespace
79 104
80 namespace content {
81
82 Manifest ManifestParser::Parse(const base::StringPiece& json, 105 Manifest ManifestParser::Parse(const base::StringPiece& json,
83 const GURL& manifest_url, 106 const GURL& manifest_url,
84 const GURL& document_url) { 107 const GURL& document_url) {
85 scoped_ptr<base::Value> value(base::JSONReader::Read(json)); 108 scoped_ptr<base::Value> value(base::JSONReader::Read(json));
86 if (!value) { 109 if (!value) {
87 // TODO(mlamouri): get the JSON parsing error and report it to the developer 110 // TODO(mlamouri): get the JSON parsing error and report it to the developer
88 // console. 111 // console.
89 return Manifest(); 112 return Manifest();
90 } 113 }
91 114
92 if (value->GetType() != base::Value::TYPE_DICTIONARY) { 115 if (value->GetType() != base::Value::TYPE_DICTIONARY) {
93 // TODO(mlamouri): provide a custom message to the developer console. 116 // TODO(mlamouri): provide a custom message to the developer console.
94 return Manifest(); 117 return Manifest();
95 } 118 }
96 119
97 base::DictionaryValue* dictionary = 0; 120 base::DictionaryValue* dictionary = 0;
98 value->GetAsDictionary(&dictionary); 121 value->GetAsDictionary(&dictionary);
99 if (!dictionary) { 122 if (!dictionary) {
100 // TODO(mlamouri): provide a custom message to the developer console. 123 // TODO(mlamouri): provide a custom message to the developer console.
101 return Manifest(); 124 return Manifest();
102 } 125 }
103 126
104 Manifest manifest; 127 Manifest manifest;
105 128
106 manifest.name = ParseName(*dictionary); 129 manifest.name = ParseName(*dictionary);
107 manifest.short_name = ParseShortName(*dictionary); 130 manifest.short_name = ParseShortName(*dictionary);
108 manifest.start_url = ParseStartURL(*dictionary, manifest_url, document_url); 131 manifest.start_url = ParseStartURL(*dictionary, manifest_url, document_url);
132 manifest.display = ParseDisplay(*dictionary);
109 133
110 return manifest; 134 return manifest;
111 } 135 }
112 136
113 } // namespace content 137 } // namespace content
OLDNEW
« no previous file with comments | « content/public/common/manifest.cc ('k') | content/renderer/manifest/manifest_parser_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698