Fix for text selection issue
[framework/osp/web.git] / src / controls / FWebCtrl_Web.cpp
old mode 100755 (executable)
new mode 100644 (file)
index 5e628f9..4ec2e87
@@ -21,6 +21,7 @@
  *
  * The file contains the definition of _Web class.
  */
+#include <Elementary.h>
 #include <memory>
 #include <FBaseByteBuffer.h>
 #include <FBaseColLinkedListT.h>
@@ -41,6 +42,7 @@
 #include <FUi_AccessibilityContainer.h>
 #include <FUi_AccessibilityElement.h>
 #include <FUi_IAccessibilityFocusHandler.h>
+#include <FUi_IAccessibilityListener.h>
 #include <FUi_Math.h>
 #include <FUi_TouchManager.h>
 #include "FWebCtrl_EflWebkit.h"
@@ -60,57 +62,205 @@ using namespace Tizen::Ui::Animations;
 
 namespace
 {
-static int __animationAccessibilityCount = 0;
+
+
+class _WebAccessibilityListener
+       : public Tizen::Ui::_IAccessibilityListener
+{
+public:
+       _WebAccessibilityListener(Evas_Object* pView);
+
+       virtual ~_WebAccessibilityListener(void);
+
+       virtual bool OnAccessibilityFocusMovedNext(const _AccessibilityContainer& control, const _AccessibilityElement& element);
+
+       virtual bool OnAccessibilityFocusMovedPrevious(const _AccessibilityContainer& control, const _AccessibilityElement& element);
+
+       virtual bool OnAccessibilityReadingElement(const _AccessibilityContainer& control, const _AccessibilityElement& element);
+
+       virtual bool OnAccessibilityReadElement(const _AccessibilityContainer& control, const _AccessibilityElement& element);
+
+       virtual bool OnAccessibilityFocusIn(const _AccessibilityContainer& control, const _AccessibilityElement& element);
+
+       virtual bool OnAccessibilityFocusOut(const _AccessibilityContainer& control, const _AccessibilityElement& element);
+
+       virtual bool OnAccessibilityActionPerformed(const _AccessibilityContainer& control, const _AccessibilityElement& element);
+
+       virtual bool OnAccessibilityValueIncreased(const _AccessibilityContainer& control, const _AccessibilityElement& element);
+
+       virtual bool OnAccessibilityValueDecreased(const _AccessibilityContainer& control, const _AccessibilityElement& element);
+
+private:
+       Evas_Object* __pView;
+};
+
+
+_WebAccessibilityListener::_WebAccessibilityListener(Evas_Object* pView)
+       : __pView(pView)
+{
+}
+
+
+_WebAccessibilityListener::~_WebAccessibilityListener(void)
+{
+}
+
+
+bool
+_WebAccessibilityListener::OnAccessibilityFocusMovedNext(const _AccessibilityContainer& control, const _AccessibilityElement& element)
+{
+       return true;
+}
+
+
+bool
+_WebAccessibilityListener::OnAccessibilityFocusMovedPrevious(const _AccessibilityContainer& control, const _AccessibilityElement& element)
+{
+       return true;
+}
+
+
+bool
+_WebAccessibilityListener::OnAccessibilityReadingElement(const _AccessibilityContainer& control, const _AccessibilityElement& element)
+{
+       return true;
+}
+
+
+bool
+_WebAccessibilityListener::OnAccessibilityReadElement(const _AccessibilityContainer& control, const _AccessibilityElement& element)
+{
+       return true;
+}
+
+
+bool
+_WebAccessibilityListener::OnAccessibilityFocusIn(const _AccessibilityContainer& control, const _AccessibilityElement& element)
+{
+       return true;
+}
+
+
+bool
+_WebAccessibilityListener::OnAccessibilityFocusOut(const _AccessibilityContainer& control, const _AccessibilityElement& element)
+{
+       return true;
+}
+
+
+bool
+_WebAccessibilityListener::OnAccessibilityActionPerformed(const _AccessibilityContainer& control, const _AccessibilityElement& element)
+{
+       const Ewk_View_Smart_Data* pSmartData = static_cast<Ewk_View_Smart_Data*>(evas_object_smart_data_get(__pView));
+       SysAssertf(pSmartData, "Failed to get webkit smart data.");
+
+       Elm_Access_Action_Info* pActionInfo = new Elm_Access_Action_Info();
+       SysTryReturn(NID_WEB_CTRL, pActionInfo, false, E_OUT_OF_MEMORY, "[%s] Memory Allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
+
+       bool result = false;
+
+       pActionInfo->action_type = ELM_ACCESS_ACTION_ACTIVATE;
+
+       result = pSmartData->api->screen_reader_action_execute(const_cast<Ewk_View_Smart_Data*>(pSmartData), pActionInfo);
+       delete pActionInfo;
+
+       return result;
+}
+
+
+bool
+_WebAccessibilityListener::OnAccessibilityValueIncreased(const _AccessibilityContainer& control, const _AccessibilityElement& element)
+{
+       return true;
+}
+
+
+bool
+_WebAccessibilityListener::OnAccessibilityValueDecreased(const _AccessibilityContainer& control, const _AccessibilityElement& element)
+{
+       return true;
+}
+
+
 class _WebAccessibilityFocusHandler
-       :public Tizen::Ui::_IAccessibilityFocusHandler
+       : public Tizen::Ui::_IAccessibilityFocusHandler
 {
 public:
-       _WebAccessibilityFocusHandler(void)
-       {
-       }
-       virtual ~_WebAccessibilityFocusHandler(void)
-       {
-       }
-       virtual bool OnMoveFocus(Tizen::Ui::_AccessibilityFocusDirection direction)
+       _WebAccessibilityFocusHandler(Evas_Object* pView);
+
+       virtual ~_WebAccessibilityFocusHandler(void);
+
+       virtual bool OnMoveFocus(Tizen::Ui::_AccessibilityFocusDirection direction);
+
+       virtual bool OnMoveFocus(const Tizen::Graphics::Point& point);
+
+private:
+       Evas_Object* __pView;
+};
+
+
+_WebAccessibilityFocusHandler::_WebAccessibilityFocusHandler(Evas_Object* pView)
+       : __pView(pView)
+{
+}
+
+
+_WebAccessibilityFocusHandler::~_WebAccessibilityFocusHandler(void)
+{
+}
+
+
+bool
+_WebAccessibilityFocusHandler::OnMoveFocus(Tizen::Ui::_AccessibilityFocusDirection direction)
+{
+       const Ewk_View_Smart_Data* pSmartData = static_cast<Ewk_View_Smart_Data*>(evas_object_smart_data_get(__pView));
+       SysAssertf(pSmartData, "Failed to get webkit smart data.");
+
+       Elm_Access_Action_Info* pActionInfo = new Elm_Access_Action_Info();
+       SysTryReturn(NID_WEB_CTRL, pActionInfo, false, E_OUT_OF_MEMORY, "[%s] Memory Allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
+
+       bool result = false;
+
+       if (direction == Tizen::Ui::_ACCESSIBILITY_FOCUS_DIRECTION_PREVIOUS)
        {
-               __animationAccessibilityCount++;
-               if (direction == Tizen::Ui::_ACCESSIBILITY_FOCUS_DIRECTION_PREVIOUS)
-               {
-                       if(__animationAccessibilityCount %3 == 0)
-                       {
-                               SysLog(NID_WEB_CTRL, "_WebAccessibilityFocusHandler can move focus , :direction : PREVIOUS");
-                               return false;
-                       }
-                       SysLog(NID_WEB_CTRL, "!!!_WebAccessibilityFocusHandler can NOT move focus , :direction : PREVIOUS");
-                       return true;
-               }
-               else if (direction == Tizen::Ui::_ACCESSIBILITY_FOCUS_DIRECTION_NEXT)
-               {
-                       if(__animationAccessibilityCount %3 == 0)
-                       {
-                               SysLog(NID_WEB_CTRL, "_WebAccessibilityFocusHandler can move focus , :direction : NEXT");
-                               return false;
-                       }
-                       SysLog(NID_WEB_CTRL, "!!!_WebAccessibilityFocusHandler can NOT move focus , :direction : NEXT");
-                       return true;
-               }
-               return true;
+               pActionInfo->action_type = ELM_ACCESS_ACTION_HIGHLIGHT_PREV;
+
+               result = pSmartData->api->screen_reader_action_execute(const_cast<Ewk_View_Smart_Data*>(pSmartData), pActionInfo);
        }
-       virtual bool OnMoveFocus(const Tizen::Graphics::Point& point)
+       else if (direction == Tizen::Ui::_ACCESSIBILITY_FOCUS_DIRECTION_NEXT)
        {
-               if(__animationAccessibilityCount %2 == 0)
-               {
-                       SysLog(NID_WEB_CTRL, "_WebAccessibilityFocusHandler can read element at the point (%d,%d)", point.x, point.y);
-                       return true;
-               }
-               else
-               {
-                       SysLog(NID_WEB_CTRL, "_WebAccessibilityFocusHandler can NOT read element at the point (%d,%d)", point.x, point.y);
-                       return false;
-               }
+               pActionInfo->action_type = ELM_ACCESS_ACTION_HIGHLIGHT_NEXT;
 
+               result = pSmartData->api->screen_reader_action_execute(const_cast<Ewk_View_Smart_Data*>(pSmartData), pActionInfo);
        }
-};
+       delete pActionInfo;
+
+       return result;
+}
+
+
+bool
+_WebAccessibilityFocusHandler::OnMoveFocus(const Tizen::Graphics::Point& point)
+{
+       const Ewk_View_Smart_Data* pSmartData = static_cast<Ewk_View_Smart_Data*>(evas_object_smart_data_get(__pView));
+       SysAssertf(pSmartData, "Failed to get webkit smart data.");
+
+       Elm_Access_Action_Info* pActionInfo = new Elm_Access_Action_Info();
+       SysTryReturn(NID_WEB_CTRL, pActionInfo, false, E_OUT_OF_MEMORY, "[%s] Memory Allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
+
+       bool result = false;
+
+       pActionInfo->action_type = ELM_ACCESS_ACTION_READ;
+       pActionInfo->x = point.x;
+       pActionInfo->y = point.y;
+
+       result = pSmartData->api->screen_reader_action_execute(const_cast<Ewk_View_Smart_Data*>(pSmartData), pActionInfo);
+       delete pActionInfo;
+
+       return result;
+}
+
+
 }
 
 
@@ -227,10 +377,11 @@ _Web::CreateWebkitEvasObject(void)
 
        __pEflWebkit = std::move(pEflWebkit);
 
-       evas_object_smart_callback_add(__pEflWebkit->GetWebEvasObject(), "edge,left", OnEdgeLeft, this);
-       evas_object_smart_callback_add(__pEflWebkit->GetWebEvasObject(), "edge,right", OnEdgeRight, this);
-       evas_object_smart_callback_add(__pEflWebkit->GetWebEvasObject(), "edge,top", OnEdgeTop, this);
-       evas_object_smart_callback_add(__pEflWebkit->GetWebEvasObject(), "edge,bottom", OnEdgeBottom, this);
+       Evas_Object* pView = GetWebNativeNode();
+       evas_object_smart_callback_add(pView, "edge,left", OnEdgeLeft, this);
+       evas_object_smart_callback_add(pView, "edge,right", OnEdgeRight, this);
+       evas_object_smart_callback_add(pView, "edge,top", OnEdgeTop, this);
+       evas_object_smart_callback_add(pView, "edge,bottom", OnEdgeBottom, this);
 
        return E_SUCCESS;
 }
@@ -337,12 +488,13 @@ _Web::RemoveGestureListener(void)
                RemoveGestureDetector(*__pGesturePinch);
        }
 
