Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(390)

Unified Diff: chrome/browser/extensions/extension_content_settings_helpers.cc

Issue 7229012: Use extension match pattern syntax in content settings extension API (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: initialize port Created 9 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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) {

Powered by Google App Engine
This is Rietveld 408576698