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/api/extension_action/action_info.h" | 5 #include "chrome/common/extensions/api/extension_action/action_info.h" |
6 | 6 |
7 #include "base/memory/scoped_ptr.h" | 7 #include "base/memory/scoped_ptr.h" |
8 #include "base/utf_string_conversions.h" | |
8 #include "chrome/common/extensions/api/commands/commands_handler.h" | 9 #include "chrome/common/extensions/api/commands/commands_handler.h" |
9 #include "chrome/common/extensions/extension.h" | 10 #include "chrome/common/extensions/extension.h" |
10 #include "chrome/common/extensions/extension_manifest_constants.h" | 11 #include "chrome/common/extensions/extension_manifest_constants.h" |
12 #include "chrome/common/extensions/manifest_handler_helpers.h" | |
13 #include "extensions/common/error_utils.h" | |
14 | |
15 namespace errors = extension_manifest_errors; | |
16 namespace keys = extension_manifest_keys; | |
Yoyo Zhou
2013/03/21 00:07:50
You can use these to shorten some declarations fur
Devlin
2013/03/23 22:23:08
Done.
| |
11 | 17 |
12 namespace extensions { | 18 namespace extensions { |
13 | 19 |
14 namespace { | 20 namespace { |
15 | 21 |
16 // The manifest data container for the ActionInfos for BrowserActions and | 22 // The manifest data container for the ActionInfos for BrowserActions and |
17 // ScriptBadges. | 23 // ScriptBadges. |
18 struct ActionInfoData : public Extension::ManifestData { | 24 struct ActionInfoData : public Extension::ManifestData { |
19 explicit ActionInfoData(ActionInfo* action_info); | 25 explicit ActionInfoData(ActionInfo* action_info); |
20 virtual ~ActionInfoData(); | 26 virtual ~ActionInfoData(); |
(...skipping 18 matching lines...) Expand all Loading... | |
39 | 45 |
40 } // namespace | 46 } // namespace |
41 | 47 |
42 ActionInfo::ActionInfo() { | 48 ActionInfo::ActionInfo() { |
43 } | 49 } |
44 | 50 |
45 ActionInfo::~ActionInfo() { | 51 ActionInfo::~ActionInfo() { |
46 } | 52 } |
47 | 53 |
48 // static | 54 // static |
55 scoped_ptr<ActionInfo> ActionInfo::Load(const Extension* extension, | |
56 const base::DictionaryValue* dict, | |
57 string16* error) { | |
58 scoped_ptr<ActionInfo> result(new ActionInfo()); | |
59 | |
60 if (extension->manifest_version() == 1) { | |
61 // kPageActionIcons is obsolete, and used by very few extensions. Continue | |
62 // loading it, but only take the first icon as the default_icon path. | |
63 const ListValue* icons = NULL; | |
64 if (dict->HasKey(keys::kPageActionIcons) && | |
65 dict->GetList(keys::kPageActionIcons, &icons)) { | |
66 for (ListValue::const_iterator iter = icons->begin(); | |
67 iter != icons->end(); ++iter) { | |
68 std::string path; | |
69 if (!(*iter)->GetAsString(&path) || | |
70 !manifest_handler_helpers::NormalizeAndValidatePath(&path)) { | |
71 *error = ASCIIToUTF16(errors::kInvalidPageActionIconPath); | |
72 return scoped_ptr<ActionInfo>(); | |
73 } | |
74 | |
75 result->default_icon.Add(extension_misc::EXTENSION_ICON_ACTION, path); | |
76 break; | |
77 } | |
78 } | |
79 | |
80 std::string id; | |
81 if (dict->HasKey(keys::kPageActionId)) { | |
82 if (!dict->GetString(keys::kPageActionId, &id)) { | |
83 *error = ASCIIToUTF16(errors::kInvalidPageActionId); | |
84 return scoped_ptr<ActionInfo>(); | |
85 } | |
86 result->id = id; | |
87 } | |
88 } | |
89 | |
90 // Read the page action |default_icon| (optional). | |
91 // The |default_icon| value can be either dictionary {icon size -> icon path} | |
92 // or non empty string value. | |
93 if (dict->HasKey(keys::kPageActionDefaultIcon)) { | |
94 const DictionaryValue* icons_value = NULL; | |
95 std::string default_icon; | |
96 if (dict->GetDictionary(keys::kPageActionDefaultIcon, &icons_value)) { | |
97 if (!manifest_handler_helpers::LoadIconsFromDictionary( | |
98 icons_value, | |
99 extension_misc::kExtensionActionIconSizes, | |
100 extension_misc::kNumExtensionActionIconSizes, | |
101 &result->default_icon, | |
102 error)) { | |
103 return scoped_ptr<ActionInfo>(); | |
104 } | |
105 } else if (dict->GetString(keys::kPageActionDefaultIcon, &default_icon) && | |
106 manifest_handler_helpers::NormalizeAndValidatePath( | |
107 &default_icon)) { | |
108 result->default_icon.Add(extension_misc::EXTENSION_ICON_ACTION, | |
109 default_icon); | |
110 } else { | |
111 *error = ASCIIToUTF16(errors::kInvalidPageActionIconPath); | |
112 return scoped_ptr<ActionInfo>(); | |
113 } | |
114 } | |
115 | |
116 // Read the page action title from |default_title| if present, |name| if not | |
117 // (both optional). | |
118 if (dict->HasKey(keys::kPageActionDefaultTitle)) { | |
119 if (!dict->GetString(keys::kPageActionDefaultTitle, | |
120 &result->default_title)) { | |
121 *error = ASCIIToUTF16(errors::kInvalidPageActionDefaultTitle); | |
122 return scoped_ptr<ActionInfo>(); | |
123 } | |
124 } else if (extension->manifest_version() == 1 && dict->HasKey(keys::kName)) { | |
125 if (!dict->GetString(keys::kName, &result->default_title)) { | |
126 *error = ASCIIToUTF16(errors::kInvalidPageActionName); | |
127 return scoped_ptr<ActionInfo>(); | |
128 } | |
129 } | |
130 | |
131 // Read the action's |popup| (optional). | |
132 const char* popup_key = NULL; | |
133 if (dict->HasKey(keys::kPageActionDefaultPopup)) | |
134 popup_key = keys::kPageActionDefaultPopup; | |
135 | |
136 if (extension->manifest_version() == 1 && | |
137 dict->HasKey(keys::kPageActionPopup)) { | |
138 if (popup_key) { | |
139 *error = ErrorUtils::FormatErrorMessageUTF16( | |
140 errors::kInvalidPageActionOldAndNewKeys, | |
141 keys::kPageActionDefaultPopup, | |
142 keys::kPageActionPopup); | |
143 return scoped_ptr<ActionInfo>(); | |
144 } | |
145 popup_key = keys::kPageActionPopup; | |
146 } | |
147 | |
148 if (popup_key) { | |
149 const DictionaryValue* popup = NULL; | |
150 std::string url_str; | |
151 | |
152 if (dict->GetString(popup_key, &url_str)) { | |
153 // On success, |url_str| is set. Nothing else to do. | |
154 } else if (extension->manifest_version() == 1 && | |
155 dict->GetDictionary(popup_key, &popup)) { | |
156 if (!popup->GetString(keys::kPageActionPopupPath, &url_str)) { | |
157 *error = ErrorUtils::FormatErrorMessageUTF16( | |
158 errors::kInvalidPageActionPopupPath, "<missing>"); | |
159 return scoped_ptr<ActionInfo>(); | |
160 } | |
161 } else { | |
162 *error = ASCIIToUTF16(errors::kInvalidPageActionPopup); | |
163 return scoped_ptr<ActionInfo>(); | |
164 } | |
165 | |
166 if (!url_str.empty()) { | |
167 // An empty string is treated as having no popup. | |
168 result->default_popup_url = Extension::GetResourceURL(extension->url(), | |
169 url_str); | |
170 if (!result->default_popup_url.is_valid()) { | |
171 *error = ErrorUtils::FormatErrorMessageUTF16( | |
172 errors::kInvalidPageActionPopupPath, url_str); | |
173 return scoped_ptr<ActionInfo>(); | |
174 } | |
175 } else { | |
176 DCHECK(result->default_popup_url.is_empty()) | |
177 << "Shouldn't be possible for the popup to be set."; | |
178 } | |
179 } | |
180 | |
181 return result.Pass(); | |
182 } | |
183 | |
184 // static | |
49 const ActionInfo* ActionInfo::GetBrowserActionInfo(const Extension* extension) { | 185 const ActionInfo* ActionInfo::GetBrowserActionInfo(const Extension* extension) { |
50 return GetActionInfo(extension, extension_manifest_keys::kBrowserAction); | 186 return GetActionInfo(extension, extension_manifest_keys::kBrowserAction); |
51 } | 187 } |
52 | 188 |
53 const ActionInfo* ActionInfo::GetPageActionInfo(const Extension* extension) { | 189 const ActionInfo* ActionInfo::GetPageActionInfo(const Extension* extension) { |
54 return GetActionInfo(extension, extension_manifest_keys::kPageAction); | 190 return GetActionInfo(extension, extension_manifest_keys::kPageAction); |
55 } | 191 } |
56 | 192 |
57 // static | 193 // static |
58 const ActionInfo* ActionInfo::GetScriptBadgeInfo(const Extension* extension) { | 194 const ActionInfo* ActionInfo::GetScriptBadgeInfo(const Extension* extension) { |
59 return GetActionInfo(extension, extension_manifest_keys::kScriptBadge); | 195 return GetActionInfo(extension, extension_manifest_keys::kScriptBadge); |
60 } | 196 } |
61 | 197 |
62 // static | 198 // static |
63 const ActionInfo* ActionInfo::GetPageLauncherInfo(const Extension* extension) { | 199 const ActionInfo* ActionInfo::GetPageLauncherInfo(const Extension* extension) { |
64 return GetActionInfo(extension, extension_manifest_keys::kPageLauncher); | 200 return GetActionInfo(extension, extension_manifest_keys::kPageLauncher); |
65 } | 201 } |
66 | 202 |
67 // static | 203 // static |
204 const ActionInfo* ActionInfo::GetSystemIndicatorInfo( | |
205 const Extension* extension) { | |
206 return GetActionInfo(extension, extension_manifest_keys::kSystemIndicator); | |
207 } | |
208 | |
209 // static | |
68 void ActionInfo::SetBrowserActionInfo(Extension* extension, ActionInfo* info) { | 210 void ActionInfo::SetBrowserActionInfo(Extension* extension, ActionInfo* info) { |
69 extension->SetManifestData(extension_manifest_keys::kBrowserAction, | 211 extension->SetManifestData(extension_manifest_keys::kBrowserAction, |
70 new ActionInfoData(info)); | 212 new ActionInfoData(info)); |
71 } | 213 } |
72 | 214 |
73 // static | 215 // static |
74 void ActionInfo::SetPageActionInfo(Extension* extension, ActionInfo* info) { | 216 void ActionInfo::SetPageActionInfo(Extension* extension, ActionInfo* info) { |
75 extension->SetManifestData(extension_manifest_keys::kPageAction, | 217 extension->SetManifestData(extension_manifest_keys::kPageAction, |
76 new ActionInfoData(info)); | 218 new ActionInfoData(info)); |
77 } | 219 } |
78 | 220 |
79 // static | 221 // static |
80 void ActionInfo::SetScriptBadgeInfo(Extension* extension, ActionInfo* info) { | 222 void ActionInfo::SetScriptBadgeInfo(Extension* extension, ActionInfo* info) { |
81 extension->SetManifestData(extension_manifest_keys::kScriptBadge, | 223 extension->SetManifestData(extension_manifest_keys::kScriptBadge, |
82 new ActionInfoData(info)); | 224 new ActionInfoData(info)); |
83 } | 225 } |
84 | 226 |
85 // static | 227 // static |
86 void ActionInfo::SetPageLauncherInfo(Extension* extension, ActionInfo* info) { | 228 void ActionInfo::SetPageLauncherInfo(Extension* extension, ActionInfo* info) { |
87 extension->SetManifestData(extension_manifest_keys::kPageLauncher, | 229 extension->SetManifestData(extension_manifest_keys::kPageLauncher, |
88 new ActionInfoData(info)); | 230 new ActionInfoData(info)); |
89 } | 231 } |
90 | 232 |
91 // static | 233 // static |
234 void ActionInfo::SetSystemIndicatorInfo(Extension* extension, | |
235 ActionInfo* info) { | |
236 extension->SetManifestData(extension_manifest_keys::kSystemIndicator, | |
237 new ActionInfoData(info)); | |
238 } | |
239 | |
240 // static | |
92 bool ActionInfo::IsVerboseInstallMessage(const Extension* extension) { | 241 bool ActionInfo::IsVerboseInstallMessage(const Extension* extension) { |
93 const ActionInfo* page_action_info = GetPageActionInfo(extension); | 242 const ActionInfo* page_action_info = GetPageActionInfo(extension); |
94 return page_action_info && | 243 return page_action_info && |
95 (CommandsInfo::GetPageActionCommand(extension) || | 244 (CommandsInfo::GetPageActionCommand(extension) || |
96 !page_action_info->default_icon.empty()); | 245 !page_action_info->default_icon.empty()); |
97 } | 246 } |
98 | 247 |
99 } // namespace extensions | 248 } // namespace extensions |
OLD | NEW |