Index: chrome/browser/extensions/extension_service_unittest.cc |
diff --git a/chrome/browser/extensions/extension_service_unittest.cc b/chrome/browser/extensions/extension_service_unittest.cc |
index 06851bb336f771dca2726eb47103d987710c3a26..0a0e52049ac64daf366fe58d1b1ba7d0deb84834 100644 |
--- a/chrome/browser/extensions/extension_service_unittest.cc |
+++ b/chrome/browser/extensions/extension_service_unittest.cc |
@@ -209,14 +209,20 @@ class MockExtensionProvider : public ExternalExtensionProviderInterface { |
class MockProviderVisitor |
: public ExternalExtensionProviderInterface::VisitorInterface { |
public: |
- MockProviderVisitor() : ids_found_(0) { |
+ |
+ // The provider will return |fake_base_path| from |
+ // GetBaseCrxFilePath(). User can test the behavior with |
+ // and without an empty path using this parameter. |
+ explicit MockProviderVisitor(FilePath fake_base_path) |
+ : ids_found_(0), |
+ fake_base_path_(fake_base_path) { |
} |
int Visit(const std::string& json_data) { |
// Give the test json file to the provider for parsing. |
provider_.reset(new ExternalExtensionProviderImpl( |
this, |
- new ExternalTestingExtensionLoader(json_data), |
+ new ExternalTestingExtensionLoader(json_data, fake_base_path_), |
Extension::EXTERNAL_PREF, |
Extension::EXTERNAL_PREF_DOWNLOAD)); |
@@ -254,6 +260,10 @@ class MockProviderVisitor |
EXPECT_TRUE(prefs_->GetDictionary(id, &pref)) |
<< "Got back ID (" << id.c_str() << ") we weren't expecting"; |
+ EXPECT_TRUE(path.IsAbsolute()); |
+ if (!fake_base_path_.empty()) |
+ EXPECT_TRUE(fake_base_path_.IsParent(path)); |
+ |
if (pref) { |
EXPECT_TRUE(provider_->HasExtension(id)); |
@@ -309,7 +319,7 @@ class MockProviderVisitor |
private: |
int ids_found_; |
- |
+ FilePath fake_base_path_; |
scoped_ptr<ExternalExtensionProviderImpl> provider_; |
scoped_ptr<DictionaryValue> prefs_; |
@@ -3004,9 +3014,16 @@ TEST_F(ExtensionServiceTest, ExternalUninstall) { |
TEST_F(ExtensionServiceTest, ExternalPrefProvider) { |
InitializeEmptyExtensionService(); |
+ |
+ // Test some valid extension records. |
+ // Set a base path to avoid erroring out on relative paths. |
+ // Paths starting with // are absolute on every platform we support. |
+ FilePath base_path(FILE_PATH_LITERAL("//base/path")); |
+ ASSERT_TRUE(base_path.IsAbsolute()); |
+ MockProviderVisitor visitor(base_path); |
std::string json_data = |
"{" |
- " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\": {" |
+ " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\": {" |
" \"external_crx\": \"RandomExtension.crx\"," |
" \"external_version\": \"1.0\"" |
" }," |
@@ -3018,11 +3035,10 @@ TEST_F(ExtensionServiceTest, ExternalPrefProvider) { |
" \"external_update_url\": \"http:\\\\foo.com/update\"" |
" }" |
"}"; |
- |
- MockProviderVisitor visitor; |
+ EXPECT_EQ(3, visitor.Visit(json_data)); |
// Simulate an external_extensions.json file that contains seven invalid |
- // extensions: |
+ // records: |
// - One that is missing the 'external_crx' key. |
// - One that is missing the 'external_version' key. |
// - One that is specifying .. in the path. |
@@ -3068,6 +3084,35 @@ TEST_F(ExtensionServiceTest, ExternalPrefProvider) { |
" }" |
"}"; |
EXPECT_EQ(1, visitor.Visit(json_data)); |
+ |
+ // Check that if a base path is not provided, use of a relative |
+ // path fails. |
+ FilePath empty; |
+ MockProviderVisitor visitor_no_relative_paths(empty); |
+ |
+ // Use absolute paths. Expect success. |
+ json_data = |
+ "{" |
+ " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\": {" |
+ " \"external_crx\": \"//RandomExtension1.crx\"," |
+ " \"external_version\": \"3.0\"" |
+ " }," |
+ " \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\": {" |
+ " \"external_crx\": \"//path/to/RandomExtension2.crx\"," |
+ " \"external_version\": \"3.0\"" |
+ " }" |
+ "}"; |
+ EXPECT_EQ(2, visitor_no_relative_paths.Visit(json_data)); |
+ |
+ // Use a relative path. Expect that it will error out. |
+ json_data = |
+ "{" |
+ " \"cccccccccccccccccccccccccccccccc\": {" |
+ " \"external_crx\": \"RandomExtension2.crx\"," |
+ " \"external_version\": \"3.0\"" |
+ " }" |
+ "}"; |
+ EXPECT_EQ(0, visitor_no_relative_paths.Visit(json_data)); |
} |
// Test loading good extensions from the profile directory. |