158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// found in the LICENSE file.
458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#ifndef CHROME_BROWSER_UI_EXTENSIONS_EXTENSION_INSTALLED_BUBBLE_H_
658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#define CHROME_BROWSER_UI_EXTENSIONS_EXTENSION_INSTALLED_BUBBLE_H_
758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "base/memory/weak_ptr.h"
9cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/scoped_observer.h"
1058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "content/public/browser/notification_observer.h"
1158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "content/public/browser/notification_registrar.h"
12cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "extensions/browser/extension_registry_observer.h"
1358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "third_party/skia/include/core/SkBitmap.h"
1458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
1558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)class Browser;
1658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
1758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)namespace extensions {
1858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)class Extension;
19cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class ExtensionRegistry;
2058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
2158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
2258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Provides feedback to the user upon successful installation of an
2358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// extension. Depending on the type of extension, the Bubble will
2458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// point to:
2558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)//    OMNIBOX_KEYWORD-> The omnibox.
2658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)//    BROWSER_ACTION -> The browser action icon in the toolbar.
2758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)//    PAGE_ACTION    -> A preview of the page action icon in the location
2858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)//                      bar which is shown while the Bubble is shown.
2958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)//    GENERIC        -> The wrench menu. This case includes page actions that
3058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)//                      don't specify a default icon.
3158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)//
3258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// ExtensionInstallBubble manages its own lifetime.
33cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class ExtensionInstalledBubble : public content::NotificationObserver,
34cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                 public extensions::ExtensionRegistryObserver {
3558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) public:
3658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // The behavior and content of this Bubble comes in these varieties:
3758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  enum BubbleType {
3858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    OMNIBOX_KEYWORD,
3958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    BROWSER_ACTION,
4058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    PAGE_ACTION,
4158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    GENERIC
4258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  };
4358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
4458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Implements the UI for showing the bubble. Owns us.
4558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  class Delegate {
4658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)   public:
4758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    virtual ~Delegate() {}
4858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
4958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    // Attempts to show the bubble. Called from ShowInternal. Returns false
5058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    // if, because of animating (such as from adding a new browser action
5158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    // to the toolbar), the bubble could not be shown immediately.
5258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    virtual bool MaybeShowNow() = 0;
5358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  };
5458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
5558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ExtensionInstalledBubble(Delegate* delegate,
5658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                           const extensions::Extension* extension,
5758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                           Browser *browser,
5858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                           const SkBitmap& icon);
5958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
6058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual ~ExtensionInstalledBubble();
6158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
6258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  const extensions::Extension* extension() const { return extension_; }
6358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  Browser* browser() { return browser_; }
64cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const Browser* browser() const { return browser_; }
6558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  const SkBitmap& icon() const { return icon_; }
6658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  BubbleType type() const { return type_; }
6758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
6858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Stop listening to NOTIFICATION_BROWSER_CLOSING.
6958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  void IgnoreBrowserClosing();
7058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
7158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) private:
7258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Delegates showing the view to our |view_|. Called internally via PostTask.
7358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  void ShowInternal();
7458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
7558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // content::NotificationObserver:
7658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void Observe(int type,
7758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                       const content::NotificationSource& source,
7858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                       const content::NotificationDetails& details) OVERRIDE;
7958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
80cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // extensions::ExtensionRegistryObserver:
81cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual void OnExtensionLoaded(
82cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      content::BrowserContext* browser_context,
83cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      const extensions::Extension* extension) OVERRIDE;
84cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual void OnExtensionUnloaded(
85cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      content::BrowserContext* browser_context,
86cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      const extensions::Extension* extension,
87cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      extensions::UnloadedExtensionInfo::Reason reason) OVERRIDE;
88cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
8958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // The view delegate that shows the bubble. Owns us.
9058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  Delegate* delegate_;
9158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
9258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // |extension_| is NULL when we are deleted.
9358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  const extensions::Extension* extension_;
9458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  Browser* browser_;
9558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  const SkBitmap icon_;
9658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  BubbleType type_;
9758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  content::NotificationRegistrar registrar_;
9858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
99cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Listen to extension load, unloaded notifications.
100cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ScopedObserver<extensions::ExtensionRegistry,
101cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                 extensions::ExtensionRegistryObserver>
102cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      extension_registry_observer_;
103cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
10458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // The number of times to retry showing the bubble if the browser action
10558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // toolbar is animating.
10658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  int animation_wait_retries_;
10758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
10858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  base::WeakPtrFactory<ExtensionInstalledBubble> weak_factory_;
10958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
11058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(ExtensionInstalledBubble);
11158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)};
11258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
11358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#endif  // CHROME_BROWSER_UI_EXTENSIONS_EXTENSION_INSTALLED_BUBBLE_H_
114