change for webpagecapture
[framework/osp/web.git] / src / controls / FWebCtrl_Web.cpp
index 936b158..f92d336 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>
 #include <FSys_VibratorImpl.h>
 #include <FUiAnim_EflNode.h>
 #include <FUiAnim_VisualElement.h>
+#include <FUiAnim_VisualElementImpl.h>
 #include <FUi_CoordinateSystemUtils.h>
 #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 +63,222 @@ 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)
+{
+       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_UNHIGHLIGHT;
+
+       result = pSmartData->api->screen_reader_action_execute(pSmartData, pActionInfo);
+       delete pActionInfo;
+
+       return result;
+}
+
+
+bool
+_WebAccessibilityListener::OnAccessibilityActionPerformed(const _AccessibilityContainer& control, const _AccessibilityElement& element)
+{
+       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(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)
+{
+       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;
+
+               pActionInfo->action_by = ELM_ACCESS_ACTION_HIGHLIGHT_PREV;
+
+               result = pSmartData->api->screen_reader_action_execute(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;
 
+               pActionInfo->action_by = ELM_ACCESS_ACTION_HIGHLIGHT_NEXT;
+
+               result = pSmartData->api->screen_reader_action_execute(pSmartData, pActionInfo);
        }
-};
+       delete pActionInfo;
+
+       return result;
+}
+
+
+bool
+_WebAccessibilityFocusHandler::OnMoveFocus(const Tizen::Graphics::Point& point)
+{
+       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(pSmartData, pActionInfo);
+       delete pActionInfo;
+
+       return result;
+}
+
+
 }
 
 
@@ -222,9 +390,13 @@ _Web::CreateWebkitEvasObject(void)
        std::unique_ptr<_EflWebkit> pEflWebkit(new (std::nothrow) _EflWebkit());
        SysTryReturnResult(NID_WEB_CTRL, pEflWebkit.get(), E_OUT_OF_MEMORY, "[%s] Memory Allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
 
-       r = pEflWebkit->Construct(GetAbsoluteBounds(), *GetVisualElement(), this);
+       _VisualElement* pVe = GetVisualElement();
+       r = pEflWebkit->Construct(GetAbsoluteBounds(), *pVe, this);
        SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
 
+       _VisualElementImpl* pVeImpl = _VisualElementImpl::GetInstance(*pVe);
+       pVeImpl->SetCaptureProvider(this);
+
        __pEflWebkit = std::move(pEflWebkit);
 
        Evas_Object* pView = GetWebNativeNode();
@@ -362,21 +534,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->SetBounds(FloatRectangle(0.0f, 0.0f, GetBoundsF().width, GetBoundsF().height));
-               //__pTextElement->SetLabel(GetText());
-               //__pTextElement->SetTrait(L"Web");
-               //__pTextElement->SetName(L"WebText");
+       __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));
 
-               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;
@@ -414,9 +588,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;
 }
 
 
@@ -626,6 +803,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);
        }
 
@@ -772,20 +957,23 @@ _Web::OnPinchGestureCanceled(Tizen::Ui::_TouchPinchGestureDetector& gesture)
 
 
 Canvas*
