Index: chrome/browser/ui/views/extensions/extension_message_bubble_view.cc |
diff --git a/chrome/browser/ui/views/extensions/extension_message_bubble_view.cc b/chrome/browser/ui/views/extensions/extension_message_bubble_view.cc |
index 578d693c599f3c1b9db7b2fdcbd6200f058d8c29..a2b70d479088a19c95ada0f5f36d95aad2d49982 100644 |
--- a/chrome/browser/ui/views/extensions/extension_message_bubble_view.cc |
+++ b/chrome/browser/ui/views/extensions/extension_message_bubble_view.cc |
@@ -7,24 +7,9 @@ |
#include "base/strings/string_number_conversions.h" |
#include "base/strings/string_util.h" |
#include "base/strings/utf_string_conversions.h" |
-#include "chrome/browser/extensions/dev_mode_bubble_controller.h" |
-#include "chrome/browser/extensions/extension_action_manager.h" |
#include "chrome/browser/extensions/extension_message_bubble_controller.h" |
-#include "chrome/browser/extensions/extension_service.h" |
-#include "chrome/browser/extensions/extension_toolbar_model.h" |
-#include "chrome/browser/extensions/proxy_overridden_bubble_controller.h" |
-#include "chrome/browser/extensions/settings_api_bubble_controller.h" |
-#include "chrome/browser/extensions/settings_api_helpers.h" |
-#include "chrome/browser/extensions/suspicious_extension_bubble_controller.h" |
-#include "chrome/browser/profiles/profile.h" |
#include "chrome/browser/ui/view_ids.h" |
-#include "chrome/browser/ui/views/frame/browser_view.h" |
-#include "chrome/browser/ui/views/toolbar/browser_actions_container.h" |
-#include "chrome/browser/ui/views/toolbar/browser_actions_container_observer.h" |
-#include "chrome/browser/ui/views/toolbar/toolbar_view.h" |
#include "chrome/grit/locale_settings.h" |
-#include "extensions/browser/extension_prefs.h" |
-#include "extensions/browser/extension_system.h" |
#include "ui/accessibility/ax_view_state.h" |
#include "ui/base/resource/resource_bundle.h" |
#include "ui/views/controls/button/label_button.h" |
@@ -36,9 +21,6 @@ |
namespace { |
-base::LazyInstance<std::set<Profile*> > g_profiles_evaluated = |
- LAZY_INSTANCE_INITIALIZER; |
- |
// Layout constants. |
const int kExtensionListPadding = 10; |
const int kInsetBottomRight = 13; |
@@ -79,21 +61,6 @@ ExtensionMessageBubbleView::ExtensionMessageBubbleView( |
set_anchor_view_insets(gfx::Insets(5, 0, 5, 0)); |
} |
-void ExtensionMessageBubbleView::OnActionButtonClicked( |
- const base::Closure& callback) { |
- action_callback_ = callback; |
-} |
- |
-void ExtensionMessageBubbleView::OnDismissButtonClicked( |
- const base::Closure& callback) { |
- dismiss_callback_ = callback; |
-} |
- |
-void ExtensionMessageBubbleView::OnLinkClicked( |
- const base::Closure& callback) { |
- link_callback_ = callback; |
-} |
- |
void ExtensionMessageBubbleView::Show() { |
// Not showing the bubble right away (during startup) has a few benefits: |
// We don't have to worry about focus being lost due to the Omnibox (or to |
@@ -114,7 +81,7 @@ void ExtensionMessageBubbleView::OnWidgetDestroying(views::Widget* widget) { |
// To catch Esc, we monitor destroy message. Unless the link has been clicked, |
// we assume Dismiss was the action taken. |
if (!link_clicked_ && !action_taken_) |
- dismiss_callback_.Run(); |
+ controller_->OnBubbleDismiss(); |
} |
//////////////////////////////////////////////////////////////////////////////// |
@@ -241,7 +208,7 @@ void ExtensionMessageBubbleView::ButtonPressed(views::Button* sender, |
const ui::Event& event) { |
if (sender == action_button_) { |
action_taken_ = true; |
- action_callback_.Run(); |
+ controller_->OnBubbleAction(); |
} else { |
DCHECK_EQ(dismiss_button_, sender); |
} |
@@ -252,7 +219,7 @@ void ExtensionMessageBubbleView::LinkClicked(views::Link* source, |
int event_flags) { |
DCHECK_EQ(learn_more_, source); |
link_clicked_ = true; |
- link_callback_.Run(); |
+ controller_->OnLinkClicked(); |
GetWidget()->Close(); |
} |
@@ -267,243 +234,4 @@ void ExtensionMessageBubbleView::ViewHierarchyChanged( |
NotifyAccessibilityEvent(ui::AX_EVENT_ALERT, true); |
} |
-//////////////////////////////////////////////////////////////////////////////// |
-// ExtensionMessageBubbleFactory |
- |
-ExtensionMessageBubbleFactory::ExtensionMessageBubbleFactory( |
- Profile* profile, |
- ToolbarView* toolbar_view) |
- : profile_(profile), |
- toolbar_view_(toolbar_view), |
- shown_suspicious_extensions_bubble_(false), |
- shown_startup_override_extensions_bubble_(false), |
- shown_proxy_override_extensions_bubble_(false), |
- shown_dev_mode_extensions_bubble_(false), |
- is_observing_(false), |
- stage_(STAGE_START), |
- container_(NULL), |
- anchor_view_(NULL) {} |
- |
-ExtensionMessageBubbleFactory::~ExtensionMessageBubbleFactory() { |
- MaybeStopObserving(); |
-} |
- |
-void ExtensionMessageBubbleFactory::MaybeShow(views::View* anchor_view) { |
-#if defined(OS_WIN) |
- bool is_initial_check = IsInitialProfileCheck(profile_->GetOriginalProfile()); |
- RecordProfileCheck(profile_->GetOriginalProfile()); |
- |
- // The list of suspicious extensions takes priority over the dev mode bubble |
- // and the settings API bubble, since that needs to be shown as soon as we |
- // disable something. The settings API bubble is shown on first startup after |
- // an extension has changed the startup pages and it is acceptable if that |
- // waits until the next startup because of the suspicious extension bubble. |
- // The dev mode bubble is not time sensitive like the other two so we'll catch |
- // the dev mode extensions on the next startup/next window that opens. That |
- // way, we're not too spammy with the bubbles. |
- if (!shown_suspicious_extensions_bubble_ && |
- MaybeShowSuspiciousExtensionsBubble(anchor_view)) |
- return; |
- |
- if (!shown_startup_override_extensions_bubble_ && |
- is_initial_check && |
- MaybeShowStartupOverrideExtensionsBubble(anchor_view)) |
- return; |
- |
- if (!shown_proxy_override_extensions_bubble_ && |
- MaybeShowProxyOverrideExtensionsBubble(anchor_view)) |
- return; |
- |
- if (!shown_dev_mode_extensions_bubble_) |
- MaybeShowDevModeExtensionsBubble(anchor_view); |
-#endif // OS_WIN |
-} |
- |
-bool ExtensionMessageBubbleFactory::MaybeShowSuspiciousExtensionsBubble( |
- views::View* anchor_view) { |
- DCHECK(!shown_suspicious_extensions_bubble_); |
- |
- scoped_ptr<SuspiciousExtensionBubbleController> suspicious_extensions( |
- new SuspiciousExtensionBubbleController(profile_)); |
- if (!suspicious_extensions->ShouldShow()) |
- return false; |
- |
- shown_suspicious_extensions_bubble_ = true; |
- SuspiciousExtensionBubbleController* weak_controller = |
- suspicious_extensions.get(); |
- ExtensionMessageBubbleView* bubble_delegate = |
- new ExtensionMessageBubbleView(anchor_view, |
- views::BubbleBorder::TOP_RIGHT, |
- suspicious_extensions.Pass()); |
- |
- views::BubbleDelegateView::CreateBubble(bubble_delegate); |
- weak_controller->Show(bubble_delegate); |
- |
- return true; |
-} |
- |
-bool ExtensionMessageBubbleFactory::MaybeShowStartupOverrideExtensionsBubble( |
- views::View* anchor_view) { |
-#if !defined(OS_WIN) |
- return false; |
-#else |
- DCHECK(!shown_startup_override_extensions_bubble_); |
- |
- const Extension* extension = GetExtensionOverridingStartupPages(profile_); |
- if (!extension) |
- return false; |
- |
- scoped_ptr<SettingsApiBubbleController> settings_api_bubble( |
- new SettingsApiBubbleController(profile_, |
- BUBBLE_TYPE_STARTUP_PAGES)); |
- if (!settings_api_bubble->ShouldShow(extension->id())) |
- return false; |
- |
- shown_startup_override_extensions_bubble_ = true; |
- PrepareToHighlightExtensions(settings_api_bubble.Pass(), anchor_view); |
- return true; |
-#endif |
-} |
- |
-bool ExtensionMessageBubbleFactory::MaybeShowProxyOverrideExtensionsBubble( |
- views::View* anchor_view) { |
-#if !defined(OS_WIN) |
- return false; |
-#else |
- DCHECK(!shown_proxy_override_extensions_bubble_); |
- |
- const Extension* extension = GetExtensionOverridingProxy(profile_); |
- if (!extension) |
- return false; |
- |
- scoped_ptr<ProxyOverriddenBubbleController> proxy_bubble( |
- new ProxyOverriddenBubbleController(profile_)); |
- if (!proxy_bubble->ShouldShow(extension->id())) |
- return false; |
- |
- shown_proxy_override_extensions_bubble_ = true; |
- PrepareToHighlightExtensions(proxy_bubble.Pass(), anchor_view); |
- return true; |
-#endif |
-} |
- |
-bool ExtensionMessageBubbleFactory::MaybeShowDevModeExtensionsBubble( |
- views::View* anchor_view) { |
- DCHECK(!shown_dev_mode_extensions_bubble_); |
- |
- // Check the Developer Mode extensions. |
- scoped_ptr<DevModeBubbleController> dev_mode_extensions( |
- new DevModeBubbleController(profile_)); |
- |
- // Return early if we have none to show. |
- if (!dev_mode_extensions->ShouldShow()) |
- return false; |
- |
- shown_dev_mode_extensions_bubble_ = true; |
- PrepareToHighlightExtensions(dev_mode_extensions.Pass(), anchor_view); |
- return true; |
-} |
- |
-void ExtensionMessageBubbleFactory::MaybeObserve() { |
- if (!is_observing_) { |
- is_observing_ = true; |
- container_->AddObserver(this); |
- } |
-} |
- |
-void ExtensionMessageBubbleFactory::MaybeStopObserving() { |
- if (is_observing_) { |
- is_observing_ = false; |
- container_->RemoveObserver(this); |
- } |
-} |
- |
-void ExtensionMessageBubbleFactory::RecordProfileCheck(Profile* profile) { |
- g_profiles_evaluated.Get().insert(profile); |
-} |
- |
-bool ExtensionMessageBubbleFactory::IsInitialProfileCheck(Profile* profile) { |
- return g_profiles_evaluated.Get().count(profile) == 0; |
-} |
- |
-void ExtensionMessageBubbleFactory::OnBrowserActionsContainerAnimationEnded() { |
- MaybeStopObserving(); |
- if (stage_ == STAGE_START) { |
- HighlightExtensions(); |
- } else if (stage_ == STAGE_HIGHLIGHTED) { |
- ShowHighlightingBubble(); |
- } else { // We shouldn't be observing if we've completed the process. |
- NOTREACHED(); |
- Finish(); |
- } |
-} |
- |
-void ExtensionMessageBubbleFactory::OnBrowserActionsContainerDestroyed() { |
- // If the container associated with the bubble is destroyed, abandon the |
- // process. |
- Finish(); |
-} |
- |
-void ExtensionMessageBubbleFactory::PrepareToHighlightExtensions( |
- scoped_ptr<ExtensionMessageBubbleController> controller, |
- views::View* anchor_view) { |
- // We should be in the start stage (i.e., should not have a pending attempt to |
- // show a bubble). |
- DCHECK_EQ(stage_, STAGE_START); |
- |
- // Prepare to display and highlight the extensions before showing the bubble. |
- // Since this is an asynchronous process, set member variables for later use. |
- controller_ = controller.Pass(); |
- anchor_view_ = anchor_view; |
- container_ = toolbar_view_->browser_actions(); |
- |
- if (container_->animating()) |
- MaybeObserve(); |
- else |
- HighlightExtensions(); |
-} |
- |
-void ExtensionMessageBubbleFactory::HighlightExtensions() { |
- DCHECK_EQ(STAGE_START, stage_); |
- stage_ = STAGE_HIGHLIGHTED; |
- |
- const ExtensionIdList extension_list = controller_->GetExtensionIdList(); |
- DCHECK(!extension_list.empty()); |
- ExtensionToolbarModel::Get(profile_)->HighlightExtensions(extension_list); |
- if (container_->animating()) |
- MaybeObserve(); |
- else |
- ShowHighlightingBubble(); |
-} |
- |
-void ExtensionMessageBubbleFactory::ShowHighlightingBubble() { |
- DCHECK_EQ(stage_, STAGE_HIGHLIGHTED); |
- stage_ = STAGE_COMPLETE; |
- |
- views::View* reference_view = NULL; |
- if (container_->num_toolbar_actions() > 0u) |
- reference_view = container_->GetToolbarActionViewAt(0); |
- if (reference_view && reference_view->visible()) |
- anchor_view_ = reference_view; |
- |
- ExtensionMessageBubbleController* weak_controller = controller_.get(); |
- ExtensionMessageBubbleView* bubble_delegate = |
- new ExtensionMessageBubbleView( |
- anchor_view_, |
- views::BubbleBorder::TOP_RIGHT, |
- scoped_ptr<ExtensionMessageBubbleController>( |
- controller_.release())); |
- views::BubbleDelegateView::CreateBubble(bubble_delegate); |
- weak_controller->Show(bubble_delegate); |
- |
- Finish(); |
-} |
- |
-void ExtensionMessageBubbleFactory::Finish() { |
- MaybeStopObserving(); |
- controller_.reset(); |
- anchor_view_ = NULL; |
- container_ = NULL; |
-} |
- |
} // namespace extensions |