Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 <algorithm> | 7 #include <algorithm> |
| 8 | 8 |
| 9 #include "base/base64.h" | 9 #include "base/base64.h" |
| 10 #include "base/basictypes.h" | 10 #include "base/basictypes.h" |
| (...skipping 14 matching lines...) Expand all Loading... | |
| 25 #include "chrome/common/chrome_constants.h" | 25 #include "chrome/common/chrome_constants.h" |
| 26 #include "chrome/common/chrome_switches.h" | 26 #include "chrome/common/chrome_switches.h" |
| 27 #include "chrome/common/chrome_version_info.h" | 27 #include "chrome/common/chrome_version_info.h" |
| 28 #include "chrome/common/extensions/extension_action.h" | 28 #include "chrome/common/extensions/extension_action.h" |
| 29 #include "chrome/common/extensions/extension_constants.h" | 29 #include "chrome/common/extensions/extension_constants.h" |
| 30 #include "chrome/common/extensions/extension_error_utils.h" | 30 #include "chrome/common/extensions/extension_error_utils.h" |
| 31 #include "chrome/common/extensions/extension_l10n_util.h" | 31 #include "chrome/common/extensions/extension_l10n_util.h" |
| 32 #include "chrome/common/extensions/extension_resource.h" | 32 #include "chrome/common/extensions/extension_resource.h" |
| 33 #include "chrome/common/extensions/extension_sidebar_defaults.h" | 33 #include "chrome/common/extensions/extension_sidebar_defaults.h" |
| 34 #include "chrome/common/extensions/extension_sidebar_utils.h" | 34 #include "chrome/common/extensions/extension_sidebar_utils.h" |
| 35 #include "chrome/common/extensions/file_browser_action.h" | |
| 35 #include "chrome/common/extensions/user_script.h" | 36 #include "chrome/common/extensions/user_script.h" |
| 36 #include "chrome/common/url_constants.h" | 37 #include "chrome/common/url_constants.h" |
| 37 #include "googleurl/src/url_util.h" | 38 #include "googleurl/src/url_util.h" |
| 38 #include "grit/chromium_strings.h" | 39 #include "grit/chromium_strings.h" |
| 39 #include "grit/generated_resources.h" | 40 #include "grit/generated_resources.h" |
| 40 #include "grit/theme_resources.h" | 41 #include "grit/theme_resources.h" |
| 41 #include "net/base/registry_controlled_domain.h" | 42 #include "net/base/registry_controlled_domain.h" |
| 42 #include "third_party/skia/include/core/SkBitmap.h" | 43 #include "third_party/skia/include/core/SkBitmap.h" |
| 43 #include "ui/base/l10n/l10n_util.h" | 44 #include "ui/base/l10n/l10n_util.h" |
| 44 #include "ui/base/resource/resource_bundle.h" | 45 #include "ui/base/resource/resource_bundle.h" |
| (...skipping 827 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 872 result->SetPopupUrl(ExtensionAction::kDefaultTabId, url); | 873 result->SetPopupUrl(ExtensionAction::kDefaultTabId, url); |
| 873 } else { | 874 } else { |
| 874 DCHECK(!result->HasPopup(ExtensionAction::kDefaultTabId)) | 875 DCHECK(!result->HasPopup(ExtensionAction::kDefaultTabId)) |
| 875 << "Shouldn't be posible for the popup to be set."; | 876 << "Shouldn't be posible for the popup to be set."; |
| 876 } | 877 } |
| 877 } | 878 } |
| 878 | 879 |
| 879 return result.release(); | 880 return result.release(); |
| 880 } | 881 } |
| 881 | 882 |
| 883 Extension::FileBrowserActionList* Extension::LoadFileBrowserActions( | |
| 884 const ListValue* extension_actions, std::string* error) { | |
| 885 scoped_ptr<FileBrowserActionList> result( | |
| 886 new FileBrowserActionList()); | |
| 887 for (ListValue::const_iterator iter = extension_actions->begin(); | |
| 888 iter != extension_actions->end(); | |
| 889 ++iter) { | |
| 890 if (!(*iter)->IsType(Value::TYPE_DICTIONARY)) { | |
| 891 *error = errors::kInvalidFileBrowserAction; | |
| 892 return false; | |
| 893 } | |
| 894 scoped_ptr<FileBrowserAction> action( | |
| 895 LoadFileBrowserAction( | |
| 896 reinterpret_cast<DictionaryValue*>(*iter), error)); | |
| 897 if (!action.get()) | |
| 898 return NULL; // Failed to parse file browser action definition. | |
| 899 result->push_back(linked_ptr<FileBrowserAction>(action.release())); | |
| 900 } | |
| 901 return result.release(); | |
| 902 } | |
| 903 | |
| 904 FileBrowserAction* Extension::LoadFileBrowserAction( | |
| 905 const DictionaryValue* file_browser_actions, std::string* error) { | |
|
Aaron Boodman
2011/04/12 22:47:21
s/file_browser_actions/file_browser_action/
zel
2011/04/13 17:49:55
Done.
| |
| 906 scoped_ptr<FileBrowserAction> result( | |
| 907 new FileBrowserAction()); | |
| 908 result->set_extension_id(id()); | |
| 909 | |
| 910 std::string id; | |
| 911 // Read the file action |id| (mandatory). | |
| 912 if (!file_browser_actions->HasKey(keys::kPageActionId) || | |
|
Aaron Boodman
2011/04/12 22:47:21
Can you name this property "name" instead? (We don
Aaron Boodman
2011/04/12 22:48:20
Whoops, I didn't mean to include this comment. I t
| |
| 913 !file_browser_actions->GetString(keys::kPageActionId, &id)) { | |
| 914 *error = errors::kInvalidPageActionId; | |
|
Aaron Boodman
2011/04/12 22:47:21
Incorrect error message.
zel
2011/04/13 17:49:55
This message is used for generic "id is missing" e
| |
| 915 return NULL; | |
| 916 } | |
| 917 result->set_id(id); | |
| 918 | |
| 919 // Read the page action title from |default_title| (mandatory). | |
| 920 std::string title; | |
| 921 if (!file_browser_actions->HasKey(keys::kPageActionDefaultTitle) || | |
|
Aaron Boodman
2011/04/12 22:47:21
It's a bit weird to reuse these constants (pageAct
zel
2011/04/13 17:49:55
Done.
| |
| 922 !file_browser_actions->GetString(keys::kPageActionDefaultTitle, &title)) { | |
| 923 *error = errors::kInvalidPageActionDefaultTitle; | |
| 924 return NULL; | |
| 925 } | |
| 926 result->set_default_title(title); | |
| 927 | |
| 928 // Initialize file filters (mandatory). | |
| 929 ListValue* list_value; | |
|
Aaron Boodman
2011/04/12 22:47:21
= NULL
zel
2011/04/13 17:49:55
Done.
| |
| 930 if (!file_browser_actions->HasKey(keys::kFileFilters) || | |
| 931 !file_browser_actions->GetList(keys::kFileFilters, &list_value) || | |
| 932 list_value->empty()) { | |
| 933 *error = errors::kInvalidFileFiltersList; | |
| 934 return false; | |
| 935 } | |
| 936 for (size_t i = 0; i < list_value->GetSize(); ++i) { | |
| 937 std::string filter; | |
| 938 if (!list_value->GetString(i, &filter)) { | |
| 939 *error = ExtensionErrorUtils::FormatErrorMessage( | |
| 940 errors::kInvalidFileFilterValue, base::IntToString(i)); | |
| 941 return false; | |
| 942 } | |
| 943 URLPattern pattern(URLPattern::SCHEME_FILESYSTEM); | |
| 944 // TODO(skerner): Consider enabling strict pattern parsing | |
| 945 // if this extension's location indicates that it is under development. | |
| 946 if (URLPattern::PARSE_SUCCESS != pattern.Parse(filter, | |
| 947 URLPattern::PARSE_LENIENT)) { | |
|
Aaron Boodman
2011/04/12 22:47:21
Use PARSE_STRICT and remove the TODO(skerner). The
zel
2011/04/13 17:49:55
Done.
| |
| 948 *error = ExtensionErrorUtils::FormatErrorMessage( | |
| 949 errors::kInvalidURLPatternError, filter); | |
| 950 return false; | |
| 951 } | |
| 952 result->AddPattern(pattern); | |
| 953 } | |
| 954 | |
| 955 std::string default_icon; | |
| 956 // Read the page action |default_icon| (optional). | |
|
Aaron Boodman
2011/04/12 22:47:21
paste-o ('page action')
zel
2011/04/13 17:49:55
Done.
| |
| 957 if (file_browser_actions->HasKey(keys::kPageActionDefaultIcon)) { | |
| 958 if (!file_browser_actions->GetString(keys::kPageActionDefaultIcon, | |
| 959 &default_icon) || | |
|
Aaron Boodman
2011/04/12 22:47:21
intent+=4
zel
2011/04/13 17:49:55
Done.
| |
| 960 default_icon.empty()) { | |
| 961 *error = errors::kInvalidPageActionIconPath; | |
| 962 return NULL; | |
| 963 } | |
| 964 result->set_default_icon_path(default_icon); | |
| 965 } | |
| 966 | |
| 967 return result.release(); | |
| 968 } | |
| 969 | |
| 882 ExtensionSidebarDefaults* Extension::LoadExtensionSidebarDefaults( | 970 ExtensionSidebarDefaults* Extension::LoadExtensionSidebarDefaults( |
| 883 const DictionaryValue* extension_sidebar, std::string* error) { | 971 const DictionaryValue* extension_sidebar, std::string* error) { |
| 884 scoped_ptr<ExtensionSidebarDefaults> result(new ExtensionSidebarDefaults()); | 972 scoped_ptr<ExtensionSidebarDefaults> result(new ExtensionSidebarDefaults()); |
| 885 | 973 |
| 886 std::string default_icon; | 974 std::string default_icon; |
| 887 // Read sidebar's |default_icon| (optional). | 975 // Read sidebar's |default_icon| (optional). |
| 888 if (extension_sidebar->HasKey(keys::kSidebarDefaultIcon)) { | 976 if (extension_sidebar->HasKey(keys::kSidebarDefaultIcon)) { |
| 889 if (!extension_sidebar->GetString(keys::kSidebarDefaultIcon, | 977 if (!extension_sidebar->GetString(keys::kSidebarDefaultIcon, |
| 890 &default_icon) || | 978 &default_icon) || |
| 891 default_icon.empty()) { | 979 default_icon.empty()) { |
| (...skipping 1011 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1903 *error = errors::kInvalidBrowserAction; | 1991 *error = errors::kInvalidBrowserAction; |
| 1904 return false; | 1992 return false; |
| 1905 } | 1993 } |
| 1906 | 1994 |
| 1907 browser_action_.reset( | 1995 browser_action_.reset( |
| 1908 LoadExtensionActionHelper(browser_action_value, error)); | 1996 LoadExtensionActionHelper(browser_action_value, error)); |
| 1909 if (!browser_action_.get()) | 1997 if (!browser_action_.get()) |
| 1910 return false; // Failed to parse browser action definition. | 1998 return false; // Failed to parse browser action definition. |
| 1911 } | 1999 } |
| 1912 | 2000 |
| 2001 // Initialize browser action (optional). | |
|
asargent_no_longer_on_chrome
2011/04/12 21:09:38
nit: comment should be "Initialize file browser ac
zel
2011/04/13 17:49:55
Done.
| |
| 2002 if (source.HasKey(keys::kFileBrowserActions)) { | |
| 2003 ListValue* file_browser_actions_value = NULL; | |
| 2004 if (!source.GetList(keys::kFileBrowserActions, | |
| 2005 &file_browser_actions_value)) { | |
| 2006 *error = errors::kInvalidFileBrowserAction; | |
| 2007 return false; | |
| 2008 } | |
| 2009 | |
| 2010 file_browser_actions_.reset( | |
| 2011 LoadFileBrowserActions(file_browser_actions_value, error)); | |
| 2012 if (!file_browser_actions_.get()) | |
| 2013 return false; // Failed to parse browser action definition. | |
|
asargent_no_longer_on_chrome
2011/04/12 21:09:38
same naming nit on comment here
zel
2011/04/13 17:49:55
Done.
| |
| 2014 } | |
| 2015 | |
| 1913 // Load App settings. | 2016 // Load App settings. |
| 1914 if (!LoadIsApp(manifest_value_.get(), error) || | 2017 if (!LoadIsApp(manifest_value_.get(), error) || |
| 1915 !LoadExtent(manifest_value_.get(), keys::kWebURLs, | 2018 !LoadExtent(manifest_value_.get(), keys::kWebURLs, |
| 1916 &extent_, | 2019 &extent_, |
| 1917 errors::kInvalidWebURLs, errors::kInvalidWebURL, | 2020 errors::kInvalidWebURLs, errors::kInvalidWebURL, |
| 1918 parse_strictness, error) || | 2021 parse_strictness, error) || |
| 1919 !EnsureNotHybridApp(manifest_value_.get(), error) || | 2022 !EnsureNotHybridApp(manifest_value_.get(), error) || |
| 1920 !LoadLaunchURL(manifest_value_.get(), error) || | 2023 !LoadLaunchURL(manifest_value_.get(), error) || |
| 1921 !LoadLaunchContainer(manifest_value_.get(), error) || | 2024 !LoadLaunchContainer(manifest_value_.get(), error) || |
| 1922 !LoadAppIsolation(manifest_value_.get(), error)) { | 2025 !LoadAppIsolation(manifest_value_.get(), error)) { |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1969 std::string permission_str; | 2072 std::string permission_str; |
| 1970 if (!permissions->GetString(i, &permission_str)) { | 2073 if (!permissions->GetString(i, &permission_str)) { |
| 1971 *error = ExtensionErrorUtils::FormatErrorMessage( | 2074 *error = ExtensionErrorUtils::FormatErrorMessage( |
| 1972 errors::kInvalidPermission, base::IntToString(i)); | 2075 errors::kInvalidPermission, base::IntToString(i)); |
| 1973 return false; | 2076 return false; |
| 1974 } | 2077 } |
| 1975 | 2078 |
| 1976 // Only COMPONENT extensions can use private APIs. | 2079 // Only COMPONENT extensions can use private APIs. |
| 1977 // TODO(asargent) - We want a more general purpose mechanism for this, | 2080 // TODO(asargent) - We want a more general purpose mechanism for this, |
| 1978 // and better error messages. (http://crbug.com/54013) | 2081 // and better error messages. (http://crbug.com/54013) |
| 1979 if (!IsComponentOnlyPermission(permission_str)) { | 2082 if (!IsComponentOnlyPermission(permission_str) |
| 2083 #ifndef NDEBUG | |
| 2084 && !CommandLine::ForCurrentProcess()->HasSwitch( | |
|
Aaron Boodman
2011/04/12 22:47:21
Is this testing code? Can we remove it?
zel
2011/04/13 17:49:55
This is super useful for us while debugging compon
| |
| 2085 switches::kExposePrivateExtensionApi) | |
| 2086 #endif | |
| 2087 ) { | |
| 1980 continue; | 2088 continue; |
| 1981 } | 2089 } |
| 1982 | 2090 |
| 1983 // Remap the old unlimited storage permission name. | 2091 // Remap the old unlimited storage permission name. |
| 1984 if (permission_str == kOldUnlimitedStoragePermission) | 2092 if (permission_str == kOldUnlimitedStoragePermission) |
| 1985 permission_str = kUnlimitedStoragePermission; | 2093 permission_str = kUnlimitedStoragePermission; |
| 1986 | 2094 |
| 1987 if (web_extent().is_empty() || location() == Extension::COMPONENT) { | 2095 if (web_extent().is_empty() || location() == Extension::COMPONENT) { |
| 1988 // Check if it's a module permission. If so, enable that permission. | 2096 // Check if it's a module permission. If so, enable that permission. |
| 1989 if (IsAPIPermission(permission_str)) { | 2097 if (IsAPIPermission(permission_str)) { |
| (...skipping 576 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2566 bool Extension::IsAPIPermission(const std::string& str) const { | 2674 bool Extension::IsAPIPermission(const std::string& str) const { |
| 2567 for (size_t i = 0; i < Extension::kNumPermissions; ++i) { | 2675 for (size_t i = 0; i < Extension::kNumPermissions; ++i) { |
| 2568 if (str == Extension::kPermissions[i].name) { | 2676 if (str == Extension::kPermissions[i].name) { |
| 2569 return true; | 2677 return true; |
| 2570 } | 2678 } |
| 2571 } | 2679 } |
| 2572 return false; | 2680 return false; |
| 2573 } | 2681 } |
| 2574 | 2682 |
| 2575 bool Extension::CanExecuteScriptEverywhere() const { | 2683 bool Extension::CanExecuteScriptEverywhere() const { |
| 2576 if (location() == Extension::COMPONENT) | 2684 if (location() == Extension::COMPONENT |
| 2685 #ifndef NDEBUG | |
| 2686 || CommandLine::ForCurrentProcess()->HasSwitch( | |
|
Aaron Boodman
2011/04/12 22:47:21
Is this testing code? Can we remove it?
zel
2011/04/13 17:49:55
see comments above
| |
| 2687 switches::kExposePrivateExtensionApi) | |
| 2688 #endif | |
| 2689 ) | |
| 2577 return true; | 2690 return true; |
| 2578 | 2691 |
| 2579 ScriptingWhitelist* whitelist = | 2692 ScriptingWhitelist* whitelist = |
| 2580 ExtensionConfig::GetInstance()->whitelist(); | 2693 ExtensionConfig::GetInstance()->whitelist(); |
| 2581 | 2694 |
| 2582 for (ScriptingWhitelist::const_iterator it = whitelist->begin(); | 2695 for (ScriptingWhitelist::const_iterator it = whitelist->begin(); |
| 2583 it != whitelist->end(); ++it) { | 2696 it != whitelist->end(); ++it) { |
| 2584 if (id() == *it) { | 2697 if (id() == *it) { |
| 2585 return true; | 2698 return true; |
| 2586 } | 2699 } |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2648 | 2761 |
| 2649 UninstalledExtensionInfo::~UninstalledExtensionInfo() {} | 2762 UninstalledExtensionInfo::~UninstalledExtensionInfo() {} |
| 2650 | 2763 |
| 2651 | 2764 |
| 2652 UnloadedExtensionInfo::UnloadedExtensionInfo( | 2765 UnloadedExtensionInfo::UnloadedExtensionInfo( |
| 2653 const Extension* extension, | 2766 const Extension* extension, |
| 2654 Reason reason) | 2767 Reason reason) |
| 2655 : reason(reason), | 2768 : reason(reason), |
| 2656 already_disabled(false), | 2769 already_disabled(false), |
| 2657 extension(extension) {} | 2770 extension(extension) {} |
| OLD | NEW |