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 3 // found in the LICENSE file. 4 5 #ifndef CHROME_BROWSER_UI_VIEWS_EXTENSIONS_EXTENSION_MESSAGE_BUBBLE_VIEW_H_ 6 #define CHROME_BROWSER_UI_VIEWS_EXTENSIONS_EXTENSION_MESSAGE_BUBBLE_VIEW_H_ 7 8 #include "base/compiler_specific.h" 9 #include "base/macros.h" 10 #include "base/memory/scoped_ptr.h" 11 #include "chrome/browser/extensions/extension_message_bubble.h" 12 #include "chrome/browser/ui/views/toolbar/browser_actions_container_observer.h" 13 #include "ui/views/bubble/bubble_delegate.h" 14 #include "ui/views/controls/button/button.h" 15 #include "ui/views/controls/link_listener.h" 16 17 class Profile; 18 class BrowserActionsContainer; 19 class ToolbarView; 20 21 namespace views { 22 class Label; 23 class LabelButton; 24 class View; 25 } 26 27 namespace extensions { 28 29 class DevModeBubbleController; 30 class ExtensionMessageBubbleController; 31 32 // Create and show ExtensionMessageBubbles for either extensions that look 33 // suspicious and have therefore been disabled, or for extensions that are 34 // running in developer mode that we want to warn the user about. 35 // Calling MaybeShow() will show one of the bubbles, if there is cause to (we 36 // don't show both in order to avoid spamminess). The suspicious extensions 37 // bubble takes priority over the developer mode extensions bubble. 38 class ExtensionMessageBubbleFactory : public BrowserActionsContainerObserver { 39 public: 40 ExtensionMessageBubbleFactory(Profile* profile, ToolbarView* toolbar_view); 41 virtual ~ExtensionMessageBubbleFactory(); 42 43 void MaybeShow(views::View* anchor_view); 44 45 private: 46 // The stage of showing the developer mode extensions bubble. STAGE_START 47 // corresponds to the beginning of the process, when nothing has been done. 48 // STAGE_HIGHLIGHTED indicates that the toolbar should be highlighting 49 // dangerous extensions. STAGE_COMPLETE means that the process should be 50 // ended. 51 enum Stage { STAGE_START, STAGE_HIGHLIGHTED, STAGE_COMPLETE }; 52 53 // Shows the suspicious extensions bubble, if there are suspicious extensions 54 // and we have not done so already. 55 // Returns true if we have show the view. 56 bool MaybeShowSuspiciousExtensionsBubble(views::View* anchor_view); 57 58 // Shows the settings API extensions bubble, if there are extensions 59 // overriding the startup pages and we have not done so already. 60 // Returns true if we show the view (or start the process). 61 bool MaybeShowStartupOverrideExtensionsBubble(views::View* anchor_view); 62 63 // Shows the bubble for when there are extensions overriding the proxy (if we 64 // have not done so already). Returns true if we show the view (or start the 65 // process of doing so). 66 bool MaybeShowProxyOverrideExtensionsBubble(views::View* anchor_view); 67 68 // Shows the developer mode extensions bubble, if there are extensions running 69 // in developer mode and we have not done so already. 70 // Returns true if we show the view (or start the process). 71 bool MaybeShowDevModeExtensionsBubble(views::View* anchor_view); 72 73 // Starts or stops observing the BrowserActionsContainer, if necessary. 74 void MaybeObserve(); 75 void MaybeStopObserving(); 76 77 // Adds |profile| to the list of profiles that have been evaluated for showing 78 // a bubble. Handy for things that only want to check once per profile. 79 void RecordProfileCheck(Profile* profile); 80 // Returns false if this profile has been evaluated before. 81 bool IsInitialProfileCheck(Profile* profile); 82 83 // BrowserActionsContainer::Observer implementation. 84 virtual void OnBrowserActionsContainerAnimationEnded() OVERRIDE; 85 virtual void OnBrowserActionsContainerDestroyed() OVERRIDE; 86 87 // Sets the stage for highlighting extensions and then showing the bubble 88 // controlled by |controller|, anchored to |anchor_view|. 89 void PrepareToHighlightExtensions( 90 scoped_ptr<ExtensionMessageBubbleController> controller, 91 views::View* anchor_view); 92 93 // Inform the ExtensionToolbarModel to highlight the appropriate extensions. 94 void HighlightExtensions(); 95 96 // Shows the waiting bubbble, after highlighting the extensions. 97 void ShowHighlightingBubble(); 98 99 // Finishes the process of showing the developer mode bubble. 100 void Finish(); 101 102 // The associated profile. 103 Profile* profile_; 104 105 // The toolbar view that the ExtensionMessageBubbleViews will attach to. 106 ToolbarView* toolbar_view_; 107 108 // Whether or not we have shown the suspicious extensions bubble. 109 bool shown_suspicious_extensions_bubble_; 110 111 // Whether or not we have shown the Settings API extensions bubble notifying 112 // the user about the startup pages being overridden. 113 bool shown_startup_override_extensions_bubble_; 114 115 // Whether or not we have shown the bubble notifying the user about the proxy 116 // being overridden. 117 bool shown_proxy_override_extensions_bubble_; 118 119 // Whether or not we have shown the developer mode extensions bubble. 120 bool shown_dev_mode_extensions_bubble_; 121 122 // Whether or not we are already observing the BrowserActionsContainer (so 123 // we don't add ourselves twice). 124 bool is_observing_; 125 126 // The current stage of showing the bubble. 127 Stage stage_; 128 129 // The BrowserActionsContainer for the profile. This will be NULL if the 130 // factory is not currently in the process of showing a bubble. 131 BrowserActionsContainer* container_; 132 133 // The default view to anchor the bubble to. This will be NULL if the factory 134 // is not currently in the process of showing a bubble. 135 views::View* anchor_view_; 136 137 // The controller to show a bubble for. This will be NULL if the factory is 138 // not currently in the process of showing a bubble. 139 scoped_ptr<ExtensionMessageBubbleController> controller_; 140 141 DISALLOW_COPY_AND_ASSIGN(ExtensionMessageBubbleFactory); 142 }; 143 144 // This is a class that implements the UI for the bubble showing which 145 // extensions look suspicious and have therefore been automatically disabled. 146 class ExtensionMessageBubbleView : public ExtensionMessageBubble, 147 public views::BubbleDelegateView, 148 public views::ButtonListener, 149 public views::LinkListener { 150 public: 151 ExtensionMessageBubbleView( 152 views::View* anchor_view, 153 views::BubbleBorder::Arrow arrow_location, 154 scoped_ptr<ExtensionMessageBubbleController> controller); 155 156 // ExtensionMessageBubble methods. 157 virtual void OnActionButtonClicked(const base::Closure& callback) OVERRIDE; 158 virtual void OnDismissButtonClicked(const base::Closure& callback) OVERRIDE; 159 virtual void OnLinkClicked(const base::Closure& callback) OVERRIDE; 160 virtual void Show() OVERRIDE; 161 162 // WidgetObserver methods. 163 virtual void OnWidgetDestroying(views::Widget* widget) OVERRIDE; 164 165 private: 166 virtual ~ExtensionMessageBubbleView(); 167 168 void ShowBubble(); 169 170 // views::BubbleDelegateView overrides: 171 virtual void Init() OVERRIDE; 172 173 // views::ButtonListener implementation. 174 virtual void ButtonPressed(views::Button* sender, 175 const ui::Event& event) OVERRIDE; 176 177 // views::LinkListener implementation. 178 virtual void LinkClicked(views::Link* source, int event_flags) OVERRIDE; 179 180 // views::View implementation. 181 virtual void GetAccessibleState(ui::AXViewState* state) OVERRIDE; 182 virtual void ViewHierarchyChanged(const ViewHierarchyChangedDetails& details) 183 OVERRIDE; 184 185 // The controller for this bubble. 186 scoped_ptr<ExtensionMessageBubbleController> controller_; 187 188 // The view this bubble is anchored against. 189 views::View* anchor_view_; 190 191 // The headline, labels and buttons on the bubble. 192 views::Label* headline_; 193 views::Link* learn_more_; 194 views::LabelButton* action_button_; 195 views::LabelButton* dismiss_button_; 196 197 // All actions (link, button, esc) close the bubble, but we need to 198 // make sure we don't send dismiss if the link was clicked. 199 bool link_clicked_; 200 bool action_taken_; 201 202 // Callbacks into the controller. 203 base::Closure action_callback_; 204 base::Closure dismiss_callback_; 205 base::Closure link_callback_; 206 207 base::WeakPtrFactory<ExtensionMessageBubbleView> weak_factory_; 208 209 DISALLOW_COPY_AND_ASSIGN(ExtensionMessageBubbleView); 210 }; 211 212 } // namespace extensions 213 214 #endif // CHROME_BROWSER_UI_VIEWS_EXTENSIONS_EXTENSION_MESSAGE_BUBBLE_VIEW_H_ 215