| OLD | NEW |
| 1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2006-2008 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/extension.h" | 5 #include "chrome/browser/extensions/extension.h" |
| 6 | 6 |
| 7 #include "base/file_path.h" | 7 #include "base/file_path.h" |
| 8 #include "base/logging.h" | 8 #include "base/logging.h" |
| 9 #include "base/string_util.h" | 9 #include "base/string_util.h" |
| 10 #include "net/base/net_util.h" | 10 #include "net/base/net_util.h" |
| 11 #include "chrome/common/extensions/user_script.h" | 11 #include "chrome/common/extensions/user_script.h" |
| 12 #include "chrome/common/resource_bundle.h" |
| 12 #include "chrome/common/url_constants.h" | 13 #include "chrome/common/url_constants.h" |
| 13 | 14 |
| 14 const char Extension::kManifestFilename[] = "manifest.json"; | 15 const char Extension::kManifestFilename[] = "manifest.json"; |
| 15 | 16 |
| 16 const wchar_t* Extension::kContentScriptsKey = L"content_scripts"; | 17 const wchar_t* Extension::kContentScriptsKey = L"content_scripts"; |
| 17 const wchar_t* Extension::kDescriptionKey = L"description"; | 18 const wchar_t* Extension::kDescriptionKey = L"description"; |
| 18 const wchar_t* Extension::kFormatVersionKey = L"format_version"; | 19 const wchar_t* Extension::kFormatVersionKey = L"format_version"; |
| 19 const wchar_t* Extension::kIdKey = L"id"; | 20 const wchar_t* Extension::kIdKey = L"id"; |
| 20 const wchar_t* Extension::kJsKey = L"js"; | 21 const wchar_t* Extension::kJsKey = L"js"; |
| 21 const wchar_t* Extension::kMatchesKey = L"matches"; | 22 const wchar_t* Extension::kMatchesKey = L"matches"; |
| 22 const wchar_t* Extension::kNameKey = L"name"; | 23 const wchar_t* Extension::kNameKey = L"name"; |
| 23 const wchar_t* Extension::kRunAtKey = L"run_at"; | 24 const wchar_t* Extension::kRunAtKey = L"run_at"; |
| 24 const wchar_t* Extension::kVersionKey = L"version"; | 25 const wchar_t* Extension::kVersionKey = L"version"; |
| 25 const wchar_t* Extension::kZipHashKey = L"zip_hash"; | 26 const wchar_t* Extension::kZipHashKey = L"zip_hash"; |
| 26 const wchar_t* Extension::kPluginsDirKey = L"plugins_dir"; | 27 const wchar_t* Extension::kPluginsDirKey = L"plugins_dir"; |
| 28 const wchar_t* Extension::kThemeKey = L"theme"; |
| 27 | 29 |
| 28 const char* Extension::kRunAtDocumentStartValue = "document_start"; | 30 const char* Extension::kRunAtDocumentStartValue = "document_start"; |
| 29 const char* Extension::kRunAtDocumentEndValue = "document_end"; | 31 const char* Extension::kRunAtDocumentEndValue = "document_end"; |
| 30 | 32 |
| 31 // Extension-related error messages. Some of these are simple patterns, where a | 33 // Extension-related error messages. Some of these are simple patterns, where a |
| 32 // '*' is replaced at runtime with a specific value. This is used instead of | 34 // '*' is replaced at runtime with a specific value. This is used instead of |
| 33 // printf because we want to unit test them and scanf is hard to make | 35 // printf because we want to unit test them and scanf is hard to make |
| 34 // cross-platform. | 36 // cross-platform. |
| 35 const char* Extension::kInvalidContentScriptError = | 37 const char* Extension::kInvalidContentScriptError = |
| 36 "Invalid value for 'content_scripts[*]'."; | 38 "Invalid value for 'content_scripts[*]'."; |
| (...skipping 27 matching lines...) Expand all Loading... |
| 64 "Invalid value for 'content_scripts[*].run_at'."; | 66 "Invalid value for 'content_scripts[*].run_at'."; |
| 65 const char* Extension::kInvalidVersionError = | 67 const char* Extension::kInvalidVersionError = |
| 66 "Required value 'version' is missing or invalid."; | 68 "Required value 'version' is missing or invalid."; |
| 67 const char* Extension::kInvalidZipHashError = | 69 const char* Extension::kInvalidZipHashError = |
| 68 "Required key 'zip_hash' is missing or invalid."; | 70 "Required key 'zip_hash' is missing or invalid."; |
| 69 const char* Extension::kInvalidPluginsDirError = | 71 const char* Extension::kInvalidPluginsDirError = |
| 70 "Invalid value for 'plugins_dir'."; | 72 "Invalid value for 'plugins_dir'."; |
| 71 | 73 |
| 72 const size_t Extension::kIdSize = 20; // SHA1 (160 bits) == 20 bytes | 74 const size_t Extension::kIdSize = 20; // SHA1 (160 bits) == 20 bytes |
| 73 | 75 |
| 76 Extension::Extension(const Extension& rhs) : |
| 77 path_(rhs.path_), |
| 78 extension_url_(rhs.extension_url_), |
| 79 id_(rhs.id_), |
| 80 version_(new Version(*rhs.version_)), |
| 81 name_(rhs.name_), |
| 82 description_(rhs.description_), |
| 83 content_scripts_(rhs.content_scripts_), |
| 84 plugins_dir_(rhs.plugins_dir_), |
| 85 zip_hash_(rhs.zip_hash_), |
| 86 theme_paths_(rhs.theme_paths_) { |
| 87 } |
| 88 |
| 74 const std::string Extension::VersionString() const { | 89 const std::string Extension::VersionString() const { |
| 75 return version_->GetString(); | 90 return version_->GetString(); |
| 76 } | 91 } |
| 77 | 92 |
| 78 // static | 93 // static |
| 79 GURL Extension::GetResourceURL(const GURL& extension_url, | 94 GURL Extension::GetResourceURL(const GURL& extension_url, |
| 80 const std::string& relative_path) { | 95 const std::string& relative_path) { |
| 81 DCHECK(extension_url.SchemeIs(chrome::kExtensionScheme)); | 96 DCHECK(extension_url.SchemeIs(chrome::kExtensionScheme)); |
| 82 DCHECK(extension_url.path() == "/"); | 97 DCHECK(extension_url.path() == "/"); |
| 83 | 98 |
| 84 GURL ret_val = GURL(extension_url.spec() + relative_path); | 99 GURL ret_val = GURL(extension_url.spec() + relative_path); |
| 85 DCHECK(StartsWithASCII(ret_val.spec(), extension_url.spec(), false)); | 100 DCHECK(StartsWithASCII(ret_val.spec(), extension_url.spec(), false)); |
| 86 | 101 |
| 87 return ret_val; | 102 return ret_val; |
| 88 } | 103 } |
| 89 | 104 |
| 105 FilePath Extension::GetThemeResourcePath(const int resource_id) { |
| 106 std::wstring id = IntToWString(resource_id); |
| 107 std::string path = theme_paths_[id]; |
| 108 if (path.size()) |
| 109 return path_.AppendASCII(path.c_str()); |
| 110 return FilePath(); |
| 111 } |
| 112 |
| 90 // static | 113 // static |
| 91 FilePath Extension::GetResourcePath(const FilePath& extension_path, | 114 FilePath Extension::GetResourcePath(const FilePath& extension_path, |
| 92 const std::string& relative_path) { | 115 const std::string& relative_path) { |
| 93 // Build up a file:// URL and convert that back to a FilePath. This avoids | 116 // Build up a file:// URL and convert that back to a FilePath. This avoids |
| 94 // URL encoding and path separator issues. | 117 // URL encoding and path separator issues. |
| 95 | 118 |
| 96 // Convert the extension's root to a file:// URL. | 119 // Convert the extension's root to a file:// URL. |
| 97 GURL extension_url = net::FilePathToFileURL(extension_path); | 120 GURL extension_url = net::FilePathToFileURL(extension_path); |
| 98 if (!extension_url.is_valid()) | 121 if (!extension_url.is_valid()) |
| 99 return FilePath(); | 122 return FilePath(); |
| (...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 230 // Initialize plugins dir (optional). | 253 // Initialize plugins dir (optional). |
| 231 if (source.HasKey(kPluginsDirKey)) { | 254 if (source.HasKey(kPluginsDirKey)) { |
| 232 std::string plugins_dir; | 255 std::string plugins_dir; |
| 233 if (!source.GetString(kPluginsDirKey, &plugins_dir)) { | 256 if (!source.GetString(kPluginsDirKey, &plugins_dir)) { |
| 234 *error = kInvalidPluginsDirError; | 257 *error = kInvalidPluginsDirError; |
| 235 return false; | 258 return false; |
| 236 } | 259 } |
| 237 plugins_dir_ = path_.AppendASCII(plugins_dir); | 260 plugins_dir_ = path_.AppendASCII(plugins_dir); |
| 238 } | 261 } |
| 239 | 262 |
| 263 if (source.HasKey(kThemeKey)) { |
| 264 DictionaryValue* dict_value; |
| 265 if (source.GetDictionary(kThemeKey, &dict_value)) { |
| 266 DictionaryValue::key_iterator iter = dict_value->begin_keys(); |
| 267 while (iter != dict_value->end_keys()) { |
| 268 std::string val; |
| 269 if (dict_value->GetString(*iter, &val)) { |
| 270 std::wstring id = *iter; |
| 271 theme_paths_[id] = val; |
| 272 } |
| 273 ++iter; |
| 274 } |
| 275 ResourceBundle::GetSharedInstance().SetThemeExtension(*this); |
| 276 } |
| 277 } |
| 278 |
| 240 // Initialize content scripts (optional). | 279 // Initialize content scripts (optional). |
| 241 if (source.HasKey(kContentScriptsKey)) { | 280 if (source.HasKey(kContentScriptsKey)) { |
| 242 ListValue* list_value; | 281 ListValue* list_value; |
| 243 if (!source.GetList(kContentScriptsKey, &list_value)) { | 282 if (!source.GetList(kContentScriptsKey, &list_value)) { |
| 244 *error = kInvalidContentScriptsListError; | 283 *error = kInvalidContentScriptsListError; |
| 245 return false; | 284 return false; |
| 246 } | 285 } |
| 247 | 286 |
| 248 for (size_t i = 0; i < list_value->GetSize(); ++i) { | 287 for (size_t i = 0; i < list_value->GetSize(); ++i) { |
| 249 DictionaryValue* content_script; | 288 DictionaryValue* content_script; |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 322 script.set_path(Extension::GetResourcePath(path(), file)); | 361 script.set_path(Extension::GetResourcePath(path(), file)); |
| 323 script.set_url(Extension::GetResourceURL(url(), file)); | 362 script.set_url(Extension::GetResourceURL(url(), file)); |
| 324 | 363 |
| 325 content_scripts_.push_back(script); | 364 content_scripts_.push_back(script); |
| 326 } | 365 } |
| 327 } | 366 } |
| 328 | 367 |
| 329 return true; | 368 return true; |
| 330 } | 369 } |
| 331 | 370 |
| OLD | NEW |