[WRTjs] Refactor popup
[platform/framework/web/chromium-efl.git] / wrt / src / browser / wrt_native_widget.cc
1 #include "wrt/src/browser/wrt_native_widget.h"
2
3 #include "tizen_src/chromium_impl/ui/ozone/platform/efl/efl_window.h"
4 #include "ui/wm/core/base_focus_rules.h"
5 #include "ui/wm/core/focus_controller.h"
6 #include "wrt/src/browser/wrt_web_contents.h"
7 #include "wrt/src/browser/wrt_window_tree_host.h"
8
9 namespace wrt {
10
11 namespace {
12
13 std::unique_ptr<wm::FocusController> focus_controller;
14
15 class WRTFocusRules : public wm::BaseFocusRules {
16  private:
17   // wm::BaseFocusRules:
18   bool IsToplevelWindow(const aura::Window* window) const override {
19     return true;
20   }
21   bool SupportsChildActivation(const aura::Window* window) const override {
22     return true;
23   }
24   bool IsWindowConsideredVisibleForActivation(
25       const aura::Window* window) const override { return true; }
26   bool CanActivateWindow(const aura::Window* window) const override {
27     return true;
28   }
29   bool CanFocusWindow(const aura::Window* window,
30                       const ui::Event* event) const override {
31     return true;
32   }
33   aura::Window* GetNextActivatableWindow(aura::Window* ignore) const override {
34     return nullptr;
35   }
36 };
37
38 }  // namespace
39
40 WRTNativeWidget::WRTNativeWidget(
41     views::internal::NativeWidgetDelegate* delegate, WRTWindowTreeHost* host)
42     : views::NativeWidgetAura(delegate),
43       host_(host) {
44   if (!focus_controller)
45     focus_controller = std::make_unique<wm::FocusController>(new WRTFocusRules);
46   InitializeWidgetClient();
47 }
48
49 WRTNativeWidget::~WRTNativeWidget() {}
50
51 void WRTNativeWidget::Show(ui::WindowShowState show_state,
52                            const gfx::Rect& restore_bounds) {
53   CheckAndResetWidgetClient();
54   views::NativeWidgetAura::Show(show_state, restore_bounds);
55   host_->platform_window()->Show(show_state == ui::SHOW_STATE_INACTIVE);
56 }
57
58 void WRTNativeWidget::Hide() {
59   views::NativeWidgetAura::Hide();
60 }
61
62 bool WRTNativeWidget::IsVisible() const {
63   return host_->platform_window()->IsVisible();
64 }
65
66 void WRTNativeWidget::Activate() {
67   CheckAndResetWidgetClient();
68   views::NativeWidgetAura::Activate();
69
70   host_->platform_window()->Activate();
71   focus_controller->FocusWindow(GetNativeView());
72 }
73
74 void WRTNativeWidget::Deactivate() {
75   CheckAndResetWidgetClient();
76   views::NativeWidgetAura::Deactivate();
77
78   host_->platform_window()->Deactivate();
79 }
80
81 bool WRTNativeWidget::IsActive() const {
82   return host_->is_active();
83 }
84
85 void WRTNativeWidget::ActiveAuraWindow(bool active, aura::Window* window) {
86   CheckAndResetWidgetClient();
87   if (active) {
88     focus_controller->ActivateWindow(window);
89     return;
90   }
91   // For onscreen rendering, new elm window will be created to show select
92   // picker popup on top of it. So, do not deactivate aura window in this
93   // case, so that Blink keeps the popup client alive.
94   wrt::WRTWebContents* web_contents =
95       WRTWebContents::FromWebContents(WRTWebContents::GetWebContents());
96   if (web_contents && !web_contents->IsPopupShowing())
97     focus_controller->DeactivateWindow(window);
98 }
99
100 void WRTNativeWidget::InitializeWidgetClient() {
101   auto* root_window = host_->window();
102   aura::client::SetFocusClient(root_window, focus_controller.get());
103   wm::SetActivationClient(root_window, focus_controller.get());
104   root_window->AddPreTargetHandler(focus_controller.get());
105 }
106
107 void WRTNativeWidget::CheckAndResetWidgetClient() {
108   auto* root_window = host_->window();
109   if (!wm::GetActivationClient(root_window)) {
110     aura::client::SetFocusClient(root_window, focus_controller.get());
111     wm::SetActivationClient(root_window, focus_controller.get());
112   }
113 }
114
115 void WRTNativeWidget::RemoveWidgetClient() {
116   LOG(INFO) << "Remove native window[" << this << "] WidgetClient";
117   auto* root_window = host_->window();
118   aura::client::SetFocusClient(root_window, nullptr);
119   wm::SetActivationClient(root_window, nullptr);
120   root_window->RemovePreTargetHandler(focus_controller.get());
121 }
122
123 }  // namespace wrt