-       if (__pEflWebkit->GetWebEvasObject())
+       Evas_Object* pView = GetWebNativeNode();
+       if (pView)
        {
-               evas_object_smart_callback_del(__pEflWebkit->GetWebEvasObject(), "edge,left", OnEdgeLeft);
-               evas_object_smart_callback_del(__pEflWebkit->GetWebEvasObject(), "edge,right", OnEdgeRight);
-               evas_object_smart_callback_del(__pEflWebkit->GetWebEvasObject(), "edge,top", OnEdgeTop);
-               evas_object_smart_callback_del(__pEflWebkit->GetWebEvasObject(), "edge,bottom", OnEdgeBottom);
+               evas_object_smart_callback_del(pView, "edge,left", OnEdgeLeft);
+               evas_object_smart_callback_del(pView, "edge,right", OnEdgeRight);
+               evas_object_smart_callback_del(pView, "edge,top", OnEdgeTop);
+               evas_object_smart_callback_del(pView, "edge,bottom", OnEdgeBottom);
        }
 }
 
@@ -360,21 +512,23 @@ _Web::InitializeWebNativeNode(void)
        _AccessibilityContainer* pContainer = GetAccessibilityContainer();
        SysTryReturn(NID_WEB_CTRL, pContainer, E_SYSTEM, E_SYSTEM, "[%s] Propagating.", GetErrorMessage(E_SYSTEM));
 
