[M94 Migration] Add event handler for EVAS_CALLBACK_MOUSE_OUT 44/267044/1
authorfr.fang <fr.fang@samsung.com>
Wed, 2 Dec 2020 05:58:43 +0000 (13:58 +0800)
committerGajendra N <gajendra.n@samsung.com>
Wed, 24 Nov 2021 11:46:32 +0000 (11:46 +0000)
Currently, webview can not detect whether the mouse is moved
out of webview. The problem is when moving mouse to the edge
of webview, the node under the cursor will stay in hover
state event when the mouse moved out. The hover state will
not be invalidated until the mouse move into webview.

Reference:
https://review.tizen.org/gerrit/248765

Change-Id: Iea67174faf8c3f5dcc0706bd05fad2ec2025e741
Signed-off-by: fr.fang <fr.fang@samsung.com>
Signed-off-by: Gajendra N <gajendra.n@samsung.com>
tizen_src/chromium_impl/content/browser/renderer_host/render_widget_host_view_efl.cc
tizen_src/chromium_impl/content/browser/renderer_host/render_widget_host_view_efl.h
tizen_src/chromium_impl/content/browser/renderer_host/web_event_factory_efl.cc
tizen_src/chromium_impl/content/browser/renderer_host/web_event_factory_efl.h

index b5e9076..3ff61a0 100644 (file)
@@ -212,6 +212,8 @@ void RenderWidgetHostViewEfl::InitAsChild(gfx::NativeView /* parent_view */) {
                                  OnMouseUp, this);
   evas_object_event_callback_add(content_image_, EVAS_CALLBACK_MOUSE_MOVE,
                                  OnMouseMove, this);
