1 // Copyright (c) 2011 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_GTK_EXTENSIONS_EXTENSION_INSTALLED_BUBBLE_GTK_H_ 6 #define CHROME_BROWSER_UI_GTK_EXTENSIONS_EXTENSION_INSTALLED_BUBBLE_GTK_H_ 7 #pragma once 8 9 #include "base/memory/ref_counted.h" 10 #include "base/memory/scoped_ptr.h" 11 #include "chrome/browser/ui/gtk/custom_button.h" 12 #include "chrome/browser/ui/gtk/info_bubble_gtk.h" 13 #include "content/common/notification_observer.h" 14 #include "content/common/notification_registrar.h" 15 #include "third_party/skia/include/core/SkBitmap.h" 16 17 class Browser; 18 class BrowserWindowGtk; 19 class Extension; 20 class SkBitmap; 21 22 // Provides feedback to the user upon successful installation of an 23 // extension. Depending on the type of extension, the InfoBubble will 24 // point to: 25 // OMNIBOX_KEYWORD-> The omnibox. 26 // BROWSER_ACTION -> The browserAction icon in the toolbar. 27 // PAGE_ACTION -> A preview of the page action icon in the location 28 // bar which is shown while the InfoBubble 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 ExtensionInstalledBubbleGtk 34 : public InfoBubbleGtkDelegate, 35 public NotificationObserver, 36 public base::RefCountedThreadSafe<ExtensionInstalledBubbleGtk> { 37 public: 38 // The behavior and content of this InfoBubble comes in three varieties. 39 enum BubbleType { 40 OMNIBOX_KEYWORD, 41 BROWSER_ACTION, 42 PAGE_ACTION, 43 GENERIC 44 }; 45 46 // Creates the ExtensionInstalledBubble and schedules it to be shown once 47 // the extension has loaded. |extension| is the installed extension. |browser| 48 // is the browser window which will host the bubble. |icon| is the install 49 // icon of the extension. 50 static void Show( 51 const Extension* extension, Browser *browser, const SkBitmap& icon); 52 53 private: 54 friend class base::RefCountedThreadSafe<ExtensionInstalledBubbleGtk>; 55 56 // Private ctor. Registers a listener for EXTENSION_LOADED. 57 ExtensionInstalledBubbleGtk(const Extension* extension, Browser *browser, 58 const SkBitmap& icon); 59 60 virtual ~ExtensionInstalledBubbleGtk(); 61 62 // Shows the bubble. Called internally via PostTask. 63 void ShowInternal(); 64 65 // NotificationObserver 66 virtual void Observe(NotificationType type, 67 const NotificationSource& source, 68 const NotificationDetails& details); 69 70 // InfoBubbleDelegate 71 virtual void InfoBubbleClosing(InfoBubbleGtk* info_bubble, 72 bool closed_by_escape); 73 74 // Calls Release() internally. Called internally via PostTask. 75 void Close(); 76 77 static void OnButtonClick(GtkWidget* button, 78 ExtensionInstalledBubbleGtk* toolbar); 79 80 const Extension* extension_; 81 Browser *browser_; 82 SkBitmap icon_; 83 NotificationRegistrar registrar_; 84 BubbleType type_; 85 86 // The number of times to retry showing the bubble if the browser action 87 // toolbar is animating. 88 int animation_wait_retries_; 89 90 // The 'x' that the user can press to hide the info bubble shelf. 91 scoped_ptr<CustomDrawButton> close_button_; 92 93 InfoBubbleGtk* info_bubble_; 94 95 DISALLOW_COPY_AND_ASSIGN(ExtensionInstalledBubbleGtk); 96 }; 97 98 #endif // CHROME_BROWSER_UI_GTK_EXTENSIONS_EXTENSION_INSTALLED_BUBBLE_GTK_H_ 99