OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 // This is a port of ManifestParser.cc from WebKit/WebCore/loader/appcache. | 5 // This is a port of ManifestParser.cc from WebKit/WebCore/loader/appcache. |
6 | 6 |
7 /* | 7 /* |
8 * Copyright (C) 2008 Apple Inc. All Rights Reserved. | 8 * Copyright (C) 2008 Apple Inc. All Rights Reserved. |
9 * | 9 * |
10 * Redistribution and use in source and binary forms, with or without | 10 * Redistribution and use in source and binary forms, with or without |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
50 | 50 |
51 Manifest::~Manifest() {} | 51 Manifest::~Manifest() {} |
52 | 52 |
53 bool ParseManifest(const GURL& manifest_url, const char* data, int length, | 53 bool ParseManifest(const GURL& manifest_url, const char* data, int length, |
54 Manifest& manifest) { | 54 Manifest& manifest) { |
55 // This is an implementation of the parsing algorithm specified in | 55 // This is an implementation of the parsing algorithm specified in |
56 // the HTML5 offline web application docs: | 56 // the HTML5 offline web application docs: |
57 // http://www.w3.org/TR/html5/offline.html | 57 // http://www.w3.org/TR/html5/offline.html |
58 // Do not modify it without consulting those docs. | 58 // Do not modify it without consulting those docs. |
59 // Though you might be tempted to convert these wstrings to UTF-8 or | 59 // Though you might be tempted to convert these wstrings to UTF-8 or |
60 // string16, this implementation seems simpler given the constraints. | 60 // base::string16, this implementation seems simpler given the constraints. |
61 | 61 |
62 const wchar_t kSignature[] = L"CACHE MANIFEST"; | 62 const wchar_t kSignature[] = L"CACHE MANIFEST"; |
63 const size_t kSignatureLength = arraysize(kSignature) - 1; | 63 const size_t kSignatureLength = arraysize(kSignature) - 1; |
64 const wchar_t kChromiumSignature[] = L"CHROMIUM CACHE MANIFEST"; | 64 const wchar_t kChromiumSignature[] = L"CHROMIUM CACHE MANIFEST"; |
65 const size_t kChromiumSignatureLength = arraysize(kChromiumSignature) - 1; | 65 const size_t kChromiumSignatureLength = arraysize(kChromiumSignature) - 1; |
66 | 66 |
67 DCHECK(manifest.explicit_urls.empty()); | 67 DCHECK(manifest.explicit_urls.empty()); |
68 DCHECK(manifest.fallback_namespaces.empty()); | 68 DCHECK(manifest.fallback_namespaces.empty()); |
69 DCHECK(manifest.online_whitelist_namespaces.empty()); | 69 DCHECK(manifest.online_whitelist_namespaces.empty()); |
70 DCHECK(!manifest.online_whitelist_all); | 70 DCHECK(!manifest.online_whitelist_all); |
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
155 manifest.online_whitelist_all = true; | 155 manifest.online_whitelist_all = true; |
156 continue; | 156 continue; |
157 } else if (mode == EXPLICIT || mode == ONLINE_WHITELIST) { | 157 } else if (mode == EXPLICIT || mode == ONLINE_WHITELIST) { |
158 const wchar_t *line_p = line.c_str(); | 158 const wchar_t *line_p = line.c_str(); |
159 const wchar_t *line_end = line_p + line.length(); | 159 const wchar_t *line_end = line_p + line.length(); |
160 | 160 |
161 // Look for whitespace separating the URL from subsequent ignored tokens. | 161 // Look for whitespace separating the URL from subsequent ignored tokens. |
162 while (line_p < line_end && *line_p != '\t' && *line_p != ' ') | 162 while (line_p < line_end && *line_p != '\t' && *line_p != ' ') |
163 ++line_p; | 163 ++line_p; |
164 | 164 |
165 string16 url16; | 165 base::string16 url16; |
166 WideToUTF16(line.c_str(), line_p - line.c_str(), &url16); | 166 WideToUTF16(line.c_str(), line_p - line.c_str(), &url16); |
167 GURL url = manifest_url.Resolve(url16); | 167 GURL url = manifest_url.Resolve(url16); |
168 if (!url.is_valid()) | 168 if (!url.is_valid()) |
169 continue; | 169 continue; |
170 if (url.has_ref()) { | 170 if (url.has_ref()) { |
171 GURL::Replacements replacements; | 171 GURL::Replacements replacements; |
172 replacements.ClearRef(); | 172 replacements.ClearRef(); |
173 url = url.ReplaceComponents(replacements); | 173 url = url.ReplaceComponents(replacements); |
174 } | 174 } |
175 | 175 |
(...skipping 22 matching lines...) Expand all Loading... |
198 const wchar_t* line_end = line_p + line.length(); | 198 const wchar_t* line_end = line_p + line.length(); |
199 | 199 |
200 // Look for first whitespace separating the url namespace from | 200 // Look for first whitespace separating the url namespace from |
201 // the intercept type. | 201 // the intercept type. |
202 while (line_p < line_end && *line_p != '\t' && *line_p != ' ') | 202 while (line_p < line_end && *line_p != '\t' && *line_p != ' ') |
203 ++line_p; | 203 ++line_p; |
204 | 204 |
205 if (line_p == line_end) | 205 if (line_p == line_end) |
206 continue; // There was no whitespace separating the URLs. | 206 continue; // There was no whitespace separating the URLs. |
207 | 207 |
208 string16 namespace_url16; | 208 base::string16 namespace_url16; |
209 WideToUTF16(line.c_str(), line_p - line.c_str(), &namespace_url16); | 209 WideToUTF16(line.c_str(), line_p - line.c_str(), &namespace_url16); |
210 GURL namespace_url = manifest_url.Resolve(namespace_url16); | 210 GURL namespace_url = manifest_url.Resolve(namespace_url16); |
211 if (!namespace_url.is_valid()) | 211 if (!namespace_url.is_valid()) |
212 continue; | 212 continue; |
213 if (namespace_url.has_ref()) { | 213 if (namespace_url.has_ref()) { |
214 GURL::Replacements replacements; | 214 GURL::Replacements replacements; |
215 replacements.ClearRef(); | 215 replacements.ClearRef(); |
216 namespace_url = namespace_url.ReplaceComponents(replacements); | 216 namespace_url = namespace_url.ReplaceComponents(replacements); |
217 } | 217 } |
218 | 218 |
(...skipping 18 matching lines...) Expand all Loading... |
237 | 237 |
238 // Skip whitespace separating type from the target_url. | 238 // Skip whitespace separating type from the target_url. |
239 while (line_p < line_end && (*line_p == '\t' || *line_p == ' ')) | 239 while (line_p < line_end && (*line_p == '\t' || *line_p == ' ')) |
240 ++line_p; | 240 ++line_p; |
241 | 241 |
242 // Look for whitespace separating the URL from subsequent ignored tokens. | 242 // Look for whitespace separating the URL from subsequent ignored tokens. |
243 const wchar_t* target_url_start = line_p; | 243 const wchar_t* target_url_start = line_p; |
244 while (line_p < line_end && *line_p != '\t' && *line_p != ' ') | 244 while (line_p < line_end && *line_p != '\t' && *line_p != ' ') |
245 ++line_p; | 245 ++line_p; |
246 | 246 |
247 string16 target_url16; | 247 base::string16 target_url16; |
248 WideToUTF16(target_url_start, line_p - target_url_start, &target_url16); | 248 WideToUTF16(target_url_start, line_p - target_url_start, &target_url16); |
249 GURL target_url = manifest_url.Resolve(target_url16); | 249 GURL target_url = manifest_url.Resolve(target_url16); |
250 if (!target_url.is_valid()) | 250 if (!target_url.is_valid()) |
251 continue; | 251 continue; |
252 | 252 |
253 if (target_url.has_ref()) { | 253 if (target_url.has_ref()) { |
254 GURL::Replacements replacements; | 254 GURL::Replacements replacements; |
255 replacements.ClearRef(); | 255 replacements.ClearRef(); |
256 target_url = target_url.ReplaceComponents(replacements); | 256 target_url = target_url.ReplaceComponents(replacements); |
257 } | 257 } |
258 if (manifest_url.GetOrigin() != target_url.GetOrigin()) | 258 if (manifest_url.GetOrigin() != target_url.GetOrigin()) |
259 continue; | 259 continue; |
260 | 260 |
261 manifest.intercept_namespaces.push_back( | 261 manifest.intercept_namespaces.push_back( |
262 Namespace(INTERCEPT_NAMESPACE, namespace_url, target_url)); | 262 Namespace(INTERCEPT_NAMESPACE, namespace_url, target_url)); |
263 } else if (mode == FALLBACK) { | 263 } else if (mode == FALLBACK) { |
264 const wchar_t* line_p = line.c_str(); | 264 const wchar_t* line_p = line.c_str(); |
265 const wchar_t* line_end = line_p + line.length(); | 265 const wchar_t* line_end = line_p + line.length(); |
266 | 266 |
267 // Look for whitespace separating the two URLs | 267 // Look for whitespace separating the two URLs |
268 while (line_p < line_end && *line_p != '\t' && *line_p != ' ') | 268 while (line_p < line_end && *line_p != '\t' && *line_p != ' ') |
269 ++line_p; | 269 ++line_p; |
270 | 270 |
271 if (line_p == line_end) { | 271 if (line_p == line_end) { |
272 // There was no whitespace separating the URLs. | 272 // There was no whitespace separating the URLs. |
273 continue; | 273 continue; |
274 } | 274 } |
275 | 275 |
276 string16 namespace_url16; | 276 base::string16 namespace_url16; |
277 WideToUTF16(line.c_str(), line_p - line.c_str(), &namespace_url16); | 277 WideToUTF16(line.c_str(), line_p - line.c_str(), &namespace_url16); |
278 GURL namespace_url = manifest_url.Resolve(namespace_url16); | 278 GURL namespace_url = manifest_url.Resolve(namespace_url16); |
279 if (!namespace_url.is_valid()) | 279 if (!namespace_url.is_valid()) |
280 continue; | 280 continue; |
281 if (namespace_url.has_ref()) { | 281 if (namespace_url.has_ref()) { |
282 GURL::Replacements replacements; | 282 GURL::Replacements replacements; |
283 replacements.ClearRef(); | 283 replacements.ClearRef(); |
284 namespace_url = namespace_url.ReplaceComponents(replacements); | 284 namespace_url = namespace_url.ReplaceComponents(replacements); |
285 } | 285 } |
286 | 286 |
287 // Fallback namespace URL must have the same scheme, host and port | 287 // Fallback namespace URL must have the same scheme, host and port |
288 // as the manifest's URL. | 288 // as the manifest's URL. |
289 if (manifest_url.GetOrigin() != namespace_url.GetOrigin()) { | 289 if (manifest_url.GetOrigin() != namespace_url.GetOrigin()) { |
290 continue; | 290 continue; |
291 } | 291 } |
292 | 292 |
293 // Skip whitespace separating fallback namespace from URL. | 293 // Skip whitespace separating fallback namespace from URL. |
294 while (line_p < line_end && (*line_p == '\t' || *line_p == ' ')) | 294 while (line_p < line_end && (*line_p == '\t' || *line_p == ' ')) |
295 ++line_p; | 295 ++line_p; |
296 | 296 |
297 // Look for whitespace separating the URL from subsequent ignored tokens. | 297 // Look for whitespace separating the URL from subsequent ignored tokens. |
298 const wchar_t* fallback_start = line_p; | 298 const wchar_t* fallback_start = line_p; |
299 while (line_p < line_end && *line_p != '\t' && *line_p != ' ') | 299 while (line_p < line_end && *line_p != '\t' && *line_p != ' ') |
300 ++line_p; | 300 ++line_p; |
301 | 301 |
302 string16 fallback_url16; | 302 base::string16 fallback_url16; |
303 WideToUTF16(fallback_start, line_p - fallback_start, &fallback_url16); | 303 WideToUTF16(fallback_start, line_p - fallback_start, &fallback_url16); |
304 GURL fallback_url = manifest_url.Resolve(fallback_url16); | 304 GURL fallback_url = manifest_url.Resolve(fallback_url16); |
305 if (!fallback_url.is_valid()) | 305 if (!fallback_url.is_valid()) |
306 continue; | 306 continue; |
307 if (fallback_url.has_ref()) { | 307 if (fallback_url.has_ref()) { |
308 GURL::Replacements replacements; | 308 GURL::Replacements replacements; |
309 replacements.ClearRef(); | 309 replacements.ClearRef(); |
310 fallback_url = fallback_url.ReplaceComponents(replacements); | 310 fallback_url = fallback_url.ReplaceComponents(replacements); |
311 } | 311 } |
312 | 312 |
313 // Fallback entry URL must have the same scheme, host and port | 313 // Fallback entry URL must have the same scheme, host and port |
314 // as the manifest's URL. | 314 // as the manifest's URL. |
315 if (manifest_url.GetOrigin() != fallback_url.GetOrigin()) { | 315 if (manifest_url.GetOrigin() != fallback_url.GetOrigin()) { |
316 continue; | 316 continue; |
317 } | 317 } |
318 | 318 |
319 // Store regardless of duplicate namespace URL. Only first match | 319 // Store regardless of duplicate namespace URL. Only first match |
320 // will ever be used. | 320 // will ever be used. |
321 manifest.fallback_namespaces.push_back( | 321 manifest.fallback_namespaces.push_back( |
322 Namespace(FALLBACK_NAMESPACE, namespace_url, fallback_url)); | 322 Namespace(FALLBACK_NAMESPACE, namespace_url, fallback_url)); |
323 } else { | 323 } else { |
324 NOTREACHED(); | 324 NOTREACHED(); |
325 } | 325 } |
326 } | 326 } |
327 | 327 |
328 return true; | 328 return true; |
329 } | 329 } |
330 | 330 |
331 } // namespace appcache | 331 } // namespace appcache |
OLD | NEW |