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/common/extensions/extension.h" | 5 #include "chrome/common/extensions/extension.h" |
6 | 6 |
7 #include <ostream> | 7 #include <ostream> |
8 | 8 |
9 #include "base/base64.h" | 9 #include "base/base64.h" |
10 #include "base/basictypes.h" | 10 #include "base/basictypes.h" |
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
126 if (base::HexStringToInt(base::StringPiece(id->begin() + i, | 126 if (base::HexStringToInt(base::StringPiece(id->begin() + i, |
127 id->begin() + i + 1), | 127 id->begin() + i + 1), |
128 &val)) { | 128 &val)) { |
129 (*id)[i] = val + 'a'; | 129 (*id)[i] = val + 'a'; |
130 } else { | 130 } else { |
131 (*id)[i] = 'a'; | 131 (*id)[i] = 'a'; |
132 } | 132 } |
133 } | 133 } |
134 } | 134 } |
135 | 135 |
136 bool LoadIconsFromDictionary(const DictionaryValue* icons_value, | |
Jeffrey Yasskin
2012/09/01 03:54:33
Comment what meaning you intend this function to h
tbarzic
2012/09/05 01:05:29
Done.
| |
137 const int* icon_sizes, | |
138 size_t num_icon_sizes, | |
139 ExtensionIconSet* icons, | |
140 string16* error) { | |
141 DCHECK(icons); | |
142 for (size_t i = 0; i < num_icon_sizes; ++i) { | |
143 std::string key = base::IntToString(icon_sizes[i]); | |
144 if (icons_value->HasKey(key)) { | |
145 std::string icon_path; | |
146 if (!icons_value->GetString(key, &icon_path)) { | |
147 *error = ExtensionErrorUtils::FormatErrorMessageUTF16( | |
148 errors::kInvalidIconPath, key); | |
149 return false; | |
150 } | |
151 | |
152 if (!icon_path.empty() && icon_path[0] == '/') | |
153 icon_path = icon_path.substr(1); | |
Jeffrey Yasskin
2012/09/01 03:54:33
This is odd. What are you trying to do? Should you
tbarzic
2012/09/05 01:05:29
this isn't my code (I just moved it here), but it
| |
154 | |
155 if (icon_path.empty()) { | |
156 *error = ExtensionErrorUtils::FormatErrorMessageUTF16( | |
157 errors::kInvalidIconPath, key); | |
158 return false; | |
159 } | |
160 icons->Add(icon_sizes[i], icon_path); | |
161 } | |
162 } | |
163 return true; | |
164 } | |
165 | |
136 // A singleton object containing global data needed by the extension objects. | 166 // A singleton object containing global data needed by the extension objects. |
137 class ExtensionConfig { | 167 class ExtensionConfig { |
138 public: | 168 public: |
139 static ExtensionConfig* GetInstance() { | 169 static ExtensionConfig* GetInstance() { |
140 return Singleton<ExtensionConfig>::get(); | 170 return Singleton<ExtensionConfig>::get(); |
141 } | 171 } |
142 | 172 |
143 Extension::ScriptingWhitelist* whitelist() { return &scripting_whitelist_; } | 173 Extension::ScriptingWhitelist* whitelist() { return &scripting_whitelist_; } |
144 | 174 |
145 private: | 175 private: |
(...skipping 675 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
821 if (extension_action->HasKey(keys::kPageActionIcons) && | 851 if (extension_action->HasKey(keys::kPageActionIcons) && |
822 extension_action->GetList(keys::kPageActionIcons, &icons)) { | 852 extension_action->GetList(keys::kPageActionIcons, &icons)) { |
823 for (ListValue::const_iterator iter = icons->begin(); | 853 for (ListValue::const_iterator iter = icons->begin(); |
824 iter != icons->end(); ++iter) { | 854 iter != icons->end(); ++iter) { |
825 std::string path; | 855 std::string path; |
826 if (!(*iter)->GetAsString(&path) || path.empty()) { | 856 if (!(*iter)->GetAsString(&path) || path.empty()) { |
827 *error = ASCIIToUTF16(errors::kInvalidPageActionIconPath); | 857 *error = ASCIIToUTF16(errors::kInvalidPageActionIconPath); |
828 return scoped_ptr<ExtensionAction>(); | 858 return scoped_ptr<ExtensionAction>(); |
829 } | 859 } |
830 | 860 |
831 result->icon_paths()->push_back(path); | 861 scoped_ptr<ExtensionIconSet> icon_set(new ExtensionIconSet); |
862 icon_set->Add(extension_misc::EXTENSION_ICON_ACTION, path); | |
863 result->AddPageActionIcon(icon_set.release()); | |
832 } | 864 } |
833 } | 865 } |
834 | 866 |
835 std::string id; | 867 std::string id; |
836 if (extension_action->HasKey(keys::kPageActionId)) { | 868 if (extension_action->HasKey(keys::kPageActionId)) { |
837 if (!extension_action->GetString(keys::kPageActionId, &id)) { | 869 if (!extension_action->GetString(keys::kPageActionId, &id)) { |
838 *error = ASCIIToUTF16(errors::kInvalidPageActionId); | 870 *error = ASCIIToUTF16(errors::kInvalidPageActionId); |
839 return scoped_ptr<ExtensionAction>(); | 871 return scoped_ptr<ExtensionAction>(); |
840 } | 872 } |
841 result->set_id(id); | 873 result->set_id(id); |
842 } | 874 } |
843 } | 875 } |
844 | 876 |
845 std::string default_icon; | 877 if (extension_action->HasKey(keys::kPageActionDefaultIconSet)) { |
Jeffrey Yasskin
2012/09/01 03:54:33
Right, I think detecting the type of "default_icon
tbarzic
2012/09/05 01:05:29
Done.
| |
846 // Read the page action |default_icon| (optional). | 878 const DictionaryValue* icons_value = NULL; |
847 if (extension_action->HasKey(keys::kPageActionDefaultIcon)) { | 879 if (!extension_action->GetDictionary(keys::kPageActionDefaultIconSet, |
880 &icons_value)) { | |
881 *error = ASCIIToUTF16(errors::kInvalidIcons); | |
882 return scoped_ptr<ExtensionAction>(); | |
883 } | |
884 | |
885 scoped_ptr<ExtensionIconSet> default_icons(new ExtensionIconSet()); | |
886 if (!LoadIconsFromDictionary(icons_value, | |
887 extension_misc::kExtensionActionIconSizes, | |
888 extension_misc::kNumExtensionActionIconSizes, | |
889 default_icons.get(), | |
890 error)) { | |
891 return scoped_ptr<ExtensionAction>(); | |
892 } | |
893 | |
894 result->set_default_icon(default_icons.release()); | |
895 } else if (extension_action->HasKey(keys::kPageActionDefaultIcon)) { | |
896 // Read the page action |default_icon| (optional). | |
897 std::string default_icon; | |
848 if (!extension_action->GetString(keys::kPageActionDefaultIcon, | 898 if (!extension_action->GetString(keys::kPageActionDefaultIcon, |
849 &default_icon) || | 899 &default_icon) || |
850 default_icon.empty()) { | 900 default_icon.empty()) { |
851 *error = ASCIIToUTF16(errors::kInvalidPageActionIconPath); | 901 *error = ASCIIToUTF16(errors::kInvalidPageActionIconPath); |
852 return scoped_ptr<ExtensionAction>(); | 902 return scoped_ptr<ExtensionAction>(); |
853 } | 903 } |
854 result->set_default_icon_path(default_icon); | 904 scoped_ptr<ExtensionIconSet> icon_set(new ExtensionIconSet); |
905 icon_set->Add(extension_misc::EXTENSION_ICON_ACTION, default_icon); | |
906 result->set_default_icon(icon_set.release()); | |
855 } | 907 } |
856 | 908 |
857 // Read the page action title from |default_title| if present, |name| if not | 909 // Read the page action title from |default_title| if present, |name| if not |
858 // (both optional). | 910 // (both optional). |
859 std::string title; | 911 std::string title; |
860 if (extension_action->HasKey(keys::kPageActionDefaultTitle)) { | 912 if (extension_action->HasKey(keys::kPageActionDefaultTitle)) { |
861 if (!extension_action->GetString(keys::kPageActionDefaultTitle, &title)) { | 913 if (!extension_action->GetString(keys::kPageActionDefaultTitle, &title)) { |
862 *error = ASCIIToUTF16(errors::kInvalidPageActionDefaultTitle); | 914 *error = ASCIIToUTF16(errors::kInvalidPageActionDefaultTitle); |
863 return scoped_ptr<ExtensionAction>(); | 915 return scoped_ptr<ExtensionAction>(); |
864 } | 916 } |
(...skipping 551 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1416 | 1468 |
1417 bool Extension::LoadIcons(string16* error) { | 1469 bool Extension::LoadIcons(string16* error) { |
1418 if (!manifest_->HasKey(keys::kIcons)) | 1470 if (!manifest_->HasKey(keys::kIcons)) |
1419 return true; | 1471 return true; |
1420 DictionaryValue* icons_value = NULL; | 1472 DictionaryValue* icons_value = NULL; |
1421 if (!manifest_->GetDictionary(keys::kIcons, &icons_value)) { | 1473 if (!manifest_->GetDictionary(keys::kIcons, &icons_value)) { |
1422 *error = ASCIIToUTF16(errors::kInvalidIcons); | 1474 *error = ASCIIToUTF16(errors::kInvalidIcons); |
1423 return false; | 1475 return false; |
1424 } | 1476 } |
1425 | 1477 |
1426 for (size_t i = 0; i < extension_misc::kNumExtensionIconSizes; ++i) { | 1478 return LoadIconsFromDictionary(icons_value, |
1427 std::string key = | 1479 extension_misc::kExtensionIconSizes, |
1428 base::IntToString(extension_misc::kExtensionIconSizes[i]); | 1480 extension_misc::kNumExtensionIconSizes, |
1429 if (icons_value->HasKey(key)) { | 1481 &icons_, |
1430 std::string icon_path; | 1482 error); |
1431 if (!icons_value->GetString(key, &icon_path)) { | |
1432 *error = ExtensionErrorUtils::FormatErrorMessageUTF16( | |
1433 errors::kInvalidIconPath, key); | |
1434 return false; | |
1435 } | |
1436 | |
1437 if (!icon_path.empty() && icon_path[0] == '/') | |
1438 icon_path = icon_path.substr(1); | |
1439 | |
1440 if (icon_path.empty()) { | |
1441 *error = ExtensionErrorUtils::FormatErrorMessageUTF16( | |
1442 errors::kInvalidIconPath, key); | |
1443 return false; | |
1444 } | |
1445 icons_.Add(extension_misc::kExtensionIconSizes[i], icon_path); | |
1446 } | |
1447 } | |
1448 return true; | |
1449 } | 1483 } |
1450 | 1484 |
1451 bool Extension::LoadCommands(string16* error) { | 1485 bool Extension::LoadCommands(string16* error) { |
1452 if (manifest_->HasKey(keys::kCommands)) { | 1486 if (manifest_->HasKey(keys::kCommands)) { |
1453 DictionaryValue* commands = NULL; | 1487 DictionaryValue* commands = NULL; |
1454 if (!manifest_->GetDictionary(keys::kCommands, &commands)) { | 1488 if (!manifest_->GetDictionary(keys::kCommands, &commands)) { |
1455 *error = ASCIIToUTF16(errors::kInvalidCommandsKey); | 1489 *error = ASCIIToUTF16(errors::kInvalidCommandsKey); |
1456 return false; | 1490 return false; |
1457 } | 1491 } |
1458 | 1492 |
(...skipping 903 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2362 // that matches the icon of a trusted extension, and users wouldn't be warned | 2396 // that matches the icon of a trusted extension, and users wouldn't be warned |
2363 // during installation. | 2397 // during installation. |
2364 | 2398 |
2365 if (!script_badge_->GetTitle(ExtensionAction::kDefaultTabId).empty()) { | 2399 if (!script_badge_->GetTitle(ExtensionAction::kDefaultTabId).empty()) { |
2366 install_warnings_.push_back( | 2400 install_warnings_.push_back( |
2367 InstallWarning(InstallWarning::FORMAT_TEXT, | 2401 InstallWarning(InstallWarning::FORMAT_TEXT, |
2368 errors::kScriptBadgeTitleIgnored)); | 2402 errors::kScriptBadgeTitleIgnored)); |
2369 } | 2403 } |
2370 script_badge_->SetTitle(ExtensionAction::kDefaultTabId, name()); | 2404 script_badge_->SetTitle(ExtensionAction::kDefaultTabId, name()); |
2371 | 2405 |
2372 if (!script_badge_->default_icon_path().empty()) { | 2406 if (script_badge_->default_icon()) { |
2373 install_warnings_.push_back( | 2407 install_warnings_.push_back( |
2374 InstallWarning(InstallWarning::FORMAT_TEXT, | 2408 InstallWarning(InstallWarning::FORMAT_TEXT, |
2375 errors::kScriptBadgeIconIgnored)); | 2409 errors::kScriptBadgeIconIgnored)); |
2376 } | 2410 } |
2377 std::string icon16_path = icons().Get(extension_misc::EXTENSION_ICON_BITTY, | 2411 |
2378 ExtensionIconSet::MATCH_EXACTLY); | 2412 scoped_ptr<ExtensionIconSet> icon_set(new ExtensionIconSet); |
2379 if (!icon16_path.empty()) { | 2413 |
2380 script_badge_->set_default_icon_path(icon16_path); | 2414 for (size_t i = 0; i < extension_misc::kNumScriptBadgeIconSizes; i++) { |
2415 std::string path = icons().Get(extension_misc::kScriptBadgeIconSizes[i], | |
2416 ExtensionIconSet::MATCH_EXACTLY); | |
2417 if (!path.empty()) { | |
2418 icon_set->Add(extension_misc::kScriptBadgeIconSizes[i], path); | |
2419 } | |
2420 } | |
2421 | |
2422 if (!icon_set->map().empty()) { | |
2423 script_badge_->set_default_icon(icon_set.release()); | |
2381 } else { | 2424 } else { |
2382 script_badge_->SetIcon( | 2425 script_badge_->set_default_icon(NULL); |
2383 ExtensionAction::kDefaultTabId, | |
2384 ui::ResourceBundle::GetSharedInstance().GetImageNamed( | |
2385 IDR_EXTENSIONS_FAVICON)); | |
2386 } | 2426 } |
2387 | 2427 |
2388 return true; | 2428 return true; |
2389 } | 2429 } |
2390 | 2430 |
2391 bool Extension::LoadFileBrowserHandlers(string16* error) { | 2431 bool Extension::LoadFileBrowserHandlers(string16* error) { |
2392 if (!manifest_->HasKey(keys::kFileBrowserHandlers)) | 2432 if (!manifest_->HasKey(keys::kFileBrowserHandlers)) |
2393 return true; | 2433 return true; |
2394 ListValue* file_browser_handlers_value = NULL; | 2434 ListValue* file_browser_handlers_value = NULL; |
2395 if (!manifest_->GetList(keys::kFileBrowserHandlers, | 2435 if (!manifest_->GetList(keys::kFileBrowserHandlers, |
(...skipping 811 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
3207 for (DictionaryValue::key_iterator it = theme_images->begin_keys(); | 3247 for (DictionaryValue::key_iterator it = theme_images->begin_keys(); |
3208 it != theme_images->end_keys(); ++it) { | 3248 it != theme_images->end_keys(); ++it) { |
3209 std::string val; | 3249 std::string val; |
3210 if (theme_images->GetStringWithoutPathExpansion(*it, &val)) | 3250 if (theme_images->GetStringWithoutPathExpansion(*it, &val)) |
3211 image_paths.insert(FilePath::FromWStringHack(UTF8ToWide(val))); | 3251 image_paths.insert(FilePath::FromWStringHack(UTF8ToWide(val))); |
3212 } | 3252 } |
3213 } | 3253 } |
3214 | 3254 |
3215 // Page action icons. | 3255 // Page action icons. |
3216 if (page_action()) { | 3256 if (page_action()) { |
3217 std::vector<std::string>* icon_paths = page_action()->icon_paths(); | 3257 const std::vector<const ExtensionIconSet*>& page_action_icons = |
3218 for (std::vector<std::string>::iterator iter = icon_paths->begin(); | 3258 page_action()->page_action_icons(); |
3219 iter != icon_paths->end(); ++iter) { | 3259 for (size_t icon = 0; icon < page_action_icons.size(); icon++) { |
3220 image_paths.insert(FilePath::FromWStringHack(UTF8ToWide(*iter))); | 3260 for (ExtensionIconSet::IconMap::const_iterator iter = |
3261 page_action_icons[icon]->map().begin(); | |
3262 iter != page_action_icons[icon]->map().end(); | |
3263 ++iter) { | |
3264 image_paths.insert(FilePath::FromWStringHack(UTF8ToWide(iter->second))); | |
3265 } | |
3221 } | 3266 } |
3222 } | 3267 } |
3223 | 3268 |
3224 // Browser action icons. | 3269 // Browser action icons. |
3225 if (browser_action()) { | 3270 if (browser_action()) { |
3226 std::vector<std::string>* icon_paths = browser_action()->icon_paths(); | 3271 const std::vector<const ExtensionIconSet*>& page_action_icons = |
3227 for (std::vector<std::string>::iterator iter = icon_paths->begin(); | 3272 browser_action()->page_action_icons(); |
3228 iter != icon_paths->end(); ++iter) { | 3273 for (size_t icon = 0; icon < page_action_icons.size(); icon++) { |
3229 image_paths.insert(FilePath::FromWStringHack(UTF8ToWide(*iter))); | 3274 for (ExtensionIconSet::IconMap::const_iterator iter = |
3275 page_action_icons[icon]->map().begin(); | |
3276 iter != page_action_icons[icon]->map().end(); | |
3277 ++iter) { | |
3278 image_paths.insert(FilePath::FromWStringHack(UTF8ToWide(iter->second))); | |
3279 } | |
3230 } | 3280 } |
3231 } | 3281 } |
3232 | 3282 |
3233 return image_paths; | 3283 return image_paths; |
3234 } | 3284 } |
3235 | 3285 |
3236 GURL Extension::GetFullLaunchURL() const { | 3286 GURL Extension::GetFullLaunchURL() const { |
3237 if (!launch_local_path().empty()) | 3287 if (!launch_local_path().empty()) |
3238 return url().Resolve(launch_local_path()); | 3288 return url().Resolve(launch_local_path()); |
3239 else | 3289 else |
(...skipping 709 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
3949 | 3999 |
3950 UpdatedExtensionPermissionsInfo::UpdatedExtensionPermissionsInfo( | 4000 UpdatedExtensionPermissionsInfo::UpdatedExtensionPermissionsInfo( |
3951 const Extension* extension, | 4001 const Extension* extension, |
3952 const PermissionSet* permissions, | 4002 const PermissionSet* permissions, |
3953 Reason reason) | 4003 Reason reason) |
3954 : reason(reason), | 4004 : reason(reason), |
3955 extension(extension), | 4005 extension(extension), |
3956 permissions(permissions) {} | 4006 permissions(permissions) {} |
3957 | 4007 |
3958 } // namespace extensions | 4008 } // namespace extensions |
OLD | NEW |