| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/extensions/external_pref_loader.h" | 5 #include "chrome/browser/extensions/external_pref_loader.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/file_util.h" | 8 #include "base/file_util.h" |
| 9 #include "base/files/file_enumerator.h" | 9 #include "base/files/file_enumerator.h" |
| 10 #include "base/files/file_path.h" | 10 #include "base/files/file_path.h" |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 60 } while (true); | 60 } while (true); |
| 61 | 61 |
| 62 return external_extension_paths; | 62 return external_extension_paths; |
| 63 } | 63 } |
| 64 | 64 |
| 65 // Extracts extension information from a json file serialized by |serializer|. | 65 // Extracts extension information from a json file serialized by |serializer|. |
| 66 // |path| is only used for informational purposes (outputted when an error | 66 // |path| is only used for informational purposes (outputted when an error |
| 67 // occurs). An empty dictionary is returned in case of failure (e.g. invalid | 67 // occurs). An empty dictionary is returned in case of failure (e.g. invalid |
| 68 // path or json content). | 68 // path or json content). |
| 69 // Caller takes ownership of the returned dictionary. | 69 // Caller takes ownership of the returned dictionary. |
| 70 DictionaryValue* ExtractExtensionPrefs(base::ValueSerializer* serializer, | 70 base::DictionaryValue* ExtractExtensionPrefs(base::ValueSerializer* serializer, |
| 71 const base::FilePath& path) { | 71 const base::FilePath& path) { |
| 72 std::string error_msg; | 72 std::string error_msg; |
| 73 Value* extensions = serializer->Deserialize(NULL, &error_msg); | 73 base::Value* extensions = serializer->Deserialize(NULL, &error_msg); |
| 74 if (!extensions) { | 74 if (!extensions) { |
| 75 LOG(WARNING) << "Unable to deserialize json data: " << error_msg | 75 LOG(WARNING) << "Unable to deserialize json data: " << error_msg |
| 76 << " in file " << path.value() << "."; | 76 << " in file " << path.value() << "."; |
| 77 return new DictionaryValue; | 77 return new base::DictionaryValue; |
| 78 } | 78 } |
| 79 | 79 |
| 80 DictionaryValue* ext_dictionary = NULL; | 80 base::DictionaryValue* ext_dictionary = NULL; |
| 81 if (extensions->GetAsDictionary(&ext_dictionary)) | 81 if (extensions->GetAsDictionary(&ext_dictionary)) |
| 82 return ext_dictionary; | 82 return ext_dictionary; |
| 83 | 83 |
| 84 LOG(WARNING) << "Expected a JSON dictionary in file " | 84 LOG(WARNING) << "Expected a JSON dictionary in file " |
| 85 << path.value() << "."; | 85 << path.value() << "."; |
| 86 return new DictionaryValue; | 86 return new base::DictionaryValue; |
| 87 } | 87 } |
| 88 | 88 |
| 89 } // namespace | 89 } // namespace |
| 90 | 90 |
| 91 namespace extensions { | 91 namespace extensions { |
| 92 | 92 |
| 93 ExternalPrefLoader::ExternalPrefLoader(int base_path_id, Options options) | 93 ExternalPrefLoader::ExternalPrefLoader(int base_path_id, Options options) |
| 94 : base_path_id_(base_path_id), options_(options) { | 94 : base_path_id_(base_path_id), options_(options) { |
| 95 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 95 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 96 } | 96 } |
| 97 | 97 |
| 98 const base::FilePath ExternalPrefLoader::GetBaseCrxFilePath() { | 98 const base::FilePath ExternalPrefLoader::GetBaseCrxFilePath() { |
| 99 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 99 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 100 | 100 |
| 101 // |base_path_| was set in LoadOnFileThread(). | 101 // |base_path_| was set in LoadOnFileThread(). |
| 102 return base_path_; | 102 return base_path_; |
| 103 } | 103 } |
| 104 | 104 |
| 105 void ExternalPrefLoader::StartLoading() { | 105 void ExternalPrefLoader::StartLoading() { |
| 106 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 106 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 107 BrowserThread::PostTask( | 107 BrowserThread::PostTask( |
| 108 BrowserThread::FILE, FROM_HERE, | 108 BrowserThread::FILE, FROM_HERE, |
| 109 base::Bind(&ExternalPrefLoader::LoadOnFileThread, this)); | 109 base::Bind(&ExternalPrefLoader::LoadOnFileThread, this)); |
| 110 } | 110 } |
| 111 | 111 |
| 112 void ExternalPrefLoader::LoadOnFileThread() { | 112 void ExternalPrefLoader::LoadOnFileThread() { |
| 113 CHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); | 113 CHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); |
| 114 | 114 |
| 115 scoped_ptr<DictionaryValue> prefs(new DictionaryValue); | 115 scoped_ptr<base::DictionaryValue> prefs(new base::DictionaryValue); |
| 116 | 116 |
| 117 // TODO(skerner): Some values of base_path_id_ will cause | 117 // TODO(skerner): Some values of base_path_id_ will cause |
| 118 // PathService::Get() to return false, because the path does | 118 // PathService::Get() to return false, because the path does |
| 119 // not exist. Find and fix the build/install scripts so that | 119 // not exist. Find and fix the build/install scripts so that |
| 120 // this can become a CHECK(). Known examples include chrome | 120 // this can become a CHECK(). Known examples include chrome |
| 121 // OS developer builds and linux install packages. | 121 // OS developer builds and linux install packages. |
| 122 // Tracked as crbug.com/70402 . | 122 // Tracked as crbug.com/70402 . |
| 123 if (PathService::Get(base_path_id_, &base_path_)) { | 123 if (PathService::Get(base_path_id_, &base_path_)) { |
| 124 ReadExternalExtensionPrefFile(prefs.get()); | 124 ReadExternalExtensionPrefFile(prefs.get()); |
| 125 | 125 |
| (...skipping 17 matching lines...) Expand all Loading... |
| 143 // read at least one .json file. If so, then we should have | 143 // read at least one .json file. If so, then we should have |
| 144 // set |base_path_|. | 144 // set |base_path_|. |
| 145 if (!prefs_->empty()) | 145 if (!prefs_->empty()) |
| 146 CHECK(!base_path_.empty()); | 146 CHECK(!base_path_.empty()); |
| 147 | 147 |
| 148 BrowserThread::PostTask( | 148 BrowserThread::PostTask( |
| 149 BrowserThread::UI, FROM_HERE, | 149 BrowserThread::UI, FROM_HERE, |
| 150 base::Bind(&ExternalPrefLoader::LoadFinished, this)); | 150 base::Bind(&ExternalPrefLoader::LoadFinished, this)); |
| 151 } | 151 } |
| 152 | 152 |
| 153 void ExternalPrefLoader::ReadExternalExtensionPrefFile(DictionaryValue* prefs) { | 153 void ExternalPrefLoader::ReadExternalExtensionPrefFile( |
| 154 base::DictionaryValue* prefs) { |
| 154 CHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); | 155 CHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); |
| 155 CHECK(NULL != prefs); | 156 CHECK(NULL != prefs); |
| 156 | 157 |
| 157 base::FilePath json_file = base_path_.Append(kExternalExtensionJson); | 158 base::FilePath json_file = base_path_.Append(kExternalExtensionJson); |
| 158 | 159 |
| 159 if (!base::PathExists(json_file)) { | 160 if (!base::PathExists(json_file)) { |
| 160 // This is not an error. The file does not exist by default. | 161 // This is not an error. The file does not exist by default. |
| 161 return; | 162 return; |
| 162 } | 163 } |
| 163 | 164 |
| (...skipping 10 matching lines...) Expand all Loading... |
| 174 } | 175 } |
| 175 #else | 176 #else |
| 176 // The only platform that uses this check is Mac OS. If you add one, | 177 // The only platform that uses this check is Mac OS. If you add one, |
| 177 // you need to implement file_util::VerifyPathControlledByAdmin() for | 178 // you need to implement file_util::VerifyPathControlledByAdmin() for |
| 178 // that platform. | 179 // that platform. |
| 179 NOTREACHED(); | 180 NOTREACHED(); |
| 180 #endif // defined(OS_MACOSX) | 181 #endif // defined(OS_MACOSX) |
| 181 } | 182 } |
| 182 | 183 |
| 183 JSONFileValueSerializer serializer(json_file); | 184 JSONFileValueSerializer serializer(json_file); |
| 184 scoped_ptr<DictionaryValue> ext_prefs( | 185 scoped_ptr<base::DictionaryValue> ext_prefs( |
| 185 ExtractExtensionPrefs(&serializer, json_file)); | 186 ExtractExtensionPrefs(&serializer, json_file)); |
| 186 if (ext_prefs) | 187 if (ext_prefs) |
| 187 prefs->MergeDictionary(ext_prefs.get()); | 188 prefs->MergeDictionary(ext_prefs.get()); |
| 188 } | 189 } |
| 189 | 190 |
| 190 void ExternalPrefLoader::ReadStandaloneExtensionPrefFiles( | 191 void ExternalPrefLoader::ReadStandaloneExtensionPrefFiles( |
| 191 DictionaryValue* prefs) { | 192 base::DictionaryValue* prefs) { |
| 192 CHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); | 193 CHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); |
| 193 CHECK(NULL != prefs); | 194 CHECK(NULL != prefs); |
| 194 | 195 |
| 195 // First list the potential .json candidates. | 196 // First list the potential .json candidates. |
| 196 std::set<base::FilePath> | 197 std::set<base::FilePath> |
| 197 candidates = GetPrefsCandidateFilesFromFolder(base_path_); | 198 candidates = GetPrefsCandidateFilesFromFolder(base_path_); |
| 198 if (candidates.empty()) { | 199 if (candidates.empty()) { |
| 199 DVLOG(1) << "Extension candidates list empty"; | 200 DVLOG(1) << "Extension candidates list empty"; |
| 200 return; | 201 return; |
| 201 } | 202 } |
| (...skipping 10 matching lines...) Expand all Loading... |
| 212 WideToASCII( | 213 WideToASCII( |
| 213 extension_candidate_path.RemoveExtension().BaseName().value()); | 214 extension_candidate_path.RemoveExtension().BaseName().value()); |
| 214 #elif defined(OS_POSIX) | 215 #elif defined(OS_POSIX) |
| 215 extension_candidate_path.RemoveExtension().BaseName().value().c_str(); | 216 extension_candidate_path.RemoveExtension().BaseName().value().c_str(); |
| 216 #endif | 217 #endif |
| 217 | 218 |
| 218 DVLOG(1) << "Reading json file: " | 219 DVLOG(1) << "Reading json file: " |
| 219 << extension_candidate_path.LossyDisplayName().c_str(); | 220 << extension_candidate_path.LossyDisplayName().c_str(); |
| 220 | 221 |
| 221 JSONFileValueSerializer serializer(extension_candidate_path); | 222 JSONFileValueSerializer serializer(extension_candidate_path); |
| 222 scoped_ptr<DictionaryValue> ext_prefs( | 223 scoped_ptr<base::DictionaryValue> ext_prefs( |
| 223 ExtractExtensionPrefs(&serializer, extension_candidate_path)); | 224 ExtractExtensionPrefs(&serializer, extension_candidate_path)); |
| 224 if (ext_prefs) { | 225 if (ext_prefs) { |
| 225 DVLOG(1) << "Adding extension with id: " << id; | 226 DVLOG(1) << "Adding extension with id: " << id; |
| 226 prefs->Set(id, ext_prefs.release()); | 227 prefs->Set(id, ext_prefs.release()); |
| 227 } | 228 } |
| 228 } | 229 } |
| 229 } | 230 } |
| 230 | 231 |
| 231 ExternalTestingLoader::ExternalTestingLoader( | 232 ExternalTestingLoader::ExternalTestingLoader( |
| 232 const std::string& json_data, | 233 const std::string& json_data, |
| (...skipping 11 matching lines...) Expand all Loading... |
| 244 LoadFinished(); | 245 LoadFinished(); |
| 245 } | 246 } |
| 246 | 247 |
| 247 ExternalTestingLoader::~ExternalTestingLoader() {} | 248 ExternalTestingLoader::~ExternalTestingLoader() {} |
| 248 | 249 |
| 249 const base::FilePath ExternalTestingLoader::GetBaseCrxFilePath() { | 250 const base::FilePath ExternalTestingLoader::GetBaseCrxFilePath() { |
| 250 return fake_base_path_; | 251 return fake_base_path_; |
| 251 } | 252 } |
| 252 | 253 |
| 253 } // extensions | 254 } // extensions |
| OLD | NEW |