| OLD | NEW |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |