extension_installed_bubble.h revision cedac228d2dd51db4b79ea1e72c7f249408ee061
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