extension_popup.h revision 5d1f7b1de12d16ceb2c938c56701a3e8bfa558f7
1// Copyright (c) 2012 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_VIEWS_EXTENSIONS_EXTENSION_POPUP_H_
6#define CHROME_BROWSER_UI_VIEWS_EXTENSIONS_EXTENSION_POPUP_H_
7
8#include "base/callback.h"
9#include "base/compiler_specific.h"
10#include "chrome/browser/ui/tabs/tab_strip_model_observer.h"
11#include "chrome/browser/ui/views/extensions/extension_view_views.h"
12#include "content/public/browser/notification_observer.h"
13#include "content/public/browser/notification_registrar.h"
14#include "ui/views/bubble/bubble_delegate.h"
15#include "ui/views/focus/widget_focus_manager.h"
16#include "url/gurl.h"
17
18#if defined(USE_AURA)
19#include "ui/aura/client/activation_change_observer.h"
20#endif
21
22class Browser;
23namespace views {
24class Widget;
25}
26
27namespace content {
28class DevToolsAgentHost;
29}
30
31namespace extensions {
32class ExtensionViewHost;
33}
34
35class ExtensionPopup : public views::BubbleDelegateView,
36#if defined(USE_AURA)
37                       public aura::client::ActivationChangeObserver,
38#endif
39                       public ExtensionViewViews::Container,
40                       public content::NotificationObserver,
41                       public TabStripModelObserver {
42 public:
43  enum ShowAction {
44    SHOW,
45    SHOW_AND_INSPECT
46  };
47
48  virtual ~ExtensionPopup();
49
50  // Create and show a popup with |url| positioned adjacent to |anchor_view|.
51  // |browser| is the browser to which the pop-up will be attached.  NULL is a
52  // valid parameter for pop-ups not associated with a browser.
53  // The positioning of the pop-up is determined by |arrow| according to the
54  // following logic:  The popup is anchored so that the corner indicated by the
55  // value of |arrow| remains fixed during popup resizes.  If |arrow| is
56  // BOTTOM_*, then the popup 'pops up', otherwise the popup 'drops down'.
57  // The actual display of the popup is delayed until the page contents
58  // finish loading in order to minimize UI flashing and resizing.
59  static ExtensionPopup* ShowPopup(const GURL& url,
60                                   Browser* browser,
61                                   views::View* anchor_view,
62                                   views::BubbleBorder::Arrow arrow,
63                                   ShowAction show_action);
64
65  extensions::ExtensionViewHost* host() const { return host_.get(); }
66
67  // content::NotificationObserver overrides.
68  virtual void Observe(int type,
69                       const content::NotificationSource& source,
70                       const content::NotificationDetails& details) OVERRIDE;
71
72  // ExtensionViewViews::Container overrides.
73  virtual void OnExtensionSizeChanged(ExtensionViewViews* view) OVERRIDE;
74
75  // views::View overrides.
76  virtual gfx::Size GetPreferredSize() OVERRIDE;
77
78  // views::BubbleDelegateView overrides.
79  virtual void OnWidgetDestroying(views::Widget* widget) OVERRIDE;
80  virtual void OnWidgetActivationChanged(views::Widget* widget,
81                                         bool active) OVERRIDE;
82
83#if defined(USE_AURA)
84  // aura::client::ActivationChangeObserver overrides.
85  virtual void OnWindowActivated(aura::Window* gained_active,
86                                 aura::Window* lost_active) OVERRIDE;
87#endif
88
89  // TabStripModelObserver overrides.
90  virtual void ActiveTabChanged(content::WebContents* old_contents,
91                                content::WebContents* new_contents,
92                                int index,
93                                int reason) OVERRIDE;
94
95  // The min/max height of popups.
96  static const int kMinWidth;
97  static const int kMinHeight;
98  static const int kMaxWidth;
99  static const int kMaxHeight;
100
101 private:
102  ExtensionPopup(extensions::ExtensionViewHost* host,
103                 views::View* anchor_view,
104                 views::BubbleBorder::Arrow arrow,
105                 ShowAction show_action);
106
107  // Show the bubble, focus on its content, and register listeners.
108  void ShowBubble();
109
110  void OnDevToolsStateChanged(content::DevToolsAgentHost*, bool attached);
111
112  // The contained host for the view.
113  scoped_ptr<extensions::ExtensionViewHost> host_;
114
115  // Flag used to indicate if the pop-up should open a devtools window once
116  // it is shown inspecting it.
117  bool inspect_with_devtools_;
118
119  content::NotificationRegistrar registrar_;
120
121  base::Callback<void(content::DevToolsAgentHost*, bool)> devtools_callback_;
122
123  DISALLOW_COPY_AND_ASSIGN(ExtensionPopup);
124};
125
126#endif  // CHROME_BROWSER_UI_VIEWS_EXTENSIONS_EXTENSION_POPUP_H_
127