Index: chrome/browser/ui/extensions/extension_action_view_controller.h |
diff --git a/chrome/browser/ui/extensions/extension_action_view_controller.h b/chrome/browser/ui/extensions/extension_action_view_controller.h |
index a6a903fa91e4654dc05ec903fd9e8b5a86331184..60fd43d4d0a6a040808a9cca49160aba9b29e8c9 100644 |
--- a/chrome/browser/ui/extensions/extension_action_view_controller.h |
+++ b/chrome/browser/ui/extensions/extension_action_view_controller.h |
@@ -8,6 +8,8 @@ |
#include "chrome/browser/extensions/extension_action_icon_factory.h" |
#include "chrome/browser/extensions/extension_context_menu_model.h" |
#include "chrome/browser/ui/toolbar/toolbar_action_view_controller.h" |
+#include "content/public/browser/notification_observer.h" |
+#include "content/public/browser/notification_registrar.h" |
#include "ui/gfx/image/image.h" |
class Browser; |
@@ -19,6 +21,7 @@ namespace extensions { |
class Command; |
class Extension; |
class ExtensionRegistry; |
+class ExtensionViewHost; |
} |
// The platform-independent controller for an ExtensionAction that is shown on |
@@ -29,7 +32,8 @@ class ExtensionRegistry; |
class ExtensionActionViewController |
: public ToolbarActionViewController, |
public ExtensionActionIconFactory::Observer, |
- public ExtensionContextMenuModel::PopupDelegate { |
+ public ExtensionContextMenuModel::PopupDelegate, |
+ public content::NotificationObserver { |
public: |
// The different options for showing a popup. |
enum PopupShowAction { SHOW_POPUP, SHOW_POPUP_AND_INSPECT }; |
@@ -75,6 +79,7 @@ class ExtensionActionViewController |
ExtensionAction* extension_action() { return extension_action_; } |
const ExtensionAction* extension_action() const { return extension_action_; } |
ToolbarActionViewDelegate* view_delegate() { return view_delegate_; } |
+ bool is_showing_popup() const { return popup_host_ != nullptr; } |
void set_icon_observer(ExtensionActionIconFactory::Observer* icon_observer) { |
icon_observer_ = icon_observer; |
@@ -84,6 +89,11 @@ class ExtensionActionViewController |
// ExtensionActionIconFactory::Observer: |
void OnIconUpdated() override; |
+ // content::NotificationObserver: |
+ void Observe(int notification_type, |
+ const content::NotificationSource& source, |
+ const content::NotificationDetails& details) override; |
+ |
// Checks if the associated |extension| is still valid by checking its |
// status in the registry. Since the OnExtensionUnloaded() notifications are |
// not in a deterministic order, it's possible that the view tries to refresh |
@@ -105,6 +115,9 @@ class ExtensionActionViewController |
const GURL& popup_url, |
bool grant_tab_permissions); |
+ // Handles cleanup after the popup closes. |
+ void OnPopupClosed(); |
+ |
// The extension associated with the action we're displaying. |
const extensions::Extension* extension_; |
@@ -115,6 +128,9 @@ class ExtensionActionViewController |
// by this class. |
ExtensionAction* extension_action_; |
+ // The extension popup's host if the popup is visible; null otherwise. |
+ extensions::ExtensionViewHost* popup_host_; |
+ |
// The context menu model for the extension. |
scoped_refptr<ExtensionContextMenuModel> context_menu_model_; |
@@ -137,6 +153,8 @@ class ExtensionActionViewController |
// The associated ExtensionRegistry; cached for quick checking. |
extensions::ExtensionRegistry* extension_registry_; |
+ content::NotificationRegistrar registrar_; |
+ |
DISALLOW_COPY_AND_ASSIGN(ExtensionActionViewController); |
}; |