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/browser/extensions/external_install_ui.h" | 5 #include "chrome/browser/extensions/external_install_ui.h" |
6 | 6 |
7 #include <string> | 7 #include <string> |
8 | 8 |
9 #include "base/bind.h" | 9 #include "base/bind.h" |
10 #include "base/lazy_instance.h" | 10 #include "base/lazy_instance.h" |
(...skipping 18 matching lines...) Expand all Loading... |
29 #include "content/public/browser/notification_observer.h" | 29 #include "content/public/browser/notification_observer.h" |
30 #include "content/public/browser/notification_registrar.h" | 30 #include "content/public/browser/notification_registrar.h" |
31 #include "content/public/browser/notification_source.h" | 31 #include "content/public/browser/notification_source.h" |
32 #include "grit/chromium_strings.h" | 32 #include "grit/chromium_strings.h" |
33 #include "grit/generated_resources.h" | 33 #include "grit/generated_resources.h" |
34 #include "grit/theme_resources.h" | 34 #include "grit/theme_resources.h" |
35 #include "ui/base/l10n/l10n_util.h" | 35 #include "ui/base/l10n/l10n_util.h" |
36 | 36 |
37 namespace extensions { | 37 namespace extensions { |
38 | 38 |
| 39 namespace { |
| 40 |
| 41 // Whether the external extension can use the streamlined bubble install flow. |
| 42 bool UseBubbleInstall(const Extension* extension) { |
| 43 // TODO(yoz): determine how to determine if it's a new profile, |
| 44 // returning false in that case. |
| 45 return extension->UpdatesFromGallery(); |
| 46 } |
| 47 |
| 48 } // namespace |
| 49 |
39 static const int kMenuCommandId = IDC_EXTERNAL_EXTENSION_ALERT; | 50 static const int kMenuCommandId = IDC_EXTERNAL_EXTENSION_ALERT; |
40 | 51 |
41 // ExternalInstallDialogDelegate -------------------------------------------- | 52 class ExternalInstallGlobalError; |
42 | 53 |
43 // TODO(mpcomplete): Get rid of the refcounting on this class, or document | 54 // TODO(mpcomplete): Get rid of the refcounting on this class, or document |
44 // why it's necessary. Will do after refactoring to merge back with | 55 // why it's necessary. Will do after refactoring to merge back with |
45 // ExtensionDisabledDialogDelegate. | 56 // ExtensionDisabledDialogDelegate. |
46 class ExternalInstallDialogDelegate | 57 class ExternalInstallDialogDelegate |
47 : public ExtensionInstallPrompt::Delegate, | 58 : public ExtensionInstallPrompt::Delegate, |
48 public base::RefCountedThreadSafe<ExternalInstallDialogDelegate> { | 59 public base::RefCountedThreadSafe<ExternalInstallDialogDelegate> { |
49 public: | 60 public: |
50 ExternalInstallDialogDelegate(Browser* browser, | 61 ExternalInstallDialogDelegate(Browser* browser, |
51 ExtensionService* service, | 62 ExtensionService* service, |
52 const Extension* extension); | 63 const Extension* extension, |
| 64 ExternalInstallGlobalError* global_error); |
53 | 65 |
54 private: | 66 private: |
55 friend class base::RefCountedThreadSafe<ExternalInstallDialogDelegate>; | 67 friend class base::RefCountedThreadSafe<ExternalInstallDialogDelegate>; |
| 68 friend class ExternalInstallGlobalError; |
56 | 69 |
57 virtual ~ExternalInstallDialogDelegate(); | 70 virtual ~ExternalInstallDialogDelegate(); |
58 | 71 |
59 // ExtensionInstallPrompt::Delegate: | 72 // ExtensionInstallPrompt::Delegate: |
60 virtual void InstallUIProceed() OVERRIDE; | 73 virtual void InstallUIProceed() OVERRIDE; |
61 virtual void InstallUIAbort(bool user_initiated) OVERRIDE; | 74 virtual void InstallUIAbort(bool user_initiated) OVERRIDE; |
62 | 75 |
63 // The UI for showing the install dialog when enabling. | 76 // The UI for showing the install dialog when enabling. |
64 scoped_ptr<ExtensionInstallPrompt> install_ui_; | 77 scoped_ptr<ExtensionInstallPrompt> install_ui_; |
65 | 78 |
66 ExtensionService* service_; | 79 ExtensionService* service_; |
67 const Extension* extension_; | 80 const Extension* extension_; |
68 }; | 81 }; |
69 | 82 |
70 ExternalInstallDialogDelegate::ExternalInstallDialogDelegate( | 83 // Only shows a menu item, no bubble. Clicking the menu item shows |
71 Browser* browser, | 84 // an external install dialog. |
72 ExtensionService* service, | 85 class ExternalInstallMenuAlert : public GlobalError, |
73 const Extension* extension) | 86 public content::NotificationObserver { |
74 : service_(service), extension_(extension) { | |
75 AddRef(); // Balanced in Proceed or Abort. | |
76 | |
77 install_ui_.reset( | |
78 ExtensionInstallUI::CreateInstallPromptWithBrowser(browser)); | |
79 install_ui_->ConfirmExternalInstall(this, extension_); | |
80 } | |
81 | |
82 ExternalInstallDialogDelegate::~ExternalInstallDialogDelegate() { | |
83 } | |
84 | |
85 void ExternalInstallDialogDelegate::InstallUIProceed() { | |
86 service_->GrantPermissionsAndEnableExtension(extension_); | |
87 Release(); | |
88 } | |
89 | |
90 void ExternalInstallDialogDelegate::InstallUIAbort(bool user_initiated) { | |
91 service_->UninstallExtension(extension_->id(), false, NULL); | |
92 Release(); | |
93 } | |
94 | |
95 static void ShowExternalInstallDialog(ExtensionService* service, | |
96 Browser* browser, | |
97 const Extension* extension) { | |
98 // This object manages its own lifetime. | |
99 new ExternalInstallDialogDelegate(browser, service, extension); | |
100 } | |
101 | |
102 // ExternalInstallGlobalError ----------------------------------------------- | |
103 | |
104 class ExternalInstallGlobalError : public GlobalError, | |
105 public content::NotificationObserver { | |
106 public: | 87 public: |
107 ExternalInstallGlobalError(ExtensionService* service, | 88 ExternalInstallMenuAlert(ExtensionService* service, |
108 const Extension* extension); | 89 const Extension* extension); |
109 virtual ~ExternalInstallGlobalError(); | 90 virtual ~ExternalInstallMenuAlert(); |
110 | 91 |
111 const Extension* extension() const { return extension_; } | 92 const Extension* extension() const { return extension_; } |
112 | 93 |
113 // GlobalError implementation. | 94 // GlobalError implementation. |
114 virtual Severity GetSeverity() OVERRIDE; | 95 virtual Severity GetSeverity() OVERRIDE; |
115 virtual bool HasMenuItem() OVERRIDE; | 96 virtual bool HasMenuItem() OVERRIDE; |
116 virtual int MenuItemCommandID() OVERRIDE; | 97 virtual int MenuItemCommandID() OVERRIDE; |
117 virtual string16 MenuItemLabel() OVERRIDE; | 98 virtual string16 MenuItemLabel() OVERRIDE; |
118 virtual int MenuItemIconResourceID() OVERRIDE; | 99 virtual int MenuItemIconResourceID() OVERRIDE; |
119 virtual void ExecuteMenuItem(Browser* browser) OVERRIDE; | 100 virtual void ExecuteMenuItem(Browser* browser) OVERRIDE; |
120 virtual bool HasBubbleView() OVERRIDE; | 101 virtual bool HasBubbleView() OVERRIDE; |
121 virtual string16 GetBubbleViewTitle() OVERRIDE; | 102 virtual string16 GetBubbleViewTitle() OVERRIDE; |
122 virtual std::vector<string16> GetBubbleViewMessages() OVERRIDE; | 103 virtual std::vector<string16> GetBubbleViewMessages() OVERRIDE; |
123 virtual string16 GetBubbleViewAcceptButtonLabel() OVERRIDE; | 104 virtual string16 GetBubbleViewAcceptButtonLabel() OVERRIDE; |
124 virtual string16 GetBubbleViewCancelButtonLabel() OVERRIDE; | 105 virtual string16 GetBubbleViewCancelButtonLabel() OVERRIDE; |
125 virtual void OnBubbleViewDidClose(Browser* browser) OVERRIDE; | 106 virtual void OnBubbleViewDidClose(Browser* browser) OVERRIDE; |
126 virtual void BubbleViewAcceptButtonPressed(Browser* browser) OVERRIDE; | 107 virtual void BubbleViewAcceptButtonPressed(Browser* browser) OVERRIDE; |
127 virtual void BubbleViewCancelButtonPressed(Browser* browser) OVERRIDE; | 108 virtual void BubbleViewCancelButtonPressed(Browser* browser) OVERRIDE; |
128 | 109 |
129 // content::NotificationObserver implementation. | 110 // content::NotificationObserver implementation. |
130 virtual void Observe(int type, | 111 virtual void Observe(int type, |
131 const content::NotificationSource& source, | 112 const content::NotificationSource& source, |
132 const content::NotificationDetails& details) OVERRIDE; | 113 const content::NotificationDetails& details) OVERRIDE; |
133 | 114 |
134 private: | 115 protected: |
135 ExtensionService* service_; | 116 ExtensionService* service_; |
136 const Extension* extension_; | 117 const Extension* extension_; |
137 content::NotificationRegistrar registrar_; | 118 content::NotificationRegistrar registrar_; |
138 }; | 119 }; |
139 | 120 |
140 ExternalInstallGlobalError::ExternalInstallGlobalError( | 121 // Shows a menu item and a global error bubble, replacing the install dialog. |
| 122 class ExternalInstallGlobalError : public ExternalInstallMenuAlert { |
| 123 public: |
| 124 ExternalInstallGlobalError(ExtensionService* service, |
| 125 const Extension* extension); |
| 126 virtual ~ExternalInstallGlobalError(); |
| 127 |
| 128 void set_prompt(const ExtensionInstallPrompt::Prompt& prompt) { |
| 129 prompt_ = &prompt; |
| 130 } |
| 131 |
| 132 virtual void ExecuteMenuItem(Browser* browser) OVERRIDE; |
| 133 virtual bool HasBubbleView() OVERRIDE; |
| 134 virtual string16 GetBubbleViewTitle() OVERRIDE; |
| 135 virtual std::vector<string16> GetBubbleViewMessages() OVERRIDE; |
| 136 virtual string16 GetBubbleViewAcceptButtonLabel() OVERRIDE; |
| 137 virtual string16 GetBubbleViewCancelButtonLabel() OVERRIDE; |
| 138 virtual void OnBubbleViewDidClose(Browser* browser) OVERRIDE; |
| 139 virtual void BubbleViewAcceptButtonPressed(Browser* browser) OVERRIDE; |
| 140 virtual void BubbleViewCancelButtonPressed(Browser* browser) OVERRIDE; |
| 141 |
| 142 protected: |
| 143 // Manages its own lifetime. |
| 144 ExternalInstallDialogDelegate* delegate_; |
| 145 const ExtensionInstallPrompt::Prompt* prompt_; |
| 146 }; |
| 147 |
| 148 static void SetExternalInstallBubble( |
| 149 ExternalInstallGlobalError* global_error, |
| 150 const ExtensionInstallPrompt::ShowParams& show_params, |
| 151 ExtensionInstallPrompt::Delegate* delegate, |
| 152 const ExtensionInstallPrompt::Prompt& prompt) { |
| 153 global_error->set_prompt(prompt); |
| 154 } |
| 155 |
| 156 static void ShowExternalInstallDialog( |
| 157 ExtensionService* service, |
| 158 Browser* browser, |
| 159 const Extension* extension) { |
| 160 // This object manages its own lifetime. |
| 161 new ExternalInstallDialogDelegate(browser, service, extension, NULL); |
| 162 } |
| 163 |
| 164 // ExternalInstallDialogDelegate -------------------------------------------- |
| 165 |
| 166 ExternalInstallDialogDelegate::ExternalInstallDialogDelegate( |
| 167 Browser* browser, |
| 168 ExtensionService* service, |
| 169 const Extension* extension, |
| 170 ExternalInstallGlobalError* global_error) |
| 171 : service_(service), extension_(extension) { |
| 172 AddRef(); // Balanced in Proceed or Abort. |
| 173 |
| 174 install_ui_.reset( |
| 175 ExtensionInstallUI::CreateInstallPromptWithBrowser(browser)); |
| 176 |
| 177 const ExtensionInstallPrompt::ShowDialogCallback callback = |
| 178 global_error ? |
| 179 base::Bind(&SetExternalInstallBubble, global_error) : |
| 180 ExtensionInstallPrompt::GetDefaultShowDialogCallback(); |
| 181 install_ui_->ConfirmExternalInstall(this, extension_, callback); |
| 182 } |
| 183 |
| 184 ExternalInstallDialogDelegate::~ExternalInstallDialogDelegate() { |
| 185 } |
| 186 |
| 187 void ExternalInstallDialogDelegate::InstallUIProceed() { |
| 188 service_->GrantPermissionsAndEnableExtension(extension_); |
| 189 Release(); |
| 190 } |
| 191 |
| 192 void ExternalInstallDialogDelegate::InstallUIAbort(bool user_initiated) { |
| 193 service_->UninstallExtension(extension_->id(), false, NULL); |
| 194 Release(); |
| 195 } |
| 196 |
| 197 // ExternalInstallMenuAlert ------------------------------------------------- |
| 198 |
| 199 ExternalInstallMenuAlert::ExternalInstallMenuAlert( |
141 ExtensionService* service, | 200 ExtensionService* service, |
142 const Extension* extension) | 201 const Extension* extension) |
143 : service_(service), | 202 : service_(service), |
144 extension_(extension) { | 203 extension_(extension) { |
145 registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_LOADED, | 204 registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_LOADED, |
146 content::Source<Profile>(service->profile())); | 205 content::Source<Profile>(service->profile())); |
147 registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_UNLOADED, | 206 registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_UNLOADED, |
148 content::Source<Profile>(service->profile())); | 207 content::Source<Profile>(service->profile())); |
149 } | 208 } |
150 | 209 |
151 ExternalInstallGlobalError::~ExternalInstallGlobalError() { | 210 ExternalInstallMenuAlert::~ExternalInstallMenuAlert() { |
152 } | 211 } |
153 | 212 |
154 GlobalError::Severity ExternalInstallGlobalError::GetSeverity() { | 213 GlobalError::Severity ExternalInstallMenuAlert::GetSeverity() { |
155 return SEVERITY_LOW; | 214 return SEVERITY_LOW; |
156 } | 215 } |
157 | 216 |
158 bool ExternalInstallGlobalError::HasMenuItem() { | 217 bool ExternalInstallMenuAlert::HasMenuItem() { |
159 return true; | 218 return true; |
160 } | 219 } |
161 | 220 |
162 int ExternalInstallGlobalError::MenuItemCommandID() { | 221 int ExternalInstallMenuAlert::MenuItemCommandID() { |
163 return kMenuCommandId; | 222 return kMenuCommandId; |
164 } | 223 } |
165 | 224 |
166 int ExternalInstallGlobalError::MenuItemIconResourceID() { | 225 int ExternalInstallMenuAlert::MenuItemIconResourceID() { |
167 return IDR_UPDATE_MENU_EXTENSION; | 226 return IDR_UPDATE_MENU_EXTENSION; |
168 } | 227 } |
169 | 228 |
170 string16 ExternalInstallGlobalError::MenuItemLabel() { | 229 string16 ExternalInstallMenuAlert::MenuItemLabel() { |
171 int id = -1; | 230 int id = -1; |
172 if (extension_->is_app()) | 231 if (extension_->is_app()) |
173 id = IDS_EXTENSION_EXTERNAL_INSTALL_ALERT_APP; | 232 id = IDS_EXTENSION_EXTERNAL_INSTALL_ALERT_APP; |
174 else if (extension_->is_theme()) | 233 else if (extension_->is_theme()) |
175 id = IDS_EXTENSION_EXTERNAL_INSTALL_ALERT_THEME; | 234 id = IDS_EXTENSION_EXTERNAL_INSTALL_ALERT_THEME; |
176 else | 235 else |
177 id = IDS_EXTENSION_EXTERNAL_INSTALL_ALERT_EXTENSION; | 236 id = IDS_EXTENSION_EXTERNAL_INSTALL_ALERT_EXTENSION; |
178 return l10n_util::GetStringFUTF16(id, UTF8ToUTF16(extension_->name())); | 237 return l10n_util::GetStringFUTF16(id, UTF8ToUTF16(extension_->name())); |
179 } | 238 } |
180 | 239 |
181 void ExternalInstallGlobalError::ExecuteMenuItem(Browser* browser) { | 240 void ExternalInstallMenuAlert::ExecuteMenuItem(Browser* browser) { |
182 ShowExternalInstallDialog(service_, browser, extension_); | 241 ShowExternalInstallDialog(service_, browser, extension_); |
183 } | 242 } |
184 | 243 |
185 bool ExternalInstallGlobalError::HasBubbleView() { | 244 bool ExternalInstallMenuAlert::HasBubbleView() { |
186 return false; | 245 return false; |
187 } | 246 } |
188 | 247 string16 ExternalInstallMenuAlert::GetBubbleViewTitle() { |
189 string16 ExternalInstallGlobalError::GetBubbleViewTitle() { | |
190 return string16(); | 248 return string16(); |
191 } | 249 } |
192 | 250 |
193 std::vector<string16> ExternalInstallGlobalError::GetBubbleViewMessages() { | 251 std::vector<string16> ExternalInstallMenuAlert::GetBubbleViewMessages() { |
194 return std::vector<string16>(); | 252 return std::vector<string16>(); |
195 } | 253 } |
196 | 254 |
197 string16 ExternalInstallGlobalError::GetBubbleViewAcceptButtonLabel() { | 255 string16 ExternalInstallMenuAlert::GetBubbleViewAcceptButtonLabel() { |
198 return string16(); | 256 return string16(); |
199 } | 257 } |
200 | 258 |
201 string16 ExternalInstallGlobalError::GetBubbleViewCancelButtonLabel() { | 259 string16 ExternalInstallMenuAlert::GetBubbleViewCancelButtonLabel() { |
202 return string16(); | 260 return string16(); |
203 } | 261 } |
204 | 262 |
205 void ExternalInstallGlobalError::OnBubbleViewDidClose(Browser* browser) { | 263 void ExternalInstallMenuAlert::OnBubbleViewDidClose(Browser* browser) { |
206 NOTREACHED(); | 264 NOTREACHED(); |
207 } | 265 } |
208 | 266 |
209 void ExternalInstallGlobalError::BubbleViewAcceptButtonPressed( | 267 void ExternalInstallMenuAlert::BubbleViewAcceptButtonPressed( |
210 Browser* browser) { | 268 Browser* browser) { |
211 NOTREACHED(); | 269 NOTREACHED(); |
212 } | 270 } |
213 | 271 |
214 void ExternalInstallGlobalError::BubbleViewCancelButtonPressed( | 272 void ExternalInstallMenuAlert::BubbleViewCancelButtonPressed( |
215 Browser* browser) { | 273 Browser* browser) { |
216 NOTREACHED(); | 274 NOTREACHED(); |
217 } | 275 } |
218 | 276 |
219 void ExternalInstallGlobalError::Observe( | 277 void ExternalInstallMenuAlert::Observe( |
220 int type, | 278 int type, |
221 const content::NotificationSource& source, | 279 const content::NotificationSource& source, |
222 const content::NotificationDetails& details) { | 280 const content::NotificationDetails& details) { |
223 const Extension* extension = NULL; | 281 const Extension* extension = NULL; |
224 // The error is invalidated if the extension has been reloaded or unloaded. | 282 // The error is invalidated if the extension has been reloaded or unloaded. |
225 if (type == chrome::NOTIFICATION_EXTENSION_LOADED) { | 283 if (type == chrome::NOTIFICATION_EXTENSION_LOADED) { |
226 extension = content::Details<const Extension>(details).ptr(); | 284 extension = content::Details<const Extension>(details).ptr(); |
227 } else { | 285 } else { |
228 DCHECK_EQ(chrome::NOTIFICATION_EXTENSION_UNLOADED, type); | 286 DCHECK_EQ(chrome::NOTIFICATION_EXTENSION_UNLOADED, type); |
229 extensions::UnloadedExtensionInfo* info = | 287 extensions::UnloadedExtensionInfo* info = |
230 content::Details<extensions::UnloadedExtensionInfo>(details).ptr(); | 288 content::Details<extensions::UnloadedExtensionInfo>(details).ptr(); |
231 extension = info->extension; | 289 extension = info->extension; |
232 } | 290 } |
233 if (extension == extension_) { | 291 if (extension == extension_) { |
234 GlobalErrorService* error_service = | 292 GlobalErrorService* error_service = |
235 GlobalErrorServiceFactory::GetForProfile(service_->profile()); | 293 GlobalErrorServiceFactory::GetForProfile(service_->profile()); |
236 error_service->RemoveGlobalError(this); | 294 error_service->RemoveGlobalError(this); |
237 service_->AcknowledgeExternalExtension(extension_->id()); | 295 service_->AcknowledgeExternalExtension(extension_->id()); |
238 delete this; | 296 delete this; |
239 } | 297 } |
240 } | 298 } |
241 | 299 |
| 300 // ExternalInstallGlobalError ----------------------------------------------- |
| 301 |
| 302 ExternalInstallGlobalError::ExternalInstallGlobalError( |
| 303 ExtensionService* service, |
| 304 const Extension* extension) |
| 305 : ExternalInstallMenuAlert(service, extension) { |
| 306 delegate_ = new ExternalInstallDialogDelegate( |
| 307 NULL, service_, extension_, this); |
| 308 } |
| 309 |
| 310 ExternalInstallGlobalError::~ExternalInstallGlobalError() { |
| 311 } |
| 312 |
| 313 void ExternalInstallGlobalError::ExecuteMenuItem(Browser* browser) { |
| 314 ShowBubbleView(browser); |
| 315 } |
| 316 |
| 317 bool ExternalInstallGlobalError::HasBubbleView() { |
| 318 return true; |
| 319 } |
| 320 |
| 321 string16 ExternalInstallGlobalError::GetBubbleViewTitle() { |
| 322 return prompt_->GetDialogTitle(); |
| 323 } |
| 324 |
| 325 std::vector<string16> ExternalInstallGlobalError::GetBubbleViewMessages() { |
| 326 std::vector<string16> messages; |
| 327 messages.push_back(prompt_->GetHeading()); |
| 328 if (prompt_->GetPermissionCount()) { |
| 329 messages.push_back(prompt_->GetPermissionsHeading()); |
| 330 for (size_t i = 0; i < prompt_->GetPermissionCount(); ++i) { |
| 331 messages.push_back(l10n_util::GetStringFUTF16( |
| 332 IDS_EXTENSION_PERMISSION_LINE, |
| 333 prompt_->GetPermission(i))); |
| 334 } |
| 335 } |
| 336 // TODO(yoz): OAuth issue advice? |
| 337 return messages; |
| 338 } |
| 339 |
| 340 string16 ExternalInstallGlobalError::GetBubbleViewAcceptButtonLabel() { |
| 341 return prompt_->GetAcceptButtonLabel(); |
| 342 } |
| 343 |
| 344 string16 ExternalInstallGlobalError::GetBubbleViewCancelButtonLabel() { |
| 345 return prompt_->GetAbortButtonLabel(); |
| 346 } |
| 347 |
| 348 void ExternalInstallGlobalError::OnBubbleViewDidClose(Browser* browser) { |
| 349 } |
| 350 |
| 351 void ExternalInstallGlobalError::BubbleViewAcceptButtonPressed( |
| 352 Browser* browser) { |
| 353 delegate_->InstallUIProceed(); |
| 354 } |
| 355 |
| 356 void ExternalInstallGlobalError::BubbleViewCancelButtonPressed( |
| 357 Browser* browser) { |
| 358 delegate_->InstallUIAbort(true); |
| 359 } |
| 360 |
242 // Public interface --------------------------------------------------------- | 361 // Public interface --------------------------------------------------------- |
243 | 362 |
244 bool AddExternalInstallError(ExtensionService* service, | 363 bool AddExternalInstallError(ExtensionService* service, |
245 const Extension* extension) { | 364 const Extension* extension) { |
246 GlobalErrorService* error_service = | 365 GlobalErrorService* error_service = |
247 GlobalErrorServiceFactory::GetForProfile(service->profile()); | 366 GlobalErrorServiceFactory::GetForProfile(service->profile()); |
248 GlobalError* error = error_service->GetGlobalErrorByMenuItemCommandID( | 367 GlobalError* error = error_service->GetGlobalErrorByMenuItemCommandID( |
249 kMenuCommandId); | 368 kMenuCommandId); |
250 if (error) | 369 if (error) |
251 return false; | 370 return false; |
252 | 371 |
253 error_service->AddGlobalError( | 372 if (UseBubbleInstall(extension)) { |
254 new ExternalInstallGlobalError(service, extension)); | 373 error_service->AddGlobalError( |
| 374 new ExternalInstallGlobalError(service, extension)); |
| 375 } else { |
| 376 error_service->AddGlobalError( |
| 377 new ExternalInstallMenuAlert(service, extension)); |
| 378 } |
255 return true; | 379 return true; |
256 } | 380 } |
257 | 381 |
258 void RemoveExternalInstallError(ExtensionService* service) { | 382 void RemoveExternalInstallError(ExtensionService* service) { |
259 GlobalErrorService* error_service = | 383 GlobalErrorService* error_service = |
260 GlobalErrorServiceFactory::GetForProfile(service->profile()); | 384 GlobalErrorServiceFactory::GetForProfile(service->profile()); |
261 GlobalError* error = error_service->GetGlobalErrorByMenuItemCommandID( | 385 GlobalError* error = error_service->GetGlobalErrorByMenuItemCommandID( |
262 kMenuCommandId); | 386 kMenuCommandId); |
263 if (error) { | 387 if (error) { |
264 error_service->RemoveGlobalError(error); | 388 error_service->RemoveGlobalError(error); |
265 delete error; | 389 delete error; |
266 } | 390 } |
267 } | 391 } |
268 | 392 |
269 bool HasExternalInstallError(ExtensionService* service) { | 393 bool HasExternalInstallError(ExtensionService* service) { |
270 GlobalErrorService* error_service = | 394 GlobalErrorService* error_service = |
271 GlobalErrorServiceFactory::GetForProfile(service->profile()); | 395 GlobalErrorServiceFactory::GetForProfile(service->profile()); |
272 GlobalError* error = error_service->GetGlobalErrorByMenuItemCommandID( | 396 GlobalError* error = error_service->GetGlobalErrorByMenuItemCommandID( |
273 kMenuCommandId); | 397 kMenuCommandId); |
274 return !!error; | 398 return !!error; |
275 } | 399 } |
276 | 400 |
277 } // namespace extensions | 401 } // namespace extensions |
OLD | NEW |