// Copyright (c) 2012 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. #include "webkit/common/appcache/appcache_interfaces.h" #include <set> #include "base/strings/string_util.h" #include "net/url_request/url_request.h" #include "url/gurl.h" namespace appcache { const char kHttpScheme[] = "http"; const char kHttpsScheme[] = "https"; const char kDevToolsScheme[] = "chrome-devtools"; const char kHttpGETMethod[] = "GET"; const char kHttpHEADMethod[] = "HEAD"; const char kEnableExecutableHandlers[] = "enable-appcache-executable-handlers"; const base::FilePath::CharType kAppCacheDatabaseName[] = FILE_PATH_LITERAL("Index"); AppCacheInfo::AppCacheInfo() : cache_id(kAppCacheNoCacheId), group_id(0), status(APPCACHE_STATUS_UNCACHED), size(0), is_complete(false) { } AppCacheInfo::~AppCacheInfo() { } AppCacheResourceInfo::AppCacheResourceInfo() : url(), size(0), is_master(false), is_manifest(false), is_intercept(false), is_fallback(false), is_foreign(false), is_explicit(false), response_id(kAppCacheNoResponseId) { } AppCacheResourceInfo::~AppCacheResourceInfo() { } AppCacheErrorDetails::AppCacheErrorDetails() : message(), reason(APPCACHE_UNKNOWN_ERROR), url(), status(0), is_cross_origin(false) {} AppCacheErrorDetails::AppCacheErrorDetails( std::string in_message, AppCacheErrorReason in_reason, GURL in_url, int in_status, bool in_is_cross_origin) : message(in_message), reason(in_reason), url(in_url), status(in_status), is_cross_origin(in_is_cross_origin) {} AppCacheErrorDetails::~AppCacheErrorDetails() {} Namespace::Namespace() : type(APPCACHE_FALLBACK_NAMESPACE), is_pattern(false), is_executable(false) { } Namespace::Namespace( AppCacheNamespaceType type, const GURL& url, const GURL& target, bool is_pattern) : type(type), namespace_url(url), target_url(target), is_pattern(is_pattern), is_executable(false) { } Namespace::Namespace( AppCacheNamespaceType type, const GURL& url, const GURL& target, bool is_pattern, bool is_executable) : type(type), namespace_url(url), target_url(target), is_pattern(is_pattern), is_executable(is_executable) { } Namespace::~Namespace() { } bool Namespace::IsMatch(const GURL& url) const { if (is_pattern) { // We have to escape '?' characters since MatchPattern also treats those // as wildcards which we don't want here, we only do '*'s. std::string pattern = namespace_url.spec(); if (namespace_url.has_query()) ReplaceSubstringsAfterOffset(&pattern, 0, "?", "\\?"); return MatchPattern(url.spec(), pattern); } return StartsWithASCII(url.spec(), namespace_url.spec(), true); } bool IsSchemeSupported(const GURL& url) { bool supported = url.SchemeIs(kHttpScheme) || url.SchemeIs(kHttpsScheme) || url.SchemeIs(kDevToolsScheme); #ifndef NDEBUG // TODO(michaeln): It would be really nice if this could optionally work for // file and filesystem urls too to help web developers experiment and test // their apps, perhaps enabled via a cmd line flag or some other developer // tool setting. Unfortunately file scheme net::URLRequests don't produce the // same signalling (200 response codes, headers) as http URLRequests, so this // doesn't work just yet. // supported |= url.SchemeIsFile(); #endif return supported; } bool IsMethodSupported(const std::string& method) { return (method == kHttpGETMethod) || (method == kHttpHEADMethod); } bool IsSchemeAndMethodSupported(const net::URLRequest* request) { return IsSchemeSupported(request->url()) && IsMethodSupported(request->method()); } } // namespace appcache