refactoring text selection module
[framework/osp/web.git] / src / controls / FWebCtrl_Web.cpp
1 //
2 // Open Service Platform
3 // Copyright (c) 2012 Samsung Electronics Co., Ltd.
4 //
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
8 //
9 //     http://www.apache.org/licenses/LICENSE-2.0
10 //
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.
16 //
17
18 /**
19  * @file                FWebCtrl_Web.cpp
20  * @brief               The file contains the definition of _Web class.
21  *
22  * The file contains the definition of _Web class.
23  */
24 #include <memory>
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 <FWebCtrlWebSetting.h>
35 #include <FGrp_CoordinateSystem.h>
36 #include <FUiAnim_EflNode.h>
37 #include <FUiAnim_VisualElement.h>
38 #include <FUi_CoordinateSystemUtils.h>
39 #include <FUi_AccessibilityContainer.h>
40 #include <FUi_AccessibilityElement.h>
41 #include <FUi_IAccessibilityFocusHandler.h>
42 #include <FUi_TouchManager.h>
43 #include "FWebCtrl_EflWebkit.h"
44 #include "FWebCtrl_GestureState.h"
45 #include "FWebCtrl_Web.h"
46 #include "FWebCtrl_WebImpl.h"
47 #include "FWebCtrl_WebSettingImpl.h"
48 #include "FWebCtrl_Utility.h"
49
50
51 using namespace Tizen::Base;
52 using namespace Tizen::Base::Collection;
53 using namespace Tizen::Graphics;
54 using namespace Tizen::Ui;
55 using namespace Tizen::Ui::Animations;
56
57
58 namespace
59 {
60 static int __animationAccessibilityCount = 0;
61 class _WebAccessibilityFocusHandler
62         :public Tizen::Ui::_IAccessibilityFocusHandler
63 {
64 public:
65         _WebAccessibilityFocusHandler(void)
66         {
67         }
68         virtual ~_WebAccessibilityFocusHandler(void)
69         {
70         }
71         virtual bool OnMoveFocus(Tizen::Ui::_AccessibilityFocusDirection direction)
72         {
73                 __animationAccessibilityCount++;
74                 if (direction == Tizen::Ui::_ACCESSIBILITY_FOCUS_DIRECTION_PREVIOUS)
75                 {
76                         if(__animationAccessibilityCount %3 == 0)
77                         {
78                                 SysLog(NID_WEB_CTRL, "_WebAccessibilityFocusHandler can move focus , :direction : PREVIOUS");
79                                 return false;
80                         }
81                         SysLog(NID_WEB_CTRL, "!!!_WebAccessibilityFocusHandler can NOT move focus , :direction : PREVIOUS");
82                         return true;
83                 }
84                 else if (direction == Tizen::Ui::_ACCESSIBILITY_FOCUS_DIRECTION_NEXT)
85                 {
86                         if(__animationAccessibilityCount %3 == 0)
87                         {
88                                 SysLog(NID_WEB_CTRL, "_WebAccessibilityFocusHandler can move focus , :direction : NEXT");
89                                 return false;
90                         }
91                         SysLog(NID_WEB_CTRL, "!!!_WebAccessibilityFocusHandler can NOT move focus , :direction : NEXT");
92                         return true;
93                 }
94                 return true;
95         }
96         virtual bool OnMoveFocus(const Tizen::Graphics::Point& point)
97         {
98                 if(__animationAccessibilityCount %2 == 0)
99                 {
100                         SysLog(NID_WEB_CTRL, "_WebAccessibilityFocusHandler can read element at the point (%d,%d)", point.x, point.y);
101                         return true;
102                 }
103                 else
104                 {
105                         SysLog(NID_WEB_CTRL, "_WebAccessibilityFocusHandler can NOT read element at the point (%d,%d)", point.x, point.y);
106                         return false;
107                 }
108
109         }
110 };
111 }
112
113
114 namespace Tizen { namespace Web { namespace Controls
115 {
116
117
118 static const char WEB_CTRL[] = "webcontrol";
119
120
121 _Web::_Web(void)
122         : __gestureType(WEB_GESTURE_TYPE_TAP)
123         , __pGestureHandler(null)
124         , __pEflWebkit(null)
125         , __pWebSetting(null)
126         , __pGestureFlick(null)
127         , __pGestureLongPress(null)
128         , __pGesturePinch(null)
129         , __pGestureDoubleTap(null)
130         , __pTouchEventInfoList(null)
131         , __pTapGestureHandler(null)
132         , __pPanningGestureHandler(null)
133         , __pFlickGestureHandler(null)
134         , __pPinchGestureHandler(null)
135 {
136         SetBackgroundColor(Color(0, 0, 0, 0));
137 }
138
139
140 _Web::~_Web(void)
141 {
142         RemoveGestureListener();
143 }
144
145
146 _Web*
147 _Web::CreateWebN(void)
148 {
149         result r = E_SUCCESS;
150
151         std::unique_ptr<_Web> pWeb(new (std::nothrow) _Web());
152         SysTryReturn(NID_WEB_CTRL, pWeb.get(), null, E_OUT_OF_MEMORY, "[%s] Memory Allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
153
154         pWeb->__pWebSetting = std::unique_ptr<WebSetting>(new (std::nothrow) WebSetting());
155         SysTryReturn(NID_WEB_CTRL, pWeb->__pWebSetting.get(), null, E_OUT_OF_MEMORY, "[%s] Memory allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
156
157         pWeb->AcquireHandle();
158         pWeb->SetMultiTouchEnabled(true);
159         pWeb->SetTouchPressThreshold(0.08);
160
161         r = pWeb->AddGestureListeners();
162         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, null, r, "[%s] Propagating.", GetErrorMessage(r));
163
164         r = pWeb->InitializeGestureStates();
165         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, null, r, "[%s] Propagating.", GetErrorMessage(r));
166
167         return pWeb.release();
168 }
169
170
171 result
172 _Web::CreateWebkitEvasObject(void)
173 {
174         result r = E_SUCCESS;
175
176         std::unique_ptr<_EflWebkit> pEflWebkit(new (std::nothrow) _EflWebkit());
177         SysTryReturnResult(NID_WEB_CTRL, pEflWebkit.get(), E_OUT_OF_MEMORY, "[%s] Memory Allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
178
179         r = pEflWebkit->Construct(GetAbsoluteBounds(), *GetVisualElement());
180         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
181
182         __pEflWebkit = std::move(pEflWebkit);
183
184         return E_SUCCESS;
185 }
186
187
188 result
189 _Web::InitializeGestureStates(void)
190 {
191         __pPinchGestureHandler = std::unique_ptr<_PinchGestureState>(new (std::nothrow) _PinchGestureState(this));
192         SysTryReturnResult(NID_WEB_CTRL, __pPinchGestureHandler.get(), E_OUT_OF_MEMORY, "[%s] Memory Allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
193
194         __pTapGestureHandler = std::unique_ptr<_TapGestureState>(new (std::nothrow) _TapGestureState(this));
195         SysTryReturnResult(NID_WEB_CTRL, __pTapGestureHandler.get(), E_OUT_OF_MEMORY, "[%s] Memory Allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
196
197         __pPanningGestureHandler = std::unique_ptr<_PanningGestureState>(new (std::nothrow) _PanningGestureState(this));
198         SysTryReturnResult(NID_WEB_CTRL, __pPanningGestureHandler.get(), E_OUT_OF_MEMORY, "[%s] Memory Allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
199
200         __pFlickGestureHandler = std::unique_ptr<_FlickGestureState>(new (std::nothrow) _FlickGestureState(this));
201         SysTryReturnResult(NID_WEB_CTRL, __pFlickGestureHandler.get(), E_OUT_OF_MEMORY, "[%s] Memory Allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
202
203         __pGestureHandler = __pTapGestureHandler.get();
204
205         return E_SUCCESS;
206 }
207
208
209 result
210 _Web::AddGestureListeners(void)
211 {
212         result r = E_SUCCESS;
213
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));
216
217         r = pGestureFlick->AddGestureListener(*this);
218         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
219
220         r = AddGestureDetector(*pGestureFlick.get());
221         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
222
223         __pGestureFlick = std::move(pGestureFlick);
224
225         std::unique_ptr<_TouchLongPressGestureDetector> pGestureLongPress(new (std::nothrow) _TouchLongPressGestureDetector());
226         SysTryReturnResult(NID_WEB_CTRL, pGestureLongPress.get(), E_OUT_OF_MEMORY, "[%s] Memory Allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
227
228         r = pGestureLongPress->AddGestureListener(*this);
229         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
230
231         r = AddGestureDetector(*pGestureLongPress.get());
232         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
233
234         __pGestureLongPress = std::move(pGestureLongPress);
235
236         std::unique_ptr<_TouchTapGestureDetector> pGestureDoubleTap(new (std::nothrow) _TouchTapGestureDetector());
237         SysTryReturnResult(NID_WEB_CTRL, pGestureDoubleTap.get(), E_OUT_OF_MEMORY, "[%s] Memory Allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
238
239         r = pGestureDoubleTap->AddGestureListener(*this);
240         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
241
242         r = AddGestureDetector(*pGestureDoubleTap.get());
243         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
244
245         __pGestureDoubleTap = std::move(pGestureDoubleTap);
246
247         std::unique_ptr<_TouchPinchGestureDetector> pGesturePinch(new (std::nothrow) _TouchPinchGestureDetector());
248         SysTryReturnResult(NID_WEB_CTRL, pGesturePinch.get(), E_OUT_OF_MEMORY, "[%s] Memory Allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
249
250         r = pGesturePinch->AddGestureListener(*this);
251         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
252
253         r = AddGestureDetector(*pGesturePinch.get());
254         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
255
256         __pGesturePinch = std::move(pGesturePinch);
257
258         return E_SUCCESS;
259 }
260
261
262 void
263 _Web::RemoveGestureListener(void)
264 {
265         if (__pGestureFlick.get())
266         {
267                 __pGestureFlick->RemoveGestureListener(*this);
268                 RemoveGestureDetector(*__pGestureFlick);
269         }
270
271         if (__pGestureLongPress.get())
272         {
273                 __pGestureLongPress->RemoveGestureListener(*this);
274                 RemoveGestureDetector(*__pGestureLongPress);
275         }
276
277         if (__pGestureDoubleTap.get())
278         {
279                 __pGestureDoubleTap->RemoveGestureListener(*this);
280                 RemoveGestureDetector(*__pGestureDoubleTap);
281         }
282
283         if (__pGesturePinch.get())
284         {
285                 __pGesturePinch->RemoveGestureListener(*this);
286                 RemoveGestureDetector(*__pGesturePinch);
287         }
288 }
289
290
291 result
292 _Web::InitializeWebNativeNode(void)
293 {
294         result r = E_SUCCESS;
295
296         r = CreateWebkitEvasObject();
297         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
298
299         SetNativeObjectFocusable(false);
300
301         _AccessibilityContainer* pContainer = GetAccessibilityContainer();
302         if (pContainer)
303         {
304                 pContainer->Activate(true);
305         }
306
307         _WebAccessibilityFocusHandler* pFocusHandler = new (std::nothrow) _WebAccessibilityFocusHandler();
308
309         pContainer->SetFocusHandler(dynamic_cast<_IAccessibilityFocusHandler*>(pFocusHandler));
310
311         return E_SUCCESS;
312 }
313
314
315 Point
316 _Web::GetAbsoluteCoordinate(Point relativePoint)
317 {
318         return _CoordinateSystemUtils::Transform(ConvertToScreenPosition(relativePoint));
319 }
320
321
322 FloatPoint
323 _Web::GetAbsoluteCoordinate(FloatPoint relativePoint)
324 {
325         return _CoordinateSystemUtils::Transform(ConvertToScreenPosition(relativePoint));
326 }
327
328
329 Point
330 _Web::GetRelativeCoordinate(Point absolutePoint)
331 {
332         return _CoordinateSystemUtils::InverseTransform(ConvertToControlPosition(absolutePoint));
333 }
334
335
336 FloatPoint
337 _Web::GetRelativeCoordinate(FloatPoint absolutePoint)
338 {
339         return _CoordinateSystemUtils::InverseTransform(ConvertToControlPosition(absolutePoint));
340 }
341
342
343 Evas_Object*
344 _Web::GetWebNativeNode(void)
345 {
346         SysTryReturn(NID_WEB_CTRL, __pEflWebkit.get(), null, E_INVALID_STATE, "[%s] Native node is in an invalid state.", GetErrorMessage(E_INVALID_STATE));
347
348         return __pEflWebkit->GetWebEvasObject();
349 }
350
351
352 WebSetting*
353 _Web::GetSetting(void) const
354 {
355         return __pWebSetting.get();
356 }
357
358
359 result
360 _Web::OnAttaching(const _Control* pParent)
361 {
362         if (__pEflWebkit.get())
363         {
364                 evas_object_show(__pEflWebkit->GetWebEvasObject());
365                 evas_object_focus_set(__pEflWebkit->GetWebEvasObject(), EINA_TRUE);
366         }
367
368         return E_SUCCESS;
369 }
370
371
372 result
373 _Web::OnBoundsChanging(const Rectangle& bounds)
374 {
375         Rectangle absoluteBounds = GetAbsoluteBounds();
376         Rectangle webBounds = GetBounds();
377         _ICoordinateSystemTransformer* pXformer = _CoordinateSystem::GetInstance()->GetTransformer();
378         SysTryReturnResult(NID_WEB_CTRL, pXformer, E_SYSTEM, "[%s] A system error has been occurred. Failed to get coordinate transformer.", GetErrorMessage(E_SYSTEM));
379
380         if (__pEflWebkit.get())
381         {
382                 evas_object_move(__pEflWebkit->GetWebEvasObject(), pXformer->TransformHorizontal(absoluteBounds.x - webBounds.x + bounds.x), pXformer->TransformVertical(absoluteBounds.y - webBounds.y + bounds.y));
383                 evas_object_resize(__pEflWebkit->GetWebEvasObject(), pXformer->TransformHorizontal(bounds.width), pXformer->TransformVertical(bounds.height));
384         }
385
386         return E_SUCCESS;
387 }
388
389
390 void
391 _Web::ChangeGesture(_WebGestureType type)
392 {
393         switch (type)
394         {
395         case WEB_GESTURE_TYPE_TAP:
396                 __pGestureHandler = __pTapGestureHandler.get();
397                 __gestureType = WEB_GESTURE_TYPE_TAP;
398                 break;
399
400         case WEB_GESTURE_TYPE_PANNING:
401                 __pGestureHandler = __pPanningGestureHandler.get();
402                 __gestureType = WEB_GESTURE_TYPE_PANNING;
403                 break;
404
405         case WEB_GESTURE_TYPE_FLICK:
406                 __pGestureHandler = __pFlickGestureHandler.get();
407                 __gestureType = WEB_GESTURE_TYPE_FLICK;
408                 break;
409
410         case WEB_GESTURE_TYPE_PINCH:
411                 __pGestureHandler = __pPinchGestureHandler.get();
412                 __gestureType = WEB_GESTURE_TYPE_PINCH;
413                 break;
414
415         default:
416                 SysAssert(false);
417         }
418 }
419
420
421 bool
422 _Web::OnTouchPressed(const _Control& source, const _TouchInfo& touchInfo)
423 {
424         if (__pEflWebkit.get())
425         {
426                 SendTouchEventForJavaScript(touchInfo);
427
428                 return __pGestureHandler->OnTouchPressed(source, touchInfo);
429         }
430
431         return true;
432 }
433
434
435 bool
436 _Web::OnTouchMoved(const _Control& source, const _TouchInfo& touchInfo)
437 {
438         if (__pEflWebkit.get() && _WebSettingImpl::GetInstance(__pWebSetting.get())->IsScrollEnabled())
439         {
440                 SendTouchEventForJavaScript(touchInfo);
441
442                 return __pGestureHandler->OnTouchMoved(source, touchInfo);
443         }
444
445         return true;
446 }
447
448
449 bool
450 _Web::OnTouchReleased(const _Control& source, const _TouchInfo& touchInfo)
451 {
452         if (__pEflWebkit.get())
453         {
454                 SendTouchEventForJavaScript(touchInfo);
455
456                 return __pGestureHandler->OnTouchReleased(source, touchInfo);
457         }
458
459         SetFocused();
460
461         return true;
462 }
463
464
465 bool
466 _Web::OnTouchCanceled(const _Control& source, const _TouchInfo& touchInfo)
467 {
468         if (__pEflWebkit.get())
469         {
470                 SendTouchEventForJavaScript(touchInfo);
471
472                 __pGestureHandler->OnTouchCanceled(source, touchInfo);
473         }
474
475         return true;
476 }
477
478
479 void
480 _Web::OnTouchPressHandled(const _Control& control)
481 {
482 }
483
484
485 void
486 _Web::OnTouchReleaseHandled(const _Control& control)
487 {
488 }
489
490
491 void
492 _Web::OnTouchMoveHandled(const _Control& control)
493 {
494 }
495
496
497 void
498 _Web::OnTouchCancelHandled(const _Control& control)
499 {
500 }
501
502
503 bool
504 _Web::OnLongPressGestureDetected(_TouchLongPressGestureDetector& gesture)
505 {
506         if (__pEflWebkit.get() && __gestureType == WEB_GESTURE_TYPE_TAP)
507         {
508                 return __pTapGestureHandler->OnLongPressGestureDetected(gesture);
509         }
510
511         return true;
512 }
513
514
515 bool
516 _Web::OnLongPressGestureCanceled(_TouchLongPressGestureDetector& gesture)
517 {
518         return true;
519 }
520
521
522 bool
523 _Web::OnTapGestureDetected(_TouchTapGestureDetector& gesture)
524 {
525         if (__pEflWebkit.get())
526         {
527                 return __pTapGestureHandler->OnTapGestureDetected(gesture);
528         }
529
530         return true;
531 }
532
533
534 bool
535 _Web::OnTapGestureCanceled(_TouchTapGestureDetector& gesture)
536 {
537         return true;
538 }
539
540
541 bool
542 _Web::OnFlickGestureDetected(_TouchFlickGestureDetector& gesture)
543 {
544         if (__pEflWebkit.get() && _WebSettingImpl::GetInstance(__pWebSetting.get())->IsScrollEnabled())
545         {
546                 return __pFlickGestureHandler->OnFlickGestureDetected(gesture);
547         }
548
549         return true;
550 }
551
552
553 bool
554 _Web::OnFlickGestureCanceled(_TouchFlickGestureDetector& gesture)
555 {
556         return true;
557 }
558
559
560 bool
561 _Web::OnPinchGestureStarted(Tizen::Ui::_TouchPinchGestureDetector& gesture)
562 {
563         if (__pEflWebkit.get())
564         {
565                 return __pPinchGestureHandler->OnPinchGestureStarted(gesture);
566         }
567
568         return true;
569 }
570
571
572 bool
573 _Web::OnPinchGestureChanged(Tizen::Ui::_TouchPinchGestureDetector& gesture)
574 {
575         if (__pEflWebkit.get() && __gestureType == WEB_GESTURE_TYPE_PINCH)
576         {
577                 return __pPinchGestureHandler->OnPinchGestureChanged(gesture);
578         }
579
580         return true;
581 }
582
583
584 bool
585 _Web::OnPinchGestureFinished(Tizen::Ui::_TouchPinchGestureDetector& gesture)
586 {
587         if (__pEflWebkit.get() && __gestureType == WEB_GESTURE_TYPE_PINCH)
588         {
589                 return __pPinchGestureHandler->OnPinchGestureFinished(gesture);
590         }
591
592         return true;
593 }
594
595
596 bool
597 _Web::OnPinchGestureCanceled(Tizen::Ui::_TouchPinchGestureDetector& gesture)
598 {
599         return true;
600 }
601
602
603 Canvas*
604 _Web::OnCanvasRequestedFN(const FloatRectangle& bounds)
605 {
606         result r = E_SUCCESS;
607
608         Evas_Object* pWebFrame = GetWebNativeNode();
609         Eina_Rectangle rect;
610         BufferInfo bufferInfo;
611
612         Point absPoint(_CoordinateSystemUtils::ConvertToInteger(GetAbsoluteCoordinate(FloatPoint(bounds.x, bounds.y))));
613         Dimension absSize(_CoordinateSystemUtils::ConvertToInteger(_CoordinateSystemUtils::HorizontalTransform(bounds.width)),
614                 _CoordinateSystemUtils::ConvertToInteger(_CoordinateSystemUtils::VerticalTransform(bounds.height)));
615
616         EINA_RECTANGLE_SET(&rect, absPoint.x, absPoint.y, absSize.width, absSize.height);
617
618         Evas_Object* pScreenShot = ewk_view_screenshot_contents_get(pWebFrame, rect, 1.0f, evas_object_evas_get(pWebFrame));
619         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));
620
621         r = _Utility::GetPixelBufferFromEvasObject(pScreenShot, bufferInfo);
622         evas_object_del(pScreenShot);
623         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, null, r, "[%s] propagating", GetErrorMessage(r));
624
625         std::unique_ptr<Canvas> pCanvas(new (std::nothrow) Canvas());
626         SysTryReturn(NID_WEB_CTRL, pCanvas.get(), null, E_OUT_OF_MEMORY, "[%s] Memory Allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
627
628         r = pCanvas->Construct(bufferInfo);
629         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, null, r, "[%s] propagating", GetErrorMessage(r));
630
631         return pCanvas.release();
632 }
633
634
635 Bitmap*
636 _Web::OnCapturedBitmapRequestedN(void)
637 {
638         result r = E_SUCCESS;
639
640         Evas_Object* pWebFrame = GetWebNativeNode();
641         Eina_Rectangle rect;
642         ByteBuffer buffer;
643         BufferInfo bufferInfo;
644
645         Dimension size(GetSize());
646         Point absSize(GetAbsoluteCoordinate(Point(size.width, size.height)));
647
648         EINA_RECTANGLE_SET(&rect, 0, 0, absSize.x, absSize.y);
649
650         Evas_Object* pScreenShot = ewk_view_screenshot_contents_get(pWebFrame, rect, 1.0f, evas_object_evas_get(pWebFrame));
651         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));
652
653         r = _Utility::GetPixelBufferFromEvasObject(pScreenShot, bufferInfo);
654         evas_object_del(pScreenShot);
655         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, null, r, "[%s] propagating", GetErrorMessage(r));
656
657         int bufferSize = bufferInfo.bitsPerPixel * bufferInfo.width * bufferInfo.height;
658         r = buffer.Construct(reinterpret_cast < byte* >(bufferInfo.pPixels), 0, bufferSize, bufferSize);
659         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, null, r, "[%s] propagating", GetErrorMessage(r));
660
661         std::unique_ptr<Bitmap> pBitmap(new (std::nothrow) Bitmap());
662         SysTryReturn(NID_WEB_CTRL, pBitmap.get(), null, E_OUT_OF_MEMORY, "[%s] Memory Allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
663
664         r = pBitmap->Construct(buffer, Dimension(bufferInfo.width, bufferInfo.height), BITMAP_PIXEL_FORMAT_ARGB8888);
665         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, null, r, "[%s] propagating", GetErrorMessage(r));
666
667         return pBitmap.release();
668 }
669
670
671 void
672 _Web::DumpPointList(void* pData)
673 {
674         Eina_List* pList = reinterpret_cast< Eina_List* >(pData);
675         
676         for(; pList; pList = eina_list_next(pList))
677         {
678                 Ewk_Touch_Point* pPointDump = static_cast<Ewk_Touch_Point*>(eina_list_data_get(pList));
679                 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);
680         }
681 }
682
683
684 void
685 _Web::SendTouchEventForJavaScript(const _TouchInfo& touchInfo)
686 {
687         result r = E_SUCCESS;
688
689         Eina_List* pPointList = null;
690         Ewk_Touch_Point* pPoint = null;
691         
692         _TouchManager* pTouchManager = _TouchManager::GetInstance();
693         SysAssertf(pTouchManager, "Failed to get touch manager.");
694
695         std::unique_ptr<IListT<_FingerInfo*> > pTouchList(pTouchManager->GetMultiFingerInfoListN());
696         SysTryReturnVoidResult(NID_WEB_CTRL, pTouchList.get(), GetLastResult(), "[%s] Failed to get touch list.", GetErrorMessage(GetLastResult()));
697
698         std::unique_ptr<IBidirectionalEnumeratorT<_FingerInfo*> > pTouchListEnum(pTouchList->GetBidirectionalEnumeratorN());
699         SysAssertf(pTouchListEnum.get() != null, "Failed to get enumerator of touch list.");
700
701         FloatPoint currentPoint;
702         _FingerInfo* pFingerInfo = null;
703         while(pTouchListEnum->MoveNext() == E_SUCCESS)
704         {       
705                 r = pTouchListEnum->GetCurrent(pFingerInfo);
706                 SysTryReturnVoidResult(NID_WEB_CTRL, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));               
707                 
708                 _TouchStatus state = pFingerInfo->GetStatus();
709                 if(state == _TOUCH_PRESSED || state == _TOUCH_MOVED || state == _TOUCH_RELEASED || state == _TOUCH_CANCELED)
710                 {
711                         currentPoint = GetAbsoluteCoordinate(pFingerInfo->GetPoint());
712                         Point integerPoint(_CoordinateSystemUtils::ConvertToInteger(currentPoint));
713
714                         pPoint = static_cast<Ewk_Touch_Point*>(calloc(1, sizeof(Ewk_Touch_Point)));
715                 
716                         pPoint->id = pFingerInfo->GetPointId();                 
717                         pPoint->x = integerPoint.x;
718                         pPoint->y = integerPoint.y;
719                         pPoint->state = GetEvasTouchState((TouchStatus)pFingerInfo->GetStatus());
720
721                         pPointList = eina_list_append(pPointList, pPoint);      
722                 }
723         }
724         DumpPointList(pPointList);
725
726         Eina_Bool ret = ewk_view_feed_touch_event(__pEflWebkit->GetWebEvasObject(), GetEwkTouchEvent(touchInfo.GetTouchStatus()), pPointList, null);
727         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));
728
729         void* pData = null;
730
731         EINA_LIST_FREE(pPointList, pData)
732         free(pData);
733 }
734
735
736 Ewk_Touch_Event_Type
737 _Web::GetEwkTouchEvent(_TouchStatus touchStatus)
738 {
739         Ewk_Touch_Event_Type ewkTouchEvent = EWK_TOUCH_CANCEL;
740
741         switch (touchStatus)
742         {
743         case _TOUCH_PRESSED :
744                 ewkTouchEvent = EWK_TOUCH_START;
745                 break;
746         case _TOUCH_MOVED :
747                 ewkTouchEvent = EWK_TOUCH_MOVE;
748                 break;
749         case _TOUCH_RELEASED :
750                 ewkTouchEvent = EWK_TOUCH_END;
751                 break;
752         case _TOUCH_CANCELED :
753                 //fall through
754         default :
755                 ewkTouchEvent = EWK_TOUCH_CANCEL;
756                 break;
757         }
758
759         return ewkTouchEvent;
760 }
761
762
763 Evas_Touch_Point_State
764 _Web::GetEvasTouchState(TouchStatus touchStatus)
765 {
766         Evas_Touch_Point_State evasTouchState = EVAS_TOUCH_POINT_CANCEL;
767
768         switch (touchStatus)
769         {
770         case TOUCH_PRESSED :
771                 evasTouchState = EVAS_TOUCH_POINT_DOWN;
772                 break;
773         case TOUCH_MOVED :
774                 evasTouchState = EVAS_TOUCH_POINT_MOVE;
775                 break;
776         case TOUCH_RELEASED :
777                 evasTouchState = EVAS_TOUCH_POINT_UP;
778                 break;
779         case TOUCH_CANCELED :
780                 //fall through
781         default :
782                 evasTouchState = EVAS_TOUCH_POINT_CANCEL;
783                 //todo : mapping    EVAS_TOUCH_POINT_STILL, /**< Touch point is not moved af
784                 break;
785         }
786
787         return evasTouchState;
788 }
789
790
791 }}} // Tizen::Web::Controls