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

Side by Side Diff: chrome/browser/extensions/external_install_ui.cc

Issue 14328029: Streamlined sideload UI for extensions from the webstore. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: 2 classes Created 7 years, 8 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 | Annotate | Revision Log
« no previous file with comments | « chrome/browser/extensions/extension_install_prompt.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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/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
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
OLDNEW
« no previous file with comments | « chrome/browser/extensions/extension_install_prompt.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698