+  evas_object_event_callback_add(content_image_, EVAS_CALLBACK_MOUSE_OUT,
+                                 OnMouseOut, this);
   evas_object_event_callback_add(content_image_, EVAS_CALLBACK_MOUSE_WHEEL,
                                  OnMouseWheel, this);
   evas_object_event_callback_add(content_image_, EVAS_CALLBACK_KEY_DOWN,
@@ -277,6 +279,8 @@ RenderWidgetHostViewEfl::~RenderWidgetHostViewEfl() {
                                  OnMouseUp);
   evas_object_event_callback_del(content_image_, EVAS_CALLBACK_MOUSE_MOVE,
                                  OnMouseMove);
+  evas_object_event_callback_del(content_image_, EVAS_CALLBACK_MOUSE_OUT,
+                                 OnMouseOut);
   evas_object_event_callback_del(content_image_, EVAS_CALLBACK_MOUSE_WHEEL,
                                  OnMouseWheel);
   evas_object_event_callback_del(content_image_, EVAS_CALLBACK_KEY_DOWN,
@@ -1137,6 +1141,16 @@ void RenderWidgetHostViewEfl::OnMouseMove(void* data,
   }
 }
 
+void RenderWidgetHostViewEfl::OnMouseOut(void* data,
+                                         Evas* evas,
+                                         Evas_Object* obj,
+                                         void* event_info) {
+  RenderWidgetHostViewEfl* rwhv = static_cast<RenderWidgetHostViewEfl*>(data);
+  blink::WebMouseEvent event =
+      MakeWebMouseEvent(obj, static_cast<Evas_Event_Mouse_Out*>(event_info));
+  rwhv->host_->ForwardMouseEvent(event);
+}
+
 void RenderWidgetHostViewEfl::OnMultiTouchDownEvent(void* data,
                                                     Evas* evas,
                                                     Evas_Object* obj,
index ecefb02..71d8fd1 100644 (file)
@@ -278,6 +278,7 @@ class CONTENT_EXPORT RenderWidgetHostViewEfl
   static void OnMouseDown(void* data, Evas*, Evas_Object*, void*);
   static void OnMouseUp(void* data, Evas*, Evas_Object*, void*);
   static void OnMouseMove(void* data, Evas*, Evas_Object*, void*);
+  static void OnMouseOut(void* data, Evas*, Evas_Object*, void*);
   static void OnMouseWheel(void* data, Evas*, Evas_Object*, void*);
   static void OnKeyDown(void*, Evas*, Evas_Object*, void*);
   static void OnKeyUp(void*, Evas*, Evas_Object*, void*);
index 83ba6b9..859d27d 100644 (file)
@@ -361,6 +361,21 @@ static WebMouseEvent::Button EvasToWebMouseButton(int button) {
   return WebMouseEvent::Button::kNoButton;
 }
 
+enum { LeftButtonPressed = 1, MiddleButtonPressed = 2, RightButtonPressed = 4 };
+
+static WebInputEvent::Modifiers EvasToWebMouseButtonsPressed(int buttons) {
+  unsigned result = 0;
+
+  if (buttons & LeftButtonPressed)
+    result |= WebInputEvent::kLeftButtonDown;
+  if (buttons & MiddleButtonPressed)
+    result |= WebInputEvent::kMiddleButtonDown;
+  if (buttons & RightButtonPressed)
+    result |= WebInputEvent::kRightButtonDown;
+
+  return static_cast<WebInputEvent::Modifiers>(result);
+}
+
 static WebInputEvent::Modifiers EvasToWebModifiers(
     const Evas_Modifier* modifiers) {
   unsigned result = 0;
@@ -407,11 +422,38 @@ template blink::WebMouseEvent MakeWebMouseEvent<Evas_Event_Mouse_Up>(
     const Evas_Event_Mouse_Up*);
 
 blink::WebMouseEvent MakeWebMouseEvent(Evas_Object* view,
+                                       const Evas_Event_Mouse_Out* ev) {
+  WebMouseEvent event(WebInputEvent::Type::kMouseLeave,
+                      EvasToWebModifiers(ev->modifiers),
+                      ui::EventTimeStampFromSeconds(ev->timestamp / 1000));
+
+  event.button = EvasToWebMouseButton(ev->buttons);
+  event.SetModifiers(event.GetModifiers() |
+                     EvasToWebMouseButtonsPressed(ev->buttons));
+
+  const float sf = GetDeviceScaleFactor();
+  gfx::PointF point(ev->canvas.x / sf, ev->canvas.y / sf);
+  TranslateEvasCoordToWebKitCoord(view, &point);
+
+  Evas* evas = evas_object_evas_get(view);
+  event.SetPositionInScreen(
+      evas_coord_world_x_to_screen(evas, ev->canvas.x) / sf,
+      evas_coord_world_y_to_screen(evas, ev->canvas.y) / sf);
+  event.SetPositionInWidget(point);
+
+  return event;
+}
+
+blink::WebMouseEvent MakeWebMouseEvent(Evas_Object* view,
                                        const Evas_Event_Mouse_Move* ev) {
   WebMouseEvent event(WebInputEvent::Type::kMouseMove,
                       EvasToWebModifiers(ev->modifiers),
                       ui::EventTimeStampFromSeconds(ev->timestamp / 1000));
 
+  event.button = EvasToWebMouseButton(ev->buttons);
+  event.SetModifiers(event.GetModifiers() |
+                     EvasToWebMouseButtonsPressed(ev->buttons));
+
   const float sf = GetDeviceScaleFactor();
   gfx::PointF point(ev->cur.canvas.x / sf, ev->cur.canvas.y / sf);
   TranslateEvasCoordToWebKitCoord(view, &point);
index 0de1187..1d43037 100644 (file)
@@ -20,6 +20,8 @@ template <class EVT>
 blink::WebMouseEvent MakeWebMouseEvent(
     blink::WebInputEvent::Type type, Evas_Object* view, const EVT*);
 blink::WebMouseEvent MakeWebMouseEvent(Evas_Object* view,
+    const Evas_Event_Mouse_Out* ev);
+blink::WebMouseEvent MakeWebMouseEvent(Evas_Object* view,
     const Evas_Event_Mouse_Move* ev);
 blink::WebMouseWheelEvent MakeWebMouseEvent(Evas_Object*,
     const Evas_Event_Mouse_Wheel* ev);