diff options
-rw-r--r-- | chromium/extensions/browser/content_verifier.cc | 13 | ||||
-rw-r--r-- | chromium/extensions/browser/content_verifier.h | 4 | ||||
-rw-r--r-- | chromium/extensions/browser/content_verifier_unittest.cc | 21 |
3 files changed, 36 insertions, 2 deletions
diff --git a/chromium/extensions/browser/content_verifier.cc b/chromium/extensions/browser/content_verifier.cc index 6d87b26ef42..f2d4f660cba 100644 --- a/chromium/extensions/browser/content_verifier.cc +++ b/chromium/extensions/browser/content_verifier.cc @@ -59,8 +59,12 @@ base::FilePath NormalizeRelativePath(const base::FilePath& path) { // Note that elsewhere we always normalize path separators to '/' so this // should work for all platforms. - return base::FilePath( - base::JoinString(parts, base::FilePath::StringType(1, '/'))); + base::FilePath::StringType normalized_relative_path = + base::JoinString(parts, base::FilePath::StringType(1, '/')); + // Preserve trailing separator, if present. + if (path.EndsWithSeparator()) + normalized_relative_path.append(1, '/'); + return base::FilePath(normalized_relative_path); } bool HasScriptFileExt(const base::FilePath& requested_path) { @@ -751,4 +755,9 @@ void ContentVerifier::ResetIODataForTesting(const Extension* extension) { io_data_->AddData(extension->id(), CreateIOData(extension, delegate_.get())); } +base::FilePath ContentVerifier::NormalizeRelativePathForTesting( + const base::FilePath& path) { + return NormalizeRelativePath(path); +} + } // namespace extensions diff --git a/chromium/extensions/browser/content_verifier.h b/chromium/extensions/browser/content_verifier.h index 24410bdd2e2..8780385de04 100644 --- a/chromium/extensions/browser/content_verifier.h +++ b/chromium/extensions/browser/content_verifier.h @@ -102,6 +102,10 @@ class ContentVerifier : public base::RefCountedThreadSafe<ContentVerifier>, // call |OnExtensionLoaded|. void ResetIODataForTesting(const Extension* extension); + // Test helper to normalize relative path of file. + static base::FilePath NormalizeRelativePathForTesting( + const base::FilePath& path); + private: friend class ContentVerifierTest; friend class base::RefCountedThreadSafe<ContentVerifier>; diff --git a/chromium/extensions/browser/content_verifier_unittest.cc b/chromium/extensions/browser/content_verifier_unittest.cc index b1c28495dea..0ccfca5779e 100644 --- a/chromium/extensions/browser/content_verifier_unittest.cc +++ b/chromium/extensions/browser/content_verifier_unittest.cc @@ -9,6 +9,7 @@ #include "base/values.h" #include "content/public/test/test_browser_thread_bundle.h" #include "content/public/test/test_utils.h" +#include "extensions/browser/content_verifier.h" #include "extensions/browser/content_verifier/test_utils.h" #include "extensions/browser/extension_registry.h" #include "extensions/browser/extensions_test.h" @@ -215,4 +216,24 @@ INSTANTIATE_TEST_CASE_P( BackgroundManifestType::kBackgroundScript, BackgroundManifestType::kBackgroundPage)); +TEST(ContentVerifierTest, NormalizeRelativePath) { +// This macro helps avoid wrapped lines in the test structs. +#define FPL(x) FILE_PATH_LITERAL(x) + struct TestData { + base::FilePath::StringPieceType input; + base::FilePath::StringPieceType expected; + } test_cases[] = {{FPL("foo/bar"), FPL("foo/bar")}, + {FPL("foo//bar"), FPL("foo/bar")}, + {FPL("foo/bar/"), FPL("foo/bar/")}, + {FPL("foo/bar//"), FPL("foo/bar/")}, + {FPL("foo/options.html/"), FPL("foo/options.html/")}}; +#undef FPL + for (const auto& test_case : test_cases) { + base::FilePath input(test_case.input); + base::FilePath expected(test_case.expected); + EXPECT_EQ(expected, + ContentVerifier::NormalizeRelativePathForTesting(input)); + } +} + } // namespace extensions |