// Copyright (c) 2013 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef CHROME_BROWSER_EXTENSIONS_EXTENSION_MESSAGE_BUBBLE_CONTROLLER_H_ #define CHROME_BROWSER_EXTENSIONS_EXTENSION_MESSAGE_BUBBLE_CONTROLLER_H_ #include #include "chrome/browser/extensions/extension_message_bubble.h" #include "extensions/browser/browser_context_keyed_api_factory.h" #include "extensions/common/extension.h" class Browser; class Profile; namespace extensions { class ExtensionPrefs; class SuspiciousExtensionBubble; class ExtensionMessageBubbleController { public: // UMA histogram constants. enum BubbleAction { ACTION_LEARN_MORE = 0, ACTION_EXECUTE, ACTION_DISMISS, ACTION_BOUNDARY, // Must be the last value. }; class Delegate { public: Delegate(); virtual ~Delegate(); virtual bool ShouldIncludeExtension(const std::string& extension_id) = 0; virtual void AcknowledgeExtension( const std::string& extension_id, BubbleAction action) = 0; virtual void PerformAction(const ExtensionIdList& list) = 0; virtual void OnClose() {} // Text for various UI labels shown in the bubble. virtual base::string16 GetTitle() const = 0; // Fetches the message to show in the body. |anchored_to_browser_action| // will be true if the bubble is anchored against a specific extension // icon, allowing the bubble to show a different message than when it is // anchored against something else (e.g. show "This extension has..." // instead of "An extension has..."). virtual base::string16 GetMessageBody( bool anchored_to_browser_action) const = 0; virtual base::string16 GetOverflowText( const base::string16& overflow_count) const = 0; virtual base::string16 GetLearnMoreLabel() const = 0; virtual GURL GetLearnMoreUrl() const = 0; virtual base::string16 GetActionButtonLabel() const = 0; virtual base::string16 GetDismissButtonLabel() const = 0; // Whether to show a list of extensions in the bubble. virtual bool ShouldShowExtensionList() const = 0; // In some cases, we want the delegate only to handle a single extension // and this sets which extension. virtual void RestrictToSingleExtension(const std::string& extension_id); // Record, through UMA, how many extensions were found. virtual void LogExtensionCount(size_t count) = 0; virtual void LogAction(BubbleAction action) = 0; }; ExtensionMessageBubbleController(Delegate* delegate, Profile* profile); virtual ~ExtensionMessageBubbleController(); Delegate* delegate() const { return delegate_.get(); } // Obtains a list of all extensions (by name) the controller knows about. std::vector GetExtensionList(); // Obtains a list of all extensions (by id) the controller knows about. const ExtensionIdList& GetExtensionIdList(); // Whether to close the bubble when it loses focus. virtual bool CloseOnDeactivate(); // Sets up the callbacks and shows the bubble. virtual void Show(ExtensionMessageBubble* bubble); // Callbacks from bubble. Declared virtual for testing purposes. virtual void OnBubbleAction(); virtual void OnBubbleDismiss(); virtual void OnLinkClicked(); private: // Iterate over the known extensions and acknowledge each one. void AcknowledgeExtensions(); // Get the data this class needs. ExtensionIdList* GetOrCreateExtensionList(); // A weak pointer to the profile we are associated with. Not owned by us. Profile* profile_; // The list of extensions found. ExtensionIdList extension_list_; // The action the user took in the bubble. BubbleAction user_action_; // Our delegate supplying information about what to show in the dialog. scoped_ptr delegate_; // Whether this class has initialized. bool initialized_; DISALLOW_COPY_AND_ASSIGN(ExtensionMessageBubbleController); }; } // namespace extensions #endif // CHROME_BROWSER_EXTENSIONS_EXTENSION_MESSAGE_BUBBLE_CONTROLLER_H_