Add Accessibility
authorHyun Lee <hyunn.lee@samsung.com>
Mon, 20 May 2013 04:53:53 +0000 (13:53 +0900)
committerHyun Lee <hyunn.lee@samsung.com>
Mon, 20 May 2013 04:53:53 +0000 (13:53 +0900)
Change-Id: I0131a64fb22114c6728de01c91884254e938d30b
Signed-off-by: Hyun Lee <hyunn.lee@samsung.com>
src/controls/FWebCtrl_Web.cpp

index 42acc8b..c6fc9f6 100755 (executable)
@@ -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;
+}
+
+
 }
 
 
@@ -362,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;