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

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: 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 27 matching lines...) Expand all
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,
358 settings_api_bubble.PassAs<ExtensionMessageBubbleController>());
359 views::BubbleDelegateView::CreateBubble(bubble_delegate);
360 weak_controller->Show(bubble_delegate);
361
362 return true; 363 return true;
363 } 364 }
364 365
366 bool ExtensionMessageBubbleFactory::MaybeShowProxyOverrideExtensionsBubble(
367 views::View* anchor_view) {
368 #if !defined(OS_WIN)
369 return false;
Devlin 2014/05/20 17:26:31 Hopefully no compilers complain that lines 371-386
Finnur 2014/05/21 16:30:32 Meh... less code to compile on other platforms...
370 #endif
371
372 DCHECK(!shown_proxy_override_extensions_bubble_);
373
374 const Extension* extension = OverridesProxy(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);
386 return true;
387 }
388
365 bool ExtensionMessageBubbleFactory::MaybeShowDevModeExtensionsBubble( 389 bool ExtensionMessageBubbleFactory::MaybeShowDevModeExtensionsBubble(
366 views::View* anchor_view) { 390 views::View* anchor_view) {
367 DCHECK(!shown_dev_mode_extensions_bubble_); 391 DCHECK(!shown_dev_mode_extensions_bubble_);
368 392
369 // Check the Developer Mode extensions. 393 // Check the Developer Mode extensions.
370 scoped_ptr<DevModeBubbleController> dev_mode_extensions( 394 scoped_ptr<DevModeBubbleController> dev_mode_extensions(
371 new DevModeBubbleController(profile_)); 395 new DevModeBubbleController(profile_));
372 396
373 // Return early if we have none to show. 397 // Return early if we have none to show.
374 if (!dev_mode_extensions->ShouldShow()) 398 if (!dev_mode_extensions->ShouldShow())
375 return false; 399 return false;
376 400
377 shown_dev_mode_extensions_bubble_ = true; 401 shown_dev_mode_extensions_bubble_ = true;
378 402 PrepareToHighlightExtensions(
379 // We should be in the start stage (i.e., should not have a pending attempt to 403 dev_mode_extensions.PassAs<ExtensionMessageBubbleController>(),
380 // show a bubble). 404 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; 405 return true;
396 } 406 }
397 407
398 void ExtensionMessageBubbleFactory::MaybeObserve() { 408 void ExtensionMessageBubbleFactory::MaybeObserve() {
399 if (!is_observing_) { 409 if (!is_observing_) {
400 is_observing_ = true; 410 is_observing_ = true;
401 container_->AddObserver(this); 411 container_->AddObserver(this);
402 } 412 }
403 } 413 }
404 414
405 void ExtensionMessageBubbleFactory::MaybeStopObserving() { 415 void ExtensionMessageBubbleFactory::MaybeStopObserving() {
406 if (is_observing_) { 416 if (is_observing_) {
407 is_observing_ = false; 417 is_observing_ = false;
408 container_->RemoveObserver(this); 418 container_->RemoveObserver(this);
409 } 419 }
410 } 420 }
411 421
412 void ExtensionMessageBubbleFactory::RecordProfileCheck(Profile* profile) { 422 void ExtensionMessageBubbleFactory::RecordProfileCheck(Profile* profile) {
413 g_profiles_evaluated.Get().insert(profile); 423 g_profiles_evaluated.Get().insert(profile);
414 } 424 }
415 425
416 bool ExtensionMessageBubbleFactory::IsInitialProfileCheck(Profile* profile) { 426 bool ExtensionMessageBubbleFactory::IsInitialProfileCheck(Profile* profile) {
417 return g_profiles_evaluated.Get().count(profile) == 0; 427 return g_profiles_evaluated.Get().count(profile) == 0;
418 } 428 }
419 429
420 void ExtensionMessageBubbleFactory::OnBrowserActionsContainerAnimationEnded() { 430 void ExtensionMessageBubbleFactory::OnBrowserActionsContainerAnimationEnded() {
421 MaybeStopObserving(); 431 MaybeStopObserving();
422 if (stage_ == STAGE_START) { 432 if (stage_ == STAGE_START) {
423 HighlightDevModeExtensions(); 433 HighlightExtensions();
424 } else if (stage_ == STAGE_HIGHLIGHTED) { 434 } else if (stage_ == STAGE_HIGHLIGHTED) {
425 ShowDevModeBubble(); 435 ShowHighlightingBubble();
426 } else { // We shouldn't be observing if we've completed the process. 436 } else { // We shouldn't be observing if we've completed the process.
427 NOTREACHED(); 437 NOTREACHED();
428 Finish(); 438 Finish();
429 } 439 }
430 } 440 }
431 441
432 void ExtensionMessageBubbleFactory::OnBrowserActionsContainerDestroyed() { 442 void ExtensionMessageBubbleFactory::OnBrowserActionsContainerDestroyed() {
433 // If the container associated with the bubble is destroyed, abandon the 443 // If the container associated with the bubble is destroyed, abandon the
434 // process. 444 // process.
435 Finish(); 445 Finish();
436 } 446 }
437 447
438 void ExtensionMessageBubbleFactory::HighlightDevModeExtensions() { 448 void ExtensionMessageBubbleFactory::PrepareToHighlightExtensions(
449 scoped_ptr<ExtensionMessageBubbleController> controller,
450 views::View* anchor_view) {
451 // We should be in the start stage (i.e., should not have a pending attempt to
452 // show a bubble).
453 DCHECK_EQ(stage_, STAGE_START);
454
455 // Prepare to display and highlight the extensions before showing the bubble.
456 // Since this is an asynchronous process, set member variables for later use.
457 controller_ = controller.Pass();
458 anchor_view_ = anchor_view;
459 container_ = toolbar_view_->browser_actions();
460
461 if (container_->animating())
462 MaybeObserve();
463 else
464 HighlightExtensions();
465 }
466
467 void ExtensionMessageBubbleFactory::HighlightExtensions() {
439 DCHECK_EQ(STAGE_START, stage_); 468 DCHECK_EQ(STAGE_START, stage_);
440 stage_ = STAGE_HIGHLIGHTED; 469 stage_ = STAGE_HIGHLIGHTED;
441 470
442 const ExtensionIdList extension_list = controller_->GetExtensionIdList(); 471 const ExtensionIdList extension_list = controller_->GetExtensionIdList();
443 DCHECK(!extension_list.empty()); 472 DCHECK(!extension_list.empty());
444 ExtensionToolbarModel::Get(profile_)->HighlightExtensions(extension_list); 473 ExtensionToolbarModel::Get(profile_)->HighlightExtensions(extension_list);
445 if (container_->animating()) 474 if (container_->animating())
446 MaybeObserve(); 475 MaybeObserve();
447 else 476 else
448 ShowDevModeBubble(); 477 ShowHighlightingBubble();
449 } 478 }
450 479
451 void ExtensionMessageBubbleFactory::ShowDevModeBubble() { 480 void ExtensionMessageBubbleFactory::ShowHighlightingBubble() {
452 DCHECK_EQ(stage_, STAGE_HIGHLIGHTED); 481 DCHECK_EQ(stage_, STAGE_HIGHLIGHTED);
453 stage_ = STAGE_COMPLETE; 482 stage_ = STAGE_COMPLETE;
454 483
455 views::View* reference_view = NULL; 484 views::View* reference_view = NULL;
456 if (container_->num_browser_actions() > 0) 485 if (container_->num_browser_actions() > 0)
457 reference_view = container_->GetBrowserActionViewAt(0); 486 reference_view = container_->GetBrowserActionViewAt(0);
458 if (reference_view && reference_view->visible()) 487 if (reference_view && reference_view->visible())
459 anchor_view_ = reference_view; 488 anchor_view_ = reference_view;
460 489
461 DevModeBubbleController* weak_controller = controller_.get(); 490 ExtensionMessageBubbleController* weak_controller = controller_.get();
462 ExtensionMessageBubbleView* bubble_delegate = new ExtensionMessageBubbleView( 491 ExtensionMessageBubbleView* bubble_delegate =
463 anchor_view_, 492 new ExtensionMessageBubbleView(
464 views::BubbleBorder::TOP_RIGHT, 493 anchor_view_,
465 scoped_ptr<ExtensionMessageBubbleController>(controller_.release())); 494 views::BubbleBorder::TOP_RIGHT,
495 scoped_ptr<ExtensionMessageBubbleController>(
496 controller_.release()));
466 views::BubbleDelegateView::CreateBubble(bubble_delegate); 497 views::BubbleDelegateView::CreateBubble(bubble_delegate);
467 weak_controller->Show(bubble_delegate); 498 weak_controller->Show(bubble_delegate);
468 499
469 Finish(); 500 Finish();
470 } 501 }
471 502
472 void ExtensionMessageBubbleFactory::Finish() { 503 void ExtensionMessageBubbleFactory::Finish() {
473 MaybeStopObserving(); 504 MaybeStopObserving();
474 controller_.reset(); 505 controller_.reset();
475 anchor_view_ = NULL; 506 anchor_view_ = NULL;
476 container_ = NULL; 507 container_ = NULL;
477 } 508 }
478 509
479 } // namespace extensions 510 } // namespace extensions
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698