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 <FGrpFloatRectangle.h>
34 #include <FSysVibrator.h>
35 #include <FWebCtrlWebSetting.h>
36 #include <FGrp_CoordinateSystem.h>
37 #include <FSys_VibratorImpl.h>
38 #include <FUiAnim_EflNode.h>
39 #include <FUiAnim_VisualElement.h>
40 #include <FUi_CoordinateSystemUtils.h>
41 #include <FUi_AccessibilityContainer.h>
42 #include <FUi_AccessibilityElement.h>
43 #include <FUi_IAccessibilityFocusHandler.h>
45 #include <FUi_TouchManager.h>
46 #include "FWebCtrl_EflWebkit.h"
47 #include "FWebCtrl_GestureState.h"
48 #include "FWebCtrl_Web.h"
49 #include "FWebCtrl_WebImpl.h"
50 #include "FWebCtrl_WebSettingImpl.h"
51 #include "FWebCtrl_Utility.h"
54 using namespace Tizen::Base;
55 using namespace Tizen::Base::Collection;
56 using namespace Tizen::Graphics;
57 using namespace Tizen::Ui;
58 using namespace Tizen::Ui::Animations;
63 static int __animationAccessibilityCount = 0;
64 class _WebAccessibilityFocusHandler
65 :public Tizen::Ui::_IAccessibilityFocusHandler
68 _WebAccessibilityFocusHandler(void)
71 virtual ~_WebAccessibilityFocusHandler(void)
74 virtual bool OnMoveFocus(Tizen::Ui::_AccessibilityFocusDirection direction)
76 __animationAccessibilityCount++;
77 if (direction == Tizen::Ui::_ACCESSIBILITY_FOCUS_DIRECTION_PREVIOUS)
79 if(__animationAccessibilityCount %3 == 0)
81 SysLog(NID_WEB_CTRL, "_WebAccessibilityFocusHandler can move focus , :direction : PREVIOUS");
84 SysLog(NID_WEB_CTRL, "!!!_WebAccessibilityFocusHandler can NOT move focus , :direction : PREVIOUS");
87 else if (direction == Tizen::Ui::_ACCESSIBILITY_FOCUS_DIRECTION_NEXT)
89 if(__animationAccessibilityCount %3 == 0)
91 SysLog(NID_WEB_CTRL, "_WebAccessibilityFocusHandler can move focus , :direction : NEXT");
94 SysLog(NID_WEB_CTRL, "!!!_WebAccessibilityFocusHandler can NOT move focus , :direction : NEXT");
99 virtual bool OnMoveFocus(const Tizen::Graphics::Point& point)
101 if(__animationAccessibilityCount %2 == 0)
103 SysLog(NID_WEB_CTRL, "_WebAccessibilityFocusHandler can read element at the point (%d,%d)", point.x, point.y);
108 SysLog(NID_WEB_CTRL, "_WebAccessibilityFocusHandler can NOT read element at the point (%d,%d)", point.x, point.y);
117 namespace Tizen { namespace Web { namespace Controls
121 static const char WEB_CTRL[] = "webcontrol";
125 OnEdgeLeft(void* pUserData, Evas_Object* pView, void* pEventInfo)
127 _Web* pCore = reinterpret_cast< _Web* >(pUserData);
128 SysAssertf(pCore, "Failed to request");
130 pCore->SetEdgeReachedEvent(WEB_EDGE_LEFT);
135 OnEdgeRight(void* pUserData, Evas_Object* pView, void* pEventInfo)
137 _Web* pCore = reinterpret_cast< _Web* >(pUserData);
138 SysAssertf(pCore, "Failed to request");
140 pCore->SetEdgeReachedEvent(WEB_EDGE_RIGHT);
145 OnEdgeTop(void* pUserData, Evas_Object* pView, void* pEventInfo)
147 _Web* pCore = reinterpret_cast< _Web* >(pUserData);
148 SysAssertf(pCore, "Failed to request");
150 pCore->SetEdgeReachedEvent(WEB_EDGE_TOP);
155 OnEdgeBottom(void* pUserData, Evas_Object* pView, void* pEventInfo)
157 _Web* pCore = reinterpret_cast< _Web* >(pUserData);
158 SysAssertf(pCore, "Failed to request");
160 pCore->SetEdgeReachedEvent(WEB_EDGE_BOTTOM);
165 : __pGestureHandler(null)
167 , __pWebSetting(null)
168 , __pGestureFlick(null)
169 , __pGestureLongPress(null)
170 , __pGesturePinch(null)
171 , __pGestureDoubleTap(null)
172 , __pTouchEventInfoList(null)
173 , __pTapGestureHandler(null)
174 , __pPanningGestureHandler(null)
175 , __pFlickGestureHandler(null)
176 , __pPinchGestureHandler(null)
177 , __gestureType(WEB_GESTURE_TYPE_TAP)
178 , __edgeType(WEB_EDGE_NONE)
179 , __pTextElement(null)
180 , __previousTouchedPosition(0.0f, 0.0f)
182 SetBackgroundColor(Color(0, 0, 0, 0));
188 RemoveGestureListener();
193 _Web::CreateWebN(void)
195 result r = E_SUCCESS;
197 std::unique_ptr<_Web> pWeb(new (std::nothrow) _Web());
198 SysTryReturn(NID_WEB_CTRL, pWeb.get(), null, E_OUT_OF_MEMORY, "[%s] Memory Allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
200 pWeb->__pWebSetting = std::unique_ptr<WebSetting>(new (std::nothrow) WebSetting());
201 SysTryReturn(NID_WEB_CTRL, pWeb->__pWebSetting.get(), null, E_OUT_OF_MEMORY, "[%s] Memory allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
203 pWeb->AcquireHandle();
204 pWeb->SetMultiTouchEnabled(true);
205 pWeb->SetTouchPressThreshold(0.08);
207 r = pWeb->AddGestureListeners();
208 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, null, r, "[%s] Propagating.", GetErrorMessage(r));
210 r = pWeb->InitializeGestureStates();
211 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, null, r, "[%s] Propagating.", GetErrorMessage(r));
213 return pWeb.release();
218 _Web::CreateWebkitEvasObject(void)
220 result r = E_SUCCESS;
222 std::unique_ptr<_EflWebkit> pEflWebkit(new (std::nothrow) _EflWebkit());
223 SysTryReturnResult(NID_WEB_CTRL, pEflWebkit.get(), E_OUT_OF_MEMORY, "[%s] Memory Allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
225 r = pEflWebkit->Construct(GetAbsoluteBounds(), *GetVisualElement(), this);
226 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
228 __pEflWebkit = std::move(pEflWebkit);
230 Evas_Object* pView = GetWebNativeNode();
231 evas_object_smart_callback_add(pView, "edge,left", OnEdgeLeft, this);
232 evas_object_smart_callback_add(pView, "edge,right", OnEdgeRight, this);
233 evas_object_smart_callback_add(pView, "edge,top", OnEdgeTop, this);
234 evas_object_smart_callback_add(pView, "edge,bottom", OnEdgeBottom, this);
241 _Web::InitializeGestureStates(void)
243 __pPinchGestureHandler = std::unique_ptr<_PinchGestureState>(new (std::nothrow) _PinchGestureState(this));
244 SysTryReturnResult(NID_WEB_CTRL, __pPinchGestureHandler.get(), E_OUT_OF_MEMORY, "[%s] Memory Allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
246 __pTapGestureHandler = std::unique_ptr<_TapGestureState>(new (std::nothrow) _TapGestureState(this));
247 SysTryReturnResult(NID_WEB_CTRL, __pTapGestureHandler.get(), E_OUT_OF_MEMORY, "[%s] Memory Allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
249 __pPanningGestureHandler = std::unique_ptr<_PanningGestureState>(new (std::nothrow) _PanningGestureState(this));
250 SysTryReturnResult(NID_WEB_CTRL, __pPanningGestureHandler.get(), E_OUT_OF_MEMORY, "[%s] Memory Allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
252 __pFlickGestureHandler = std::unique_ptr<_FlickGestureState>(new (std::nothrow) _FlickGestureState(this));
253 SysTryReturnResult(NID_WEB_CTRL, __pFlickGestureHandler.get(), E_OUT_OF_MEMORY, "[%s] Memory Allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
255 __pGestureHandler = __pTapGestureHandler.get();
262 _Web::AddGestureListeners(void)
264 result r = E_SUCCESS;
266 std::unique_ptr<_TouchFlickGestureDetector> pGestureFlick(new (std::nothrow) _TouchFlickGestureDetector());
267 SysTryReturnResult(NID_WEB_CTRL, pGestureFlick.get(), E_OUT_OF_MEMORY, "[%s] Memory Allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
269 r = pGestureFlick->AddGestureListener(*this);
270 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
272 r = AddGestureDetector(*pGestureFlick.get());
273 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
275 __pGestureFlick = std::move(pGestureFlick);
277 std::unique_ptr<_TouchLongPressGestureDetector> pGestureLongPress(new (std::nothrow) _TouchLongPressGestureDetector());
278 SysTryReturnResult(NID_WEB_CTRL, pGestureLongPress.get(), E_OUT_OF_MEMORY, "[%s] Memory Allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
280 r = pGestureLongPress->AddGestureListener(*this);
281 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
283 r = AddGestureDetector(*pGestureLongPress.get());
284 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
286 __pGestureLongPress = std::move(pGestureLongPress);
288 std::unique_ptr<_TouchTapGestureDetector> pGestureDoubleTap(new (std::nothrow) _TouchTapGestureDetector());
289 SysTryReturnResult(NID_WEB_CTRL, pGestureDoubleTap.get(), E_OUT_OF_MEMORY, "[%s] Memory Allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
291 r = pGestureDoubleTap->AddGestureListener(*this);
292 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
294 r = AddGestureDetector(*pGestureDoubleTap.get());
295 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
297 __pGestureDoubleTap = std::move(pGestureDoubleTap);
299 std::unique_ptr<_TouchPinchGestureDetector> pGesturePinch(new (std::nothrow) _TouchPinchGestureDetector());
300 SysTryReturnResult(NID_WEB_CTRL, pGesturePinch.get(), E_OUT_OF_MEMORY, "[%s] Memory Allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
302 r = pGesturePinch->AddGestureListener(*this);
303 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
305 r = AddGestureDetector(*pGesturePinch.get());
306 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
308 __pGesturePinch = std::move(pGesturePinch);
315 _Web::RemoveGestureListener(void)
317 if (__pGestureFlick.get())
319 __pGestureFlick->RemoveGestureListener(*this);
320 RemoveGestureDetector(*__pGestureFlick);
323 if (__pGestureLongPress.get())
325 __pGestureLongPress->RemoveGestureListener(*this);
326 RemoveGestureDetector(*__pGestureLongPress);
329 if (__pGestureDoubleTap.get())
331 __pGestureDoubleTap->RemoveGestureListener(*this);
332 RemoveGestureDetector(*__pGestureDoubleTap);
335 if (__pGesturePinch.get())
337 __pGesturePinch->RemoveGestureListener(*this);
338 RemoveGestureDetector(*__pGesturePinch);
341 Evas_Object* pView = GetWebNativeNode();
344 evas_object_smart_callback_del(pView, "edge,left", OnEdgeLeft);
345 evas_object_smart_callback_del(pView, "edge,right", OnEdgeRight);
346 evas_object_smart_callback_del(pView, "edge,top", OnEdgeTop);
347 evas_object_smart_callback_del(pView, "edge,bottom", OnEdgeBottom);
353 _Web::InitializeWebNativeNode(void)
355 result r = E_SUCCESS;
357 r = CreateWebkitEvasObject();
358 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
360 SetNativeObjectFocusable(false);
362 _AccessibilityContainer* pContainer = GetAccessibilityContainer();
363 SysTryReturn(NID_WEB_CTRL, pContainer, E_SYSTEM, E_SYSTEM, "[%s] Propagating.", GetErrorMessage(E_SYSTEM));
367 __pTextElement = new (std::nothrow) _AccessibilityElement(true);
368 SysTryReturn(NID_WEB_CTRL, __pTextElement, E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[%s] Memory shortage.", GetErrorMessage(E_OUT_OF_MEMORY));
370 __pTextElement->SetBounds(FloatRectangle(0.0f, 0.0f, GetBoundsF().width, GetBoundsF().height));
371 //__pTextElement->SetLabel(GetText());
372 //__pTextElement->SetTrait(L"Web");
373 //__pTextElement->SetName(L"WebText");
375 pContainer->AddElement(*__pTextElement);
378 pContainer->Activate(true);
379 _WebAccessibilityFocusHandler* pFocusHandler = new (std::nothrow) _WebAccessibilityFocusHandler();
380 pContainer->SetFocusHandler(dynamic_cast<_IAccessibilityFocusHandler*>(pFocusHandler));
387 _Web::GetAbsoluteCoordinate(Point relativePoint)
389 return _CoordinateSystemUtils::Transform(ConvertToScreenPosition(relativePoint));
394 _Web::GetAbsoluteCoordinate(FloatPoint relativePoint)
396 return _CoordinateSystemUtils::Transform(ConvertToScreenPosition(relativePoint));
401 _Web::GetRelativeCoordinate(Point absolutePoint)
403 return ConvertToControlPosition(_CoordinateSystemUtils::InverseTransform(absolutePoint));
408 _Web::GetRelativeCoordinate(FloatPoint absolutePoint)
410 return ConvertToControlPosition(_CoordinateSystemUtils::InverseTransform(absolutePoint));
415 _Web::GetWebNativeNode(void)
417 SysTryReturn(NID_WEB_CTRL, __pEflWebkit.get(), null, E_INVALID_STATE, "[%s] Native node is in an invalid state.", GetErrorMessage(E_INVALID_STATE));
419 return __pEflWebkit->GetWebEvasObject();
424 _Web::GetSetting(void) const
426 return __pWebSetting.get();
431 _Web::OnAttaching(const _Control* pParent)
433 if (__pEflWebkit.get())
435 evas_object_show(__pEflWebkit->GetWebEvasObject());
436 evas_object_focus_set(__pEflWebkit->GetWebEvasObject(), EINA_TRUE);
444 _Web::OnBoundsChanging(const Rectangle& bounds)
446 Rectangle absoluteBounds = GetAbsoluteBounds();
447 Rectangle webBounds = GetBounds();
448 _ICoordinateSystemTransformer* pXformer = _CoordinateSystem::GetInstance()->GetTransformer();
449 SysTryReturnResult(NID_WEB_CTRL, pXformer, E_SYSTEM, "[%s] A system error has been occurred. Failed to get coordinate transformer.", GetErrorMessage(E_SYSTEM));
451 if (__pEflWebkit.get())
453 evas_object_move(__pEflWebkit->GetWebEvasObject(), pXformer->TransformHorizontal(absoluteBounds.x - webBounds.x + bounds.x), pXformer->TransformVertical(absoluteBounds.y - webBounds.y + bounds.y));
454 evas_object_resize(__pEflWebkit->GetWebEvasObject(), pXformer->TransformHorizontal(bounds.width), pXformer->TransformVertical(bounds.height));
462 _Web::ChangeGesture(_WebGestureType type)
466 case WEB_GESTURE_TYPE_TAP:
467 __pGestureHandler = __pTapGestureHandler.get();
468 __gestureType = WEB_GESTURE_TYPE_TAP;
471 case WEB_GESTURE_TYPE_PANNING:
472 __pGestureHandler = __pPanningGestureHandler.get();
473 __gestureType = WEB_GESTURE_TYPE_PANNING;
476 case WEB_GESTURE_TYPE_FLICK:
477 __pGestureHandler = __pFlickGestureHandler.get();
478 __gestureType = WEB_GESTURE_TYPE_FLICK;
481 case WEB_GESTURE_TYPE_PINCH:
482 __pGestureHandler = __pPinchGestureHandler.get();
483 __gestureType = WEB_GESTURE_TYPE_PINCH;
493 _Web::SetEdgeReachedEvent(_WebEdgeType type)
500 __edgeType &= ~WEB_EDGE_RIGHT;
504 __edgeType &= ~WEB_EDGE_LEFT;
508 __edgeType &= ~WEB_EDGE_BOTTOM;
511 case WEB_EDGE_BOTTOM:
512 __edgeType &= ~WEB_EDGE_TOP;
522 _Web::OnTouchPressed(const _Control& source, const _TouchInfo& touchInfo)
524 if (__pEflWebkit.get())
526 __edgeType = WEB_EDGE_NONE;
527 __previousTouchedPosition = touchInfo.GetCurrentPosition();
529 SendTouchEventForJavaScript(touchInfo);
531 return __pGestureHandler->OnTouchPressed(source, touchInfo);
539 _Web::OnTouchMoved(const _Control& source, const _TouchInfo& touchInfo)
541 if (__pEflWebkit.get())
543 SendTouchEventForJavaScript(touchInfo);
545 __pGestureHandler->OnTouchMoved(source, touchInfo);
547 float scrollDistanceX = __previousTouchedPosition.x - touchInfo.GetCurrentPosition().x;
548 float scrollDistanceY = __previousTouchedPosition.y - touchInfo.GetCurrentPosition().y;
549 __previousTouchedPosition = touchInfo.GetCurrentPosition();
551 if (__edgeType != WEB_EDGE_NONE && __gestureType == WEB_GESTURE_TYPE_PANNING)
553 if (_Abs(scrollDistanceY) < _Abs(scrollDistanceX))
555 if (__edgeType & WEB_EDGE_LEFT)
557 if (scrollDistanceX < 0)
559 __edgeType &= ~WEB_EDGE_RIGHT;
565 __edgeType &= ~WEB_EDGE_LEFT;
568 else if (__edgeType & WEB_EDGE_RIGHT)
570 if (scrollDistanceX > 0)
572 __edgeType &= ~WEB_EDGE_LEFT;
578 __edgeType &= ~WEB_EDGE_RIGHT;
582 else if (_Abs(scrollDistanceY) > _Abs(scrollDistanceX))
584 if (__edgeType & WEB_EDGE_TOP)
586 if (scrollDistanceY < 0)
588 __edgeType &= ~WEB_EDGE_BOTTOM;
594 __edgeType &= ~WEB_EDGE_TOP;
597 else if (__edgeType & WEB_EDGE_BOTTOM)
599 if (scrollDistanceY > 0)
601 __edgeType &= ~WEB_EDGE_TOP;
607 __edgeType &= ~WEB_EDGE_BOTTOM;
621 _Web::OnTouchReleased(const _Control& source, const _TouchInfo& touchInfo)
625 if (__pEflWebkit.get())
627 SendTouchEventForJavaScript(touchInfo);
629 return __pGestureHandler->OnTouchReleased(source, touchInfo);
637 _Web::OnTouchCanceled(const _Control& source, const _TouchInfo& touchInfo)
639 if (__pEflWebkit.get())
641 SendTouchEventForJavaScript(touchInfo);
643 return __pGestureHandler->OnTouchCanceled(source, touchInfo);
651 _Web::OnTouchPressHandled(const _Control& control)
657 _Web::OnTouchReleaseHandled(const _Control& control)
663 _Web::OnTouchMoveHandled(const _Control& control)
669 _Web::OnTouchCancelHandled(const _Control& control)
675 _Web::OnLongPressGestureDetected(_TouchLongPressGestureDetector& gesture)
677 if (__pEflWebkit.get() && __gestureType == WEB_GESTURE_TYPE_TAP)
679 return __pTapGestureHandler->OnLongPressGestureDetected(gesture);
687 _Web::OnLongPressGestureCanceled(_TouchLongPressGestureDetector& gesture)
694 _Web::OnTapGestureDetected(_TouchTapGestureDetector& gesture)
696 if (__pEflWebkit.get())
698 return __pTapGestureHandler->OnTapGestureDetected(gesture);
706 _Web::OnTapGestureCanceled(_TouchTapGestureDetector& gesture)
713 _Web::OnFlickGestureDetected(_TouchFlickGestureDetector& gesture)
715 if (__pEflWebkit.get() && _WebSettingImpl::GetInstance(__pWebSetting.get())->IsScrollEnabled())
717 return __pFlickGestureHandler->OnFlickGestureDetected(gesture);
725 _Web::OnFlickGestureCanceled(_TouchFlickGestureDetector& gesture)
732 _Web::OnPinchGestureStarted(Tizen::Ui::_TouchPinchGestureDetector& gesture)
734 if (__pEflWebkit.get())
736 return __pPinchGestureHandler->OnPinchGestureStarted(gesture);
744 _Web::OnPinchGestureChanged(Tizen::Ui::_TouchPinchGestureDetector& gesture)
746 if (__pEflWebkit.get() && __gestureType == WEB_GESTURE_TYPE_PINCH)
748 return __pPinchGestureHandler->OnPinchGestureChanged(gesture);
756 _Web::OnPinchGestureFinished(Tizen::Ui::_TouchPinchGestureDetector& gesture)
758 if (__pEflWebkit.get() && __gestureType == WEB_GESTURE_TYPE_PINCH)
760 return __pPinchGestureHandler->OnPinchGestureFinished(gesture);
768 _Web::OnPinchGestureCanceled(Tizen::Ui::_TouchPinchGestureDetector& gesture)
775 _Web::OnCanvasRequestedFN(const FloatRectangle& bounds)
777 result r = E_SUCCESS;
779 Evas_Object* pWebFrame = GetWebNativeNode();
781 BufferInfo bufferInfo;
783 Point absPoint(_CoordinateSystemUtils::ConvertToInteger(GetAbsoluteCoordinate(FloatPoint(bounds.x, bounds.y))));
784 Dimension absSize(_CoordinateSystemUtils::ConvertToInteger(_CoordinateSystemUtils::HorizontalTransform(bounds.width)),
785 _CoordinateSystemUtils::ConvertToInteger(_CoordinateSystemUtils::VerticalTransform(bounds.height)));
787 EINA_RECTANGLE_SET(&rect, absPoint.x, absPoint.y, absSize.width, absSize.height);
789 Evas_Object* pScreenShot = ewk_view_screenshot_contents_get(pWebFrame, rect, 1.0f, evas_object_evas_get(pWebFrame));
791 std::unique_ptr<Canvas> pCanvas(new (std::nothrow) Canvas());
792 SysTryReturn(NID_WEB_CTRL, pCanvas.get(), null, E_OUT_OF_MEMORY, "[%s] Memory Allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
796 r = _Utility::GetPixelBufferFromEvasObject(pScreenShot, bufferInfo);
797 evas_object_del(pScreenShot);
798 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, null, r, "[%s] propagating", GetErrorMessage(r));
800 r = pCanvas->Construct(bufferInfo);
801 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, null, r, "[%s] propagating", GetErrorMessage(r));
805 r = pCanvas->Construct(bounds);
806 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, null, r, "[%s] propagating", GetErrorMessage(r));
809 return pCanvas.release();
814 _Web::OnCapturedBitmapRequestedN(void)
816 result r = E_SUCCESS;
818 Evas_Object* pWebFrame = GetWebNativeNode();
821 BufferInfo bufferInfo;
823 Dimension size(GetSize());
824 Point absSize(GetAbsoluteCoordinate(Point(size.width, size.height)));
826 EINA_RECTANGLE_SET(&rect, 0, 0, absSize.x, absSize.y);
828 Evas_Object* pScreenShot = ewk_view_screenshot_contents_get(pWebFrame, rect, 1.0f, evas_object_evas_get(pWebFrame));
829 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));
831 r = _Utility::GetPixelBufferFromEvasObject(pScreenShot, bufferInfo);
832 evas_object_del(pScreenShot);
833 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, null, r, "[%s] propagating", GetErrorMessage(r));
835 int bufferSize = bufferInfo.bitsPerPixel * bufferInfo.width * bufferInfo.height;
836 r = buffer.Construct(reinterpret_cast < byte* >(bufferInfo.pPixels), 0, bufferSize, bufferSize);
837 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, null, r, "[%s] propagating", GetErrorMessage(r));
839 std::unique_ptr<Bitmap> pBitmap(new (std::nothrow) Bitmap());
840 SysTryReturn(NID_WEB_CTRL, pBitmap.get(), null, E_OUT_OF_MEMORY, "[%s] Memory Allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
842 r = pBitmap->Construct(buffer, Dimension(bufferInfo.width, bufferInfo.height), BITMAP_PIXEL_FORMAT_ARGB8888);
843 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, null, r, "[%s] propagating", GetErrorMessage(r));
845 return pBitmap.release();
850 _Web::DumpPointList(void* pData)
852 Eina_List* pList = reinterpret_cast< Eina_List* >(pData);
854 for(; pList; pList = eina_list_next(pList))
856 Ewk_Touch_Point* pPointDump = static_cast<Ewk_Touch_Point*>(eina_list_data_get(pList));
857 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);
863 _Web::SendTouchEventForJavaScript(const _TouchInfo& touchInfo)
865 result r = E_SUCCESS;
867 Eina_List* pPointList = null;
868 Ewk_Touch_Point* pPoint = null;
870 _TouchManager* pTouchManager = _TouchManager::GetInstance();
871 SysAssertf(pTouchManager, "Failed to get touch manager.");
873 std::unique_ptr<IListT<_FingerInfo*> > pTouchList(pTouchManager->GetMultiFingerInfoListN());
874 SysTryReturnVoidResult(NID_WEB_CTRL, pTouchList.get(), GetLastResult(), "[%s] Failed to get touch list.", GetErrorMessage(GetLastResult()));
876 std::unique_ptr<IBidirectionalEnumeratorT<_FingerInfo*> > pTouchListEnum(pTouchList->GetBidirectionalEnumeratorN());
877 SysAssertf(pTouchListEnum.get() != null, "Failed to get enumerator of touch list.");
879 FloatPoint currentPoint;
880 _FingerInfo* pFingerInfo = null;
881 while(pTouchListEnum->MoveNext() == E_SUCCESS)
883 r = pTouchListEnum->GetCurrent(pFingerInfo);
884 SysTryReturnVoidResult(NID_WEB_CTRL, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
886 _TouchStatus state = pFingerInfo->GetStatus();
887 if(state == _TOUCH_PRESSED || state == _TOUCH_MOVED || state == _TOUCH_RELEASED || state == _TOUCH_CANCELED)
889 currentPoint = GetAbsoluteCoordinate(pFingerInfo->GetPoint());
890 Point integerPoint(_CoordinateSystemUtils::ConvertToInteger(currentPoint));
892 pPoint = static_cast<Ewk_Touch_Point*>(calloc(1, sizeof(Ewk_Touch_Point)));
894 pPoint->id = pFingerInfo->GetPointId();
895 pPoint->x = integerPoint.x;
896 pPoint->y = integerPoint.y;
897 pPoint->state = GetEvasTouchState((TouchStatus)pFingerInfo->GetStatus());
899 pPointList = eina_list_append(pPointList, pPoint);
902 DumpPointList(pPointList);
904 Eina_Bool ret = ewk_view_feed_touch_event(__pEflWebkit->GetWebEvasObject(), GetEwkTouchEvent(touchInfo.GetTouchStatus()), pPointList, null);
905 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));
909 EINA_LIST_FREE(pPointList, pData)
915 _Web::GetEwkTouchEvent(_TouchStatus touchStatus)
917 Ewk_Touch_Event_Type ewkTouchEvent = EWK_TOUCH_CANCEL;
921 case _TOUCH_PRESSED :
922 ewkTouchEvent = EWK_TOUCH_START;
925 ewkTouchEvent = EWK_TOUCH_MOVE;
927 case _TOUCH_RELEASED :
928 ewkTouchEvent = EWK_TOUCH_END;
930 case _TOUCH_CANCELED :
933 ewkTouchEvent = EWK_TOUCH_CANCEL;
937 return ewkTouchEvent;
941 Evas_Touch_Point_State
942 _Web::GetEvasTouchState(TouchStatus touchStatus)
944 Evas_Touch_Point_State evasTouchState = EVAS_TOUCH_POINT_CANCEL;
949 evasTouchState = EVAS_TOUCH_POINT_DOWN;
952 evasTouchState = EVAS_TOUCH_POINT_MOVE;
954 case TOUCH_RELEASED :
955 evasTouchState = EVAS_TOUCH_POINT_UP;
957 case TOUCH_CANCELED :
960 evasTouchState = EVAS_TOUCH_POINT_CANCEL;
961 //todo : mapping EVAS_TOUCH_POINT_STILL, /**< Touch point is not moved af
965 return evasTouchState;
969 }}} // Tizen::Web::Controls