1// Copyright (c) 2012 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include "content/common/appcache_interfaces.h" 6 7#include <set> 8 9#include "base/strings/string_util.h" 10#include "net/url_request/url_request.h" 11#include "url/gurl.h" 12 13namespace content { 14 15const char kHttpScheme[] = "http"; 16const char kHttpsScheme[] = "https"; 17const char kDevToolsScheme[] = "chrome-devtools"; 18const char kHttpGETMethod[] = "GET"; 19const char kHttpHEADMethod[] = "HEAD"; 20 21const char kEnableExecutableHandlers[] = "enable-appcache-executable-handlers"; 22 23const base::FilePath::CharType kAppCacheDatabaseName[] = 24 FILE_PATH_LITERAL("Index"); 25 26AppCacheInfo::AppCacheInfo() 27 : cache_id(kAppCacheNoCacheId), 28 group_id(0), 29 status(APPCACHE_STATUS_UNCACHED), 30 size(0), 31 is_complete(false) { 32} 33 34AppCacheInfo::~AppCacheInfo() { 35} 36 37AppCacheResourceInfo::AppCacheResourceInfo() 38 : url(), 39 size(0), 40 is_master(false), 41 is_manifest(false), 42 is_intercept(false), 43 is_fallback(false), 44 is_foreign(false), 45 is_explicit(false), 46 response_id(kAppCacheNoResponseId) { 47} 48 49AppCacheResourceInfo::~AppCacheResourceInfo() { 50} 51 52AppCacheErrorDetails::AppCacheErrorDetails() 53 : message(), 54 reason(APPCACHE_UNKNOWN_ERROR), 55 url(), 56 status(0), 57 is_cross_origin(false) {} 58 59AppCacheErrorDetails::AppCacheErrorDetails( 60 std::string in_message, 61 AppCacheErrorReason in_reason, 62 GURL in_url, 63 int in_status, 64 bool in_is_cross_origin) 65 : message(in_message), 66 reason(in_reason), 67 url(in_url), 68 status(in_status), 69 is_cross_origin(in_is_cross_origin) {} 70 71AppCacheErrorDetails::~AppCacheErrorDetails() {} 72 73AppCacheNamespace::AppCacheNamespace() 74 : type(APPCACHE_FALLBACK_NAMESPACE), 75 is_pattern(false), 76 is_executable(false) { 77} 78 79AppCacheNamespace::AppCacheNamespace( 80 AppCacheNamespaceType type, const GURL& url, const GURL& target, 81 bool is_pattern) 82 : type(type), 83 namespace_url(url), 84 target_url(target), 85 is_pattern(is_pattern), 86 is_executable(false) { 87} 88 89AppCacheNamespace::AppCacheNamespace( 90 AppCacheNamespaceType type, const GURL& url, const GURL& target, 91 bool is_pattern, bool is_executable) 92 : type(type), 93 namespace_url(url), 94 target_url(target), 95 is_pattern(is_pattern), 96 is_executable(is_executable) { 97} 98 99AppCacheNamespace::~AppCacheNamespace() { 100} 101 102bool AppCacheNamespace::IsMatch(const GURL& url) const { 103 if (is_pattern) { 104 // We have to escape '?' characters since MatchPattern also treats those 105 // as wildcards which we don't want here, we only do '*'s. 106 std::string pattern = namespace_url.spec(); 107 if (namespace_url.has_query()) 108 ReplaceSubstringsAfterOffset(&pattern, 0, "?", "\\?"); 109 return MatchPattern(url.spec(), pattern); 110 } 111 return StartsWithASCII(url.spec(), namespace_url.spec(), true); 112} 113 114bool IsSchemeSupportedForAppCache(const GURL& url) { 115 bool supported = url.SchemeIs(kHttpScheme) || url.SchemeIs(kHttpsScheme) || 116 url.SchemeIs(kDevToolsScheme); 117 118#ifndef NDEBUG 119 // TODO(michaeln): It would be really nice if this could optionally work for 120 // file and filesystem urls too to help web developers experiment and test 121 // their apps, perhaps enabled via a cmd line flag or some other developer 122 // tool setting. Unfortunately file scheme net::URLRequests don't produce the 123 // same signalling (200 response codes, headers) as http URLRequests, so this 124 // doesn't work just yet. 125 // supported |= url.SchemeIsFile(); 126#endif 127 return supported; 128} 129 130bool IsMethodSupportedForAppCache(const std::string& method) { 131 return (method == kHttpGETMethod) || (method == kHttpHEADMethod); 132} 133 134bool IsSchemeAndMethodSupportedForAppCache(const net::URLRequest* request) { 135 return IsSchemeSupportedForAppCache(request->url()) && 136 IsMethodSupportedForAppCache(request->method()); 137} 138 139} // namespace content 140