- add sources.
[platform/framework/web/crosswalk.git] / src / chrome / browser / ui / views / extensions / extension_popup.h
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/extensions/extension_host.h"
11 #include "chrome/browser/ui/views/extensions/extension_view_views.h"
12 #include "content/public/browser/notification_observer.h"
13 #include "ui/views/bubble/bubble_delegate.h"
14 #include "ui/views/focus/widget_focus_manager.h"
15 #include "url/gurl.h"
16
17 class Browser;
18 namespace views {
19 class Widget;
20 }
21
22 namespace content {
23 class DevToolsAgentHost;
24 }
25
26 class ExtensionPopup : public views::BubbleDelegateView,
27                        public ExtensionViewViews::Container,
28                        public content::NotificationObserver {
29  public:
30   enum ShowAction {
31     SHOW,
32     SHOW_AND_INSPECT
33   };
34
35   virtual ~ExtensionPopup();
36
37   // Create and show a popup with |url| positioned adjacent to |anchor_view|.
38   // |browser| is the browser to which the pop-up will be attached.  NULL is a
39   // valid parameter for pop-ups not associated with a browser.
40   // The positioning of the pop-up is determined by |arrow| according to the
41   // following logic:  The popup is anchored so that the corner indicated by the
42   // value of |arrow| remains fixed during popup resizes.  If |arrow| is
43   // BOTTOM_*, then the popup 'pops up', otherwise the popup 'drops down'.
44   // The actual display of the popup is delayed until the page contents
45   // finish loading in order to minimize UI flashing and resizing.
46   static ExtensionPopup* ShowPopup(const GURL& url,
47                                    Browser* browser,
48                                    views::View* anchor_view,
49                                    views::BubbleBorder::Arrow arrow,
50                                    ShowAction show_action);
51
52   extensions::ExtensionHost* host() const { return extension_host_.get(); }
53
54   // content::NotificationObserver overrides.
55   virtual void Observe(int type,
56                        const content::NotificationSource& source,
57                        const content::NotificationDetails& details) OVERRIDE;
58
59   // ExtensionViewViews::Container overrides.
60   virtual void OnExtensionSizeChanged(ExtensionViewViews* view) OVERRIDE;
61
62   // views::View overrides.
63   virtual gfx::Size GetPreferredSize() OVERRIDE;
64
65   // views::BubbleDelegateView overrides.
66   virtual void OnWidgetActivationChanged(views::Widget* widget, bool active)
67       OVERRIDE;
68
69   // The min/max height of popups.
70   static const int kMinWidth;
71   static const int kMinHeight;
72   static const int kMaxWidth;
73   static const int kMaxHeight;
74
75  private:
76   ExtensionPopup(extensions::ExtensionHost* host,
77                  views::View* anchor_view,
78                  views::BubbleBorder::Arrow arrow,
79                  ShowAction show_action);
80
81   // Show the bubble, focus on its content, and register listeners.
82   void ShowBubble();
83
84   void OnDevToolsStateChanged(content::DevToolsAgentHost*, bool attached);
85
86   // The contained host for the view.
87   scoped_ptr<extensions::ExtensionHost> extension_host_;
88
89   // Flag used to indicate if the pop-up should open a devtools window once
90   // it is shown inspecting it.
91   bool inspect_with_devtools_;
92
93   content::NotificationRegistrar registrar_;
94
95   base::Callback<void(content::DevToolsAgentHost*, bool)> devtools_callback_;
96
97   DISALLOW_COPY_AND_ASSIGN(ExtensionPopup);
98 };
99
100 #endif  // CHROME_BROWSER_UI_VIEWS_EXTENSIONS_EXTENSION_POPUP_H_