|  | // Copyright 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_UI_EXTENSIONS_EXTENSION_INSTALLED_BUBBLE_H_ | 
|  | #define CHROME_BROWSER_UI_EXTENSIONS_EXTENSION_INSTALLED_BUBBLE_H_ | 
|  |  | 
|  | #include <string> | 
|  |  | 
|  | #include "base/macros.h" | 
|  | #include "base/memory/scoped_refptr.h" | 
|  | #include "base/strings/string16.h" | 
|  | #include "components/bubble/bubble_delegate.h" | 
|  | #include "third_party/skia/include/core/SkBitmap.h" | 
|  | #include "ui/gfx/native_widget_types.h" | 
|  |  | 
|  | class Browser; | 
|  |  | 
|  | namespace extensions { | 
|  | class Command; | 
|  | class Extension; | 
|  | } | 
|  |  | 
|  | namespace gfx { | 
|  | class Point; | 
|  | } | 
|  |  | 
|  | // Provides feedback to the user upon successful installation of an | 
|  | // extension. Depending on the type of extension, the Bubble will | 
|  | // point to: | 
|  | //    OMNIBOX_KEYWORD-> The omnibox. | 
|  | //    BROWSER_ACTION -> The browser action icon in the toolbar. | 
|  | //    PAGE_ACTION    -> A preview of the page action icon in the location | 
|  | //                      bar which is shown while the Bubble is shown. | 
|  | //    GENERIC        -> The app menu. This case includes page actions that | 
|  | //                      don't specify a default icon. | 
|  | // NB: This bubble is using the temporarily-deprecated bubble manager interface | 
|  | // BubbleUi. Do not copy this pattern. | 
|  | class ExtensionInstalledBubble : public BubbleDelegate { | 
|  | public: | 
|  | // The behavior and content of this Bubble comes in these varieties: | 
|  | enum BubbleType { | 
|  | OMNIBOX_KEYWORD, | 
|  | BROWSER_ACTION, | 
|  | PAGE_ACTION, | 
|  | GENERIC | 
|  | }; | 
|  |  | 
|  | // The different options to show in the installed bubble. | 
|  | enum Options { | 
|  | NONE = 0, | 
|  | HOW_TO_USE = 1 << 0, | 
|  | HOW_TO_MANAGE = 1 << 1, | 
|  | SHOW_KEYBINDING = 1 << 2, | 
|  | SIGN_IN_PROMO = 1 << 3, | 
|  | }; | 
|  |  | 
|  | // The different possible anchor positions. | 
|  | enum AnchorPosition { | 
|  | ANCHOR_ACTION, | 
|  | ANCHOR_OMNIBOX, | 
|  | ANCHOR_APP_MENU, | 
|  | }; | 
|  |  | 
|  | // Creates the ExtensionInstalledBubble and schedules it to be shown once | 
|  | // the extension has loaded. |extension| is the installed extension. |browser| | 
|  | // is the browser window which will host the bubble. |icon| is the install | 
|  | // icon of the extension. | 
|  | static void ShowBubble(scoped_refptr<const extensions::Extension> extension, | 
|  | Browser* browser, | 
|  | const SkBitmap& icon); | 
|  |  | 
|  | ExtensionInstalledBubble(scoped_refptr<const extensions::Extension> extension, | 
|  | Browser* browser, | 
|  | const SkBitmap& icon); | 
|  |  | 
|  | ~ExtensionInstalledBubble() override; | 
|  |  | 
|  | const extensions::Extension* extension() const { return extension_.get(); } | 
|  | Browser* browser() { return browser_; } | 
|  | const Browser* browser() const { return browser_; } | 
|  | const SkBitmap& icon() const { return icon_; } | 
|  | BubbleType type() const { return type_; } | 
|  | bool has_command_keybinding() const { return !!action_command_; } | 
|  | int options() const { return options_; } | 
|  | AnchorPosition anchor_position() const { return anchor_position_; } | 
|  |  | 
|  | // BubbleDelegate: | 
|  | std::unique_ptr<BubbleUi> BuildBubbleUi() override; | 
|  | bool ShouldClose(BubbleCloseReason reason) const override; | 
|  | std::string GetName() const override; | 
|  | const content::RenderFrameHost* OwningFrame() const override; | 
|  |  | 
|  | // Returns false if the bubble could not be shown immediately, because of an | 
|  | // animation (eg. adding a new browser action to the toolbar). | 
|  | // TODO(hcarmona): Detect animation in a platform-agnostic manner. | 
|  | bool ShouldShow(); | 
|  |  | 
|  | // Returns the anchor point in screen coordinates. Used when there is no | 
|  | // anchor view. | 
|  | gfx::Point GetAnchorPoint(gfx::NativeWindow window) const; | 
|  |  | 
|  | // Returns the string describing how to use the new extension. | 
|  | base::string16 GetHowToUseDescription() const; | 
|  |  | 
|  | // Handle initialization with the extension. | 
|  | void Initialize(); | 
|  |  | 
|  | private: | 
|  | // It's possible for an extension to be programmatically uninstalled | 
|  | // underneath us, so don't let the extension object go away until the bubble | 
|  | // is hidden. | 
|  | scoped_refptr<const extensions::Extension> extension_; | 
|  | Browser* const browser_; | 
|  | const SkBitmap icon_; | 
|  | BubbleType type_; | 
|  |  | 
|  | // A bitmask containing the various options of bubble sections to show. | 
|  | int options_; | 
|  |  | 
|  | // The location where the bubble should be anchored. | 
|  | AnchorPosition anchor_position_; | 
|  |  | 
|  | // The command to execute the extension action, if one exists. | 
|  | std::unique_ptr<extensions::Command> action_command_; | 
|  |  | 
|  | DISALLOW_COPY_AND_ASSIGN(ExtensionInstalledBubble); | 
|  | }; | 
|  |  | 
|  | #endif  // CHROME_BROWSER_UI_EXTENSIONS_EXTENSION_INSTALLED_BUBBLE_H_ |