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

Side by Side Diff: chrome/browser/ui/views/extensions/extension_message_bubble_view.cc

Issue 288923004: Add an extension override bubble and warning box for proxy extensions. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Address review comments Created 6 years, 7 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
OLDNEW
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2013 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/ui/views/extensions/extension_message_bubble_view.h" 5 #include "chrome/browser/ui/views/extensions/extension_message_bubble_view.h"
6 6
7 #include "base/strings/string_number_conversions.h" 7 #include "base/strings/string_number_conversions.h"
8 #include "base/strings/string_util.h" 8 #include "base/strings/string_util.h"
9 #include "base/strings/utf_string_conversions.h" 9 #include "base/strings/utf_string_conversions.h"
10 #include "chrome/browser/extensions/dev_mode_bubble_controller.h" 10 #include "chrome/browser/extensions/dev_mode_bubble_controller.h"
11 #include "chrome/browser/extensions/extension_action_manager.h" 11 #include "chrome/browser/extensions/extension_action_manager.h"
12 #include "chrome/browser/extensions/extension_message_bubble_controller.h" 12 #include "chrome/browser/extensions/extension_message_bubble_controller.h"
13 #include "chrome/browser/extensions/extension_service.h" 13 #include "chrome/browser/extensions/extension_service.h"
14 #include "chrome/browser/extensions/proxy_overridden_bubble_controller.h"
14 #include "chrome/browser/extensions/settings_api_bubble_controller.h" 15 #include "chrome/browser/extensions/settings_api_bubble_controller.h"
15 #include "chrome/browser/extensions/settings_api_helpers.h" 16 #include "chrome/browser/extensions/settings_api_helpers.h"
16 #include "chrome/browser/extensions/suspicious_extension_bubble_controller.h" 17 #include "chrome/browser/extensions/suspicious_extension_bubble_controller.h"
17 #include "chrome/browser/profiles/profile.h" 18 #include "chrome/browser/profiles/profile.h"
18 #include "chrome/browser/ui/views/frame/browser_view.h" 19 #include "chrome/browser/ui/views/frame/browser_view.h"
19 #include "chrome/browser/ui/views/toolbar/browser_actions_container.h" 20 #include "chrome/browser/ui/views/toolbar/browser_actions_container.h"
20 #include "chrome/browser/ui/views/toolbar/browser_actions_container_observer.h" 21 #include "chrome/browser/ui/views/toolbar/browser_actions_container_observer.h"
21 #include "chrome/browser/ui/views/toolbar/toolbar_view.h" 22 #include "chrome/browser/ui/views/toolbar/toolbar_view.h"
22 #include "extensions/browser/extension_prefs.h" 23 #include "extensions/browser/extension_prefs.h"
23 #include "extensions/browser/extension_system.h" 24 #include "extensions/browser/extension_system.h"
(...skipping 241 matching lines...) Expand 10 before | Expand all | Expand 10 after
265 //////////////////////////////////////////////////////////////////////////////// 266 ////////////////////////////////////////////////////////////////////////////////
266 // ExtensionMessageBubbleFactory 267 // ExtensionMessageBubbleFactory
267 268
268 ExtensionMessageBubbleFactory::ExtensionMessageBubbleFactory( 269 ExtensionMessageBubbleFactory::ExtensionMessageBubbleFactory(
269 Profile* profile, 270 Profile* profile,
270 ToolbarView* toolbar_view) 271 ToolbarView* toolbar_view)
271 : profile_(profile), 272 : profile_(profile),
272 toolbar_view_(toolbar_view), 273 toolbar_view_(toolbar_view),
273 shown_suspicious_extensions_bubble_(false), 274 shown_suspicious_extensions_bubble_(false),
274 shown_startup_override_extensions_bubble_(false), 275 shown_startup_override_extensions_bubble_(false),
276 shown_proxy_override_extensions_bubble_(false),
275 shown_dev_mode_extensions_bubble_(false), 277 shown_dev_mode_extensions_bubble_(false),
276 is_observing_(false), 278 is_observing_(false),
277 stage_(STAGE_START), 279 stage_(STAGE_START),
278 container_(NULL), 280 container_(NULL),
279 anchor_view_(NULL) {} 281 anchor_view_(NULL) {}
280 282
281 ExtensionMessageBubbleFactory::~ExtensionMessageBubbleFactory() { 283 ExtensionMessageBubbleFactory::~ExtensionMessageBubbleFactory() {
282 MaybeStopObserving(); 284 MaybeStopObserving();
283 } 285 }
284 286
(...skipping 12 matching lines...) Expand all
297 // way, we're not too spammy with the bubbles. 299 // way, we're not too spammy with the bubbles.
298 if (!shown_suspicious_extensions_bubble_ && 300 if (!shown_suspicious_extensions_bubble_ &&
299 MaybeShowSuspiciousExtensionsBubble(anchor_view)) 301 MaybeShowSuspiciousExtensionsBubble(anchor_view))
300 return; 302 return;
301 303
302 if (!shown_startup_override_extensions_bubble_ && 304 if (!shown_startup_override_extensions_bubble_ &&
303 is_initial_check && 305 is_initial_check &&
304 MaybeShowStartupOverrideExtensionsBubble(anchor_view)) 306 MaybeShowStartupOverrideExtensionsBubble(anchor_view))
305 return; 307 return;
306 308
309 if (!shown_proxy_override_extensions_bubble_ &&
310 MaybeShowProxyOverrideExtensionsBubble(anchor_view))
311 return;
312
307 if (!shown_dev_mode_extensions_bubble_) 313 if (!shown_dev_mode_extensions_bubble_)
308 MaybeShowDevModeExtensionsBubble(anchor_view); 314 MaybeShowDevModeExtensionsBubble(anchor_view);
309 #endif // OS_WIN 315 #endif // OS_WIN
310 } 316 }
311 317
312 bool ExtensionMessageBubbleFactory::MaybeShowSuspiciousExtensionsBubble( 318 bool ExtensionMessageBubbleFactory::MaybeShowSuspiciousExtensionsBubble(
313 views::View* anchor_view) { 319 views::View* anchor_view) {
314 DCHECK(!shown_suspicious_extensions_bubble_); 320 DCHECK(!shown_suspicious_extensions_bubble_);
315 321
316 scoped_ptr<SuspiciousExtensionBubbleController> suspicious_extensions( 322 scoped_ptr<SuspiciousExtensionBubbleController> suspicious_extensions(
(...skipping 12 matching lines...) Expand all
329 views::BubbleDelegateView::CreateBubble(bubble_delegate); 335 views::BubbleDelegateView::CreateBubble(bubble_delegate);
330 weak_controller->Show(bubble_delegate); 336 weak_controller->Show(bubble_delegate);
331 337
332 return true; 338 return true;
333 } 339 }
334 340
335 bool ExtensionMessageBubbleFactory::MaybeShowStartupOverrideExtensionsBubble( 341 bool ExtensionMessageBubbleFactory::MaybeShowStartupOverrideExtensionsBubble(
336 views::View* anchor_view) { 342 views::View* anchor_view) {
337 #if !defined(OS_WIN) 343 #if !defined(OS_WIN)
338 return false; 344 return false;
339 #endif 345 #else
340
341 DCHECK(!shown_startup_override_extensions_bubble_); 346 DCHECK(!shown_startup_override_extensions_bubble_);
342 347
343 const Extension* extension = OverridesStartupPages(profile_, NULL); 348 const Extension* extension =
349 GetExtensionOverridingStartupPages(profile_, NULL);
344 if (!extension) 350 if (!extension)
345 return false; 351 return false;
346 352
347 scoped_ptr<SettingsApiBubbleController> settings_api_bubble( 353 scoped_ptr<SettingsApiBubbleController> settings_api_bubble(
348 new SettingsApiBubbleController(profile_, 354 new SettingsApiBubbleController(profile_,
349 BUBBLE_TYPE_STARTUP_PAGES)); 355 BUBBLE_TYPE_STARTUP_PAGES));
350 if (!settings_api_bubble->ShouldShow(extension->id())) 356 if (!settings_api_bubble->ShouldShow(extension->id()))
351 return false; 357 return false;
352 358
353 shown_startup_override_extensions_bubble_ = true; 359 shown_startup_override_extensions_bubble_ = true;
354 SettingsApiBubbleController* weak_controller = settings_api_bubble.get(); 360 PrepareToHighlightExtensions(
355 ExtensionMessageBubbleView* bubble_delegate = new ExtensionMessageBubbleView( 361 settings_api_bubble.PassAs<ExtensionMessageBubbleController>(),
356 anchor_view, 362 anchor_view);
357 views::BubbleBorder::TOP_RIGHT, 363 return true;
358 settings_api_bubble.PassAs<ExtensionMessageBubbleController>()); 364 #endif
359 views::BubbleDelegateView::CreateBubble(bubble_delegate); 365 }
360 weak_controller->Show(bubble_delegate);
361 366
367 bool ExtensionMessageBubbleFactory::MaybeShowProxyOverrideExtensionsBubble(
368 views::View* anchor_view) {
369 #if !defined(OS_WIN)
370 return false;
371 #else
372 DCHECK(!shown_proxy_override_extensions_bubble_);
373
374 const Extension* extension = GetExtensionOverridingProxy(profile_);
375 if (!extension)
376 return false;
377
378 scoped_ptr<ProxyOverriddenBubbleController> proxy_bubble(
379 new ProxyOverriddenBubbleController(profile_));
380 if (!proxy_bubble->ShouldShow(extension->id()))
381 return false;
382
383 shown_proxy_override_extensions_bubble_ = true;
384 PrepareToHighlightExtensions(
385 proxy_bubble.PassAs<ExtensionMessageBubbleController>(), anchor_view);
362 return true; 386 return true;
387 #endif
363 } 388 }
364 389
365 bool ExtensionMessageBubbleFactory::MaybeShowDevModeExtensionsBubble( 390 bool ExtensionMessageBubbleFactory::MaybeShowDevModeExtensionsBubble(
366 views::View* anchor_view) { 391 views::View* anchor_view) {
367 DCHECK(!shown_dev_mode_extensions_bubble_); 392 DCHECK(!shown_dev_mode_extensions_bubble_);
368 393
369 // Check the Developer Mode extensions. 394 // Check the Developer Mode extensions.
370 scoped_ptr<DevModeBubbleController> dev_mode_extensions( 395 scoped_ptr<DevModeBubbleController> dev_mode_extensions(
371 new DevModeBubbleController(profile_)); 396 new DevModeBubbleController(profile_));
372 397
373 // Return early if we have none to show. 398 // Return early if we have none to show.
374 if (!dev_mode_extensions->ShouldShow()) 399 if (!dev_mode_extensions->ShouldShow())
375 return false; 400 return false;
376 401
377 shown_dev_mode_extensions_bubble_ = true; 402 shown_dev_mode_extensions_bubble_ = true;
378 403 PrepareToHighlightExtensions(
379 // We should be in the start stage (i.e., should not have a pending attempt to 404 dev_mode_extensions.PassAs<ExtensionMessageBubbleController>(),
380 // show a bubble). 405 anchor_view);
381 DCHECK_EQ(stage_, STAGE_START);
382
383 // Prepare to display and highlight the developer mode extensions before
384 // showing the bubble. Since this is an asynchronous process, set member
385 // variables for later use.
386 controller_ = dev_mode_extensions.Pass();
387 anchor_view_ = anchor_view;
388 container_ = toolbar_view_->browser_actions();
389
390 if (container_->animating())
391 MaybeObserve();
392 else
393 HighlightDevModeExtensions();
394
395 return true; 406 return true;
396 } 407 }
397 408
398 void ExtensionMessageBubbleFactory::MaybeObserve() { 409 void ExtensionMessageBubbleFactory::MaybeObserve() {
399 if (!is_observing_) { 410 if (!is_observing_) {
400 is_observing_ = true; 411 is_observing_ = true;
401 container_->AddObserver(this); 412 container_->AddObserver(this);
402 } 413 }
403 } 414 }
404 415
405 void ExtensionMessageBubbleFactory::MaybeStopObserving() { 416 void ExtensionMessageBubbleFactory::MaybeStopObserving() {
406 if (is_observing_) { 417 if (is_observing_) {
407 is_observing_ = false; 418 is_observing_ = false;
408 container_->RemoveObserver(this); 419 container_->RemoveObserver(this);
409 } 420 }
410 } 421 }
411 422
412 void ExtensionMessageBubbleFactory::RecordProfileCheck(Profile* profile) { 423 void ExtensionMessageBubbleFactory::RecordProfileCheck(Profile* profile) {
413 g_profiles_evaluated.Get().insert(profile); 424 g_profiles_evaluated.Get().insert(profile);
414 } 425 }
415 426
416 bool ExtensionMessageBubbleFactory::IsInitialProfileCheck(Profile* profile) { 427 bool ExtensionMessageBubbleFactory::IsInitialProfileCheck(Profile* profile) {
417 return g_profiles_evaluated.Get().count(profile) == 0; 428 return g_profiles_evaluated.Get().count(profile) == 0;
418 } 429 }
419 430
420 void ExtensionMessageBubbleFactory::OnBrowserActionsContainerAnimationEnded() { 431 void ExtensionMessageBubbleFactory::OnBrowserActionsContainerAnimationEnded() {
421 MaybeStopObserving(); 432 MaybeStopObserving();
422 if (stage_ == STAGE_START) { 433 if (stage_ == STAGE_START) {
423 HighlightDevModeExtensions(); 434 HighlightExtensions();
424 } else if (stage_ == STAGE_HIGHLIGHTED) { 435 } else if (stage_ == STAGE_HIGHLIGHTED) {
425 ShowDevModeBubble(); 436 ShowHighlightingBubble();
426 } else { // We shouldn't be observing if we've completed the process. 437 } else { // We shouldn't be observing if we've completed the process.
427 NOTREACHED(); 438 NOTREACHED();
428 Finish(); 439 Finish();
429 } 440 }
430 } 441 }
431 442
432 void ExtensionMessageBubbleFactory::OnBrowserActionsContainerDestroyed() { 443 void ExtensionMessageBubbleFactory::OnBrowserActionsContainerDestroyed() {
433 // If the container associated with the bubble is destroyed, abandon the 444 // If the container associated with the bubble is destroyed, abandon the
434 // process. 445 // process.
435 Finish(); 446 Finish();
436 } 447 }
437 448
438 void ExtensionMessageBubbleFactory::HighlightDevModeExtensions() { 449 void ExtensionMessageBubbleFactory::PrepareToHighlightExtensions(
450 scoped_ptr<ExtensionMessageBubbleController> controller,
451 views::View* anchor_view) {
452 // We should be in the start stage (i.e., should not have a pending attempt to
453 // show a bubble).
454 DCHECK_EQ(stage_, STAGE_START);
455
456 // Prepare to display and highlight the extensions before showing the bubble.
457 // Since this is an asynchronous process, set member variables for later use.
458 controller_ = controller.Pass();
459 anchor_view_ = anchor_view;
460 container_ = toolbar_view_->browser_actions();
461
462 if (container_->animating())
463 MaybeObserve();
464 else
465 HighlightExtensions();
466 }
467
468 void ExtensionMessageBubbleFactory::HighlightExtensions() {
439 DCHECK_EQ(STAGE_START, stage_); 469 DCHECK_EQ(STAGE_START, stage_);
440 stage_ = STAGE_HIGHLIGHTED; 470 stage_ = STAGE_HIGHLIGHTED;
441 471
442 const ExtensionIdList extension_list = controller_->GetExtensionIdList(); 472 const ExtensionIdList extension_list = controller_->GetExtensionIdList();
443 DCHECK(!extension_list.empty()); 473 DCHECK(!extension_list.empty());
444 ExtensionToolbarModel::Get(profile_)->HighlightExtensions(extension_list); 474 ExtensionToolbarModel::Get(profile_)->HighlightExtensions(extension_list);
445 if (container_->animating()) 475 if (container_->animating())
446 MaybeObserve(); 476 MaybeObserve();
447 else 477 else
448 ShowDevModeBubble(); 478 ShowHighlightingBubble();
449 } 479 }
450 480
451 void ExtensionMessageBubbleFactory::ShowDevModeBubble() { 481 void ExtensionMessageBubbleFactory::ShowHighlightingBubble() {
452 DCHECK_EQ(stage_, STAGE_HIGHLIGHTED); 482 DCHECK_EQ(stage_, STAGE_HIGHLIGHTED);
453 stage_ = STAGE_COMPLETE; 483 stage_ = STAGE_COMPLETE;
454 484
455 views::View* reference_view = NULL; 485 views::View* reference_view = NULL;
456 if (container_->num_browser_actions() > 0) 486 if (container_->num_browser_actions() > 0)
457 reference_view = container_->GetBrowserActionViewAt(0); 487 reference_view = container_->GetBrowserActionViewAt(0);
458 if (reference_view && reference_view->visible()) 488 if (reference_view && reference_view->visible())
459 anchor_view_ = reference_view; 489 anchor_view_ = reference_view;
460 490
461 DevModeBubbleController* weak_controller = controller_.get(); 491 ExtensionMessageBubbleController* weak_controller = controller_.get();
462 ExtensionMessageBubbleView* bubble_delegate = new ExtensionMessageBubbleView( 492 ExtensionMessageBubbleView* bubble_delegate =
463 anchor_view_, 493 new ExtensionMessageBubbleView(
464 views::BubbleBorder::TOP_RIGHT, 494 anchor_view_,
465 scoped_ptr<ExtensionMessageBubbleController>(controller_.release())); 495 views::BubbleBorder::TOP_RIGHT,
496 scoped_ptr<ExtensionMessageBubbleController>(
497 controller_.release()));
466 views::BubbleDelegateView::CreateBubble(bubble_delegate); 498 views::BubbleDelegateView::CreateBubble(bubble_delegate);
467 weak_controller->Show(bubble_delegate); 499 weak_controller->Show(bubble_delegate);
468 500
469 Finish(); 501 Finish();
470 } 502 }
471 503
472 void ExtensionMessageBubbleFactory::Finish() { 504 void ExtensionMessageBubbleFactory::Finish() {
473 MaybeStopObserving(); 505 MaybeStopObserving();
474 controller_.reset(); 506 controller_.reset();
475 anchor_view_ = NULL; 507 anchor_view_ = NULL;
476 container_ = NULL; 508 container_ = NULL;
477 } 509 }
478 510
479 } // namespace extensions 511 } // namespace extensions
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698