Fix for webkit event issue
[framework/osp/web.git] / src / controls / FWebCtrl_Web.cpp
index f2d63b8..8c268c8 100755 (executable)
@@ -21,6 +21,7 @@
  *
  * The file contains the definition of _Web class.
  */
+#include <Ecore_X.h>
 #include <Elementary.h>
 #include <memory>
 #include <FBaseByteBuffer.h>
@@ -341,9 +342,12 @@ _Web::_Web(void)
        , __pPinchGestureHandler(null)
        , __gestureType(WEB_GESTURE_TYPE_TAP)
        , __edgeType(WEB_EDGE_NONE)
+       , __focus(false)
        , __pTextElement(null)
        , __previousTouchedPosition(0.0f, 0.0f)
        , __isFullScreenEntered(false)
+       , __isRotated(false)
+       , __touchPressed(false)
 {
        SetBackgroundColor(Color(0, 0, 0, 0));
 }
@@ -351,11 +355,6 @@ _Web::_Web(void)
 
 _Web::~_Web(void)
 {
-       _UiEventManager* pManager = _UiEventManager::GetInstance();
-       SysAssertf(pManager, "Failed to get ui evnet manager.");
-
-       pManager->RemoveKeyEventListener(*this);
-
        RemoveGestureListener();
 }
 
@@ -381,11 +380,6 @@ _Web::CreateWebN(void)
        r = pWeb->InitializeGestureStates();
        SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, null, r, "[%s] Propagating.", GetErrorMessage(r));
 
-       _UiEventManager* pManager = _UiEventManager::GetInstance();
-       SysAssertf(pManager, "Failed to get ui evnet manager.");
-
-       pManager->AddKeyEventListener(*pWeb.get());
-
        return pWeb.release();
 }
 
@@ -611,6 +605,12 @@ _Web::GetSetting(void) const
        return __pWebSetting.get();
 }
 
+_EflWebkit*
+_Web::GetEflWebkit(void) const
+{
+       return __pEflWebkit.get();
+}
+
 
 result
 _Web::OnAttaching(const _Control* pParent)
@@ -633,7 +633,7 @@ _Web::OnBoundsChanging(const Rectangle& bounds)
        _ICoordinateSystemTransformer* pXformer = _CoordinateSystem::GetInstance()->GetTransformer();
        SysTryReturnResult(NID_WEB_CTRL, pXformer, E_SYSTEM, "[%s] A system error has been occurred. Failed to get coordinate transformer.", GetErrorMessage(E_SYSTEM));
 
