2 // Open Service Platform
3 // Copyright (c) 2012 Samsung Electronics Co., Ltd.
5 // Licensed under the Apache License, Version 2.0 (the License);
6 // you may not use this file except in compliance with the License.
7 // You may obtain a copy of the License at
9 // http://www.apache.org/licenses/LICENSE-2.0
11 // Unless required by applicable law or agreed to in writing, software
12 // distributed under the License is distributed on an "AS IS" BASIS,
13 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 // See the License for the specific language governing permissions and
15 // limitations under the License.
19 * @file FWebCtrl_Web.cpp
20 * @brief The file contains the definition of _Web class.
22 * The file contains the definition of _Web class.
25 #include <FBaseByteBuffer.h>
26 #include <FBaseColLinkedListT.h>
27 #include <FBaseSysLog.h>
28 #include <FBaseColIListT.h>
29 #include <FGrpFloatPoint.h>
30 #include <FGrpPoint.h>
31 #include <FGrpBitmap.h>
32 #include <FGrpCanvas.h>
33 #include <FWebCtrlWebSetting.h>
34 #include <FGrp_CoordinateSystem.h>
35 #include <FUiAnim_EflNode.h>
36 #include <FUiAnim_VisualElement.h>
37 #include <FUi_CoordinateSystemUtils.h>
38 #include <FUi_AccessibilityContainer.h>
39 #include <FUi_AccessibilityElement.h>
40 #include <FUi_IAccessibilityFocusHandler.h>
41 #include <FUi_TouchManager.h>
42 #include "FWebCtrl_EflWebkit.h"
43 #include "FWebCtrl_GestureState.h"
44 #include "FWebCtrl_Web.h"
45 #include "FWebCtrl_WebImpl.h"
46 #include "FWebCtrl_WebSettingImpl.h"
47 #include "FWebCtrl_Utility.h"
50 using namespace Tizen::Base;
51 using namespace Tizen::Base::Collection;
52 using namespace Tizen::Graphics;
53 using namespace Tizen::Ui;
54 using namespace Tizen::Ui::Animations;
59 static int __animationAccessibilityCount = 0;
60 class _WebAccessibilityFocusHandler
61 :public Tizen::Ui::_IAccessibilityFocusHandler
64 _WebAccessibilityFocusHandler(void)
67 virtual ~_WebAccessibilityFocusHandler(void)
70 virtual bool OnMoveFocus(Tizen::Ui::_AccessibilityFocusDirection direction)
72 __animationAccessibilityCount++;
73 if (direction == Tizen::Ui::_ACCESSIBILITY_FOCUS_DIRECTION_PREVIOUS)
75 if(__animationAccessibilityCount %3 == 0)
77 SysLog(NID_WEB_CTRL, "_WebAccessibilityFocusHandler can move focus , :direction : PREVIOUS");
80 SysLog(NID_WEB_CTRL, "!!!_WebAccessibilityFocusHandler can NOT move focus , :direction : PREVIOUS");
83 else if (direction == Tizen::Ui::_ACCESSIBILITY_FOCUS_DIRECTION_NEXT)
85 if(__animationAccessibilityCount %3 == 0)
87 SysLog(NID_WEB_CTRL, "_WebAccessibilityFocusHandler can move focus , :direction : NEXT");
90 SysLog(NID_WEB_CTRL, "!!!_WebAccessibilityFocusHandler can NOT move focus , :direction : NEXT");
95 virtual bool OnMoveFocus(const Tizen::Graphics::Point& point)
97 if(__animationAccessibilityCount %2 == 0)
99 SysLog(NID_WEB_CTRL, "_WebAccessibilityFocusHandler can read element at the point (%d,%d)", point.x, point.y);
104 SysLog(NID_WEB_CTRL, "_WebAccessibilityFocusHandler can NOT read element at the point (%d,%d)", point.x, point.y);
113 namespace Tizen { namespace Web { namespace Controls
117 static const char WEB_CTRL[] = "webcontrol";
121 : __pGestureHandler(null)
123 , __pGestureFlick(null)
124 , __pGestureLongPress(null)
125 , __pGestureDoubleTap(null)
126 , __pTouchEventInfoList(null)
127 , __pTapGestureHandler(null)
128 , __pDoubleTapGestureHandler(null)
129 , __pPanningGestureHandler(null)
130 , __pFlickGestureHandler(null)
131 , __pPinchGestureHandler(null)
133 SetBackgroundColor(Color(0, 0, 0, 0));
139 RemoveGestureListener();
144 _Web::CreateWebN(void)
146 result r = E_SUCCESS;
148 std::unique_ptr<_Web> pWeb(new (std::nothrow) _Web());
149 SysTryReturn(NID_WEB_CTRL, pWeb.get(), null, E_OUT_OF_MEMORY, "[%s] Memory Allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
151 pWeb->AcquireHandle();
152 pWeb->SetMultiTouchEnabled(true);
153 pWeb->SetTouchPressThreshold(0.08);
155 r = pWeb->AddGestureListeners();
156 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, null, r, "[%s] Propagating.", GetErrorMessage(r));
158 r = pWeb->InitializeGestureStates();
159 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, null, r, "[%s] Propagating.", GetErrorMessage(r));
161 return pWeb.release();
166 _Web::CreateWebkitEvasObject(void)
168 result r = E_SUCCESS;
170 std::unique_ptr<_EflWebkit> pEflWebkit(new (std::nothrow) _EflWebkit());
171 SysTryReturnResult(NID_WEB_CTRL, pEflWebkit.get(), E_OUT_OF_MEMORY, "[%s] Memory Allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
173 r = pEflWebkit->Construct(GetAbsoluteBounds(), *GetVisualElement());
174 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
176 __pEflWebkit = std::move(pEflWebkit);
183 _Web::InitializeGestureStates(void)
185 __pPinchGestureHandler = std::unique_ptr<_PinchGestureState>(new (std::nothrow) _PinchGestureState(this));
186 SysTryReturnResult(NID_WEB_CTRL, __pPinchGestureHandler.get(), E_OUT_OF_MEMORY, "[%s] Memory Allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
188 __pTapGestureHandler = std::unique_ptr<_TapGestureState>(new (std::nothrow) _TapGestureState(this, __pPinchGestureHandler.get()));
189 SysTryReturnResult(NID_WEB_CTRL, __pTapGestureHandler.get(), E_OUT_OF_MEMORY, "[%s] Memory Allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
191 __pDoubleTapGestureHandler = std::unique_ptr<_DoubleTapGestureState>(new (std::nothrow) _DoubleTapGestureState(this));
192 SysTryReturnResult(NID_WEB_CTRL, __pDoubleTapGestureHandler.get(), E_OUT_OF_MEMORY, "[%s] Memory Allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
194 __pPanningGestureHandler = std::unique_ptr<_PanningGestureState>(new (std::nothrow) _PanningGestureState(this, __pPinchGestureHandler.get()));
195 SysTryReturnResult(NID_WEB_CTRL, __pPanningGestureHandler.get(), E_OUT_OF_MEMORY, "[%s] Memory Allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
197 __pFlickGestureHandler = std::unique_ptr<_FlickGestureState>(new (std::nothrow) _FlickGestureState(this));
198 SysTryReturnResult(NID_WEB_CTRL, __pFlickGestureHandler.get(), E_OUT_OF_MEMORY, "[%s] Memory Allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
200 __pGestureHandler = __pTapGestureHandler.get();
207 _Web::AddGestureListeners(void)
209 result r = E_SUCCESS;
211 _ITouchFlickGestureEventListener* pFlickListener = dynamic_cast< _ITouchFlickGestureEventListener* >(this);
212 SysAssertf(pFlickListener != null, "Failed to get flick gesture listener");
214 std::unique_ptr<_TouchFlickGestureDetector> pGestureFlick(new (std::nothrow) _TouchFlickGestureDetector());
215 SysTryReturnResult(NID_WEB_CTRL, pGestureFlick.get(), E_OUT_OF_MEMORY, "[%s] Memory Allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
217 r = pGestureFlick->AddGestureListener(*pFlickListener);
218 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
220 r = AddGestureDetector(*pGestureFlick.get());
221 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
223 __pGestureFlick = std::move(pGestureFlick);
225 _ITouchLongPressGestureEventListener* pLongPressListener = dynamic_cast< _ITouchLongPressGestureEventListener* >(this);
226 SysAssertf(pLongPressListener != null, "Failed to get longpress gesture listener");
228 std::unique_ptr<_TouchLongPressGestureDetector> pGestureLongPress(new (std::nothrow) _TouchLongPressGestureDetector());
229 SysTryReturnResult(NID_WEB_CTRL, pGestureLongPress.get(), E_OUT_OF_MEMORY, "[%s] Memory Allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
231 r = pGestureLongPress->AddGestureListener(*pLongPressListener);
232 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
234 r = AddGestureDetector(*pGestureLongPress.get());
235 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
237 __pGestureLongPress = std::move(pGestureLongPress);
239 _ITouchTapGestureEventListener* pDoubleTapListener = dynamic_cast< _ITouchTapGestureEventListener* >(this);
240 SysAssertf(pDoubleTapListener != null, "Failed to get tap gesture listener");
242 std::unique_ptr<_TouchTapGestureDetector> pGestureDoubleTap(new (std::nothrow) _TouchTapGestureDetector());
243 SysTryReturnResult(NID_WEB_CTRL, pGestureDoubleTap.get(), E_OUT_OF_MEMORY, "[%s] Memory Allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
245 r = pGestureDoubleTap->AddGestureListener(*pDoubleTapListener);
246 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
248 r = AddGestureDetector(*pGestureDoubleTap.get());
249 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
251 __pGestureDoubleTap = std::move(pGestureDoubleTap);
258 _Web::RemoveGestureListener(void)
260 if (__pGestureFlick.get())
262 _ITouchFlickGestureEventListener* pListener = dynamic_cast< _ITouchFlickGestureEventListener* >(this);
263 __pGestureFlick->RemoveGestureListener(*pListener);
264 RemoveGestureDetector(*__pGestureFlick);
267 if (__pGestureLongPress.get())
269 _ITouchLongPressGestureEventListener* pListener = dynamic_cast< _ITouchLongPressGestureEventListener* >(this);
270 __pGestureLongPress->RemoveGestureListener(*pListener);
271 RemoveGestureDetector(*__pGestureLongPress);
274 if (__pGestureDoubleTap.get())
276 _ITouchTapGestureEventListener* pListener = dynamic_cast< _ITouchTapGestureEventListener* >(this);
277 __pGestureDoubleTap->RemoveGestureListener(*pListener);
278 RemoveGestureDetector(*__pGestureDoubleTap);
284 _Web::InitializeWebNativeNode(void)
286 result r = E_SUCCESS;
288 r = CreateWebkitEvasObject();
289 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
291 SetNativeObjectFocusable(false);
293 _AccessibilityContainer* pContainer = GetAccessibilityContainer();
296 pContainer->Activate(true);
299 _WebAccessibilityFocusHandler* pFocusHandler = new (std::nothrow) _WebAccessibilityFocusHandler();
301 pContainer->SetFocusHandler(dynamic_cast<_IAccessibilityFocusHandler*>(pFocusHandler));
308 _Web::GetAbsoluteCoordinate(Point relativePoint)
310 _ICoordinateSystemTransformer* pXformer = _CoordinateSystem::GetInstance()->GetTransformer();
311 SysAssertf(pXformer, "Failed to get coordinate transformer.");
313 int absX = pXformer->TransformHorizontal(relativePoint.x + GetAbsoluteBounds().x);
314 int absY = pXformer->TransformVertical(relativePoint.y + GetAbsoluteBounds().y);
316 return Point(absX, absY);
321 _Web::GetAbsoluteCoordinate(FloatPoint relativePoint)
323 _ICoordinateSystemTransformer* pXformer = _CoordinateSystem::GetInstance()->GetTransformer();
324 SysAssertf(pXformer, "Failed to get coordinate transformer.");
326 float absX = pXformer->TransformHorizontal(relativePoint.x + GetAbsoluteBoundsF().x);
327 float absY = pXformer->TransformVertical(relativePoint.y + GetAbsoluteBoundsF().y);
329 return FloatPoint(absX, absY);
334 _Web::GetRelativeCoordinate(Point absolutePoint)
336 _ICoordinateSystemTransformer* pXformer = _CoordinateSystem::GetInstance()->GetInverseTransformer();
337 SysAssertf(pXformer, "Failed to get coordinate transformer.");
339 Point bound(GetAbsoluteCoordinate(Point(0, 0)));
341 int absX = pXformer->TransformHorizontal(absolutePoint.x - bound.x);
342 int absY = pXformer->TransformVertical(absolutePoint.y - bound.y);
344 return Point(absX, absY);
349 _Web::GetRelativeCoordinate(FloatPoint absolutePoint)
351 _ICoordinateSystemTransformer* pXformer = _CoordinateSystem::GetInstance()->GetInverseTransformer();
352 SysAssertf(pXformer, "Failed to get coordinate transformer.");
354 FloatPoint bound(GetAbsoluteCoordinate(FloatPoint(0.0, 0.0)));
356 float absX = pXformer->TransformHorizontal(absolutePoint.x - bound.x);
357 float absY = pXformer->TransformVertical(absolutePoint.y - bound.y);
359 return FloatPoint(absX, absY);
364 _Web::GetWebNativeNode(void)
366 SysTryReturn(NID_WEB_CTRL, __pEflWebkit.get(), null, E_INVALID_STATE, "[%s] Native node is in an invalid state.", GetErrorMessage(E_INVALID_STATE));
368 return __pEflWebkit->GetWebEvasObject();
373 _Web::SetWebSettingImpl(_WebSettingImpl* pWebSettingImpl)
375 __pWebSettingImpl = pWebSettingImpl;
380 _Web::GetWebSettingImpl(void) const
382 return __pWebSettingImpl;
387 _Web::OnAttaching(const _Control* pParent)
389 if (__pEflWebkit.get())
391 evas_object_show(__pEflWebkit->GetWebEvasObject());
392 evas_object_focus_set(__pEflWebkit->GetWebEvasObject(), EINA_TRUE);
400 _Web::OnBoundsChanging(const Rectangle& bounds)
402 Rectangle absoluteBounds = GetAbsoluteBounds();
403 Rectangle webBounds = GetBounds();
404 _ICoordinateSystemTransformer* pXformer = _CoordinateSystem::GetInstance()->GetTransformer();
405 SysTryReturnResult(NID_WEB_CTRL, pXformer, E_SYSTEM, "[%s] A system error has been occurred. Failed to get coordinate transformer.", GetErrorMessage(E_SYSTEM));
407 if (__pEflWebkit.get())
409 evas_object_move(__pEflWebkit->GetWebEvasObject(), pXformer->TransformHorizontal(absoluteBounds.x - webBounds.x + bounds.x), pXformer->TransformVertical(absoluteBounds.y - webBounds.y + bounds.y));
410 evas_object_resize(__pEflWebkit->GetWebEvasObject(), pXformer->TransformHorizontal(bounds.width), pXformer->TransformVertical(bounds.height));
418 _Web::ChangeGesture(_WebGestureType type)
422 case WEB_GESTURE_TYPE_TAP:
423 __pGestureHandler = __pTapGestureHandler.get();
426 case WEB_GESTURE_TYPE_DOUBLE_TAP:
427 __pGestureHandler = __pDoubleTapGestureHandler.get();
430 case WEB_GESTURE_TYPE_PANNING:
431 __pGestureHandler = __pPanningGestureHandler.get();
434 case WEB_GESTURE_TYPE_FLICK:
435 __pGestureHandler = __pFlickGestureHandler.get();
438 case WEB_GESTURE_TYPE_PINCH:
439 __pGestureHandler = __pPinchGestureHandler.get();
449 _Web::OnTouchPressed(const _Control& source, const _TouchInfo& touchInfo)
451 if (__pEflWebkit.get())
453 SendTouchEventForJavaScript(touchInfo);
455 __pGestureHandler->OnTouchPressed(source, touchInfo);
463 _Web::OnTouchMoved(const _Control& source, const _TouchInfo& touchInfo)
465 if (__pEflWebkit.get())
467 SendTouchEventForJavaScript(touchInfo);
469 __pGestureHandler->OnTouchMoved(source, touchInfo);
477 _Web::OnTouchReleased(const _Control& source, const _TouchInfo& touchInfo)
479 if (__pEflWebkit.get())
481 SendTouchEventForJavaScript(touchInfo);
483 __pGestureHandler->OnTouchReleased(source, touchInfo);
485 _WebImpl* pWebImpl = reinterpret_cast<_WebImpl*>(evas_object_data_get(GetWebNativeNode(), WEB_CTRL));
487 if (pWebImpl && pWebImpl->GetLoadingListener() && pWebImpl->GetTextFromBlock().GetLength() > 0)
489 pWebImpl->FireWebPageBlockSelectedEvent();
499 _Web::OnTouchCanceled(const _Control& source, const _TouchInfo& touchInfo)
501 if (__pEflWebkit.get())
503 SendTouchEventForJavaScript(touchInfo);
505 __pGestureHandler->OnTouchCanceled(source, touchInfo);
513 _Web::OnFlickGestureDetected(_TouchFlickGestureDetector& gesture)
515 if (__pEflWebkit.get() && __pWebSettingImpl->IsScrollEnabled())
517 ChangeGesture(WEB_GESTURE_TYPE_FLICK);
518 static_cast< _FlickGestureState* >(__pGestureHandler)->OnFlickGestureDetected(gesture);
526 _Web::OnFlickGestureCanceled(_TouchFlickGestureDetector& gesture)
533 _Web::OnLongPressGestureDetected(_TouchLongPressGestureDetector& gesture)
535 if (__pEflWebkit.get())
537 _TapGestureState* pTapGestureHandler = dynamic_cast< _TapGestureState* >(__pGestureHandler);
538 if (pTapGestureHandler)
540 pTapGestureHandler->OnLongPressGestureDetected(gesture);
549 _Web::OnLongPressGestureCanceled(_TouchLongPressGestureDetector& gesture)
556 _Web::OnTapGestureDetected(_TouchTapGestureDetector& gesture)
558 if (__pEflWebkit.get())
560 ChangeGesture(WEB_GESTURE_TYPE_DOUBLE_TAP);
568 _Web::OnTapGestureCanceled(_TouchTapGestureDetector& gesture)
575 _Web::OnCanvasRequestedN(const Dimension& size)
577 result r = E_SUCCESS;
579 Evas_Object* pWebFrame = GetWebNativeNode();
581 BufferInfo bufferInfo;
583 Point absSize = GetAbsoluteCoordinate(Point(size.width, size.height));
585 EINA_RECTANGLE_SET(&rect, 0, 0, absSize.x, absSize.y);
587 Evas_Object* pScreenShot = ewk_view_screenshot_contents_get(pWebFrame, rect, 1.0f, evas_object_evas_get(pWebFrame));
588 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));
590 r = _Utility::GetPixelBufferFromEvasObject(pScreenShot, bufferInfo);
591 evas_object_del(pScreenShot);
592 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, null, r, "[%s] propagating", GetErrorMessage(r));
594 std::unique_ptr<Canvas> pCanvas(new (std::nothrow) Canvas());
595 SysTryReturn(NID_WEB_CTRL, pCanvas.get(), null, E_OUT_OF_MEMORY, "[%s] Memory Allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
597 r = pCanvas->Construct(bufferInfo);
598 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, null, r, "[%s] propagating", GetErrorMessage(r));
600 return pCanvas.release();
605 _Web::OnCapturedBitmapRequestedN(void)
607 result r = E_SUCCESS;
609 Evas_Object* pWebFrame = GetWebNativeNode();
612 BufferInfo bufferInfo;
614 Dimension size = GetSize();
615 Point absSize = GetAbsoluteCoordinate(Point(size.width, size.height));
617 EINA_RECTANGLE_SET(&rect, 0, 0, absSize.x, absSize.y);
619 Evas_Object* pScreenShot = ewk_view_screenshot_contents_get(pWebFrame, rect, 1.0f, evas_object_evas_get(pWebFrame));
620 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));
622 r = _Utility::GetPixelBufferFromEvasObject(pScreenShot, bufferInfo);
623 evas_object_del(pScreenShot);
624 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, null, r, "[%s] propagating", GetErrorMessage(r));
626 int bufferSize = bufferInfo.bitsPerPixel * bufferInfo.width * bufferInfo.height;
627 r = buffer.Construct(reinterpret_cast < byte* >(bufferInfo.pPixels), 0, bufferSize, bufferSize);
628 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, null, r, "[%s] propagating", GetErrorMessage(r));
630 std::unique_ptr<Bitmap> pBitmap(new (std::nothrow) Bitmap());
631 SysTryReturn(NID_WEB_CTRL, pBitmap.get(), null, E_OUT_OF_MEMORY, "[%s] Memory Allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
633 r = pBitmap->Construct(buffer, Dimension(bufferInfo.width, bufferInfo.height), BITMAP_PIXEL_FORMAT_ARGB8888);
634 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, null, r, "[%s] propagating", GetErrorMessage(r));
636 return pBitmap.release();
641 _Web::DumpPointList(void* pData)
643 Eina_List* pList = reinterpret_cast< Eina_List* >(pData);
645 for(; pList; pList = eina_list_next(pList))
647 Ewk_Touch_Point* pPointDump = static_cast<Ewk_Touch_Point*>(eina_list_data_get(pList));
648 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);
654 _Web::SendTouchEventForJavaScript(const _TouchInfo& touchInfo)
656 result r = E_SUCCESS;
658 Eina_List* pPointList = null;
659 Ewk_Touch_Point* pPoint = null;
661 _TouchManager* pTouchManager = _TouchManager::GetInstance();
662 SysAssertf(pTouchManager, "Failed to get touch manager.");
664 std::unique_ptr<IListT<_FingerInfo*> > pTouchList(pTouchManager->GetMultiFingerInfoListN());
665 SysTryReturnVoidResult(NID_WEB_CTRL, pTouchList.get(), GetLastResult(), "[%s] Failed to get touch list.", GetErrorMessage(GetLastResult()));
667 std::unique_ptr<IBidirectionalEnumeratorT<_FingerInfo*> > pTouchListEnum(pTouchList->GetBidirectionalEnumeratorN());
668 SysAssertf(pTouchListEnum.get() != null, "Failed to get enumerator of touch list.");
670 FloatPoint currentPoint;
671 _FingerInfo* pFingerInfo = null;
672 while(pTouchListEnum->MoveNext() == E_SUCCESS)
674 r = pTouchListEnum->GetCurrent(pFingerInfo);
675 SysTryReturnVoidResult(NID_WEB_CTRL, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
677 _TouchStatus state = pFingerInfo->GetStatus();
678 if(state == _TOUCH_PRESSED || state == _TOUCH_MOVED || state == _TOUCH_RELEASED || state == _TOUCH_CANCELED)
680 currentPoint = GetAbsoluteCoordinate(pFingerInfo->GetPoint());
681 Point integerPoint(_CoordinateSystemUtils::ConvertToInteger(currentPoint));
683 pPoint = static_cast<Ewk_Touch_Point*>(calloc(1, sizeof(Ewk_Touch_Point)));
685 pPoint->id = pFingerInfo->GetPointId();
686 pPoint->x = integerPoint.x;
687 pPoint->y = integerPoint.y;
688 pPoint->state = GetEvasTouchState((TouchStatus)pFingerInfo->GetStatus());
690 pPointList = eina_list_append(pPointList, pPoint);
693 DumpPointList(pPointList);
695 Eina_Bool ret = ewk_view_feed_touch_event(__pEflWebkit->GetWebEvasObject(), GetEwkTouchEvent(touchInfo.GetTouchStatus()), pPointList, null);
696 SysTryReturnVoidResult(NID_WEB_CTRL, ret == EINA_TRUE, E_SYSTEM, "[%s] A system error has been occurred. Failed to deliver touch event to javascript.", GetErrorMessage(E_SYSTEM));
700 EINA_LIST_FREE(pPointList, pData)
706 _Web::GetEwkTouchEvent(_TouchStatus touchStatus)
708 Ewk_Touch_Event_Type ewkTouchEvent = EWK_TOUCH_CANCEL;
712 case _TOUCH_PRESSED :
713 ewkTouchEvent = EWK_TOUCH_START;
716 ewkTouchEvent = EWK_TOUCH_MOVE;
718 case _TOUCH_RELEASED :
719 ewkTouchEvent = EWK_TOUCH_END;
721 case _TOUCH_CANCELED :
724 ewkTouchEvent = EWK_TOUCH_CANCEL;
728 return ewkTouchEvent;
732 Evas_Touch_Point_State
733 _Web::GetEvasTouchState(TouchStatus touchStatus)
735 Evas_Touch_Point_State evasTouchState = EVAS_TOUCH_POINT_CANCEL;
740 evasTouchState = EVAS_TOUCH_POINT_DOWN;
743 evasTouchState = EVAS_TOUCH_POINT_MOVE;
745 case TOUCH_RELEASED :
746 evasTouchState = EVAS_TOUCH_POINT_UP;
748 case TOUCH_CANCELED :
751 evasTouchState = EVAS_TOUCH_POINT_CANCEL;
752 //todo : mapping EVAS_TOUCH_POINT_STILL, /**< Touch point is not moved af
756 return evasTouchState;
760 }}} // Tizen::Web::Controls