Index: chrome/browser/extensions/extension_content_settings_helpers.cc |
diff --git a/chrome/browser/extensions/extension_content_settings_helpers.cc b/chrome/browser/extensions/extension_content_settings_helpers.cc |
index c250e7b1553d329f50adf3dc0f05b9cd46f5531e..bb249559ed50eb05f9ca0bc19e9537200d7c5571 100644 |
--- a/chrome/browser/extensions/extension_content_settings_helpers.cc |
+++ b/chrome/browser/extensions/extension_content_settings_helpers.cc |
@@ -6,9 +6,17 @@ |
#include "base/basictypes.h" |
#include "base/logging.h" |
+#include "base/scoped_ptr.h" |
+#include "chrome/common/extensions/url_pattern.h" |
+#include "content/common/url_constants.h" |
namespace { |
+const char kNoPathWildcardsError[] = |
+ "Path wildcards in file URL patterns are not allowed."; |
+const char kNoPathsError[] = "Specific paths are not allowed."; |
+const char kInvalidPatternError[] = "The pattern \"*\" is invalid."; |
+ |
const char* const kContentSettingsTypeNames[] = { |
"cookies", |
"images", |
@@ -33,10 +41,77 @@ COMPILE_ASSERT(arraysize(kContentSettingNames) <= |
CONTENT_SETTING_NUM_SETTINGS, |
content_setting_names_size_invalid); |
+// TODO(bauerb): Move this someplace where it can be reused. |
+std::string GetDefaultPort(const std::string& scheme) { |
+ if (scheme == chrome::kHttpScheme) |
+ return "80"; |
+ if (scheme == chrome::kHttpsScheme) |
+ return "443"; |
+ NOTREACHED(); |
+ return ""; |
+} |
+ |
} // namespace |
namespace extension_content_settings_helpers { |
+ContentSettingsPattern ParseExtensionPattern(const std::string& pattern_str, |
+ std::string* error) { |
+ URLPattern url_pattern(URLPattern::SCHEME_HTTP | |
+ URLPattern::SCHEME_HTTPS | |
+ URLPattern::SCHEME_FILE); |
+ URLPattern::ParseResult result = |
+ url_pattern.Parse(pattern_str, URLPattern::USE_PORTS); |
+ if (result != URLPattern::PARSE_SUCCESS) { |
+ *error = URLPattern::GetParseResultString(result); |
+ return ContentSettingsPattern(); |
+ } else { |
+ scoped_ptr<ContentSettingsPattern::BuilderInterface> builder( |
+ ContentSettingsPattern::CreateBuilder(false)); |
+ builder->WithHost(url_pattern.host()); |
+ if (url_pattern.match_subdomains()) |
+ builder->WithDomainWildcard(); |
+ |
+ std::string scheme = url_pattern.scheme(); |
+ if (scheme == "*") |
+ builder->WithSchemeWildcard(); |
+ else |
+ builder->WithScheme(scheme); |
+ |
+ std::string port = url_pattern.port(); |
+ if (port.empty() && scheme != "file") { |
+ if (scheme == "*") |
+ port = "*"; |
+ else |
+ port = GetDefaultPort(scheme); |
+ } |
+ if (port == "*") |
+ builder->WithPortWildcard(); |
+ else |
+ builder->WithPort(port); |
+ |
+ std::string path = url_pattern.path(); |
+ if (scheme == "file") { |
+ // For file URLs we allow only exact path matches. |
+ if (path.find_first_of("*?") != std::string::npos) { |
+ *error = kNoPathWildcardsError; |
+ return ContentSettingsPattern(); |
+ } else { |
+ builder->WithPath(path); |
+ } |
+ } else if (path != "/*") { |
+ // For other URLs we allow only paths which match everything. |
+ *error = kNoPathsError; |
+ return ContentSettingsPattern(); |
+ } |
+ |
+ ContentSettingsPattern pattern = builder->Build(); |
+ if (!pattern.IsValid()) |
+ *error = kInvalidPatternError; |
+ return pattern; |
+ } |
+} |
+ |
ContentSettingsType StringToContentSettingsType( |
const std::string& content_type) { |
for (size_t type = 0; type < arraysize(kContentSettingsTypeNames); ++type) { |