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 <FUiAnim_VisualElementImpl.h>
42 #include <FUi_CoordinateSystemUtils.h>
43 #include <FUi_AccessibilityContainer.h>
44 #include <FUi_AccessibilityElement.h>
45 #include <FUi_UiEventManager.h>
46 #include <FUi_IAccessibilityFocusHandler.h>
47 #include <FUi_IAccessibilityListener.h>
49 #include <FUi_TouchManager.h>
50 #include "FWebCtrl_EflWebkit.h"
51 #include "FWebCtrl_GestureState.h"
52 #include "FWebCtrl_Web.h"
53 #include "FWebCtrl_WebSettingImpl.h"
54 #include "FWebCtrl_Utility.h"
57 using namespace Tizen::Base;
58 using namespace Tizen::Base::Collection;
59 using namespace Tizen::Graphics;
60 using namespace Tizen::Ui;
61 using namespace Tizen::Ui::Animations;
68 class _WebAccessibilityListener
69 : public Tizen::Ui::_IAccessibilityListener
72 _WebAccessibilityListener(Evas_Object* pView);
74 virtual ~_WebAccessibilityListener(void);
76 virtual bool OnAccessibilityFocusMovedNext(const _AccessibilityContainer& control, const _AccessibilityElement& element);
78 virtual bool OnAccessibilityFocusMovedPrevious(const _AccessibilityContainer& control, const _AccessibilityElement& element);
80 virtual bool OnAccessibilityReadingElement(const _AccessibilityContainer& control, const _AccessibilityElement& element);
82 virtual bool OnAccessibilityReadElement(const _AccessibilityContainer& control, const _AccessibilityElement& element);
84 virtual bool OnAccessibilityFocusIn(const _AccessibilityContainer& control, const _AccessibilityElement& element);
86 virtual bool OnAccessibilityFocusOut(const _AccessibilityContainer& control, const _AccessibilityElement& element);
88 virtual bool OnAccessibilityActionPerformed(const _AccessibilityContainer& control, const _AccessibilityElement& element);
90 virtual bool OnAccessibilityValueIncreased(const _AccessibilityContainer& control, const _AccessibilityElement& element);
92 virtual bool OnAccessibilityValueDecreased(const _AccessibilityContainer& control, const _AccessibilityElement& element);
99 _WebAccessibilityListener::_WebAccessibilityListener(Evas_Object* pView)
105 _WebAccessibilityListener::~_WebAccessibilityListener(void)
111 _WebAccessibilityListener::OnAccessibilityFocusMovedNext(const _AccessibilityContainer& control, const _AccessibilityElement& element)
118 _WebAccessibilityListener::OnAccessibilityFocusMovedPrevious(const _AccessibilityContainer& control, const _AccessibilityElement& element)
125 _WebAccessibilityListener::OnAccessibilityReadingElement(const _AccessibilityContainer& control, const _AccessibilityElement& element)
132 _WebAccessibilityListener::OnAccessibilityReadElement(const _AccessibilityContainer& control, const _AccessibilityElement& element)
139 _WebAccessibilityListener::OnAccessibilityFocusIn(const _AccessibilityContainer& control, const _AccessibilityElement& element)
146 _WebAccessibilityListener::OnAccessibilityFocusOut(const _AccessibilityContainer& control, const _AccessibilityElement& element)
148 Ewk_View_Smart_Data* pSmartData = static_cast<Ewk_View_Smart_Data*>(evas_object_smart_data_get(__pView));
149 SysAssertf(pSmartData, "Failed to get webkit smart data.");
151 Elm_Access_Action_Info* pActionInfo = new Elm_Access_Action_Info();
152 SysTryReturn(NID_WEB_CTRL, pActionInfo, false, E_OUT_OF_MEMORY, "[%s] Memory Allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
156 pActionInfo->action_type = ELM_ACCESS_ACTION_UNHIGHLIGHT;
158 result = pSmartData->api->screen_reader_action_execute(pSmartData, pActionInfo);
166 _WebAccessibilityListener::OnAccessibilityActionPerformed(const _AccessibilityContainer& control, const _AccessibilityElement& element)
168 Ewk_View_Smart_Data* pSmartData = static_cast<Ewk_View_Smart_Data*>(evas_object_smart_data_get(__pView));
169 SysAssertf(pSmartData, "Failed to get webkit smart data.");
171 Elm_Access_Action_Info* pActionInfo = new Elm_Access_Action_Info();
172 SysTryReturn(NID_WEB_CTRL, pActionInfo, false, E_OUT_OF_MEMORY, "[%s] Memory Allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
176 pActionInfo->action_type = ELM_ACCESS_ACTION_ACTIVATE;
178 result = pSmartData->api->screen_reader_action_execute(pSmartData, pActionInfo);
186 _WebAccessibilityListener::OnAccessibilityValueIncreased(const _AccessibilityContainer& control, const _AccessibilityElement& element)
193 _WebAccessibilityListener::OnAccessibilityValueDecreased(const _AccessibilityContainer& control, const _AccessibilityElement& element)
199 class _WebAccessibilityFocusHandler
200 : public Tizen::Ui::_IAccessibilityFocusHandler
203 _WebAccessibilityFocusHandler(Evas_Object* pView);
205 virtual ~_WebAccessibilityFocusHandler(void);
207 virtual bool OnMoveFocus(Tizen::Ui::_AccessibilityFocusDirection direction);
209 virtual bool OnMoveFocus(const Tizen::Graphics::Point& point);
212 Evas_Object* __pView;
216 _WebAccessibilityFocusHandler::_WebAccessibilityFocusHandler(Evas_Object* pView)
222 _WebAccessibilityFocusHandler::~_WebAccessibilityFocusHandler(void)
228 _WebAccessibilityFocusHandler::OnMoveFocus(Tizen::Ui::_AccessibilityFocusDirection direction)
230 Ewk_View_Smart_Data* pSmartData = static_cast<Ewk_View_Smart_Data*>(evas_object_smart_data_get(__pView));
231 SysAssertf(pSmartData, "Failed to get webkit smart data.");
233 Elm_Access_Action_Info* pActionInfo = new Elm_Access_Action_Info();
234 SysTryReturn(NID_WEB_CTRL, pActionInfo, false, E_OUT_OF_MEMORY, "[%s] Memory Allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
238 if (direction == Tizen::Ui::_ACCESSIBILITY_FOCUS_DIRECTION_PREVIOUS)
240 pActionInfo->action_type = ELM_ACCESS_ACTION_HIGHLIGHT;
242 pActionInfo->action_by = ELM_ACCESS_ACTION_HIGHLIGHT_PREV;
244 result = pSmartData->api->screen_reader_action_execute(pSmartData, pActionInfo);
246 else if (direction == Tizen::Ui::_ACCESSIBILITY_FOCUS_DIRECTION_NEXT)
248 pActionInfo->action_type = ELM_ACCESS_ACTION_HIGHLIGHT;
250 pActionInfo->action_by = ELM_ACCESS_ACTION_HIGHLIGHT_NEXT;
252 result = pSmartData->api->screen_reader_action_execute(pSmartData, pActionInfo);
261 _WebAccessibilityFocusHandler::OnMoveFocus(const Tizen::Graphics::Point& point)
263 Ewk_View_Smart_Data* pSmartData = static_cast<Ewk_View_Smart_Data*>(evas_object_smart_data_get(__pView));
264 SysAssertf(pSmartData, "Failed to get webkit smart data.");
266 Elm_Access_Action_Info* pActionInfo = new Elm_Access_Action_Info();
267 SysTryReturn(NID_WEB_CTRL, pActionInfo, false, E_OUT_OF_MEMORY, "[%s] Memory Allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
271 pActionInfo->action_type = ELM_ACCESS_ACTION_READ;
272 pActionInfo->x = point.x;
273 pActionInfo->y = point.y;
275 result = pSmartData->api->screen_reader_action_execute(pSmartData, pActionInfo);
285 namespace Tizen { namespace Web { namespace Controls
290 OnEdgeLeft(void* pUserData, Evas_Object* pView, void* pEventInfo)
292 _Web* pCore = reinterpret_cast< _Web* >(pUserData);
293 SysAssertf(pCore, "Failed to request");
295 pCore->SetEdgeReachedEvent(WEB_EDGE_LEFT);
300 OnEdgeRight(void* pUserData, Evas_Object* pView, void* pEventInfo)
302 _Web* pCore = reinterpret_cast< _Web* >(pUserData);
303 SysAssertf(pCore, "Failed to request");
305 pCore->SetEdgeReachedEvent(WEB_EDGE_RIGHT);
310 OnEdgeTop(void* pUserData, Evas_Object* pView, void* pEventInfo)
312 _Web* pCore = reinterpret_cast< _Web* >(pUserData);
313 SysAssertf(pCore, "Failed to request");
315 pCore->SetEdgeReachedEvent(WEB_EDGE_TOP);
320 OnEdgeBottom(void* pUserData, Evas_Object* pView, void* pEventInfo)
322 _Web* pCore = reinterpret_cast< _Web* >(pUserData);
323 SysAssertf(pCore, "Failed to request");
325 pCore->SetEdgeReachedEvent(WEB_EDGE_BOTTOM);
330 : __pGestureHandler(null)
332 , __pWebSetting(null)
333 , __pGestureFlick(null)
334 , __pGestureLongPress(null)
335 , __pGesturePinch(null)
336 , __pGestureDoubleTap(null)
337 , __pTouchEventInfoList(null)
338 , __pTapGestureHandler(null)
339 , __pPanningGestureHandler(null)
340 , __pFlickGestureHandler(null)
341 , __pPinchGestureHandler(null)
342 , __gestureType(WEB_GESTURE_TYPE_TAP)
343 , __edgeType(WEB_EDGE_NONE)
345 , __pTextElement(null)
346 , __previousTouchedPosition(0.0f, 0.0f)
347 , __isFullScreenEntered(false)
349 SetBackgroundColor(Color(0, 0, 0, 0));
355 _UiEventManager* pManager = _UiEventManager::GetInstance();
356 SysAssertf(pManager, "Failed to get ui evnet manager.");
358 pManager->RemoveKeyEventListener(*this);
360 RemoveGestureListener();
365 _Web::CreateWebN(void)
367 result r = E_SUCCESS;
369 std::unique_ptr<_Web> pWeb(new (std::nothrow) _Web());
370 SysTryReturn(NID_WEB_CTRL, pWeb.get(), null, E_OUT_OF_MEMORY, "[%s] Memory Allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
372 pWeb->__pWebSetting = std::unique_ptr<WebSetting>(new (std::nothrow) WebSetting());
373 SysTryReturn(NID_WEB_CTRL, pWeb->__pWebSetting.get(), null, E_OUT_OF_MEMORY, "[%s] Memory allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
375 pWeb->AcquireHandle();
376 pWeb->SetMultiTouchEnabled(true);
377 pWeb->SetTouchPressThreshold(0.08);
379 r = pWeb->AddGestureListeners();
380 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, null, r, "[%s] Propagating.", GetErrorMessage(r));
382 r = pWeb->InitializeGestureStates();
383 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, null, r, "[%s] Propagating.", GetErrorMessage(r));
385 _UiEventManager* pManager = _UiEventManager::GetInstance();
386 SysAssertf(pManager, "Failed to get ui evnet manager.");
388 pManager->AddKeyEventListener(*pWeb.get());
390 return pWeb.release();
395 _Web::CreateWebkitEvasObject(void)
397 result r = E_SUCCESS;
399 std::unique_ptr<_EflWebkit> pEflWebkit(new (std::nothrow) _EflWebkit());
400 SysTryReturnResult(NID_WEB_CTRL, pEflWebkit.get(), E_OUT_OF_MEMORY, "[%s] Memory Allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
402 _VisualElement* pVe = GetVisualElement();
403 r = pEflWebkit->Construct(GetAbsoluteBounds(), *pVe, this);
404 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
406 _VisualElementImpl* pVeImpl = _VisualElementImpl::GetInstance(*pVe);
407 pVeImpl->SetCaptureProvider(this);
409 __pEflWebkit = std::move(pEflWebkit);
411 Evas_Object* pView = GetWebNativeNode();
412 evas_object_smart_callback_add(pView, "edge,left", OnEdgeLeft, this);
413 evas_object_smart_callback_add(pView, "edge,right", OnEdgeRight, this);
414 evas_object_smart_callback_add(pView, "edge,top", OnEdgeTop, this);
415 evas_object_smart_callback_add(pView, "edge,bottom", OnEdgeBottom, this);
422 _Web::InitializeGestureStates(void)
424 __pPinchGestureHandler = std::unique_ptr<_PinchGestureState>(new (std::nothrow) _PinchGestureState(this));
425 SysTryReturnResult(NID_WEB_CTRL, __pPinchGestureHandler.get(), E_OUT_OF_MEMORY, "[%s] Memory Allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
427 __pTapGestureHandler = std::unique_ptr<_TapGestureState>(new (std::nothrow) _TapGestureState(this));
428 SysTryReturnResult(NID_WEB_CTRL, __pTapGestureHandler.get(), E_OUT_OF_MEMORY, "[%s] Memory Allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
430 __pPanningGestureHandler = std::unique_ptr<_PanningGestureState>(new (std::nothrow) _PanningGestureState(this));
431 SysTryReturnResult(NID_WEB_CTRL, __pPanningGestureHandler.get(), E_OUT_OF_MEMORY, "[%s] Memory Allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
433 __pFlickGestureHandler = std::unique_ptr<_FlickGestureState>(new (std::nothrow) _FlickGestureState(this));
434 SysTryReturnResult(NID_WEB_CTRL, __pFlickGestureHandler.get(), E_OUT_OF_MEMORY, "[%s] Memory Allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
436 __pGestureHandler = __pTapGestureHandler.get();
443 _Web::AddGestureListeners(void)
445 result r = E_SUCCESS;
447 std::unique_ptr<_TouchFlickGestureDetector> pGestureFlick(new (std::nothrow) _TouchFlickGestureDetector());
448 SysTryReturnResult(NID_WEB_CTRL, pGestureFlick.get(), E_OUT_OF_MEMORY, "[%s] Memory Allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
450 r = pGestureFlick->AddGestureListener(*this);
451 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
453 r = AddGestureDetector(*pGestureFlick.get());
454 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
456 __pGestureFlick = std::move(pGestureFlick);
458 std::unique_ptr<_TouchLongPressGestureDetector> pGestureLongPress(new (std::nothrow) _TouchLongPressGestureDetector());
459 SysTryReturnResult(NID_WEB_CTRL, pGestureLongPress.get(), E_OUT_OF_MEMORY, "[%s] Memory Allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
461 r = pGestureLongPress->AddGestureListener(*this);
462 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
464 r = AddGestureDetector(*pGestureLongPress.get());
465 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
467 __pGestureLongPress = std::move(pGestureLongPress);
469 std::unique_ptr<_TouchTapGestureDetector> pGestureDoubleTap(new (std::nothrow) _TouchTapGestureDetector());
470 SysTryReturnResult(NID_WEB_CTRL, pGestureDoubleTap.get(), E_OUT_OF_MEMORY, "[%s] Memory Allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
472 r = pGestureDoubleTap->AddGestureListener(*this);
473 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
475 r = AddGestureDetector(*pGestureDoubleTap.get());
476 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
478 __pGestureDoubleTap = std::move(pGestureDoubleTap);
480 std::unique_ptr<_TouchPinchGestureDetector> pGesturePinch(new (std::nothrow) _TouchPinchGestureDetector());
481 SysTryReturnResult(NID_WEB_CTRL, pGesturePinch.get(), E_OUT_OF_MEMORY, "[%s] Memory Allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
483 r = pGesturePinch->AddGestureListener(*this);
484 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
486 r = AddGestureDetector(*pGesturePinch.get());
487 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
489 __pGesturePinch = std::move(pGesturePinch);
496 _Web::RemoveGestureListener(void)
498 if (__pGestureFlick.get())
500 __pGestureFlick->RemoveGestureListener(*this);
501 RemoveGestureDetector(*__pGestureFlick);
504 if (__pGestureLongPress.get())
506 __pGestureLongPress->RemoveGestureListener(*this);
507 RemoveGestureDetector(*__pGestureLongPress);
510 if (__pGestureDoubleTap.get())
512 __pGestureDoubleTap->RemoveGestureListener(*this);
513 RemoveGestureDetector(*__pGestureDoubleTap);
516 if (__pGesturePinch.get())
518 __pGesturePinch->RemoveGestureListener(*this);
519 RemoveGestureDetector(*__pGesturePinch);
522 Evas_Object* pView = GetWebNativeNode();
525 evas_object_smart_callback_del(pView, "edge,left", OnEdgeLeft);
526 evas_object_smart_callback_del(pView, "edge,right", OnEdgeRight);
527 evas_object_smart_callback_del(pView, "edge,top", OnEdgeTop);
528 evas_object_smart_callback_del(pView, "edge,bottom", OnEdgeBottom);
534 _Web::InitializeWebNativeNode(void)
536 result r = E_SUCCESS;
538 r = CreateWebkitEvasObject();
539 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
541 SetNativeObjectFocusable(false);
543 _AccessibilityContainer* pContainer = GetAccessibilityContainer();
544 SysTryReturn(NID_WEB_CTRL, pContainer, E_SYSTEM, E_SYSTEM, "[%s] Propagating.", GetErrorMessage(E_SYSTEM));
546 __pTextElement = new (std::nothrow) _AccessibilityElement(true);
547 SysTryReturn(NID_WEB_CTRL, __pTextElement, E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[%s] Memory Allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
549 __pTextElement->SetBounds(FloatRectangle(0.0f, 0.0f, GetBoundsF().width, GetBoundsF().height));
550 __pTextElement->SetLabel(L"Web control");
552 pContainer->AddElement(*__pTextElement);
553 pContainer->Activate(true);
555 _WebAccessibilityListener* pListener = new (std::nothrow) _WebAccessibilityListener(GetWebNativeNode());
556 SysTryReturn(NID_WEB_CTRL, pListener, E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[%s] Memory Allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
558 pContainer->AddListener(*dynamic_cast<_IAccessibilityListener*>(pListener));
560 _WebAccessibilityFocusHandler* pFocusHandler = new (std::nothrow) _WebAccessibilityFocusHandler(GetWebNativeNode());
561 SysTryReturn(NID_WEB_CTRL, pFocusHandler, E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[%s] Memory Allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
563 pContainer->SetFocusHandler(dynamic_cast<_IAccessibilityFocusHandler*>(pFocusHandler));
570 _Web::GetAbsoluteCoordinate(Point relativePoint)
572 return _CoordinateSystemUtils::Transform(ConvertToScreenPosition(relativePoint));
577 _Web::GetAbsoluteCoordinate(FloatPoint relativePoint)
579 return _CoordinateSystemUtils::Transform(ConvertToScreenPosition(relativePoint));
584 _Web::GetRelativeCoordinate(Point absolutePoint)
586 return ConvertToControlPosition(_CoordinateSystemUtils::InverseTransform(absolutePoint));
591 _Web::GetRelativeCoordinate(FloatPoint absolutePoint)
593 return ConvertToControlPosition(_CoordinateSystemUtils::InverseTransform(absolutePoint));
598 _Web::GetWebNativeNode(void)
600 if (__pEflWebkit.get())
602 return __pEflWebkit->GetWebEvasObject();
610 _Web::GetSetting(void) const
612 return __pWebSetting.get();
617 _Web::OnAttaching(const _Control* pParent)
619 if (__pEflWebkit.get())
621 evas_object_show(__pEflWebkit->GetWebEvasObject());
622 evas_object_focus_set(__pEflWebkit->GetWebEvasObject(), EINA_TRUE);
630 _Web::OnBoundsChanging(const Rectangle& bounds)
632 Rectangle absoluteBounds = GetAbsoluteBounds();
633 Rectangle webBounds = GetBounds();
634 _ICoordinateSystemTransformer* pXformer = _CoordinateSystem::GetInstance()->GetTransformer();
635 SysTryReturnResult(NID_WEB_CTRL, pXformer, E_SYSTEM, "[%s] A system error has been occurred. Failed to get coordinate transformer.", GetErrorMessage(E_SYSTEM));
637 if (__pEflWebkit.get())
639 evas_object_move(__pEflWebkit->GetWebEvasObject(), pXformer->TransformHorizontal(absoluteBounds.x - webBounds.x + bounds.x), pXformer->TransformVertical(absoluteBounds.y - webBounds.y + bounds.y));
640 evas_object_resize(__pEflWebkit->GetWebEvasObject(), pXformer->TransformHorizontal(bounds.width), pXformer->TransformVertical(bounds.height));
648 _Web::ChangeGesture(_WebGestureType type)
652 case WEB_GESTURE_TYPE_TAP:
653 __pGestureHandler = __pTapGestureHandler.get();
654 __gestureType = WEB_GESTURE_TYPE_TAP;
657 case WEB_GESTURE_TYPE_PANNING:
658 __pGestureHandler = __pPanningGestureHandler.get();
659 __gestureType = WEB_GESTURE_TYPE_PANNING;
662 case WEB_GESTURE_TYPE_FLICK:
663 __pGestureHandler = __pFlickGestureHandler.get();
664 __gestureType = WEB_GESTURE_TYPE_FLICK;
667 case WEB_GESTURE_TYPE_PINCH:
668 __pGestureHandler = __pPinchGestureHandler.get();
669 __gestureType = WEB_GESTURE_TYPE_PINCH;
679 _Web::SetEdgeReachedEvent(_WebEdgeType type)
686 __edgeType &= ~WEB_EDGE_RIGHT;
690 __edgeType &= ~WEB_EDGE_LEFT;
694 __edgeType &= ~WEB_EDGE_BOTTOM;
697 case WEB_EDGE_BOTTOM:
698 __edgeType &= ~WEB_EDGE_TOP;
708 _Web::OnTouchPressed(const _Control& source, const _TouchInfo& touchInfo)
710 evas_object_focus_set(GetWebNativeNode(), EINA_TRUE);
712 if (__pEflWebkit.get())
714 __edgeType = WEB_EDGE_NONE;
715 __previousTouchedPosition = touchInfo.GetCurrentPosition();
717 SendTouchEventForJavaScript(touchInfo);
719 return __pGestureHandler->OnTouchPressed(source, touchInfo);
727 _Web::OnTouchMoved(const _Control& source, const _TouchInfo& touchInfo)
729 if (__pEflWebkit.get())
731 if (__gestureType == WEB_GESTURE_TYPE_TAP)
733 __pPanningGestureHandler->InitializeTextSelectionStatus();
736 SendTouchEventForJavaScript(touchInfo);
738 __pGestureHandler->OnTouchMoved(source, touchInfo);
740 float scrollDistanceX = __previousTouchedPosition.x - touchInfo.GetCurrentPosition().x;
741 float scrollDistanceY = __previousTouchedPosition.y - touchInfo.GetCurrentPosition().y;
742 __previousTouchedPosition = touchInfo.GetCurrentPosition();
744 if (__edgeType != WEB_EDGE_NONE && __gestureType == WEB_GESTURE_TYPE_PANNING)
746 if (_Abs(scrollDistanceY) < _Abs(scrollDistanceX))
748 if (__edgeType & WEB_EDGE_LEFT)
750 if (scrollDistanceX < 0)
752 __edgeType &= ~WEB_EDGE_RIGHT;
758 __edgeType &= ~WEB_EDGE_LEFT;
761 else if (__edgeType & WEB_EDGE_RIGHT)
763 if (scrollDistanceX > 0)
765 __edgeType &= ~WEB_EDGE_LEFT;
771 __edgeType &= ~WEB_EDGE_RIGHT;
775 else if (_Abs(scrollDistanceY) > _Abs(scrollDistanceX))
777 if (__edgeType & WEB_EDGE_TOP)
779 if (scrollDistanceY < 0)
781 __edgeType &= ~WEB_EDGE_BOTTOM;
787 __edgeType &= ~WEB_EDGE_TOP;
790 else if (__edgeType & WEB_EDGE_BOTTOM)
792 if (scrollDistanceY > 0)
794 __edgeType &= ~WEB_EDGE_TOP;
800 __edgeType &= ~WEB_EDGE_BOTTOM;
814 _Web::OnTouchReleased(const _Control& source, const _TouchInfo& touchInfo)
818 if (__pEflWebkit.get())
820 SendTouchEventForJavaScript(touchInfo);
822 return __pGestureHandler->OnTouchReleased(source, touchInfo);
830 _Web::OnTouchCanceled(const _Control& source, const _TouchInfo& touchInfo)
832 if (__pEflWebkit.get())
834 SendTouchEventForJavaScript(touchInfo);
836 return __pGestureHandler->OnTouchCanceled(source, touchInfo);
844 _Web::OnTouchPressHandled(const _Control& control)
850 _Web::OnTouchReleaseHandled(const _Control& control)
856 _Web::OnTouchMoveHandled(const _Control& control)
862 _Web::OnTouchCancelHandled(const _Control& control)
868 _Web::OnLongPressGestureDetected(_TouchLongPressGestureDetector& gesture)
870 if (__pEflWebkit.get() && __gestureType == WEB_GESTURE_TYPE_TAP)
872 return __pTapGestureHandler->OnLongPressGestureDetected(gesture);
880 _Web::OnLongPressGestureCanceled(_TouchLongPressGestureDetector& gesture)
887 _Web::OnTapGestureDetected(_TouchTapGestureDetector& gesture)
889 if (__pEflWebkit.get())
891 return __pTapGestureHandler->OnTapGestureDetected(gesture);
899 _Web::OnTapGestureCanceled(_TouchTapGestureDetector& gesture)
906 _Web::OnFlickGestureDetected(_TouchFlickGestureDetector& gesture)
908 if (__pEflWebkit.get() && _WebSettingImpl::GetInstance(__pWebSetting.get())->IsScrollEnabled())
910 return __pFlickGestureHandler->OnFlickGestureDetected(gesture);
918 _Web::OnFlickGestureCanceled(_TouchFlickGestureDetector& gesture)
925 _Web::OnPinchGestureStarted(Tizen::Ui::_TouchPinchGestureDetector& gesture)
927 if (__pEflWebkit.get())
929 return __pPinchGestureHandler->OnPinchGestureStarted(gesture);
937 _Web::OnPinchGestureChanged(Tizen::Ui::_TouchPinchGestureDetector& gesture)
939 if (__pEflWebkit.get() && __gestureType == WEB_GESTURE_TYPE_PINCH)
941 return __pPinchGestureHandler->OnPinchGestureChanged(gesture);
949 _Web::OnPinchGestureFinished(Tizen::Ui::_TouchPinchGestureDetector& gesture)
951 if (__pEflWebkit.get() && __gestureType == WEB_GESTURE_TYPE_PINCH)
953 return __pPinchGestureHandler->OnPinchGestureFinished(gesture);
961 _Web::OnPinchGestureCanceled(Tizen::Ui::_TouchPinchGestureDetector& gesture)
968 _Web::OnCanvasRequestedN(const FloatRectangle& bounds)
970 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);
971 if (bounds.width == 0.0f || bounds.height == 0.0f)
973 FloatDimension size(GetSizeF());
974 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.");
977 result r = E_SUCCESS;
979 Rectangle absBounds(_CoordinateSystemUtils::ConvertToInteger(_CoordinateSystemUtils::Transform(bounds)));
982 EINA_RECTANGLE_SET(&rect, absBounds.x, absBounds.y, absBounds.width, absBounds.height);
984 Evas_Object* pWebFrame = GetWebNativeNode();
985 Evas_Object* pScreenShot = ewk_view_screenshot_contents_get(pWebFrame, rect, 1.0f, evas_object_evas_get(pWebFrame));
987 std::unique_ptr<Canvas> pCanvas(new (std::nothrow) Canvas());
988 SysTryReturn(NID_WEB_CTRL, pCanvas.get(), null, E_OUT_OF_MEMORY, "[%s] Memory Allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
992 BufferInfo bufferInfo;
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 r = pCanvas->Construct(bufferInfo);
999 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, null, r, "[%s] propagating", GetErrorMessage(r));
1003 r = pCanvas->Construct(bounds);
1004 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, null, r, "[%s] propagating", GetErrorMessage(r));
1007 return pCanvas.release();
1012 _Web::OnCapturedBitmapRequestedN(void)
1014 result r = E_SUCCESS;
1016 BufferInfo bufferInfo;
1017 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));
1020 int bufferSize = bufferInfo.bitsPerPixel * bufferInfo.width * bufferInfo.height;
1022 r = buffer.Construct(reinterpret_cast < byte* >(bufferInfo.pPixels), 0, bufferSize, bufferSize);
1023 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, null, r, "[%s] propagating", GetErrorMessage(r));
1025 std::unique_ptr<Bitmap> pBitmap(new (std::nothrow) Bitmap());
1026 SysTryReturn(NID_WEB_CTRL, pBitmap.get(), null, E_OUT_OF_MEMORY, "[%s] Memory Allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
1028 r = pBitmap->Construct(buffer, Dimension(bufferInfo.width, bufferInfo.height), BITMAP_PIXEL_FORMAT_ARGB8888);
1029 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, null, r, "[%s] propagating", GetErrorMessage(r));
1031 return pBitmap.release();
1036 _Web::OnCaptureAcquire(BufferInfo& output)
1038 result r = E_SUCCESS;
1040 FloatPoint position(GetPositionF());
1041 FloatDimension size(GetSizeF());
1043 Dimension absSize(_CoordinateSystemUtils::ConvertToInteger(_CoordinateSystemUtils::Transform(size)));
1045 Eina_Rectangle rect;
1046 EINA_RECTANGLE_SET(&rect, 0, 0, absSize.width, absSize.height);
1048 Evas_Object* pWebFrame = GetWebNativeNode();
1049 Evas_Object* pScreenShot = ewk_view_screenshot_contents_get(pWebFrame, rect, 1.0f, evas_object_evas_get(pWebFrame));
1050 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));
1052 r = _Utility::GetPixelBufferFromEvasObject(pScreenShot, output);
1053 evas_object_del(pScreenShot);
1054 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, false, r, "[%s] propagating", GetErrorMessage(r));
1061 _Web::SendTouchEventForJavaScript(const _TouchInfo& touchInfo)
1063 result r = E_SUCCESS;
1065 _TouchManager* pTouchManager = _TouchManager::GetInstance();
1066 SysAssertf(pTouchManager, "Failed to get touch manager.");
1068 std::unique_ptr<IListT<_FingerInfo*> > pTouchList(pTouchManager->GetMultiFingerInfoListN());
1069 SysTryReturnVoidResult(NID_WEB_CTRL, pTouchList.get(), GetLastResult(), "[%s] Failed to get touch list.", GetErrorMessage(GetLastResult()));
1071 std::unique_ptr<IBidirectionalEnumeratorT<_FingerInfo*> > pTouchListEnum(pTouchList->GetBidirectionalEnumeratorN());
1072 SysAssertf(pTouchListEnum.get() != null, "Failed to get enumerator of touch list.");
1074 Eina_List* pPointList = null;
1075 _FingerInfo* pFingerInfo = null;
1076 while(pTouchListEnum->MoveNext() == E_SUCCESS)
1078 r = pTouchListEnum->GetCurrent(pFingerInfo);
1079 SysTryReturnVoidResult(NID_WEB_CTRL, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
1081 _TouchStatus state = pFingerInfo->GetStatus();
1082 if(state == _TOUCH_PRESSED || state == _TOUCH_MOVED || state == _TOUCH_RELEASED || state == _TOUCH_CANCELED)
1084 Point integerPoint(_CoordinateSystemUtils::ConvertToInteger(GetAbsoluteCoordinate(pFingerInfo->GetPoint())));
1086 Ewk_Touch_Point* pPoint = static_cast<Ewk_Touch_Point*>(calloc(1, sizeof(Ewk_Touch_Point)));
1087 pPoint->id = pFingerInfo->GetPointId();
1088 pPoint->x = integerPoint.x;
1089 pPoint->y = integerPoint.y;
1090 pPoint->state = GetEvasTouchState((TouchStatus)pFingerInfo->GetStatus());
1091 SysSecureLog(NID_WEB_CTRL, "The current value of id is %lu, x is %d, y is %d, state is %d", pPoint->id, pPoint->x, pPoint->y, pPoint->state);
1093 pPointList = eina_list_append(pPointList, pPoint);
1097 ewk_view_feed_touch_event(__pEflWebkit->GetWebEvasObject(), GetEwkTouchEvent(touchInfo.GetTouchStatus()), pPointList, null);
1100 EINA_LIST_FREE(pPointList, pData)
1105 Ewk_Touch_Event_Type
1106 _Web::GetEwkTouchEvent(_TouchStatus touchStatus)
1108 Ewk_Touch_Event_Type ewkTouchEvent = EWK_TOUCH_CANCEL;
1110 switch (touchStatus)
1112 case _TOUCH_PRESSED :
1113 ewkTouchEvent = EWK_TOUCH_START;
1116 ewkTouchEvent = EWK_TOUCH_MOVE;
1118 case _TOUCH_RELEASED :
1119 ewkTouchEvent = EWK_TOUCH_END;
1121 case _TOUCH_CANCELED :
1124 ewkTouchEvent = EWK_TOUCH_CANCEL;
1128 return ewkTouchEvent;
1132 Evas_Touch_Point_State
1133 _Web::GetEvasTouchState(TouchStatus touchStatus)
1135 Evas_Touch_Point_State evasTouchState = EVAS_TOUCH_POINT_CANCEL;
1137 switch (touchStatus)
1139 case TOUCH_PRESSED :
1140 evasTouchState = EVAS_TOUCH_POINT_DOWN;
1143 evasTouchState = EVAS_TOUCH_POINT_MOVE;
1145 case TOUCH_RELEASED :
1146 evasTouchState = EVAS_TOUCH_POINT_UP;
1148 case TOUCH_CANCELED :
1151 evasTouchState = EVAS_TOUCH_POINT_CANCEL;
1152 //todo : mapping EVAS_TOUCH_POINT_STILL, /**< Touch point is not moved af
1156 return evasTouchState;
1161 _Web::SetFullScreenEntered(bool isFullScreenEntered)
1163 __isFullScreenEntered = isFullScreenEntered;
1168 _Web::SetFocusEnd(bool focus)
1175 _Web::IsFocusEnd(void)
1182 _Web::OnKeyPressed(const _Control& source, const _KeyInfo& keyInfo)
1184 _KeyCode keyCode = keyInfo.GetKeyCode();
1186 if (IsFocusEnd() == true)
1189 evas_object_focus_set(GetWebNativeNode(), EINA_FALSE);
1197 evas_object_focus_set(GetWebNativeNode(), EINA_FALSE);
1204 evas_object_focus_set(GetWebNativeNode(), EINA_TRUE);
1211 _Web::OnKeyReleased(const _Control& source, const _KeyInfo& keyInfo)
1213 if (__isFullScreenEntered)
1215 if (keyInfo.GetKeyCode() == _KEY_ESC || keyInfo.GetKeyCode() == _KEY_BACK)
1217 __isFullScreenEntered = false;
1219 ewk_view_fullscreen_exit(GetWebNativeNode());
1230 _Web::OnDrawFocus(void)
1235 }}} // Tizen::Web::Controls