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