Index: chrome/common/extensions/extension.cc |
diff --git a/chrome/common/extensions/extension.cc b/chrome/common/extensions/extension.cc |
index ecf3d16338a5097749b3e7315a3a747e7167ba4a..d6b52f7a1f4ddfa0183bf86d24dff185b2217d69 100644 |
--- a/chrome/common/extensions/extension.cc |
+++ b/chrome/common/extensions/extension.cc |
@@ -2477,16 +2477,27 @@ FileBrowserHandler* Extension::LoadFileBrowserHandler( |
return NULL; |
} |
StringToLowerASCII(&filter); |
- URLPattern pattern(URLPattern::SCHEME_FILESYSTEM); |
+ if (!StartsWithASCII(filter, |
+ std::string(chrome::kFileSystemScheme) + ':', |
+ true)) { |
+ *error = ExtensionErrorUtils::FormatErrorMessageUTF16( |
+ errors::kInvalidURLPatternError, filter); |
+ return NULL; |
+ } |
+ // The user inputs filesystem:*; we don't actually implement scheme |
+ // wildcards in URLPattern, so transform to what will match correctly. |
+ filter.replace(0, 11, "chrome-extension://*/"); |
+ URLPattern pattern(URLPattern::SCHEME_EXTENSION); |
+ pattern.set_partial_filesystem_support_hack(true); |
if (pattern.Parse(filter) != URLPattern::PARSE_SUCCESS) { |
*error = ExtensionErrorUtils::FormatErrorMessageUTF16( |
errors::kInvalidURLPatternError, filter); |
return NULL; |
} |
std::string path = pattern.path(); |
- bool allowed = path == "*" || path == "*.*" || |
- (path.compare(0, 2, "*.") == 0 && |
- path.find_first_of('*', 2) == std::string::npos); |
+ bool allowed = path == "/*" || path == "/*.*" || |
+ (path.compare(0, 3, "/*.") == 0 && |
+ path.find_first_of('*', 3) == std::string::npos); |
if (!allowed) { |
*error = ExtensionErrorUtils::FormatErrorMessageUTF16( |
errors::kInvalidURLPatternError, filter); |