*
* The file contains the definition of _Web class.
*/
+#include <Elementary.h>
#include <memory>
#include <FBaseByteBuffer.h>
#include <FBaseColLinkedListT.h>
#include <FGrpBitmap.h>
#include <FGrpCanvas.h>
#include <FGrpFloatRectangle.h>
+#include <FSysVibrator.h>
#include <FWebCtrlWebSetting.h>
#include <FGrp_CoordinateSystem.h>
+#include <FSys_VibratorImpl.h>
#include <FUiAnim_EflNode.h>
#include <FUiAnim_VisualElement.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"
#include "FWebCtrl_GestureState.h"
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;
+}
+
+
}
static const char WEB_CTRL[] = "webcontrol";
+void
+OnEdgeLeft(void* pUserData, Evas_Object* pView, void* pEventInfo)
+{
+ _Web* pCore = reinterpret_cast< _Web* >(pUserData);
+ SysAssertf(pCore, "Failed to request");
+
+ pCore->SetEdgeReachedEvent(WEB_EDGE_LEFT);
+}
+
+
+void
+OnEdgeRight(void* pUserData, Evas_Object* pView, void* pEventInfo)
+{
+ _Web* pCore = reinterpret_cast< _Web* >(pUserData);
+ SysAssertf(pCore, "Failed to request");
+
+ pCore->SetEdgeReachedEvent(WEB_EDGE_RIGHT);
+}
+
+
+void
+OnEdgeTop(void* pUserData, Evas_Object* pView, void* pEventInfo)
+{
+ _Web* pCore = reinterpret_cast< _Web* >(pUserData);
+ SysAssertf(pCore, "Failed to request");
+
+ pCore->SetEdgeReachedEvent(WEB_EDGE_TOP);
+}
+
+
+void
+OnEdgeBottom(void* pUserData, Evas_Object* pView, void* pEventInfo)
+{
+ _Web* pCore = reinterpret_cast< _Web* >(pUserData);
+ SysAssertf(pCore, "Failed to request");
+
+ pCore->SetEdgeReachedEvent(WEB_EDGE_BOTTOM);
+}
+
+
_Web::_Web(void)
- : __gestureType(WEB_GESTURE_TYPE_TAP)
- , __pGestureHandler(null)
+ : __pGestureHandler(null)
, __pEflWebkit(null)
, __pWebSetting(null)
, __pGestureFlick(null)
, __pPanningGestureHandler(null)
, __pFlickGestureHandler(null)
, __pPinchGestureHandler(null)
+ , __gestureType(WEB_GESTURE_TYPE_TAP)
+ , __edgeType(WEB_EDGE_NONE)
+ , __pTextElement(null)
+ , __previousTouchedPosition(0.0f, 0.0f)
{
SetBackgroundColor(Color(0, 0, 0, 0));
}
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());
+ r = pEflWebkit->Construct(GetAbsoluteBounds(), *GetVisualElement(), this);
SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
__pEflWebkit = std::move(pEflWebkit);
+ 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;
}
__pGesturePinch->RemoveGestureListener(*this);
RemoveGestureDetector(*__pGesturePinch);
}
+
+ Evas_Object* pView = GetWebNativeNode();
+ if (pView)
+ {
+ 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);
+ }
}
_AccessibilityContainer* pContainer = GetAccessibilityContainer();
SysTryReturn(NID_WEB_CTRL, pContainer, E_SYSTEM, E_SYSTEM, "[%s] Propagating.", GetErrorMessage(E_SYSTEM));
+ __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(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;
Point
_Web::GetRelativeCoordinate(Point absolutePoint)
{
- return _CoordinateSystemUtils::InverseTransform(ConvertToControlPosition(absolutePoint));
+ return ConvertToControlPosition(_CoordinateSystemUtils::InverseTransform(absolutePoint));
}
FloatPoint
_Web::GetRelativeCoordinate(FloatPoint absolutePoint)
{
- return _CoordinateSystemUtils::InverseTransform(ConvertToControlPosition(absolutePoint));
+ return ConvertToControlPosition(_CoordinateSystemUtils::InverseTransform(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;
}
}
+void
+_Web::SetEdgeReachedEvent(_WebEdgeType type)
+{
+ __edgeType |= type;
+
+ switch(type)
+ {
+ case WEB_EDGE_LEFT:
+ __edgeType &= ~WEB_EDGE_RIGHT;
+ break;
+
+ case WEB_EDGE_RIGHT:
+ __edgeType &= ~WEB_EDGE_LEFT;
+ break;
+
+ case WEB_EDGE_TOP:
+ __edgeType &= ~WEB_EDGE_BOTTOM;
+ break;
+
+ case WEB_EDGE_BOTTOM:
+ __edgeType &= ~WEB_EDGE_TOP;
+ break;
+
+ default:
+ SysAssert(false);
+ }
+}
+
+
bool
_Web::OnTouchPressed(const _Control& source, const _TouchInfo& touchInfo)
{
if (__pEflWebkit.get())
{
+ __edgeType = WEB_EDGE_NONE;
+ __previousTouchedPosition = touchInfo.GetCurrentPosition();
+
SendTouchEventForJavaScript(touchInfo);
return __pGestureHandler->OnTouchPressed(source, touchInfo);
}
- return true;
+ return false;
}
{
if (__pEflWebkit.get())
{
- if (_WebSettingImpl::GetInstance(__pWebSetting.get())->IsScrollEnabled())
- {
- SendTouchEventForJavaScript(touchInfo);
+ SendTouchEventForJavaScript(touchInfo);
- return __pGestureHandler->OnTouchMoved(source, touchInfo);
- }
- else if (__gestureType == WEB_GESTURE_TYPE_TAP)
+ __pGestureHandler->OnTouchMoved(source, touchInfo);
+
+ 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)
{
- return __pGestureHandler->OnTouchMoved(source, touchInfo);
+ if (_Abs(scrollDistanceY) < _Abs(scrollDistanceX))
+ {
+ 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;
+ }
+ }
+ }
+ else if (_Abs(scrollDistanceY) > _Abs(scrollDistanceX))
+ {
+ 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 true;
}
- return true;
+ return false;
}
{
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);
}
- return true;
+ return false;
}
{
SendTouchEventForJavaScript(touchInfo);
- __pGestureHandler->OnTouchCanceled(source, touchInfo);
+ return __pGestureHandler->OnTouchCanceled(source, touchInfo);
}
- return true;
+ return false;
}
Canvas*
-_Web::OnCanvasRequestedFN(const FloatRectangle& bounds)
+_Web::OnCanvasRequestedN(const FloatRectangle& bounds)
{
result r = E_SUCCESS;
EINA_RECTANGLE_SET(&rect, absPoint.x, absPoint.y, absSize.width, absSize.height);
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));
std::unique_ptr<Canvas> pCanvas(new (std::nothrow) Canvas());
SysTryReturn(NID_WEB_CTRL, pCanvas.get(), null, E_OUT_OF_MEMORY, "[%s] Memory Allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
- r = pCanvas->Construct(bufferInfo);
- SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, null, r, "[%s] propagating", GetErrorMessage(r));
+ if (pScreenShot)
+ {
+ r = _Utility::GetPixelBufferFromEvasObject(pScreenShot, bufferInfo);
+ evas_object_del(pScreenShot);
+ SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, null, r, "[%s] propagating", GetErrorMessage(r));
+
+ r = pCanvas->Construct(bufferInfo);
+ SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, null, r, "[%s] propagating", GetErrorMessage(r));
+ }
+ else
+ {
+ r = pCanvas->Construct(bounds);
+ SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, null, r, "[%s] propagating", GetErrorMessage(r));
+ }
return pCanvas.release();
}
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);
}
}