| 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 11 matching lines...) Expand all Loading... |
| 22 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR | 22 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR |
| 23 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, | 23 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
| 24 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, | 24 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
| 25 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR | 25 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
| 26 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY | 26 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY |
| 27 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | 27 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
| 28 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | 28 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
| 29 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 29 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| 30 */ | 30 */ |
| 31 | 31 |
| 32 #include "webkit/browser/appcache/manifest_parser.h" | 32 #include "content/browser/appcache/manifest_parser.h" |
| 33 | 33 |
| 34 #include "base/command_line.h" | 34 #include "base/command_line.h" |
| 35 #include "base/i18n/icu_string_conversions.h" | 35 #include "base/i18n/icu_string_conversions.h" |
| 36 #include "base/logging.h" | 36 #include "base/logging.h" |
| 37 #include "base/strings/utf_string_conversions.h" | 37 #include "base/strings/utf_string_conversions.h" |
| 38 #include "url/gurl.h" | 38 #include "url/gurl.h" |
| 39 | 39 |
| 40 namespace appcache { | 40 namespace content { |
| 41 | 41 |
| 42 namespace { | 42 namespace { |
| 43 | 43 |
| 44 // Helper function used to identify 'isPattern' annotations. | 44 // Helper function used to identify 'isPattern' annotations. |
| 45 bool HasPatternMatchingAnnotation(const wchar_t* line_p, | 45 bool HasPatternMatchingAnnotation(const wchar_t* line_p, |
| 46 const wchar_t* line_end) { | 46 const wchar_t* line_end) { |
| 47 // Skip whitespace separating the resource url from the annotation. | 47 // Skip whitespace separating the resource url from the annotation. |
| 48 // Note: trailing whitespace has already been trimmed from the line. | 48 // Note: trailing whitespace has already been trimmed from the line. |
| 49 while (line_p < line_end && (*line_p == '\t' || *line_p == ' ')) | 49 while (line_p < line_end && (*line_p == '\t' || *line_p == ' ')) |
| 50 ++line_p; | 50 ++line_p; |
| (...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 212 // Per the spec, EXPLICIT cross-origin HTTS resources should be | 212 // Per the spec, EXPLICIT cross-origin HTTS resources should be |
| 213 // ignored here. We've opted for a milder constraint and allow | 213 // ignored here. We've opted for a milder constraint and allow |
| 214 // caching unless the resource has a "no-store" header. That | 214 // caching unless the resource has a "no-store" header. That |
| 215 // condition is enforced in AppCacheUpdateJob. | 215 // condition is enforced in AppCacheUpdateJob. |
| 216 | 216 |
| 217 if (mode == EXPLICIT) { | 217 if (mode == EXPLICIT) { |
| 218 manifest.explicit_urls.insert(url.spec()); | 218 manifest.explicit_urls.insert(url.spec()); |
| 219 } else { | 219 } else { |
| 220 bool is_pattern = HasPatternMatchingAnnotation(line_p, line_end); | 220 bool is_pattern = HasPatternMatchingAnnotation(line_p, line_end); |
| 221 manifest.online_whitelist_namespaces.push_back( | 221 manifest.online_whitelist_namespaces.push_back( |
| 222 Namespace(APPCACHE_NETWORK_NAMESPACE, url, GURL(), is_pattern)); | 222 AppCacheNamespace(APPCACHE_NETWORK_NAMESPACE, url, GURL(), |
| 223 is_pattern)); |
| 223 } | 224 } |
| 224 } else if (mode == INTERCEPT) { | 225 } else if (mode == INTERCEPT) { |
| 225 if (parse_mode != PARSE_MANIFEST_ALLOWING_INTERCEPTS) { | 226 if (parse_mode != PARSE_MANIFEST_ALLOWING_INTERCEPTS) { |
| 226 manifest.did_ignore_intercept_namespaces = true; | 227 manifest.did_ignore_intercept_namespaces = true; |
| 227 continue; | 228 continue; |
| 228 } | 229 } |
| 229 | 230 |
| 230 // Lines of the form, | 231 // Lines of the form, |
| 231 // <urlnamespace> <intercept_type> <targeturl> | 232 // <urlnamespace> <intercept_type> <targeturl> |
| 232 const wchar_t* line_p = line.c_str(); | 233 const wchar_t* line_p = line.c_str(); |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 297 if (target_url.has_ref()) { | 298 if (target_url.has_ref()) { |
| 298 GURL::Replacements replacements; | 299 GURL::Replacements replacements; |
| 299 replacements.ClearRef(); | 300 replacements.ClearRef(); |
| 300 target_url = target_url.ReplaceComponents(replacements); | 301 target_url = target_url.ReplaceComponents(replacements); |
| 301 } | 302 } |
| 302 if (manifest_url.GetOrigin() != target_url.GetOrigin()) | 303 if (manifest_url.GetOrigin() != target_url.GetOrigin()) |
| 303 continue; | 304 continue; |
| 304 | 305 |
| 305 bool is_pattern = HasPatternMatchingAnnotation(line_p, line_end); | 306 bool is_pattern = HasPatternMatchingAnnotation(line_p, line_end); |
| 306 manifest.intercept_namespaces.push_back( | 307 manifest.intercept_namespaces.push_back( |
| 307 Namespace(APPCACHE_INTERCEPT_NAMESPACE, namespace_url, | 308 AppCacheNamespace(APPCACHE_INTERCEPT_NAMESPACE, namespace_url, |
| 308 target_url, is_pattern, verb == EXECUTE)); | 309 target_url, is_pattern, verb == EXECUTE)); |
| 309 } else if (mode == FALLBACK) { | 310 } else if (mode == FALLBACK) { |
| 310 const wchar_t* line_p = line.c_str(); | 311 const wchar_t* line_p = line.c_str(); |
| 311 const wchar_t* line_end = line_p + line.length(); | 312 const wchar_t* line_end = line_p + line.length(); |
| 312 | 313 |
| 313 // Look for whitespace separating the two URLs | 314 // Look for whitespace separating the two URLs |
| 314 while (line_p < line_end && *line_p != '\t' && *line_p != ' ') | 315 while (line_p < line_end && *line_p != '\t' && *line_p != ' ') |
| 315 ++line_p; | 316 ++line_p; |
| 316 | 317 |
| 317 if (line_p == line_end) { | 318 if (line_p == line_end) { |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 361 // as the manifest's URL. | 362 // as the manifest's URL. |
| 362 if (manifest_url.GetOrigin() != fallback_url.GetOrigin()) { | 363 if (manifest_url.GetOrigin() != fallback_url.GetOrigin()) { |
| 363 continue; | 364 continue; |
| 364 } | 365 } |
| 365 | 366 |
| 366 bool is_pattern = HasPatternMatchingAnnotation(line_p, line_end); | 367 bool is_pattern = HasPatternMatchingAnnotation(line_p, line_end); |
| 367 | 368 |
| 368 // Store regardless of duplicate namespace URL. Only first match | 369 // Store regardless of duplicate namespace URL. Only first match |
| 369 // will ever be used. | 370 // will ever be used. |
| 370 manifest.fallback_namespaces.push_back( | 371 manifest.fallback_namespaces.push_back( |
| 371 Namespace(APPCACHE_FALLBACK_NAMESPACE, namespace_url, | 372 AppCacheNamespace(APPCACHE_FALLBACK_NAMESPACE, namespace_url, |
| 372 fallback_url, is_pattern)); | 373 fallback_url, is_pattern)); |
| 373 } else { | 374 } else { |
| 374 NOTREACHED(); | 375 NOTREACHED(); |
| 375 } | 376 } |
| 376 } | 377 } |
| 377 | 378 |
| 378 return true; | 379 return true; |
| 379 } | 380 } |
| 380 | 381 |
| 381 } // namespace appcache | 382 } // namespace content |
| OLD | NEW |