1 // Copyright 2013 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef CHROME_BROWSER_UI_EXTENSIONS_EXTENSION_INSTALLED_BUBBLE_H_ 6 #define CHROME_BROWSER_UI_EXTENSIONS_EXTENSION_INSTALLED_BUBBLE_H_ 7 8 #include "base/memory/weak_ptr.h" 9 #include "base/scoped_observer.h" 10 #include "content/public/browser/notification_observer.h" 11 #include "content/public/browser/notification_registrar.h" 12 #include "extensions/browser/extension_registry_observer.h" 13 #include "third_party/skia/include/core/SkBitmap.h" 14 15 class Browser; 16 17 namespace extensions { 18 class Extension; 19 class ExtensionRegistry; 20 } 21 22 // Provides feedback to the user upon successful installation of an 23 // extension. Depending on the type of extension, the Bubble will 24 // point to: 25 // OMNIBOX_KEYWORD-> The omnibox. 26 // BROWSER_ACTION -> The browser action icon in the toolbar. 27 // PAGE_ACTION -> A preview of the page action icon in the location 28 // bar which is shown while the Bubble is shown. 29 // GENERIC -> The wrench menu. This case includes page actions that 30 // don't specify a default icon. 31 // 32 // ExtensionInstallBubble manages its own lifetime. 33 class ExtensionInstalledBubble : public content::NotificationObserver, 34 public extensions::ExtensionRegistryObserver { 35 public: 36 // The behavior and content of this Bubble comes in these varieties: 37 enum BubbleType { 38 OMNIBOX_KEYWORD, 39 BROWSER_ACTION, 40 PAGE_ACTION, 41 GENERIC 42 }; 43 44 // Implements the UI for showing the bubble. Owns us. 45 class Delegate { 46 public: ~Delegate()47 virtual ~Delegate() {} 48 49 // Attempts to show the bubble. Called from ShowInternal. Returns false 50 // if, because of animating (such as from adding a new browser action 51 // to the toolbar), the bubble could not be shown immediately. 52 virtual bool MaybeShowNow() = 0; 53 }; 54 55 ExtensionInstalledBubble(Delegate* delegate, 56 const extensions::Extension* extension, 57 Browser *browser, 58 const SkBitmap& icon); 59 60 virtual ~ExtensionInstalledBubble(); 61 extension()62 const extensions::Extension* extension() const { return extension_; } browser()63 Browser* browser() { return browser_; } browser()64 const Browser* browser() const { return browser_; } icon()65 const SkBitmap& icon() const { return icon_; } type()66 BubbleType type() const { return type_; } 67 68 // Stop listening to NOTIFICATION_BROWSER_CLOSING. 69 void IgnoreBrowserClosing(); 70 71 private: 72 // Delegates showing the view to our |view_|. Called internally via PostTask. 73 void ShowInternal(); 74 75 // content::NotificationObserver: 76 virtual void Observe(int type, 77 const content::NotificationSource& source, 78 const content::NotificationDetails& details) OVERRIDE; 79 80 // extensions::ExtensionRegistryObserver: 81 virtual void OnExtensionLoaded( 82 content::BrowserContext* browser_context, 83 const extensions::Extension* extension) OVERRIDE; 84 virtual void OnExtensionUnloaded( 85 content::BrowserContext* browser_context, 86 const extensions::Extension* extension, 87 extensions::UnloadedExtensionInfo::Reason reason) OVERRIDE; 88 89 // The view delegate that shows the bubble. Owns us. 90 Delegate* delegate_; 91 92 // |extension_| is NULL when we are deleted. 93 const extensions::Extension* extension_; 94 Browser* browser_; 95 const SkBitmap icon_; 96 BubbleType type_; 97 content::NotificationRegistrar registrar_; 98 99 // Listen to extension load, unloaded notifications. 100 ScopedObserver<extensions::ExtensionRegistry, 101 extensions::ExtensionRegistryObserver> 102 extension_registry_observer_; 103 104 // The number of times to retry showing the bubble if the browser action 105 // toolbar is animating. 106 int animation_wait_retries_; 107 108 base::WeakPtrFactory<ExtensionInstalledBubble> weak_factory_; 109 110 DISALLOW_COPY_AND_ASSIGN(ExtensionInstalledBubble); 111 }; 112 113 #endif // CHROME_BROWSER_UI_EXTENSIONS_EXTENSION_INSTALLED_BUBBLE_H_ 114