-       if (__pEflWebkit.get())
+       if (__pEflWebkit.get() && __isRotated == false)
        {
                evas_object_move(__pEflWebkit->GetWebEvasObject(), pXformer->TransformHorizontal(absoluteBounds.x - webBounds.x + bounds.x), pXformer->TransformVertical(absoluteBounds.y - webBounds.y + bounds.y));
                evas_object_resize(__pEflWebkit->GetWebEvasObject(), pXformer->TransformHorizontal(bounds.width), pXformer->TransformVertical(bounds.height));
@@ -644,6 +644,20 @@ _Web::OnBoundsChanging(const Rectangle& bounds)
 
 
 void
+_Web::OnBoundsChanged(void)
+{
+       __isRotated = false;
+}
+
+
+void
+_Web::OnChangeLayout(_ControlOrientation orientation)
+{
+       __isRotated = true;
+}
+
+
+void
 _Web::ChangeGesture(_WebGestureType type)
 {
        switch (type)
@@ -706,6 +720,8 @@ _Web::SetEdgeReachedEvent(_WebEdgeType type)
 bool
 _Web::OnTouchPressed(const _Control& source, const _TouchInfo& touchInfo)
 {
+       __touchPressed = true;
+
        if (__pEflWebkit.get())
        {
                __edgeType = WEB_EDGE_NONE;
@@ -721,86 +737,182 @@ _Web::OnTouchPressed(const _Control& source, const _TouchInfo& touchInfo)
 
 
 bool
-_Web::OnTouchMoved(const _Control& source, const _TouchInfo& touchInfo)
+_Web::CanOutOfEdgeLeft(float scrollDistanceX, int pageDistance)
 {
-       if (__pEflWebkit.get())
+       if (scrollDistanceX < 0.0f)
        {
-               if (__gestureType == WEB_GESTURE_TYPE_TAP)
-               {
-                       __pPanningGestureHandler->InitializeTextSelectionStatus();
-               }
+               __edgeType &= ~WEB_EDGE_RIGHT;
 
-               SendTouchEventForJavaScript(touchInfo);
+               return false;
+       }
+       else if (scrollDistanceX > 0.0f && pageDistance != 0)
+       {
+               __edgeType &= ~WEB_EDGE_LEFT;
+       }
 
-               __pGestureHandler->OnTouchMoved(source, touchInfo);
+       return true;
+}
 
-               float scrollDistanceX = __previousTouchedPosition.x - touchInfo.GetCurrentPosition().x;
-               float scrollDistanceY = __previousTouchedPosition.y - touchInfo.GetCurrentPosition().y;
-               __previousTouchedPosition = touchInfo.GetCurrentPosition();
 
-               if (__edgeType !=  WEB_EDGE_NONE && __gestureType == WEB_GESTURE_TYPE_PANNING)
+bool
+_Web::CanOutOfEdgeRight(float scrollDistanceX, int pageDistance)
+{
+       if (scrollDistanceX > 0.0f)
+       {
+               __edgeType &= ~WEB_EDGE_LEFT;
+
+               return false;
+       }
+       else if (scrollDistanceX < 0.0f &&  pageDistance != 0)
+       {
+               __edgeType &= ~WEB_EDGE_RIGHT;
+       }
+
+       return true;
+}
+
+
+bool
+_Web::CanOutOfEdgeTop(float scrollDistanceY, int pageDistance)
+{
+       if (scrollDistanceY < 0.0f)
+       {
+               __edgeType &= ~WEB_EDGE_BOTTOM;
+
+               return false;
+       }
+       else if (scrollDistanceY > 0.0f && pageDistance != 0)
+       {
+               __edgeType &= ~WEB_EDGE_TOP;
+       }
+
+       return true;
+}
+
+
+bool
+_Web::CanOutOfEdgeBottom(float scrollDistanceY, int pageDistance)
+{
+       if (scrollDistanceY > 0.0f)
+       {
+               __edgeType &= ~WEB_EDGE_TOP;
+
+               return false;
+       }
+       else if (scrollDistanceY < 0.0f && pageDistance != 0)
+       {
+               __edgeType &= ~WEB_EDGE_BOTTOM;
+       }
+
+       return true;
+}
+
+
+bool
+_Web::CanConsumeTouchMoved(float scrollDistanceX, float scrollDistanceY)
+{
+       if (__edgeType ==  WEB_EDGE_NONE)
+       {
+               return true;
+       }
+
+       bool ret = true;
+
+       int scrollWidth = 0;
+       int scrollHeight = 0;
+       ewk_view_scroll_size_get(GetWebNativeNode(), &scrollWidth, &scrollHeight);
+
+       int scrollX = 0;
+       int scrollY = 0;
+       ewk_view_scroll_pos_get(GetWebNativeNode(), &scrollX, &scrollY);
+
+       if (scrollWidth == 0)
+       {
+               if (__edgeType & WEB_EDGE_TOP)
                {
-                       if (_Abs(scrollDistanceY) < _Abs(scrollDistanceX))
+                       if (!CanOutOfEdgeTop(scrollDistanceY, scrollY - 0))
                        {
-                               if  (__edgeType & WEB_EDGE_LEFT)
-                               {
-                                       if (scrollDistanceX < 0)
-                                       {
-                                               __edgeType &= ~WEB_EDGE_RIGHT;
-
-                                               return false;
-                                       }
-                                       else
-                                       {
-                                               __edgeType &= ~WEB_EDGE_LEFT;
-                                       }
-                               }
-                               else if  (__edgeType & WEB_EDGE_RIGHT)
-                               {
-                                       if (scrollDistanceX > 0)
-                                       {
-                                               __edgeType &= ~WEB_EDGE_LEFT;
-
-                                               return false;
-                                       }
-                                       else
-                                       {
-                                               __edgeType &= ~WEB_EDGE_RIGHT;
-                                       }
-                               }
+                               return false;
                        }
-                       else if (_Abs(scrollDistanceY) > _Abs(scrollDistanceX))
+               }
+               else if (__edgeType & WEB_EDGE_BOTTOM)
+               {
+                       if (!CanOutOfEdgeBottom(scrollDistanceY, scrollY - scrollHeight))
                        {
-                               if  (__edgeType & WEB_EDGE_TOP)
-                               {
-                                       if (scrollDistanceY < 0)
-                                       {
-                                               __edgeType &= ~WEB_EDGE_BOTTOM;
-
-                                               return false;
-                                       }
-                                       else
-                                       {
-                                               __edgeType &= ~WEB_EDGE_TOP;
-                                       }
-                               }
-                               else if  (__edgeType & WEB_EDGE_BOTTOM)
-                               {
-                                       if (scrollDistanceY > 0)
-                                       {
-                                               __edgeType &= ~WEB_EDGE_TOP;
-
-                                               return false;
-                                       }
-                                       else
-                                       {
-                                               __edgeType &= ~WEB_EDGE_BOTTOM;
-                                       }
-                               }
+                               return false;
                        }
                }
+       }
 
-               return true;
+       if (scrollHeight == 0)
+       {
+               if (__edgeType & WEB_EDGE_LEFT)
+               {
+                       if (!CanOutOfEdgeLeft(scrollDistanceX, scrollX - 0))
+                       {
+                               return false;
+                       }
+               }
+               else if  (__edgeType & WEB_EDGE_RIGHT)
+               {
+                       if (!CanOutOfEdgeRight(scrollDistanceX, scrollX - scrollWidth))
+                       {
+                               return false;
+                       }
+               }
+       }
+
+       if (scrollWidth > 0 && scrollHeight > 0)
+       {
+               if  ((__edgeType & WEB_EDGE_LEFT) && (__edgeType & WEB_EDGE_TOP))
+               {
+                       if (!CanOutOfEdgeLeft(scrollDistanceX, scrollX - 0) || !CanOutOfEdgeTop(scrollDistanceY, scrollY - 0))
+                       {
+                               return false;
+                       }
+               }
+               else if  ((__edgeType & WEB_EDGE_LEFT) && (__edgeType & WEB_EDGE_BOTTOM))
+               {
+                       if (!CanOutOfEdgeLeft(scrollDistanceX, scrollX - 0) || !CanOutOfEdgeBottom(scrollDistanceY, scrollY - scrollHeight))
+                       {
+                               return false;
+                       }
+               }
+               else if  ((__edgeType & WEB_EDGE_RIGHT) && (__edgeType & WEB_EDGE_TOP))
+               {
+                       if (!CanOutOfEdgeRight(scrollDistanceX, scrollX - scrollWidth) || !CanOutOfEdgeTop(scrollDistanceY, scrollY - 0))
+                       {
+                               return false;
+                       }
+               }
+               else if  ((__edgeType & WEB_EDGE_RIGHT) && (__edgeType & WEB_EDGE_BOTTOM))
+               {
+                       if (!CanOutOfEdgeRight(scrollDistanceX, scrollX - scrollWidth) || !CanOutOfEdgeBottom(scrollDistanceY, scrollY - scrollHeight))
+                       {
+                               return false;
+                       }
+               }
+       }
+
+       return true;
+}
+
+
+bool
+_Web::OnTouchMoved(const _Control& source, const _TouchInfo& touchInfo)
+{
+       if (__pEflWebkit.get())
+       {
+               SendTouchEventForJavaScript(touchInfo);
+
+               float scrollDistanceX = __previousTouchedPosition.x - touchInfo.GetCurrentPosition().x;
+               float scrollDistanceY = __previousTouchedPosition.y - touchInfo.GetCurrentPosition().y;
+               __previousTouchedPosition = touchInfo.GetCurrentPosition();
+
+               if (CanConsumeTouchMoved(scrollDistanceX, scrollDistanceY))
+               {
+                       return __pGestureHandler->OnTouchMoved(source, touchInfo);
+               }
        }
 
        return false;
@@ -810,6 +922,8 @@ _Web::OnTouchMoved(const _Control& source, const _TouchInfo& touchInfo)
 bool
 _Web::OnTouchReleased(const _Control& source, const _TouchInfo& touchInfo)
 {
+       __touchPressed = false;
+
        SetFocused();
 
        if (__pEflWebkit.get())
@@ -837,30 +951,6 @@ _Web::OnTouchCanceled(const _Control& source, const _TouchInfo& touchInfo)
 }
 
 
-void
-_Web::OnTouchPressHandled(const _Control& control)
-{
-}
-
-
-void
-_Web::OnTouchReleaseHandled(const _Control& control)
-{
-}
-
-
-void
-_Web::OnTouchMoveHandled(const _Control& control)
-{
-}
-
-
-void
-_Web::OnTouchCancelHandled(const _Control& control)
-{
-}
-
-
 bool
 _Web::OnLongPressGestureDetected(_TouchLongPressGestureDetector& gesture)
 {
@@ -869,14 +959,14 @@ _Web::OnLongPressGestureDetected(_TouchLongPressGestureDetector& gesture)
                return __pTapGestureHandler->OnLongPressGestureDetected(gesture);
        }
 
-       return true;
+       return false;
 }
 
 
 bool
 _Web::OnLongPressGestureCanceled(_TouchLongPressGestureDetector& gesture)
 {
-       return true;
+       return false;
 }
 
 
@@ -888,33 +978,33 @@ _Web::OnTapGestureDetected(_TouchTapGestureDetector& gesture)
                return __pTapGestureHandler->OnTapGestureDetected(gesture);
        }
 
-       return true;
+       return false;
 }
 
 
 bool
 _Web::OnTapGestureCanceled(_TouchTapGestureDetector& gesture)
 {
-       return true;
+       return false;
 }
 
 
 bool
 _Web::OnFlickGestureDetected(_TouchFlickGestureDetector& gesture)
 {
-       if (__pEflWebkit.get() && _WebSettingImpl::GetInstance(__pWebSetting.get())->IsScrollEnabled())
+       if (__pEflWebkit.get())
        {
                return __pFlickGestureHandler->OnFlickGestureDetected(gesture);
        }
 
-       return true;
+       return false;
 }
 
 
 bool
 _Web::OnFlickGestureCanceled(_TouchFlickGestureDetector& gesture)
 {
-       return true;
+       return false;
 }
 
 
@@ -926,7 +1016,7 @@ _Web::OnPinchGestureStarted(Tizen::Ui::_TouchPinchGestureDetector& gesture)
                return __pPinchGestureHandler->OnPinchGestureStarted(gesture);
        }
 
-       return true;
+       return false;
 }
 
 
