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.
24 #include <Elementary.h>
26 #include <FBaseByteBuffer.h>
27 #include <FBaseColLinkedListT.h>
28 #include <FBaseSysLog.h>
29 #include <FBaseColIListT.h>
30 #include <FGrpFloatPoint.h>
31 #include <FGrpPoint.h>
32 #include <FGrpBitmap.h>
33 #include <FGrpCanvas.h>
34 #include <FGrpFloatRectangle.h>
35 #include <FSysVibrator.h>
36 #include <FWebCtrlWebSetting.h>
37 #include <FGrp_CoordinateSystem.h>
38 #include <FSys_VibratorImpl.h>
39 #include <FUiAnim_EflNode.h>
40 #include <FUiAnim_VisualElement.h>
41 #include <FUi_CoordinateSystemUtils.h>
42 #include <FUi_AccessibilityContainer.h>
43 #include <FUi_AccessibilityElement.h>
44 #include <FUi_IAccessibilityFocusHandler.h>
45 #include <FUi_IAccessibilityListener.h>
47 #include <FUi_TouchManager.h>
48 #include "FWebCtrl_EflWebkit.h"
49 #include "FWebCtrl_GestureState.h"
50 #include "FWebCtrl_Web.h"
51 #include "FWebCtrl_WebImpl.h"
52 #include "FWebCtrl_WebSettingImpl.h"
53 #include "FWebCtrl_Utility.h"
56 using namespace Tizen::Base;
57 using namespace Tizen::Base::Collection;
58 using namespace Tizen::Graphics;
59 using namespace Tizen::Ui;
60 using namespace Tizen::Ui::Animations;
67 class _WebAccessibilityListener
68 : public Tizen::Ui::_IAccessibilityListener
71 _WebAccessibilityListener(Evas_Object* pView);
73 virtual ~_WebAccessibilityListener(void);
75 virtual bool OnAccessibilityFocusMovedNext(const _AccessibilityContainer& control, const _AccessibilityElement& element);
77 virtual bool OnAccessibilityFocusMovedPrevious(const _AccessibilityContainer& control, const _AccessibilityElement& element);
79 virtual bool OnAccessibilityReadingElement(const _AccessibilityContainer& control, const _AccessibilityElement& element);
81 virtual bool OnAccessibilityReadElement(const _AccessibilityContainer& control, const _AccessibilityElement& element);
83 virtual bool OnAccessibilityFocusIn(const _AccessibilityContainer& control, const _AccessibilityElement& element);
85 virtual bool OnAccessibilityFocusOut(const _AccessibilityContainer& control, const _AccessibilityElement& element);
87 virtual bool OnAccessibilityActionPerformed(const _AccessibilityContainer& control, const _AccessibilityElement& element);
89 virtual bool OnAccessibilityValueIncreased(const _AccessibilityContainer& control, const _AccessibilityElement& element);
91 virtual bool OnAccessibilityValueDecreased(const _AccessibilityContainer& control, const _AccessibilityElement& element);
98 _WebAccessibilityListener::_WebAccessibilityListener(Evas_Object* pView)
104 _WebAccessibilityListener::~_WebAccessibilityListener(void)
110 _WebAccessibilityListener::OnAccessibilityFocusMovedNext(const _AccessibilityContainer& control, const _AccessibilityElement& element)
117 _WebAccessibilityListener::OnAccessibilityFocusMovedPrevious(const _AccessibilityContainer& control, const _AccessibilityElement& element)
124 _WebAccessibilityListener::OnAccessibilityReadingElement(const _AccessibilityContainer& control, const _AccessibilityElement& element)
131 _WebAccessibilityListener::OnAccessibilityReadElement(const _AccessibilityContainer& control, const _AccessibilityElement& element)
138 _WebAccessibilityListener::OnAccessibilityFocusIn(const _AccessibilityContainer& control, const _AccessibilityElement& element)
145 _WebAccessibilityListener::OnAccessibilityFocusOut(const _AccessibilityContainer& control, const _AccessibilityElement& element)
152 _WebAccessibilityListener::OnAccessibilityActionPerformed(const _AccessibilityContainer& control, const _AccessibilityElement& element)
154 const Ewk_View_Smart_Data* pSmartData = static_cast<Ewk_View_Smart_Data*>(evas_object_smart_data_get(__pView));
155 SysAssertf(pSmartData, "Failed to get webkit smart data.");
157 Elm_Access_Action_Info* pActionInfo = new Elm_Access_Action_Info();
158 SysTryReturn(NID_WEB_CTRL, pActionInfo, false, E_OUT_OF_MEMORY, "[%s] Memory Allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
162 pActionInfo->action_type = ELM_ACCESS_ACTION_ACTIVATE;
164 result = pSmartData->api->screen_reader_action_execute(const_cast<Ewk_View_Smart_Data*>(pSmartData), pActionInfo);
172 _WebAccessibilityListener::OnAccessibilityValueIncreased(const _AccessibilityContainer& control, const _AccessibilityElement& element)
179 _WebAccessibilityListener::OnAccessibilityValueDecreased(const _AccessibilityContainer& control, const _AccessibilityElement& element)
185 class _WebAccessibilityFocusHandler
186 : public Tizen::Ui::_IAccessibilityFocusHandler
189 _WebAccessibilityFocusHandler(Evas_Object* pView);
191 virtual ~_WebAccessibilityFocusHandler(void);
193 virtual bool OnMoveFocus(Tizen::Ui::_AccessibilityFocusDirection direction);
195 virtual bool OnMoveFocus(const Tizen::Graphics::Point& point);
198 Evas_Object* __pView;
202 _WebAccessibilityFocusHandler::_WebAccessibilityFocusHandler(Evas_Object* pView)
208 _WebAccessibilityFocusHandler::~_WebAccessibilityFocusHandler(void)
214 _WebAccessibilityFocusHandler::OnMoveFocus(Tizen::Ui::_AccessibilityFocusDirection direction)
216 const Ewk_View_Smart_Data* pSmartData = static_cast<Ewk_View_Smart_Data*>(evas_object_smart_data_get(__pView));
217 SysAssertf(pSmartData, "Failed to get webkit smart data.");
219 Elm_Access_Action_Info* pActionInfo = new Elm_Access_Action_Info();
220 SysTryReturn(NID_WEB_CTRL, pActionInfo, false, E_OUT_OF_MEMORY, "[%s] Memory Allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
224 if (direction == Tizen::Ui::_ACCESSIBILITY_FOCUS_DIRECTION_PREVIOUS)
226 pActionInfo->action_type = ELM_ACCESS_ACTION_HIGHLIGHT_PREV;
228 result = pSmartData->api->screen_reader_action_execute(const_cast<Ewk_View_Smart_Data*>(pSmartData), pActionInfo);
230 else if (direction == Tizen::Ui::_ACCESSIBILITY_FOCUS_DIRECTION_NEXT)
232 pActionInfo->action_type = ELM_ACCESS_ACTION_HIGHLIGHT_NEXT;
234 result = pSmartData->api->screen_reader_action_execute(const_cast<Ewk_View_Smart_Data*>(pSmartData), pActionInfo);
243 _WebAccessibilityFocusHandler::OnMoveFocus(const Tizen::Graphics::Point& point)
245 const Ewk_View_Smart_Data* pSmartData = static_cast<Ewk_View_Smart_Data*>(evas_object_smart_data_get(__pView));
246 SysAssertf(pSmartData, "Failed to get webkit smart data.");
248 Elm_Access_Action_Info* pActionInfo = new Elm_Access_Action_Info();
249 SysTryReturn(NID_WEB_CTRL, pActionInfo, false, E_OUT_OF_MEMORY, "[%s] Memory Allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
253 pActionInfo->action_type = ELM_ACCESS_ACTION_READ;
254 pActionInfo->x = point.x;
255 pActionInfo->y = point.y;
257 result = pSmartData->api->screen_reader_action_execute(const_cast<Ewk_View_Smart_Data*>(pSmartData), pActionInfo);
267 namespace Tizen { namespace Web { namespace Controls
271 static const char WEB_CTRL[] = "webcontrol";
275 OnEdgeLeft(void* pUserData, Evas_Object* pView, void* pEventInfo)
277 _Web* pCore = reinterpret_cast< _Web* >(pUserData);
278 SysAssertf(pCore, "Failed to request");
280 pCore->SetEdgeReachedEvent(WEB_EDGE_LEFT);
285 OnEdgeRight(void* pUserData, Evas_Object* pView, void* pEventInfo)
287 _Web* pCore = reinterpret_cast< _Web* >(pUserData);
288 SysAssertf(pCore, "Failed to request");
290 pCore->SetEdgeReachedEvent(WEB_EDGE_RIGHT);
295 OnEdgeTop(void* pUserData, Evas_Object* pView, void* pEventInfo)
297 _Web* pCore = reinterpret_cast< _Web* >(pUserData);
298 SysAssertf(pCore, "Failed to request");
300 pCore->SetEdgeReachedEvent(WEB_EDGE_TOP);
305 OnEdgeBottom(void* pUserData, Evas_Object* pView, void* pEventInfo)
307 _Web* pCore = reinterpret_cast< _Web* >(pUserData);
308 SysAssertf(pCore, "Failed to request");
310 pCore->SetEdgeReachedEvent(WEB_EDGE_BOTTOM);
315 : __pGestureHandler(null)
317 , __pWebSetting(null)
318 , __pGestureFlick(null)
319 , __pGestureLongPress(null)
320 , __pGesturePinch(null)
321 , __pGestureDoubleTap(null)
322 , __pTouchEventInfoList(null)
323 , __pTapGestureHandler(null)
324 , __pPanningGestureHandler(null)
325 , __pFlickGestureHandler(null)
326 , __pPinchGestureHandler(null)
327 , __gestureType(WEB_GESTURE_TYPE_TAP)
328 , __edgeType(WEB_EDGE_NONE)
329 , __pTextElement(null)
330 , __previousTouchedPosition(0.0f, 0.0f)
332 SetBackgroundColor(Color(0, 0, 0, 0));
338 RemoveGestureListener();
343 _Web::CreateWebN(void)
345 result r = E_SUCCESS;
347 std::unique_ptr<_Web> pWeb(new (std::nothrow) _Web());
348 SysTryReturn(NID_WEB_CTRL, pWeb.get(), null, E_OUT_OF_MEMORY, "[%s] Memory Allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
350 pWeb->__pWebSetting = std::unique_ptr<WebSetting>(new (std::nothrow) WebSetting());
351 SysTryReturn(NID_WEB_CTRL, pWeb->__pWebSetting.get(), null, E_OUT_OF_MEMORY, "[%s] Memory allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
353 pWeb->AcquireHandle();
354 pWeb->SetMultiTouchEnabled(true);
355 pWeb->SetTouchPressThreshold(0.08);
357 r = pWeb->AddGestureListeners();
358 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, null, r, "[%s] Propagating.", GetErrorMessage(r));
360 r = pWeb->InitializeGestureStates();
361 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, null, r, "[%s] Propagating.", GetErrorMessage(r));
363 return pWeb.release();
368 _Web::CreateWebkitEvasObject(void)
370 result r = E_SUCCESS;
372 std::unique_ptr<_EflWebkit> pEflWebkit(new (std::nothrow) _EflWebkit());
373 SysTryReturnResult(NID_WEB_CTRL, pEflWebkit.get(), E_OUT_OF_MEMORY, "[%s] Memory Allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
375 r = pEflWebkit->Construct(GetAbsoluteBounds(), *GetVisualElement(), this);
376 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
378 __pEflWebkit = std::move(pEflWebkit);
380 Evas_Object* pView = GetWebNativeNode();
381 evas_object_smart_callback_add(pView, "edge,left", OnEdgeLeft, this);
382 evas_object_smart_callback_add(pView, "edge,right", OnEdgeRight, this);
383 evas_object_smart_callback_add(pView, "edge,top", OnEdgeTop, this);
384 evas_object_smart_callback_add(pView, "edge,bottom", OnEdgeBottom, this);
391 _Web::InitializeGestureStates(void)
393 __pPinchGestureHandler = std::unique_ptr<_PinchGestureState>(new (std::nothrow) _PinchGestureState(this));
394 SysTryReturnResult(NID_WEB_CTRL, __pPinchGestureHandler.get(), E_OUT_OF_MEMORY, "[%s] Memory Allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
396 __pTapGestureHandler = std::unique_ptr<_TapGestureState>(new (std::nothrow) _TapGestureState(this));
397 SysTryReturnResult(NID_WEB_CTRL, __pTapGestureHandler.get(), E_OUT_OF_MEMORY, "[%s] Memory Allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
399 __pPanningGestureHandler = std::unique_ptr<_PanningGestureState>(new (std::nothrow) _PanningGestureState(this));
400 SysTryReturnResult(NID_WEB_CTRL, __pPanningGestureHandler.get(), E_OUT_OF_MEMORY, "[%s] Memory Allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
402 __pFlickGestureHandler = std::unique_ptr<_FlickGestureState>(new (std::nothrow) _FlickGestureState(this));
403 SysTryReturnResult(NID_WEB_CTRL, __pFlickGestureHandler.get(), E_OUT_OF_MEMORY, "[%s] Memory Allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
405 __pGestureHandler = __pTapGestureHandler.get();
412 _Web::AddGestureListeners(void)
414 result r = E_SUCCESS;
416 std::unique_ptr<_TouchFlickGestureDetector> pGestureFlick(new (std::nothrow) _TouchFlickGestureDetector());
417 SysTryReturnResult(NID_WEB_CTRL, pGestureFlick.get(), E_OUT_OF_MEMORY, "[%s] Memory Allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
419 r = pGestureFlick->AddGestureListener(*this);
420 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
422 r = AddGestureDetector(*pGestureFlick.get());
423 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
425 __pGestureFlick = std::move(pGestureFlick);
427 std::unique_ptr<_TouchLongPressGestureDetector> pGestureLongPress(new (std::nothrow) _TouchLongPressGestureDetector());
428 SysTryReturnResult(NID_WEB_CTRL, pGestureLongPress.get(), E_OUT_OF_MEMORY, "[%s] Memory Allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
430 r = pGestureLongPress->AddGestureListener(*this);
431 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
433 r = AddGestureDetector(*pGestureLongPress.get());
434 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
436 __pGestureLongPress = std::move(pGestureLongPress);
438 std::unique_ptr<_TouchTapGestureDetector> pGestureDoubleTap(new (std::nothrow) _TouchTapGestureDetector());
439 SysTryReturnResult(NID_WEB_CTRL, pGestureDoubleTap.get(), E_OUT_OF_MEMORY, "[%s] Memory Allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
441 r = pGestureDoubleTap->AddGestureListener(*this);
442 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
444 r = AddGestureDetector(*pGestureDoubleTap.get());
445 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
447 __pGestureDoubleTap = std::move(pGestureDoubleTap);
449 std::unique_ptr<_TouchPinchGestureDetector> pGesturePinch(new (std::nothrow) _TouchPinchGestureDetector());
450 SysTryReturnResult(NID_WEB_CTRL, pGesturePinch.get(), E_OUT_OF_MEMORY, "[%s] Memory Allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
452 r = pGesturePinch->AddGestureListener(*this);
453 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
455 r = AddGestureDetector(*pGesturePinch.get());
456 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
458 __pGesturePinch = std::move(pGesturePinch);
465 _Web::RemoveGestureListener(void)
467 if (__pGestureFlick.get())
469 __pGestureFlick->RemoveGestureListener(*this);
470 RemoveGestureDetector(*__pGestureFlick);
473 if (__pGestureLongPress.get())
475 __pGestureLongPress->RemoveGestureListener(*this);
476 RemoveGestureDetector(*__pGestureLongPress);
479 if (__pGestureDoubleTap.get())
481 __pGestureDoubleTap->RemoveGestureListener(*this);
482 RemoveGestureDetector(*__pGestureDoubleTap);
485 if (__pGesturePinch.get())
487 __pGesturePinch->RemoveGestureListener(*this);
488 RemoveGestureDetector(*__pGesturePinch);
491 Evas_Object* pView = GetWebNativeNode();
494 evas_object_smart_callback_del(pView, "edge,left", OnEdgeLeft);
495 evas_object_smart_callback_del(pView, "edge,right", OnEdgeRight);
496 evas_object_smart_callback_del(pView, "edge,top", OnEdgeTop);
497 evas_object_smart_callback_del(pView, "edge,bottom", OnEdgeBottom);
503 _Web::InitializeWebNativeNode(void)
505 result r = E_SUCCESS;
507 r = CreateWebkitEvasObject();
508 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
510 SetNativeObjectFocusable(false);
512 _AccessibilityContainer* pContainer = GetAccessibilityContainer();
513 SysTryReturn(NID_WEB_CTRL, pContainer, E_SYSTEM, E_SYSTEM, "[%s] Propagating.", GetErrorMessage(E_SYSTEM));
515 __pTextElement = new (std::nothrow) _AccessibilityElement(true);
516 SysTryReturn(NID_WEB_CTRL, __pTextElement, E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[%s] Memory Allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
518 __pTextElement->SetBounds(FloatRectangle(0.0f, 0.0f, GetBoundsF().width, GetBoundsF().height));
519 __pTextElement->SetLabel(L"Web control");
521 pContainer->AddElement(*__pTextElement);
522 pContainer->Activate(true);
524 _WebAccessibilityListener* pListener = new (std::nothrow) _WebAccessibilityListener(GetWebNativeNode());
525 SysTryReturn(NID_WEB_CTRL, pListener, E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[%s] Memory Allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
527 pContainer->AddListener(*dynamic_cast<_IAccessibilityListener*>(pListener));
529 _WebAccessibilityFocusHandler* pFocusHandler = new (std::nothrow) _WebAccessibilityFocusHandler(GetWebNativeNode());
530 SysTryReturn(NID_WEB_CTRL, pFocusHandler, E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[%s] Memory Allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
532 pContainer->SetFocusHandler(dynamic_cast<_IAccessibilityFocusHandler*>(pFocusHandler));
539 _Web::GetAbsoluteCoordinate(Point relativePoint)
541 return _CoordinateSystemUtils::Transform(ConvertToScreenPosition(relativePoint));
546 _Web::GetAbsoluteCoordinate(FloatPoint relativePoint)
548 return _CoordinateSystemUtils::Transform(ConvertToScreenPosition(relativePoint));
553 _Web::GetRelativeCoordinate(Point absolutePoint)
555 return ConvertToControlPosition(_CoordinateSystemUtils::InverseTransform(absolutePoint));
560 _Web::GetRelativeCoordinate(FloatPoint absolutePoint)
562 return ConvertToControlPosition(_CoordinateSystemUtils::InverseTransform(absolutePoint));
567 _Web::GetWebNativeNode(void)
569 if (__pEflWebkit.get())
571 return __pEflWebkit->GetWebEvasObject();
579 _Web::GetSetting(void) const
581 return __pWebSetting.get();
586 _Web::OnAttaching(const _Control* pParent)
588 if (__pEflWebkit.get())
590 evas_object_show(__pEflWebkit->GetWebEvasObject());
591 evas_object_focus_set(__pEflWebkit->GetWebEvasObject(), EINA_TRUE);
599 _Web::OnBoundsChanging(const Rectangle& bounds)
601 Rectangle absoluteBounds = GetAbsoluteBounds();
602 Rectangle webBounds = GetBounds();
603 _ICoordinateSystemTransformer* pXformer = _CoordinateSystem::GetInstance()->GetTransformer();
604 SysTryReturnResult(NID_WEB_CTRL, pXformer, E_SYSTEM, "[%s] A system error has been occurred. Failed to get coordinate transformer.", GetErrorMessage(E_SYSTEM));
606 if (__pEflWebkit.get())
608 evas_object_move(__pEflWebkit->GetWebEvasObject(), pXformer->TransformHorizontal(absoluteBounds.x - webBounds.x + bounds.x), pXformer->TransformVertical(absoluteBounds.y - webBounds.y + bounds.y));
609 evas_object_resize(__pEflWebkit->GetWebEvasObject(), pXformer->TransformHorizontal(bounds.width), pXformer->TransformVertical(bounds.height));
617 _Web::ChangeGesture(_WebGestureType type)
621 case WEB_GESTURE_TYPE_TAP:
622 __pGestureHandler = __pTapGestureHandler.get();
623 __gestureType = WEB_GESTURE_TYPE_TAP;
626 case WEB_GESTURE_TYPE_PANNING:
627 __pGestureHandler = __pPanningGestureHandler.get();
628 __gestureType = WEB_GESTURE_TYPE_PANNING;
631 case WEB_GESTURE_TYPE_FLICK:
632 __pGestureHandler = __pFlickGestureHandler.get();
633 __gestureType = WEB_GESTURE_TYPE_FLICK;
636 case WEB_GESTURE_TYPE_PINCH:
637 __pGestureHandler = __pPinchGestureHandler.get();
638 __gestureType = WEB_GESTURE_TYPE_PINCH;
648 _Web::SetEdgeReachedEvent(_WebEdgeType type)
655 __edgeType &= ~WEB_EDGE_RIGHT;
659 __edgeType &= ~WEB_EDGE_LEFT;
663 __edgeType &= ~WEB_EDGE_BOTTOM;
666 case WEB_EDGE_BOTTOM:
667 __edgeType &= ~WEB_EDGE_TOP;
677 _Web::OnTouchPressed(const _Control& source, const _TouchInfo& touchInfo)
679 if (__pEflWebkit.get())
681 __edgeType = WEB_EDGE_NONE;
682 __previousTouchedPosition = touchInfo.GetCurrentPosition();
684 SendTouchEventForJavaScript(touchInfo);
686 return __pGestureHandler->OnTouchPressed(source, touchInfo);
694 _Web::OnTouchMoved(const _Control& source, const _TouchInfo& touchInfo)
696 if (__pEflWebkit.get())
698 SendTouchEventForJavaScript(touchInfo);
700 __pGestureHandler->OnTouchMoved(source, touchInfo);
702 float scrollDistanceX = __previousTouchedPosition.x - touchInfo.GetCurrentPosition().x;
703 float scrollDistanceY = __previousTouchedPosition.y - touchInfo.GetCurrentPosition().y;
704 __previousTouchedPosition = touchInfo.GetCurrentPosition();
706 if (__edgeType != WEB_EDGE_NONE && __gestureType == WEB_GESTURE_TYPE_PANNING)
708 if (_Abs(scrollDistanceY) < _Abs(scrollDistanceX))
710 if (__edgeType & WEB_EDGE_LEFT)
712 if (scrollDistanceX < 0)
714 __edgeType &= ~WEB_EDGE_RIGHT;
720 __edgeType &= ~WEB_EDGE_LEFT;
723 else if (__edgeType & WEB_EDGE_RIGHT)
725 if (scrollDistanceX > 0)
727 __edgeType &= ~WEB_EDGE_LEFT;
733 __edgeType &= ~WEB_EDGE_RIGHT;
737 else if (_Abs(scrollDistanceY) > _Abs(scrollDistanceX))
739 if (__edgeType & WEB_EDGE_TOP)
741 if (scrollDistanceY < 0)
743 __edgeType &= ~WEB_EDGE_BOTTOM;
749 __edgeType &= ~WEB_EDGE_TOP;
752 else if (__edgeType & WEB_EDGE_BOTTOM)
754 if (scrollDistanceY > 0)
756 __edgeType &= ~WEB_EDGE_TOP;
762 __edgeType &= ~WEB_EDGE_BOTTOM;
776 _Web::OnTouchReleased(const _Control& source, const _TouchInfo& touchInfo)
780 if (__pEflWebkit.get())
782 SendTouchEventForJavaScript(touchInfo);
784 Evas_Object* pView = GetWebNativeNode();
785 _WebImpl* pImpl = reinterpret_cast< _WebImpl* >(evas_object_data_get(pView, WEB_CTRL));
787 if (pImpl && pImpl->GetTextFromBlock().GetLength() > 0)
789 evas_object_smart_callback_call(pView, "text,selected", NULL);
792 return __pGestureHandler->OnTouchReleased(source, touchInfo);
800 _Web::OnTouchCanceled(const _Control& source, const _TouchInfo& touchInfo)
802 if (__pEflWebkit.get())
804 SendTouchEventForJavaScript(touchInfo);
806 return __pGestureHandler->OnTouchCanceled(source, touchInfo);
814 _Web::OnTouchPressHandled(const _Control& control)
820 _Web::OnTouchReleaseHandled(const _Control& control)
826 _Web::OnTouchMoveHandled(const _Control& control)
832 _Web::OnTouchCancelHandled(const _Control& control)
838 _Web::OnLongPressGestureDetected(_TouchLongPressGestureDetector& gesture)
840 if (__pEflWebkit.get() && __gestureType == WEB_GESTURE_TYPE_TAP)
842 return __pTapGestureHandler->OnLongPressGestureDetected(gesture);
850 _Web::OnLongPressGestureCanceled(_TouchLongPressGestureDetector& gesture)
857 _Web::OnTapGestureDetected(_TouchTapGestureDetector& gesture)
859 if (__pEflWebkit.get())
861 return __pTapGestureHandler->OnTapGestureDetected(gesture);
869 _Web::OnTapGestureCanceled(_TouchTapGestureDetector& gesture)
876 _Web::OnFlickGestureDetected(_TouchFlickGestureDetector& gesture)
878 if (__pEflWebkit.get() && _WebSettingImpl::GetInstance(__pWebSetting.get())->IsScrollEnabled())
880 return __pFlickGestureHandler->OnFlickGestureDetected(gesture);
888 _Web::OnFlickGestureCanceled(_TouchFlickGestureDetector& gesture)
895 _Web::OnPinchGestureStarted(Tizen::Ui::_TouchPinchGestureDetector& gesture)
897 if (__pEflWebkit.get())
899 return __pPinchGestureHandler->OnPinchGestureStarted(gesture);
907 _Web::OnPinchGestureChanged(Tizen::Ui::_TouchPinchGestureDetector& gesture)
909 if (__pEflWebkit.get() && __gestureType == WEB_GESTURE_TYPE_PINCH)
911 return __pPinchGestureHandler->OnPinchGestureChanged(gesture);
919 _Web::OnPinchGestureFinished(Tizen::Ui::_TouchPinchGestureDetector& gesture)
921 if (__pEflWebkit.get() && __gestureType == WEB_GESTURE_TYPE_PINCH)
923 return __pPinchGestureHandler->OnPinchGestureFinished(gesture);
931 _Web::OnPinchGestureCanceled(Tizen::Ui::_TouchPinchGestureDetector& gesture)
938 _Web::OnCanvasRequestedN(const FloatRectangle& bounds)
940 result r = E_SUCCESS;
942 Evas_Object* pWebFrame = GetWebNativeNode();
944 BufferInfo bufferInfo;
946 Point absPoint(_CoordinateSystemUtils::ConvertToInteger(GetAbsoluteCoordinate(FloatPoint(bounds.x, bounds.y))));
947 Dimension absSize(_CoordinateSystemUtils::ConvertToInteger(_CoordinateSystemUtils::HorizontalTransform(bounds.width)),
948 _CoordinateSystemUtils::ConvertToInteger(_CoordinateSystemUtils::VerticalTransform(bounds.height)));
950 EINA_RECTANGLE_SET(&rect, absPoint.x, absPoint.y, absSize.width, absSize.height);
952 Evas_Object* pScreenShot = ewk_view_screenshot_contents_get(pWebFrame, rect, 1.0f, evas_object_evas_get(pWebFrame));
954 std::unique_ptr<Canvas> pCanvas(new (std::nothrow) Canvas());
955 SysTryReturn(NID_WEB_CTRL, pCanvas.get(), null, E_OUT_OF_MEMORY, "[%s] Memory Allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
959 r = _Utility::GetPixelBufferFromEvasObject(pScreenShot, bufferInfo);
960 evas_object_del(pScreenShot);
961 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, null, r, "[%s] propagating", GetErrorMessage(r));
963 r = pCanvas->Construct(bufferInfo);
964 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, null, r, "[%s] propagating", GetErrorMessage(r));
968 r = pCanvas->Construct(bounds);
969 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, null, r, "[%s] propagating", GetErrorMessage(r));
972 return pCanvas.release();
977 _Web::OnCapturedBitmapRequestedN(void)
979 result r = E_SUCCESS;
981 Evas_Object* pWebFrame = GetWebNativeNode();
984 BufferInfo bufferInfo;
986 Dimension size(GetSize());
987 Point absSize(GetAbsoluteCoordinate(Point(size.width, size.height)));
989 EINA_RECTANGLE_SET(&rect, 0, 0, absSize.x, absSize.y);
991 Evas_Object* pScreenShot = ewk_view_screenshot_contents_get(pWebFrame, rect, 1.0f, evas_object_evas_get(pWebFrame));
992 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));
994 r = _Utility::GetPixelBufferFromEvasObject(pScreenShot, bufferInfo);
995 evas_object_del(pScreenShot);
996 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, null, r, "[%s] propagating", GetErrorMessage(r));
998 int bufferSize = bufferInfo.bitsPerPixel * bufferInfo.width * bufferInfo.height;
999 r = buffer.Construct(reinterpret_cast < byte* >(bufferInfo.pPixels), 0, bufferSize, bufferSize);
1000 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, null, r, "[%s] propagating", GetErrorMessage(r));
1002 std::unique_ptr<Bitmap> pBitmap(new (std::nothrow) Bitmap());
1003 SysTryReturn(NID_WEB_CTRL, pBitmap.get(), null, E_OUT_OF_MEMORY, "[%s] Memory Allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
1005 r = pBitmap->Construct(buffer, Dimension(bufferInfo.width, bufferInfo.height), BITMAP_PIXEL_FORMAT_ARGB8888);
1006 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, null, r, "[%s] propagating", GetErrorMessage(r));
1008 return pBitmap.release();
1013 _Web::DumpPointList(void* pData)
1015 Eina_List* pList = reinterpret_cast< Eina_List* >(pData);
1017 for(; pList; pList = eina_list_next(pList))
1019 Ewk_Touch_Point* pPointDump = static_cast<Ewk_Touch_Point*>(eina_list_data_get(pList));
1020 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);
1026 _Web::SendTouchEventForJavaScript(const _TouchInfo& touchInfo)
1028 result r = E_SUCCESS;
1030 Eina_List* pPointList = null;
1031 Ewk_Touch_Point* pPoint = null;
1033 _TouchManager* pTouchManager = _TouchManager::GetInstance();
1034 SysAssertf(pTouchManager, "Failed to get touch manager.");
1036 std::unique_ptr<IListT<_FingerInfo*> > pTouchList(pTouchManager->GetMultiFingerInfoListN());
1037 SysTryReturnVoidResult(NID_WEB_CTRL, pTouchList.get(), GetLastResult(), "[%s] Failed to get touch list.", GetErrorMessage(GetLastResult()));
1039 std::unique_ptr<IBidirectionalEnumeratorT<_FingerInfo*> > pTouchListEnum(pTouchList->GetBidirectionalEnumeratorN());
1040 SysAssertf(pTouchListEnum.get() != null, "Failed to get enumerator of touch list.");
1042 FloatPoint currentPoint;
1043 _FingerInfo* pFingerInfo = null;
1044 while(pTouchListEnum->MoveNext() == E_SUCCESS)
1046 r = pTouchListEnum->GetCurrent(pFingerInfo);
1047 SysTryReturnVoidResult(NID_WEB_CTRL, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
1049 _TouchStatus state = pFingerInfo->GetStatus();
1050 if(state == _TOUCH_PRESSED || state == _TOUCH_MOVED || state == _TOUCH_RELEASED || state == _TOUCH_CANCELED)
1052 currentPoint = GetAbsoluteCoordinate(pFingerInfo->GetPoint());
1053 Point integerPoint(_CoordinateSystemUtils::ConvertToInteger(currentPoint));
1055 pPoint = static_cast<Ewk_Touch_Point*>(calloc(1, sizeof(Ewk_Touch_Point)));
1057 pPoint->id = pFingerInfo->GetPointId();
1058 pPoint->x = integerPoint.x;
1059 pPoint->y = integerPoint.y;
1060 pPoint->state = GetEvasTouchState((TouchStatus)pFingerInfo->GetStatus());
1062 pPointList = eina_list_append(pPointList, pPoint);
1065 DumpPointList(pPointList);
1067 Eina_Bool ret = ewk_view_feed_touch_event(__pEflWebkit->GetWebEvasObject(), GetEwkTouchEvent(touchInfo.GetTouchStatus()), pPointList, null);
1068 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));
1072 EINA_LIST_FREE(pPointList, pData)
1077 Ewk_Touch_Event_Type
1078 _Web::GetEwkTouchEvent(_TouchStatus touchStatus)
1080 Ewk_Touch_Event_Type ewkTouchEvent = EWK_TOUCH_CANCEL;
1082 switch (touchStatus)
1084 case _TOUCH_PRESSED :
1085 ewkTouchEvent = EWK_TOUCH_START;
1088 ewkTouchEvent = EWK_TOUCH_MOVE;
1090 case _TOUCH_RELEASED :
1091 ewkTouchEvent = EWK_TOUCH_END;
1093 case _TOUCH_CANCELED :
1096 ewkTouchEvent = EWK_TOUCH_CANCEL;
1100 return ewkTouchEvent;
1104 Evas_Touch_Point_State
1105 _Web::GetEvasTouchState(TouchStatus touchStatus)
1107 Evas_Touch_Point_State evasTouchState = EVAS_TOUCH_POINT_CANCEL;
1109 switch (touchStatus)
1111 case TOUCH_PRESSED :
1112 evasTouchState = EVAS_TOUCH_POINT_DOWN;
1115 evasTouchState = EVAS_TOUCH_POINT_MOVE;
1117 case TOUCH_RELEASED :
1118 evasTouchState = EVAS_TOUCH_POINT_UP;
1120 case TOUCH_CANCELED :
1123 evasTouchState = EVAS_TOUCH_POINT_CANCEL;
1124 //todo : mapping EVAS_TOUCH_POINT_STILL, /**< Touch point is not moved af
1128 return evasTouchState;
1132 }}} // Tizen::Web::Controls