1 // Copyright 2014 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 EXTENSIONS_COMPONENTS_NATIVE_APP_WINDOW_NATIVE_APP_WINDOW_VIEWS_H_
6 #define EXTENSIONS_COMPONENTS_NATIVE_APP_WINDOW_NATIVE_APP_WINDOW_VIEWS_H_
7 
8 #include <memory>
9 
10 #include "base/macros.h"
11 #include "base/observer_list.h"
12 #include "content/public/browser/web_contents_observer.h"
13 #include "extensions/browser/app_window/app_window.h"
14 #include "extensions/browser/app_window/native_app_window.h"
15 #include "extensions/browser/app_window/size_constraints.h"
16 #include "ui/gfx/geometry/rect.h"
17 #include "ui/views/controls/webview/unhandled_keyboard_event_handler.h"
18 #include "ui/views/widget/widget.h"
19 #include "ui/views/widget/widget_delegate.h"
20 #include "ui/views/widget/widget_observer.h"
21 
22 class SkRegion;
23 
24 namespace content {
25 class RenderViewHost;
26 }
27 
28 namespace views {
29 class WebView;
30 }
31 
32 namespace native_app_window {
33 
34 // A NativeAppWindow backed by a views::Widget. This class may be used alone
35 // as a stub or subclassed (for example, ChromeNativeAppWindowViews).
36 class NativeAppWindowViews : public extensions::NativeAppWindow,
37                              public content::WebContentsObserver,
38                              public views::WidgetDelegateView,
39                              public views::WidgetObserver {
40  public:
41   NativeAppWindowViews();
42   ~NativeAppWindowViews() override;
43   void Init(extensions::AppWindow* app_window,
44             const extensions::AppWindow::CreateParams& create_params);
45 
46   // Signal that CanHaveTransparentBackground has changed.
47   void OnCanHaveAlphaEnabledChanged();
48 
app_window()49   extensions::AppWindow* app_window() { return app_window_; }
app_window()50   const extensions::AppWindow* app_window() const { return app_window_; }
51 
web_view()52   views::WebView* web_view() { return web_view_; }
web_view()53   const views::WebView* web_view() const { return web_view_; }
54 
widget()55   views::Widget* widget() { return widget_; }
widget()56   const views::Widget* widget() const { return widget_; }
57 
set_window_for_testing(views::Widget * window)58   void set_window_for_testing(views::Widget* window) { widget_ = window; }
set_web_view_for_testing(views::WebView * view)59   void set_web_view_for_testing(views::WebView* view) { web_view_ = view; }
60 
61  protected:
62   // Initializes |widget_| for |app_window|.
63   virtual void InitializeWindow(
64       extensions::AppWindow* app_window,
65       const extensions::AppWindow::CreateParams& create_params);
66 
67   // ui::BaseWindow:
68   bool IsActive() const override;
69   bool IsMaximized() const override;
70   bool IsMinimized() const override;
71   bool IsFullscreen() const override;
72   gfx::NativeWindow GetNativeWindow() const override;
73   gfx::Rect GetRestoredBounds() const override;
74   ui::WindowShowState GetRestoredState() const override;
75   gfx::Rect GetBounds() const override;
76   void Show() override;
77   void ShowInactive() override;
78   void Hide() override;
79   bool IsVisible() const override;
80   void Close() override;
81   void Activate() override;
82   void Deactivate() override;
83   void Maximize() override;
84   void Minimize() override;
85   void Restore() override;
86   void SetBounds(const gfx::Rect& bounds) override;
87   void FlashFrame(bool flash) override;
88   ui::ZOrderLevel GetZOrderLevel() const override;
89   void SetZOrderLevel(ui::ZOrderLevel order) override;
90 
91   // WidgetDelegate:
92   void OnWidgetMove() override;
93   views::View* GetInitiallyFocusedView() override;
94   bool CanResize() const override;
95   bool CanMaximize() const override;
96   bool CanMinimize() const override;
97   base::string16 GetWindowTitle() const override;
98   bool ShouldShowWindowTitle() const override;
99   void SaveWindowPlacement(const gfx::Rect& bounds,
100                            ui::WindowShowState show_state) override;
101   void DeleteDelegate() override;
102   views::Widget* GetWidget() override;
103   const views::Widget* GetWidget() const override;
104   bool ShouldDescendIntoChildForEventHandling(
105       gfx::NativeView child,
106       const gfx::Point& location) override;
107 
108   // WidgetObserver:
109   void OnWidgetDestroying(views::Widget* widget) override;
110   void OnWidgetVisibilityChanged(views::Widget* widget, bool visible) override;
111   void OnWidgetActivationChanged(views::Widget* widget, bool active) override;
112 
113   // WebContentsObserver:
114   void RenderViewCreated(content::RenderViewHost* render_view_host) override;
115   void RenderViewHostChanged(content::RenderViewHost* old_host,
116                              content::RenderViewHost* new_host) override;
117 
118   // views::View:
119   void ViewHierarchyChanged(
120       const views::ViewHierarchyChangedDetails& details) override;
121   gfx::Size GetMinimumSize() const override;
122   gfx::Size GetMaximumSize() const override;
123   void OnBoundsChanged(const gfx::Rect& previous_bounds) override;
124   void OnFocus() override;
125 
126   // NativeAppWindow:
127   void SetFullscreen(int fullscreen_types) override;
128   bool IsFullscreenOrPending() const override;
129   void UpdateWindowIcon() override;
130   void UpdateWindowTitle() override;
131   void UpdateDraggableRegions(
132       const std::vector<extensions::DraggableRegion>& regions) override;
133   SkRegion* GetDraggableRegion() override;
134   void UpdateShape(std::unique_ptr<ShapeRects> rects) override;
135   bool HandleKeyboardEvent(
136       const content::NativeWebKeyboardEvent& event) override;
137   bool IsFrameless() const override;
138   bool HasFrameColor() const override;
139   SkColor ActiveFrameColor() const override;
140   SkColor InactiveFrameColor() const override;
141   gfx::Insets GetFrameInsets() const override;
142   gfx::Size GetContentMinimumSize() const override;
143   gfx::Size GetContentMaximumSize() const override;
144   void SetContentSizeConstraints(const gfx::Size& min_size,
145                                  const gfx::Size& max_size) override;
146   bool CanHaveAlphaEnabled() const override;
147   void SetVisibleOnAllWorkspaces(bool always_visible) override;
148   void SetActivateOnPointer(bool activate_on_pointer) override;
149 
150   // web_modal::WebContentsModalDialogHost:
151   gfx::NativeView GetHostView() const override;
152   gfx::Point GetDialogPosition(const gfx::Size& size) override;
153   gfx::Size GetMaximumDialogSize() override;
154   void AddObserver(web_modal::ModalDialogHostObserver* observer) override;
155   void RemoveObserver(web_modal::ModalDialogHostObserver* observer) override;
156 
157  private:
158   // Informs modal dialogs that they need to update their positions.
159   void OnViewWasResized();
160 
161   extensions::AppWindow* app_window_ = nullptr;  // Not owned.
162   views::WebView* web_view_ = nullptr;
163   views::Widget* widget_ = nullptr;
164 
165   std::unique_ptr<SkRegion> draggable_region_;
166 
167   bool frameless_ = false;
168   bool resizable_ = false;
169   extensions::SizeConstraints size_constraints_;
170 
171   views::UnhandledKeyboardEventHandler unhandled_keyboard_event_handler_;
172 
173   base::ObserverList<web_modal::ModalDialogHostObserver>::Unchecked
174       observer_list_;
175 
176   DISALLOW_COPY_AND_ASSIGN(NativeAppWindowViews);
177 };
178 
179 }  // namespace native_app_window
180 
181 #endif  // EXTENSIONS_COMPONENTS_NATIVE_APP_WINDOW_NATIVE_APP_WINDOW_VIEWS_H_
182