@@ -938,7 +1028,7 @@ _Web::OnPinchGestureChanged(Tizen::Ui::_TouchPinchGestureDetector& gesture)
                return __pPinchGestureHandler->OnPinchGestureChanged(gesture);
        }
 
-       return true;
+       return false;
 }
 
 
@@ -950,14 +1040,14 @@ _Web::OnPinchGestureFinished(Tizen::Ui::_TouchPinchGestureDetector& gesture)
                return __pPinchGestureHandler->OnPinchGestureFinished(gesture);
        }
 
-       return true;
+       return false;
 }
 
 
 bool
 _Web::OnPinchGestureCanceled(Tizen::Ui::_TouchPinchGestureDetector& gesture)
 {
-       return true;
+       return false;
 }
 
 
@@ -1161,6 +1251,58 @@ _Web::SetFullScreenEntered(bool isFullScreenEntered)
 }
 
 
+void
+_Web::SetFocusEnd(bool focus)
+{
+       __focus = focus;
+}
+
+
+bool
+_Web::IsFocusEnd(void) const
+{
+       return __focus;
+}
+
+
+bool
+_Web::OnKeyPressed(const _Control& source, const _KeyInfo& keyInfo)
+{
+       Ecore_X_Window rootWindow = ecore_x_window_root_first_get();
+       Ecore_X_Atom keyboardExist = ecore_x_atom_get("X External Keyboard Exist");
+       unsigned int keyboardNumber = 0;
+       int ret = ecore_x_window_prop_card32_get(rootWindow, keyboardExist, &keyboardNumber, 1);
+       if (keyboardNumber == 0)
+       {
+               return false;
+       }
+
+       _KeyCode keyCode = keyInfo.GetKeyCode();
+
+       if (IsFocusEnd() == true)
+       {
+               SetFocusEnd(false);
+               evas_object_focus_set(GetWebNativeNode(), EINA_FALSE);
+               return false;
+       }
+
+       switch(keyCode)
+       {
+       case _KEY_UP:
+       case _KEY_DOWN:
+               evas_object_focus_set(GetWebNativeNode(), EINA_FALSE);
+               return false;
+               break;
+       default:
+               break;
+       }
+
+       evas_object_focus_set(GetWebNativeNode(), EINA_TRUE);
+
+       return true;
+}
+
+
 bool
 _Web::OnKeyReleased(const _Control& source, const _KeyInfo& keyInfo)
 {
@@ -1180,4 +1322,44 @@ _Web::OnKeyReleased(const _Control& source, const _KeyInfo& keyInfo)
 }
 
 