-_Web::OnCanvasRequestedFN(const FloatRectangle& bounds)
+_Web::OnCanvasRequestedN(const FloatRectangle& bounds)
 {
-       result r = E_SUCCESS;
+       SysTryReturn(NID_WEB_CTRL, bounds.width >= 0.0f && bounds.height >= 0.0f, null, E_OUT_OF_RANGE, "[E_OUT_OF_RANGE] Canvas size is out of range. size = (%f, %f)", bounds.width, bounds.height);
+       if (bounds.width == 0.0f || bounds.height == 0.0f)
+       {
+               FloatDimension size(GetSizeF());
+               SysTryReturn(NID_WEB_CTRL, bounds.x >= 0.0f && bounds.y >= 0.0f && bounds.x <= size.width && bounds.y <= size.height, null, E_OUT_OF_RANGE, "[E_OUT_OF_RANGE] Bounds is out of range.");
+       }
 
-       Evas_Object* pWebFrame = GetWebNativeNode();
-       Eina_Rectangle rect;
-       BufferInfo bufferInfo;
+       result r = E_SUCCESS;
 
-       Point absPoint(_CoordinateSystemUtils::ConvertToInteger(GetAbsoluteCoordinate(FloatPoint(bounds.x, bounds.y))));
-       Dimension absSize(_CoordinateSystemUtils::ConvertToInteger(_CoordinateSystemUtils::HorizontalTransform(bounds.width)),
-               _CoordinateSystemUtils::ConvertToInteger(_CoordinateSystemUtils::VerticalTransform(bounds.height)));
+       Rectangle absBounds(_CoordinateSystemUtils::ConvertToInteger(_CoordinateSystemUtils::Transform(bounds)));
 
-       EINA_RECTANGLE_SET(&rect, absPoint.x, absPoint.y, absSize.width, absSize.height);
+       Eina_Rectangle rect;
+       EINA_RECTANGLE_SET(&rect, absBounds.x, absBounds.y, absBounds.width, absBounds.height);
 
+       Evas_Object* pWebFrame = GetWebNativeNode();
        Evas_Object* pScreenShot = ewk_view_screenshot_contents_get(pWebFrame, rect, 1.0f, evas_object_evas_get(pWebFrame));
 
        std::unique_ptr<Canvas> pCanvas(new (std::nothrow) Canvas());
@@ -793,6 +981,8 @@ _Web::OnCanvasRequestedFN(const FloatRectangle& bounds)
 
        if (pScreenShot)
        {
+               BufferInfo bufferInfo;
+
                r = _Utility::GetPixelBufferFromEvasObject(pScreenShot, bufferInfo);
                evas_object_del(pScreenShot);
                SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, null, r, "[%s] propagating", GetErrorMessage(r));
@@ -815,24 +1005,12 @@ _Web::OnCapturedBitmapRequestedN(void)
 {
        result r = E_SUCCESS;
 
-       Evas_Object* pWebFrame = GetWebNativeNode();
-       Eina_Rectangle rect;
-       ByteBuffer buffer;
        BufferInfo bufferInfo;
+       SysTryReturn(NID_WEB_CTRL, OnCaptureAcquire(bufferInfo), null, E_SYSTEM, "[%s] A system error has been occurred. Failed to get snapshot of Web control", GetErrorMessage(E_SYSTEM));
 
-       Dimension size(GetSize());
-       Point absSize(GetAbsoluteCoordinate(Point(size.width, size.height)));
-
-       EINA_RECTANGLE_SET(&rect, 0, 0, absSize.x, absSize.y);
-
-       Evas_Object* pScreenShot = ewk_view_screenshot_contents_get(pWebFrame, rect, 1.0f, evas_object_evas_get(pWebFrame));
-       SysTryReturn(NID_WEB_CTRL, pScreenShot, null, E_SYSTEM, "[%s] A system error has been occurred. Failed to get snapshot of Web control", GetErrorMessage(E_SYSTEM));
-
-       r = _Utility::GetPixelBufferFromEvasObject(pScreenShot, bufferInfo);
-       evas_object_del(pScreenShot);
-       SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, null, r, "[%s] propagating", GetErrorMessage(r));
-
+       ByteBuffer buffer;
        int bufferSize = bufferInfo.bitsPerPixel * bufferInfo.width * bufferInfo.height;
+
        r = buffer.Construct(reinterpret_cast < byte* >(bufferInfo.pPixels), 0, bufferSize, bufferSize);
        SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, null, r, "[%s] propagating", GetErrorMessage(r));
 
@@ -846,6 +1024,31 @@ _Web::OnCapturedBitmapRequestedN(void)
 }
 
 
+bool
+_Web::OnCaptureAcquire(BufferInfo& output)
+{
+       result r = E_SUCCESS;
+
+       FloatPoint position(GetPositionF());
+       FloatDimension size(GetSizeF());
+
+       Dimension absSize(_CoordinateSystemUtils::ConvertToInteger(_CoordinateSystemUtils::Transform(size)));
+
+       Eina_Rectangle rect;
+       EINA_RECTANGLE_SET(&rect, 0, 0, absSize.width, absSize.height);
+
+       Evas_Object* pWebFrame = GetWebNativeNode();
+       Evas_Object* pScreenShot = ewk_view_screenshot_contents_get(pWebFrame, rect, 1.0f, evas_object_evas_get(pWebFrame));
+       SysTryReturn(NID_WEB_CTRL, pScreenShot, false, E_SYSTEM, "[%s] A system error has been occurred. Failed to get snapshot of Web control", GetErrorMessage(E_SYSTEM));
+
+       r = _Utility::GetPixelBufferFromEvasObject(pScreenShot, output);
+       evas_object_del(pScreenShot);
+       SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, false, r, "[%s] propagating", GetErrorMessage(r));
+
+       return true;
+}
+
+
 void
 _Web::DumpPointList(void* pData)
 {
@@ -854,7 +1057,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);
        }
 }