Chromium Code Reviews| 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 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 123 if (base::HexStringToInt(base::StringPiece(id->begin() + i, | 123 if (base::HexStringToInt(base::StringPiece(id->begin() + i, |
| 124 id->begin() + i + 1), | 124 id->begin() + i + 1), |
| 125 &val)) { | 125 &val)) { |
| 126 (*id)[i] = val + 'a'; | 126 (*id)[i] = val + 'a'; |
| 127 } else { | 127 } else { |
| 128 (*id)[i] = 'a'; | 128 (*id)[i] = 'a'; |
| 129 } | 129 } |
| 130 } | 130 } |
| 131 } | 131 } |
| 132 | 132 |
| 133 // Loads icon paths defined in dictionary |icons_value| into ExtensionIconSet | |
| 134 // |icons|. |icons_value| is a dictionary value {icon size -> icon path}. Icons | |
| 135 // in |icons_value| whose size is not in |icon_sizes| will be ignored. | |
| 136 // Returns success. If load fails, |error| will be set. | |
| 137 bool LoadIconsFromDictionary(const DictionaryValue* icons_value, | |
| 138 const int* icon_sizes, | |
| 139 size_t num_icon_sizes, | |
| 140 ExtensionIconSet* icons, | |
| 141 string16* error) { | |
| 142 DCHECK(icons); | |
| 143 for (size_t i = 0; i < num_icon_sizes; ++i) { | |
| 144 std::string key = base::IntToString(icon_sizes[i]); | |
| 145 if (icons_value->HasKey(key)) { | |
| 146 std::string icon_path; | |
| 147 if (!icons_value->GetString(key, &icon_path)) { | |
| 148 *error = ExtensionErrorUtils::FormatErrorMessageUTF16( | |
| 149 errors::kInvalidIconPath, key); | |
| 150 return false; | |
| 151 } | |
| 152 | |
| 153 if (!icon_path.empty() && icon_path[0] == '/') | |
| 154 icon_path = icon_path.substr(1); | |
| 155 | |
| 156 if (icon_path.empty()) { | |
| 157 *error = ExtensionErrorUtils::FormatErrorMessageUTF16( | |
| 158 errors::kInvalidIconPath, key); | |
| 159 return false; | |
| 160 } | |
| 161 icons->Add(icon_sizes[i], icon_path); | |
| 162 } | |
| 163 } | |
| 164 return true; | |
| 165 } | |
| 166 | |
| 133 // A singleton object containing global data needed by the extension objects. | 167 // A singleton object containing global data needed by the extension objects. |
| 134 class ExtensionConfig { | 168 class ExtensionConfig { |
| 135 public: | 169 public: |
| 136 static ExtensionConfig* GetInstance() { | 170 static ExtensionConfig* GetInstance() { |
| 137 return Singleton<ExtensionConfig>::get(); | 171 return Singleton<ExtensionConfig>::get(); |
| 138 } | 172 } |
| 139 | 173 |
| 140 Extension::ScriptingWhitelist* whitelist() { return &scripting_whitelist_; } | 174 Extension::ScriptingWhitelist* whitelist() { return &scripting_whitelist_; } |
| 141 | 175 |
| 142 private: | 176 private: |
| (...skipping 663 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 806 if (extension_action->HasKey(keys::kPageActionIcons) && | 840 if (extension_action->HasKey(keys::kPageActionIcons) && |
| 807 extension_action->GetList(keys::kPageActionIcons, &icons)) { | 841 extension_action->GetList(keys::kPageActionIcons, &icons)) { |
| 808 for (ListValue::const_iterator iter = icons->begin(); | 842 for (ListValue::const_iterator iter = icons->begin(); |
| 809 iter != icons->end(); ++iter) { | 843 iter != icons->end(); ++iter) { |
| 810 std::string path; | 844 std::string path; |
| 811 if (!(*iter)->GetAsString(&path) || path.empty()) { | 845 if (!(*iter)->GetAsString(&path) || path.empty()) { |
| 812 *error = ASCIIToUTF16(errors::kInvalidPageActionIconPath); | 846 *error = ASCIIToUTF16(errors::kInvalidPageActionIconPath); |
| 813 return scoped_ptr<ExtensionAction>(); | 847 return scoped_ptr<ExtensionAction>(); |
| 814 } | 848 } |
| 815 | 849 |
| 816 result->icon_paths()->push_back(path); | 850 scoped_ptr<ExtensionIconSet> icon_set(new ExtensionIconSet); |
| 851 icon_set->Add(extension_misc::EXTENSION_ICON_ACTION, path); | |
| 852 result->AddPageActionIcon(icon_set.Pass()); | |
| 817 } | 853 } |
| 818 } | 854 } |
| 819 | 855 |
| 820 std::string id; | 856 std::string id; |
| 821 if (extension_action->HasKey(keys::kPageActionId)) { | 857 if (extension_action->HasKey(keys::kPageActionId)) { |
| 822 if (!extension_action->GetString(keys::kPageActionId, &id)) { | 858 if (!extension_action->GetString(keys::kPageActionId, &id)) { |
| 823 *error = ASCIIToUTF16(errors::kInvalidPageActionId); | 859 *error = ASCIIToUTF16(errors::kInvalidPageActionId); |
| 824 return scoped_ptr<ExtensionAction>(); | 860 return scoped_ptr<ExtensionAction>(); |
| 825 } | 861 } |
| 826 result->set_id(id); | 862 result->set_id(id); |
| 827 } | 863 } |
| 828 } | 864 } |
| 829 | 865 |
| 830 std::string default_icon; | |
| 831 // Read the page action |default_icon| (optional). | 866 // Read the page action |default_icon| (optional). |
| 867 // The |default_icon| value can be either dictionary {icon size -> icon path} | |
| 868 // or non empty string value. | |
| 832 if (extension_action->HasKey(keys::kPageActionDefaultIcon)) { | 869 if (extension_action->HasKey(keys::kPageActionDefaultIcon)) { |
| 833 if (!extension_action->GetString(keys::kPageActionDefaultIcon, | 870 const DictionaryValue* icons_value = NULL; |
| 834 &default_icon) || | 871 std::string default_icon; |
| 835 default_icon.empty()) { | 872 if (extension_action->GetDictionary(keys::kPageActionDefaultIcon, |
| 873 &icons_value)) { | |
| 874 scoped_ptr<ExtensionIconSet> default_icons(new ExtensionIconSet()); | |
| 875 if (!LoadIconsFromDictionary(icons_value, | |
| 876 extension_misc::kExtensionActionIconSizes, | |
| 877 extension_misc::kNumExtensionActionIconSizes, | |
| 878 default_icons.get(), | |
| 879 error)) { | |
| 880 return scoped_ptr<ExtensionAction>(); | |
| 881 } | |
| 882 | |
| 883 result->set_default_icon(default_icons.Pass()); | |
| 884 } else if (extension_action->GetString(keys::kPageActionDefaultIcon, | |
| 885 &default_icon) && | |
| 886 !default_icon.empty()) { | |
| 887 scoped_ptr<ExtensionIconSet> icon_set(new ExtensionIconSet); | |
| 888 icon_set->Add(extension_misc::EXTENSION_ICON_ACTION, default_icon); | |
| 889 result->set_default_icon(icon_set.Pass()); | |
| 890 } else { | |
| 836 *error = ASCIIToUTF16(errors::kInvalidPageActionIconPath); | 891 *error = ASCIIToUTF16(errors::kInvalidPageActionIconPath); |
| 837 return scoped_ptr<ExtensionAction>(); | 892 return scoped_ptr<ExtensionAction>(); |
| 838 } | 893 } |
| 839 result->set_default_icon_path(default_icon); | |
| 840 } | 894 } |
| 841 | 895 |
| 842 // Read the page action title from |default_title| if present, |name| if not | 896 // Read the page action title from |default_title| if present, |name| if not |
| 843 // (both optional). | 897 // (both optional). |
| 844 std::string title; | 898 std::string title; |
| 845 if (extension_action->HasKey(keys::kPageActionDefaultTitle)) { | 899 if (extension_action->HasKey(keys::kPageActionDefaultTitle)) { |
| 846 if (!extension_action->GetString(keys::kPageActionDefaultTitle, &title)) { | 900 if (!extension_action->GetString(keys::kPageActionDefaultTitle, &title)) { |
| 847 *error = ASCIIToUTF16(errors::kInvalidPageActionDefaultTitle); | 901 *error = ASCIIToUTF16(errors::kInvalidPageActionDefaultTitle); |
| 848 return scoped_ptr<ExtensionAction>(); | 902 return scoped_ptr<ExtensionAction>(); |
| 849 } | 903 } |
| (...skipping 507 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1357 | 1411 |
| 1358 bool Extension::LoadIcons(string16* error) { | 1412 bool Extension::LoadIcons(string16* error) { |
| 1359 if (!manifest_->HasKey(keys::kIcons)) | 1413 if (!manifest_->HasKey(keys::kIcons)) |
| 1360 return true; | 1414 return true; |
| 1361 DictionaryValue* icons_value = NULL; | 1415 DictionaryValue* icons_value = NULL; |
| 1362 if (!manifest_->GetDictionary(keys::kIcons, &icons_value)) { | 1416 if (!manifest_->GetDictionary(keys::kIcons, &icons_value)) { |
| 1363 *error = ASCIIToUTF16(errors::kInvalidIcons); | 1417 *error = ASCIIToUTF16(errors::kInvalidIcons); |
| 1364 return false; | 1418 return false; |
| 1365 } | 1419 } |
| 1366 | 1420 |
| 1367 for (size_t i = 0; i < extension_misc::kNumExtensionIconSizes; ++i) { | 1421 return LoadIconsFromDictionary(icons_value, |
| 1368 std::string key = base::IntToString(extension_misc::kExtensionIconSizes[i]); | 1422 extension_misc::kExtensionIconSizes, |
| 1369 if (icons_value->HasKey(key)) { | 1423 extension_misc::kNumExtensionIconSizes, |
| 1370 std::string icon_path; | 1424 &icons_, |
| 1371 if (!icons_value->GetString(key, &icon_path)) { | 1425 error); |
| 1372 *error = ExtensionErrorUtils::FormatErrorMessageUTF16( | |
| 1373 errors::kInvalidIconPath, key); | |
| 1374 return false; | |
| 1375 } | |
| 1376 | |
| 1377 if (!icon_path.empty() && icon_path[0] == '/') | |
| 1378 icon_path = icon_path.substr(1); | |
| 1379 | |
| 1380 if (icon_path.empty()) { | |
| 1381 *error = ExtensionErrorUtils::FormatErrorMessageUTF16( | |
| 1382 errors::kInvalidIconPath, key); | |
| 1383 return false; | |
| 1384 } | |
| 1385 icons_.Add(extension_misc::kExtensionIconSizes[i], icon_path); | |
| 1386 } | |
| 1387 } | |
| 1388 return true; | |
| 1389 } | 1426 } |
| 1390 | 1427 |
| 1391 bool Extension::LoadCommands(string16* error) { | 1428 bool Extension::LoadCommands(string16* error) { |
| 1392 if (manifest_->HasKey(keys::kCommands)) { | 1429 if (manifest_->HasKey(keys::kCommands)) { |
| 1393 DictionaryValue* commands = NULL; | 1430 DictionaryValue* commands = NULL; |
| 1394 if (!manifest_->GetDictionary(keys::kCommands, &commands)) { | 1431 if (!manifest_->GetDictionary(keys::kCommands, &commands)) { |
| 1395 *error = ASCIIToUTF16(errors::kInvalidCommandsKey); | 1432 *error = ASCIIToUTF16(errors::kInvalidCommandsKey); |
| 1396 return false; | 1433 return false; |
| 1397 } | 1434 } |
| 1398 | 1435 |
| (...skipping 876 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2275 // that matches the icon of a trusted extension, and users wouldn't be warned | 2312 // that matches the icon of a trusted extension, and users wouldn't be warned |
| 2276 // during installation. | 2313 // during installation. |
| 2277 | 2314 |
| 2278 if (!script_badge_->GetTitle(ExtensionAction::kDefaultTabId).empty()) { | 2315 if (!script_badge_->GetTitle(ExtensionAction::kDefaultTabId).empty()) { |
| 2279 install_warnings_.push_back( | 2316 install_warnings_.push_back( |
| 2280 InstallWarning(InstallWarning::FORMAT_TEXT, | 2317 InstallWarning(InstallWarning::FORMAT_TEXT, |
| 2281 errors::kScriptBadgeTitleIgnored)); | 2318 errors::kScriptBadgeTitleIgnored)); |
| 2282 } | 2319 } |
| 2283 script_badge_->SetTitle(ExtensionAction::kDefaultTabId, name()); | 2320 script_badge_->SetTitle(ExtensionAction::kDefaultTabId, name()); |
| 2284 | 2321 |
| 2285 if (!script_badge_->default_icon_path().empty()) { | 2322 if (script_badge_->default_icon()) { |
| 2286 install_warnings_.push_back( | 2323 install_warnings_.push_back( |
| 2287 InstallWarning(InstallWarning::FORMAT_TEXT, | 2324 InstallWarning(InstallWarning::FORMAT_TEXT, |
| 2288 errors::kScriptBadgeIconIgnored)); | 2325 errors::kScriptBadgeIconIgnored)); |
| 2289 } | 2326 } |
| 2290 std::string icon16_path = icons().Get(extension_misc::EXTENSION_ICON_BITTY, | 2327 |
| 2291 ExtensionIconSet::MATCH_EXACTLY); | 2328 scoped_ptr<ExtensionIconSet> icon_set(new ExtensionIconSet); |
| 2292 if (!icon16_path.empty()) { | 2329 |
| 2293 script_badge_->set_default_icon_path(icon16_path); | 2330 for (size_t i = 0; i < extension_misc::kNumScriptBadgeIconSizes; i++) { |
| 2331 std::string path = icons().Get(extension_misc::kScriptBadgeIconSizes[i], | |
| 2332 ExtensionIconSet::MATCH_EXACTLY); | |
| 2333 if (!path.empty()) { | |
| 2334 icon_set->Add(extension_misc::kScriptBadgeIconSizes[i], path); | |
| 2335 } | |
| 2336 } | |
| 2337 | |
| 2338 if (!icon_set->map().empty()) { | |
| 2339 script_badge_->set_default_icon(icon_set.Pass()); | |
| 2294 } else { | 2340 } else { |
| 2295 script_badge_->SetIcon( | 2341 script_badge_->set_default_icon(scoped_ptr<ExtensionIconSet>().Pass()); |
|
Jeffrey Yasskin
2012/09/13 00:23:36
You shouldn't need .Pass() on this line. Temporary
tbarzic
2012/09/13 02:01:01
Done.
| |
| 2296 ExtensionAction::kDefaultTabId, | |
| 2297 ui::ResourceBundle::GetSharedInstance().GetImageNamed( | |
| 2298 IDR_EXTENSIONS_FAVICON)); | |
| 2299 } | 2342 } |
| 2300 | 2343 |
| 2301 return true; | 2344 return true; |
| 2302 } | 2345 } |
| 2303 | 2346 |
| 2304 bool Extension::LoadFileBrowserHandlers(string16* error) { | 2347 bool Extension::LoadFileBrowserHandlers(string16* error) { |
| 2305 if (!manifest_->HasKey(keys::kFileBrowserHandlers)) | 2348 if (!manifest_->HasKey(keys::kFileBrowserHandlers)) |
| 2306 return true; | 2349 return true; |
| 2307 ListValue* file_browser_handlers_value = NULL; | 2350 ListValue* file_browser_handlers_value = NULL; |
| 2308 if (!manifest_->GetList(keys::kFileBrowserHandlers, | 2351 if (!manifest_->GetList(keys::kFileBrowserHandlers, |
| (...skipping 799 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3108 for (DictionaryValue::key_iterator it = theme_images->begin_keys(); | 3151 for (DictionaryValue::key_iterator it = theme_images->begin_keys(); |
| 3109 it != theme_images->end_keys(); ++it) { | 3152 it != theme_images->end_keys(); ++it) { |
| 3110 std::string val; | 3153 std::string val; |
| 3111 if (theme_images->GetStringWithoutPathExpansion(*it, &val)) | 3154 if (theme_images->GetStringWithoutPathExpansion(*it, &val)) |
| 3112 image_paths.insert(FilePath::FromWStringHack(UTF8ToWide(val))); | 3155 image_paths.insert(FilePath::FromWStringHack(UTF8ToWide(val))); |
| 3113 } | 3156 } |
| 3114 } | 3157 } |
| 3115 | 3158 |
| 3116 // Page action icons. | 3159 // Page action icons. |
| 3117 if (page_action()) { | 3160 if (page_action()) { |
| 3118 std::vector<std::string>* icon_paths = page_action()->icon_paths(); | 3161 const std::vector<const ExtensionIconSet*>& page_action_icons = |
| 3119 for (std::vector<std::string>::iterator iter = icon_paths->begin(); | 3162 page_action()->page_action_icons(); |
| 3120 iter != icon_paths->end(); ++iter) { | 3163 for (size_t icon = 0; icon < page_action_icons.size(); icon++) { |
| 3121 image_paths.insert(FilePath::FromWStringHack(UTF8ToWide(*iter))); | 3164 for (ExtensionIconSet::IconMap::const_iterator iter = |
| 3165 page_action_icons[icon]->map().begin(); | |
| 3166 iter != page_action_icons[icon]->map().end(); | |
| 3167 ++iter) { | |
| 3168 image_paths.insert(FilePath::FromWStringHack(UTF8ToWide(iter->second))); | |
| 3169 } | |
| 3122 } | 3170 } |
| 3123 } | 3171 } |
| 3124 | 3172 |
| 3125 // Browser action icons. | 3173 // Browser action icons. |
| 3126 if (browser_action()) { | 3174 if (browser_action()) { |
| 3127 std::vector<std::string>* icon_paths = browser_action()->icon_paths(); | 3175 const std::vector<const ExtensionIconSet*>& page_action_icons = |
| 3128 for (std::vector<std::string>::iterator iter = icon_paths->begin(); | 3176 browser_action()->page_action_icons(); |
| 3129 iter != icon_paths->end(); ++iter) { | 3177 for (size_t icon = 0; icon < page_action_icons.size(); icon++) { |
| 3130 image_paths.insert(FilePath::FromWStringHack(UTF8ToWide(*iter))); | 3178 for (ExtensionIconSet::IconMap::const_iterator iter = |
| 3179 page_action_icons[icon]->map().begin(); | |
| 3180 iter != page_action_icons[icon]->map().end(); | |
| 3181 ++iter) { | |
| 3182 image_paths.insert(FilePath::FromWStringHack(UTF8ToWide(iter->second))); | |
| 3183 } | |
| 3131 } | 3184 } |
| 3132 } | 3185 } |
| 3133 | 3186 |
| 3134 return image_paths; | 3187 return image_paths; |
| 3135 } | 3188 } |
| 3136 | 3189 |
| 3137 GURL Extension::GetFullLaunchURL() const { | 3190 GURL Extension::GetFullLaunchURL() const { |
| 3138 return launch_local_path().empty() ? GURL(launch_web_url()) : | 3191 return launch_local_path().empty() ? GURL(launch_web_url()) : |
| 3139 url().Resolve(launch_local_path()); | 3192 url().Resolve(launch_local_path()); |
| 3140 } | 3193 } |
| (...skipping 764 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3905 | 3958 |
| 3906 UpdatedExtensionPermissionsInfo::UpdatedExtensionPermissionsInfo( | 3959 UpdatedExtensionPermissionsInfo::UpdatedExtensionPermissionsInfo( |
| 3907 const Extension* extension, | 3960 const Extension* extension, |
| 3908 const PermissionSet* permissions, | 3961 const PermissionSet* permissions, |
| 3909 Reason reason) | 3962 Reason reason) |
| 3910 : reason(reason), | 3963 : reason(reason), |
| 3911 extension(extension), | 3964 extension(extension), |
| 3912 permissions(permissions) {} | 3965 permissions(permissions) {} |
| 3913 | 3966 |
| 3914 } // namespace extensions | 3967 } // namespace extensions |
| OLD | NEW |