1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
|
// Copyright 2014 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.
#ifndef CONTENT_RENDERER_MANIFEST_MANIFEST_PARSER_H_
#define CONTENT_RENDERER_MANIFEST_MANIFEST_PARSER_H_
#include <stdint.h>
#include "base/macros.h"
#include "base/strings/nullable_string16.h"
#include "base/strings/string_piece.h"
#include "content/common/content_export.h"
#include "content/public/common/manifest.h"
class GURL;
namespace base {
class DictionaryValue;
}
namespace content {
// ManifestParser handles the logic of parsing the Web Manifest from a string.
// It implements:
// http://w3c.github.io/manifest/#dfn-steps-for-processing-a-manifest
class CONTENT_EXPORT ManifestParser {
public:
class ErrorInfo {
public:
ErrorInfo(const std::string& error_msg, int error_line, int error_column)
: error_msg(error_msg),
error_line(error_line),
error_column(error_column) {}
const std::string error_msg;
const int error_line;
const int error_column;
};
ManifestParser(const base::StringPiece& data,
const GURL& manifest_url,
const GURL& document_url);
~ManifestParser();
// Parse the Manifest from a string using following:
// http://w3c.github.io/manifest/#dfn-steps-for-processing-a-manifest
void Parse();
const Manifest& manifest() const;
const std::vector<scoped_ptr<ErrorInfo>>& errors() const;
bool failed() const;
private:
// Used to indicate whether to strip whitespace when parsing a string.
enum TrimType {
Trim,
NoTrim
};
// Helper function to parse booleans present on a given |dictionary| in a
// given field identified by its |key|.
// Returns the parsed boolean if any, or |default_value| if parsing failed.
bool ParseBoolean(const base::DictionaryValue& dictionary,
const std::string& key,
bool default_value);
// Helper function to parse strings present on a given |dictionary| in a given
// field identified by its |key|.
// Returns the parsed string if any, a null string if the parsing failed.
base::NullableString16 ParseString(const base::DictionaryValue& dictionary,
const std::string& key,
TrimType trim);
// Helper function to parse colors present on a given |dictionary| in a given
// field identified by its |key|.
// Returns the parsed color as an int64_t if any,
// Manifest::kInvalidOrMissingColor if the parsing failed.
int64_t ParseColor(const base::DictionaryValue& dictionary,
const std::string& key);
// 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);
// 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.
base::NullableString16 ParseName(const base::DictionaryValue& dictionary);
// Parses the 'short_name' field of the manifest, as defined in:
// http://w3c.github.io/manifest/#dfn-steps-for-processing-the-short-name-member
// Returns the parsed string if any, a null string if the parsing failed.
base::NullableString16 ParseShortName(
const base::DictionaryValue& dictionary);
// Parses the 'start_url' field of the manifest, as defined in:
// http://w3c.github.io/manifest/#dfn-steps-for-processing-the-start_url-member
// Returns the parsed GURL if any, an empty GURL if the parsing failed.
GURL ParseStartURL(const base::DictionaryValue& dictionary);
// Parses the 'display' field of the manifest, as defined in:
// http://w3c.github.io/manifest/#dfn-steps-for-processing-the-display-member
// Returns the parsed DisplayMode if any, WebDisplayModeUndefined if the
// parsing failed.
blink::WebDisplayMode ParseDisplay(const base::DictionaryValue& dictionary);
// Parses the 'orientation' field of the manifest, as defined in:
// http://w3c.github.io/manifest/#dfn-steps-for-processing-the-orientation-member
// Returns the parsed WebScreenOrientationLockType if any,
// WebScreenOrientationLockDefault if the parsing failed.
blink::WebScreenOrientationLockType ParseOrientation(
const base::DictionaryValue& dictionary);
// 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);
// 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);
// 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);
// Parses the 'sizes' field of an icon, as defined in:
// http://w3c.github.io/manifest/#dfn-steps-for-processing-a-sizes-member-of-an-icon
// Returns a vector of gfx::Size with the successfully parsed sizes, if any.
// An empty vector if the field was not present or empty. "Any" is represented
// by gfx::Size(0, 0).
std::vector<gfx::Size> ParseIconSizes(const base::DictionaryValue& icon);
// Parses the 'icons' field of a Manifest, as defined in:
// http://w3c.github.io/manifest/#dfn-steps-for-processing-the-icons-member
// Returns a vector of Manifest::Icon with the successfully parsed icons, if
// any. An empty vector if the field was not present or empty.
std::vector<Manifest::Icon> ParseIcons(
const base::DictionaryValue& dictionary);
// Parses the 'platform' field of a related application, as defined in:
// https://w3c.github.io/manifest/#dfn-steps-for-processing-the-platform-member-of-an-application
// Returns the parsed string if any, a null string if the parsing failed.
base::NullableString16 ParseRelatedApplicationPlatform(
const base::DictionaryValue& application);
// Parses the 'url' field of a related application, as defined in:
// https://w3c.github.io/manifest/#dfn-steps-for-processing-the-url-member-of-an-application
// Returns the paresed GURL if any, an empty GURL if the parsing failed.
GURL ParseRelatedApplicationURL(const base::DictionaryValue& application);
// Parses the 'id' field of a related application, as defined in:
// https://w3c.github.io/manifest/#dfn-steps-for-processing-the-id-member-of-an-application
// Returns the parsed string if any, a null string if the parsing failed.
base::NullableString16 ParseRelatedApplicationId(
const base::DictionaryValue& application);
// Parses the 'related_applications' field of the manifest, as defined in:
// https://w3c.github.io/manifest/#dfn-steps-for-processing-the-related_applications-member
// Returns a vector of Manifest::RelatedApplication with the successfully
// parsed applications, if any. An empty vector if the field was not present
// or empty.
std::vector<Manifest::RelatedApplication> ParseRelatedApplications(
const base::DictionaryValue& dictionary);
// Parses the 'prefer_related_applications' field on the manifest, as defined
// in:
// https://w3c.github.io/manifest/#dfn-steps-for-processing-the-prefer_related_applications-member
// returns true iff the field could be parsed as the boolean true.
bool ParsePreferRelatedApplications(const base::DictionaryValue& dictionary);
// Parses the 'theme_color' field of the manifest, as defined in:
// http://w3c.github.io/manifest/#dfn-steps-for-processing-the-theme_color-member
// Returns the parsed theme color if any,
// Manifest::kInvalidOrMissingColor if the parsing failed.
int64_t ParseThemeColor(const base::DictionaryValue& dictionary);
// Parses the 'background_color' field of the manifest, as defined in:
// http://w3c.github.io/manifest/#dfn-steps-for-processing-the-background_color-member
// Returns the parsed background color if any,
// Manifest::kInvalidOrMissingColor if the parsing failed.
int64_t ParseBackgroundColor(const base::DictionaryValue& dictionary);
// Parses the 'gcm_sender_id' field of the manifest.
// This is a proprietary extension of the Web Manifest specification.
// Returns the parsed string if any, a null string if the parsing failed.
base::NullableString16 ParseGCMSenderID(
const base::DictionaryValue& dictionary);
void AddErrorInfo(const std::string& error_msg,
int error_line = 0,
int error_column = 0);
const base::StringPiece& data_;
GURL manifest_url_;
GURL document_url_;
bool failed_;
Manifest manifest_;
std::vector<scoped_ptr<ErrorInfo>> errors_;
DISALLOW_COPY_AND_ASSIGN(ManifestParser);
};
} // namespace content
#endif // CONTENT_RENDERER_MANIFEST_MANIFEST_PARSER_H_
|