Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(665)

Side by Side Diff: chrome/common/extensions/api/extension_action/action_info.cc

Issue 12618009: Move SystemIndicator parsing out of Extension class (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: Created 7 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698