blob: 11ffe2d81b1add112a4eb4a95c1aa0898e57d0e0 [file] [log] [blame]
// 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 {
struct ActionInfo;
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;
private:
ExtensionInstalledBubble(scoped_refptr<const extensions::Extension> extension,
Browser* browser,
const SkBitmap& icon,
const extensions::ActionInfo* action_info);
// 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.
const scoped_refptr<const extensions::Extension> extension_;
Browser* const browser_;
const SkBitmap icon_;
const BubbleType type_;
// The command to execute the extension action, if one exists.
const std::unique_ptr<extensions::Command> action_command_;
// A bitmask containing the various options of bubble sections to show.
const int options_;
// The location where the bubble should be anchored.
const AnchorPosition anchor_position_;
DISALLOW_COPY_AND_ASSIGN(ExtensionInstalledBubble);
};
#endif // CHROME_BROWSER_UI_EXTENSIONS_EXTENSION_INSTALLED_BUBBLE_H_