-       if (pContainer)
-       {
-               __pTextElement = new (std::nothrow) _AccessibilityElement(true);
-               SysTryReturn(NID_WEB_CTRL, __pTextElement, E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[%s] Memory shortage.", GetErrorMessage(E_OUT_OF_MEMORY));
+       __pTextElement = new (std::nothrow) _AccessibilityElement(true);
+       SysTryReturn(NID_WEB_CTRL, __pTextElement, E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[%s] Memory Allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
 
-               __pTextElement->SetBounds(FloatRectangle(0.0f, 0.0f, GetBoundsF().width, GetBoundsF().height));
-               //__pTextElement->SetLabel(GetText());
-               //__pTextElement->SetTrait(L"Web");
-               //__pTextElement->SetName(L"WebText");
-
-               pContainer->AddElement(*__pTextElement);
-       }
+       __pTextElement->SetBounds(FloatRectangle(0.0f, 0.0f, GetBoundsF().width, GetBoundsF().height));
+       __pTextElement->SetLabel(L"Web control");
 
+       pContainer->AddElement(*__pTextElement);
        pContainer->Activate(true);
-       _WebAccessibilityFocusHandler* pFocusHandler = new (std::nothrow) _WebAccessibilityFocusHandler();
+
+       _WebAccessibilityListener* pListener = new (std::nothrow) _WebAccessibilityListener(GetWebNativeNode());
+       SysTryReturn(NID_WEB_CTRL, pListener, E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[%s] Memory Allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
+
+       pContainer->AddListener(*dynamic_cast<_IAccessibilityListener*>(pListener));
+
+       _WebAccessibilityFocusHandler* pFocusHandler = new (std::nothrow) _WebAccessibilityFocusHandler(GetWebNativeNode());
+       SysTryReturn(NID_WEB_CTRL, pFocusHandler, E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[%s] Memory Allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
+
        pContainer->SetFocusHandler(dynamic_cast<_IAccessibilityFocusHandler*>(pFocusHandler));
 
        return E_SUCCESS;
@@ -412,9 +566,12 @@ _Web::GetRelativeCoordinate(FloatPoint absolutePoint)
 Evas_Object*
 _Web::GetWebNativeNode(void)
 {
-       SysTryReturn(NID_WEB_CTRL, __pEflWebkit.get(), null, E_INVALID_STATE, "[%s] Native node is in an invalid state.", GetErrorMessage(E_INVALID_STATE));
+       if (__pEflWebkit.get())
+       {
+               return __pEflWebkit->GetWebEvasObject();
+       }
 
-       return __pEflWebkit->GetWebEvasObject();
+       return null;
 }
 
 
@@ -624,6 +781,14 @@ _Web::OnTouchReleased(const _Control& source, const _TouchInfo& touchInfo)
        {
                SendTouchEventForJavaScript(touchInfo);
 
+               Evas_Object* pView = GetWebNativeNode();
+               _WebImpl* pImpl = reinterpret_cast< _WebImpl* >(evas_object_data_get(pView, WEB_CTRL));
+
+               if (pImpl && pImpl->GetTextFromBlock().GetLength() > 0)
+               {
+                       evas_object_smart_callback_call(pView, "text,selected", NULL);
+               }
+
                return __pGestureHandler->OnTouchReleased(source, touchInfo);
        }
 
@@ -770,7 +935,7 @@ _Web::OnPinchGestureCanceled(Tizen::Ui::_TouchPinchGestureDetector& gesture)
 
 
 Canvas*
-_Web::OnCanvasRequestedFN(const FloatRectangle& bounds)
+_Web::OnCanvasRequestedN(const FloatRectangle& bounds)
 {
        result r = E_SUCCESS;
 
@@ -852,7 +1017,7 @@ _Web::DumpPointList(void* pData)
        for(; pList; pList = eina_list_next(pList))
        {
                Ewk_Touch_Point* pPointDump = static_cast<Ewk_Touch_Point*>(eina_list_data_get(pList));
-               SysLog(NID_WEB_CTRL, "The current value of id is %lu, x is %d, y is %d, state is %d", pPointDump->id, pPointDump->x, pPointDump->y, pPointDump->state);
+               SysSecureLog(NID_WEB_CTRL, "The current value of id is %lu, x is %d, y is %d, state is %d", pPointDump->id, pPointDump->x, pPointDump->y, pPointDump->state);
        }
 }