OLD | NEW |
1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2009 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/common/extensions/extension.h" | 5 #include "chrome/common/extensions/extension.h" |
6 | 6 |
7 #include "app/resource_bundle.h" | 7 #include "app/resource_bundle.h" |
8 #include "base/basictypes.h" | 8 #include "base/basictypes.h" |
9 #include "base/file_path.h" | 9 #include "base/file_path.h" |
10 #include "base/file_util.h" | 10 #include "base/file_util.h" |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
48 | 48 |
49 int Extension::id_counter_ = 0; | 49 int Extension::id_counter_ = 0; |
50 | 50 |
51 const char Extension::kManifestFilename[] = "manifest.json"; | 51 const char Extension::kManifestFilename[] = "manifest.json"; |
52 | 52 |
53 const wchar_t* Extension::kBackgroundKey = L"background_page"; | 53 const wchar_t* Extension::kBackgroundKey = L"background_page"; |
54 const wchar_t* Extension::kContentScriptsKey = L"content_scripts"; | 54 const wchar_t* Extension::kContentScriptsKey = L"content_scripts"; |
55 const wchar_t* Extension::kCssKey = L"css"; | 55 const wchar_t* Extension::kCssKey = L"css"; |
56 const wchar_t* Extension::kDescriptionKey = L"description"; | 56 const wchar_t* Extension::kDescriptionKey = L"description"; |
57 const wchar_t* Extension::kIconPathKey = L"icon"; | 57 const wchar_t* Extension::kIconPathKey = L"icon"; |
| 58 const wchar_t* Extension::kIconPathsKey = L"icons"; |
58 const wchar_t* Extension::kJsKey = L"js"; | 59 const wchar_t* Extension::kJsKey = L"js"; |
59 const wchar_t* Extension::kMatchesKey = L"matches"; | 60 const wchar_t* Extension::kMatchesKey = L"matches"; |
60 const wchar_t* Extension::kNameKey = L"name"; | 61 const wchar_t* Extension::kNameKey = L"name"; |
61 const wchar_t* Extension::kPageActionIdKey = L"id"; | 62 const wchar_t* Extension::kPageActionIdKey = L"id"; |
62 const wchar_t* Extension::kPageActionsKey = L"page_actions"; | 63 const wchar_t* Extension::kPageActionsKey = L"page_actions"; |
63 const wchar_t* Extension::kPermissionsKey = L"permissions"; | 64 const wchar_t* Extension::kPermissionsKey = L"permissions"; |
64 const wchar_t* Extension::kPluginsKey = L"plugins"; | 65 const wchar_t* Extension::kPluginsKey = L"plugins"; |
65 const wchar_t* Extension::kPluginsPathKey = L"path"; | 66 const wchar_t* Extension::kPluginsPathKey = L"path"; |
66 const wchar_t* Extension::kPluginsPublicKey = L"public"; | 67 const wchar_t* Extension::kPluginsPublicKey = L"public"; |
67 const wchar_t* Extension::kPublicKeyKey = L"key"; | 68 const wchar_t* Extension::kPublicKeyKey = L"key"; |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
119 "Invalid value for 'content_scripts[*].matches. There must be at least one " | 120 "Invalid value for 'content_scripts[*].matches. There must be at least one " |
120 "match specified."; | 121 "match specified."; |
121 const char* Extension::kInvalidMatchError = | 122 const char* Extension::kInvalidMatchError = |
122 "Invalid value for 'content_scripts[*].matches[*]'."; | 123 "Invalid value for 'content_scripts[*].matches[*]'."; |
123 const char* Extension::kInvalidMatchesError = | 124 const char* Extension::kInvalidMatchesError = |
124 "Required value 'content_scripts[*].matches' is missing or invalid."; | 125 "Required value 'content_scripts[*].matches' is missing or invalid."; |
125 const char* Extension::kInvalidNameError = | 126 const char* Extension::kInvalidNameError = |
126 "Required value 'name' is missing or invalid."; | 127 "Required value 'name' is missing or invalid."; |
127 const char* Extension::kInvalidPageActionError = | 128 const char* Extension::kInvalidPageActionError = |
128 "Invalid value for 'page_actions[*]'."; | 129 "Invalid value for 'page_actions[*]'."; |
| 130 const char* Extension::kInvalidPageActionIconPathError = |
| 131 "Invalid value for 'page_actions[*].icons[*]'."; |
129 const char* Extension::kInvalidPageActionsListError = | 132 const char* Extension::kInvalidPageActionsListError = |
130 "Invalid value for 'page_actions'."; | 133 "Invalid value for 'page_actions'."; |
131 const char* Extension::kInvalidPageActionIconPathError = | 134 const char* Extension::kInvalidPageActionIconPathsError = |
132 "Invalid value for 'page_actions[*].icon'."; | 135 "Required value 'page_actions[*].icons' is missing or invalid."; |
133 const char* Extension::kInvalidPageActionIdError = | 136 const char* Extension::kInvalidPageActionIdError = |
134 "Required value 'id' is missing or invalid."; | 137 "Required value 'id' is missing or invalid."; |
135 const char* Extension::kInvalidPageActionTypeValueError = | 138 const char* Extension::kInvalidPageActionTypeValueError = |
136 "Invalid value for 'page_actions[*].type', expected 'tab' or 'permanent'."; | 139 "Invalid value for 'page_actions[*].type', expected 'tab' or 'permanent'."; |
137 const char* Extension::kInvalidPermissionsError = | 140 const char* Extension::kInvalidPermissionsError = |
138 "Required value 'permissions' is missing or invalid."; | 141 "Required value 'permissions' is missing or invalid."; |
139 const char* Extension::kInvalidPermissionCountWarning = | 142 const char* Extension::kInvalidPermissionCountWarning = |
140 "Warning, 'permissions' key found, but array is empty."; | 143 "Warning, 'permissions' key found, but array is empty."; |
141 const char* Extension::kInvalidPermissionError = | 144 const char* Extension::kInvalidPermissionError = |
142 "Invalid value for 'permissions[*]'."; | 145 "Invalid value for 'permissions[*]'."; |
(...skipping 248 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
391 } | 394 } |
392 | 395 |
393 // Helper method that loads a PageAction object from a dictionary in the | 396 // Helper method that loads a PageAction object from a dictionary in the |
394 // page_action list of the manifest. | 397 // page_action list of the manifest. |
395 PageAction* Extension::LoadPageActionHelper( | 398 PageAction* Extension::LoadPageActionHelper( |
396 const DictionaryValue* page_action, int definition_index, | 399 const DictionaryValue* page_action, int definition_index, |
397 std::string* error) { | 400 std::string* error) { |
398 scoped_ptr<PageAction> result(new PageAction()); | 401 scoped_ptr<PageAction> result(new PageAction()); |
399 result->set_extension_id(id()); | 402 result->set_extension_id(id()); |
400 | 403 |
401 // Read the page action |icon|. | 404 ListValue* icons; |
402 std::string icon; | 405 // Read the page action |icons|. |
403 if (!page_action->GetString(kIconPathKey, &icon)) { | 406 if (!page_action->HasKey(kIconPathsKey) || |
| 407 !page_action->GetList(kIconPathsKey, &icons) || |
| 408 icons->GetSize() == 0) { |
404 *error = ExtensionErrorUtils::FormatErrorMessage( | 409 *error = ExtensionErrorUtils::FormatErrorMessage( |
405 kInvalidPageActionIconPathError, IntToString(definition_index)); | 410 kInvalidPageActionIconPathsError, IntToString(definition_index)); |
406 return NULL; | 411 return NULL; |
407 } | 412 } |
408 FilePath icon_path = path_.AppendASCII(icon); | 413 |
409 result->set_icon_path(icon_path); | 414 int icon_count = 0; |
| 415 for (ListValue::const_iterator iter = icons->begin(); |
| 416 iter != icons->end(); ++iter) { |
| 417 FilePath::StringType path; |
| 418 if (!(*iter)->GetAsString(&path) || path.empty()) { |
| 419 *error = ExtensionErrorUtils::FormatErrorMessage( |
| 420 kInvalidPageActionIconPathError, |
| 421 IntToString(definition_index), IntToString(icon_count)); |
| 422 return NULL; |
| 423 } |
| 424 |
| 425 FilePath icon_path = path_.Append(path); |
| 426 result->AddIconPath(icon_path); |
| 427 ++icon_count; |
| 428 } |
410 | 429 |
411 // Read the page action |id|. | 430 // Read the page action |id|. |
412 std::string id; | 431 std::string id; |
413 if (!page_action->GetString(kPageActionIdKey, &id)) { | 432 if (!page_action->GetString(kPageActionIdKey, &id)) { |
414 *error = ExtensionErrorUtils::FormatErrorMessage(kInvalidPageActionIdError, | 433 *error = ExtensionErrorUtils::FormatErrorMessage(kInvalidPageActionIdError, |
415 IntToString(definition_index)); | 434 IntToString(definition_index)); |
416 return NULL; | 435 return NULL; |
417 } | 436 } |
418 result->set_id(id); | 437 result->set_id(id); |
419 | 438 |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
497 return FilePath(); | 516 return FilePath(); |
498 | 517 |
499 // Double-check that the path we ended up with is actually inside the | 518 // Double-check that the path we ended up with is actually inside the |
500 // extension root. | 519 // extension root. |
501 if (!extension_path.IsParent(ret_val)) | 520 if (!extension_path.IsParent(ret_val)) |
502 return FilePath(); | 521 return FilePath(); |
503 | 522 |
504 return ret_val; | 523 return ret_val; |
505 } | 524 } |
506 | 525 |
507 Extension::Extension(const FilePath& path) { | 526 Extension::Extension(const FilePath& path) : is_theme_(false) { |
508 DCHECK(path.IsAbsolute()); | 527 DCHECK(path.IsAbsolute()); |
509 location_ = INVALID; | 528 location_ = INVALID; |
510 | 529 |
511 #if defined(OS_WIN) | 530 #if defined(OS_WIN) |
512 // Normalize any drive letter to upper-case. We do this for consistency with | 531 // Normalize any drive letter to upper-case. We do this for consistency with |
513 // net_utils::FilePathToFileURL(), which does the same thing, to make string | 532 // net_utils::FilePathToFileURL(), which does the same thing, to make string |
514 // comparisons simpler. | 533 // comparisons simpler. |
515 std::wstring path_str = path.value(); | 534 std::wstring path_str = path.value(); |
516 if (path_str.size() >= 2 && path_str[0] >= L'a' && path_str[0] <= L'z' && | 535 if (path_str.size() >= 2 && path_str[0] >= L'a' && path_str[0] <= L'z' && |
517 path_str[1] == ':') | 536 path_str[1] == ':') |
(...skipping 414 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
932 it != theme_images->end_keys(); ++it) { | 951 it != theme_images->end_keys(); ++it) { |
933 std::wstring val; | 952 std::wstring val; |
934 if (theme_images->GetString(*it, &val)) { | 953 if (theme_images->GetString(*it, &val)) { |
935 image_paths.insert(FilePath::FromWStringHack(val)); | 954 image_paths.insert(FilePath::FromWStringHack(val)); |
936 } | 955 } |
937 } | 956 } |
938 } | 957 } |
939 | 958 |
940 for (PageActionMap::const_iterator it = page_actions().begin(); | 959 for (PageActionMap::const_iterator it = page_actions().begin(); |
941 it != page_actions().end(); ++it) { | 960 it != page_actions().end(); ++it) { |
942 image_paths.insert(it->second->icon_path()); | 961 const std::vector<FilePath>& icon_paths = it->second->icon_paths(); |
| 962 for (std::vector<FilePath>::const_iterator iter = icon_paths.begin(); |
| 963 iter != icon_paths.end(); ++iter) { |
| 964 image_paths.insert(*iter); |
| 965 } |
943 } | 966 } |
944 | 967 |
945 return image_paths; | 968 return image_paths; |
946 } | 969 } |
OLD | NEW |