+void
+_Web::OnDrawFocus(void)
+{
+}
+
+
+bool
+_Web::OnFocusLost(const _Control& source)
+{
+       _Control::OnFocusLost(*this);
+
+       if (__touchPressed == true)
+       {
+               _TouchManager* pTouchManager = _TouchManager::GetInstance();
+               SysAssertf(pTouchManager, "Failed to get touch manager.");
+
+               Point absPoint(_CoordinateSystemUtils::ConvertToInteger(pTouchManager->GetPosition(pTouchManager->GetCurrentPointId())));
+
+               Ewk_Touch_Point* pPoint = static_cast< Ewk_Touch_Point* >(calloc(1, sizeof(Ewk_Touch_Point)));
+               pPoint->id = 0;
+               pPoint->x = absPoint.x;
+               pPoint->y = absPoint.y;
+               pPoint->state = EVAS_TOUCH_POINT_CANCEL;
+
+               Eina_List* pPointList = null;
+               pPointList = eina_list_append(pPointList, pPoint);
+
+               ewk_view_feed_touch_event(GetWebNativeNode(), EWK_TOUCH_CANCEL, pPointList, null);
+
+               void* pData = null;
+               EINA_LIST_FREE(pPointList, pData)
+               free(pData);
+
+               __touchPressed = false;
+       }
+
+       return false;
+}
+
+
 }}} // Tizen::Web::Controls