• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
13 namespace content {
14 
15 const char kHttpScheme[] = "http";
16 const char kHttpsScheme[] = "https";
17 const char kDevToolsScheme[] = "chrome-devtools";
18 const char kHttpGETMethod[] = "GET";
19 const char kHttpHEADMethod[] = "HEAD";
20 
21 const char kEnableExecutableHandlers[] = "enable-appcache-executable-handlers";
22 
23 const base::FilePath::CharType kAppCacheDatabaseName[] =
24     FILE_PATH_LITERAL("Index");
25 
AppCacheInfo()26 AppCacheInfo::AppCacheInfo()
27     : cache_id(kAppCacheNoCacheId),
28       group_id(0),
29       status(APPCACHE_STATUS_UNCACHED),
30       size(0),
31       is_complete(false) {
32 }
33 
~AppCacheInfo()34 AppCacheInfo::~AppCacheInfo() {
35 }
36 
AppCacheResourceInfo()37 AppCacheResourceInfo::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 
~AppCacheResourceInfo()49 AppCacheResourceInfo::~AppCacheResourceInfo() {
50 }
51 
AppCacheErrorDetails()52 AppCacheErrorDetails::AppCacheErrorDetails()
53     : message(),
54       reason(APPCACHE_UNKNOWN_ERROR),
55       url(),
56       status(0),
57       is_cross_origin(false) {}
58 
AppCacheErrorDetails(std::string in_message,AppCacheErrorReason in_reason,GURL in_url,int in_status,bool in_is_cross_origin)59 AppCacheErrorDetails::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 
~AppCacheErrorDetails()71 AppCacheErrorDetails::~AppCacheErrorDetails() {}
72 
AppCacheNamespace()73 AppCacheNamespace::AppCacheNamespace()
74     : type(APPCACHE_FALLBACK_NAMESPACE),
75       is_pattern(false),
76       is_executable(false) {
77 }
78 
AppCacheNamespace(AppCacheNamespaceType type,const GURL & url,const GURL & target,bool is_pattern)79 AppCacheNamespace::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 
AppCacheNamespace(AppCacheNamespaceType type,const GURL & url,const GURL & target,bool is_pattern,bool is_executable)89 AppCacheNamespace::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 
~AppCacheNamespace()99 AppCacheNamespace::~AppCacheNamespace() {
100 }
101 
IsMatch(const GURL & url) const102 bool 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 
IsSchemeSupportedForAppCache(const GURL & url)114 bool 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 
IsMethodSupportedForAppCache(const std::string & method)130 bool IsMethodSupportedForAppCache(const std::string& method) {
131   return (method == kHttpGETMethod) || (method == kHttpHEADMethod);
132 }
133 
IsSchemeAndMethodSupportedForAppCache(const net::URLRequest * request)134 bool IsSchemeAndMethodSupportedForAppCache(const net::URLRequest* request) {
135   return IsSchemeSupportedForAppCache(request->url()) &&
136          IsMethodSupportedForAppCache(request->method());
137 }
138 
139 }  // namespace content
140