a46d890431e66f3dec7067cd00e857706681fb00
[framework/web/webkit-efl.git] / Source / WebKit2 / UIProcess / API / efl / EwkViewImpl.cpp
1 /*
2    Copyright (C) 2011 Samsung Electronics
3    Copyright (C) 2012 Intel Corporation. All rights reserved.
4
5     This library is free software; you can redistribute it and/or
6     modify it under the terms of the GNU Library General Public
7     License as published by the Free Software Foundation; either
8     version 2 of the License, or (at your option) any later version.
9
10     This library is distributed in the hope that it will be useful,
11     but WITHOUT ANY WARRANTY; without even the implied warranty of
12     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13     Library General Public License for more details.
14
15     You should have received a copy of the GNU Library General Public License
16     along with this library; see the file COPYING.LIB.  If not, write to
17     the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18     Boston, MA 02110-1301, USA.
19 */
20
21 #include "config.h"
22 #include "EwkViewImpl.h"
23
24 #include "EflScreenUtilities.h"
25 #include "FindClientEfl.h"
26 #include "FormClientEfl.h"
27 #include "InputMethodContextEfl.h"
28 #include "PageClientImpl.h"
29 #include "PageLoadClientEfl.h"
30 #include "PagePolicyClientEfl.h"
31 #include "PageUIClientEfl.h"
32 #if ENABLE(WAIT_UPVERSION)
33 #include "PageViewportController.h"
34 #include "PageViewportControllerClientEfl.h"
35 #endif
36 #include "ResourceLoadClientEfl.h"
37 #include "WKColorPickerResultListener.h"
38 #include "WKString.h"
39 #include "WebPageProxy.h"
40 #include "WebPopupMenuProxyEfl.h"
41 #include "ewk_back_forward_list_private.h"
42 #include "ewk_context_private.h"
43 #include "ewk_favicon_database_private.h"
44 #include "ewk_popup_menu_item_private.h"
45 #include "ewk_private.h"
46 #include "ewk_settings_private.h"
47 #include "ewk_view.h"
48 #include "ewk_view_private.h"
49 #include <Ecore_Evas.h>
50 #include <Edje.h>
51 #include <WebCore/Cursor.h>
52
53 #if OS(TIZEN)
54 #if ENABLE(TIZEN_GEOLOCATION)
55 #include "ewk_geolocation_private.h"
56 #endif
57 #if ENABLE(TIZEN_MEDIA_STREAM)
58 #include "ewk_user_media_private.h"
59 #endif
60 #if ENABLE(TIZEN_NOTIFICATIONS)
61 #include "ewk_notification_private.h"
62 #endif
63 #if ENABLE(TIZEN_WEBKIT2_CREATE_VIEW_WITH_CREATED_PAGE_GROUP_WITH_IDENTIFIER)
64 #include "WebPageGroup.h"
65 #endif
66 #if ENABLE(TIZEN_SUPPORT_WEBAPP_META_TAG)
67 #include "ewk_web_application_icon_data_private.h"
68 #endif
69 #endif
70
71 using namespace WebCore;
72 using namespace WebKit;
73
74 static const int defaultCursorSize = 16;
75
76 EwkViewImpl::PageViewMap EwkViewImpl::pageViewMap;
77
78 void EwkViewImpl::addToPageViewMap(const Evas_Object* ewkView)
79 {
80     EwkViewImpl* viewImpl = EwkViewImpl::fromEvasObject(ewkView);
81
82     PageViewMap::AddResult result = pageViewMap.add(viewImpl->wkPage(), ewkView);
83     ASSERT_UNUSED(result, result.isNewEntry);
84 }
85
86 void EwkViewImpl::removeFromPageViewMap(const Evas_Object* ewkView)
87 {
88     EwkViewImpl* viewImpl = EwkViewImpl::fromEvasObject(ewkView);
89
90     ASSERT(pageViewMap.contains(viewImpl->wkPage()));
91     pageViewMap.remove(viewImpl->wkPage());
92 }
93
94 const Evas_Object* EwkViewImpl::viewFromPageViewMap(const WKPageRef page)
95 {
96     ASSERT(page);
97
98     return pageViewMap.get(page);
99 }
100
101 #if ENABLE(TIZEN_WEBKIT2_CREATE_VIEW_WITH_CREATED_PAGE_GROUP_WITH_IDENTIFIER)
102 static uint64_t generatePageGroupIdentifierID()
103 {
104     static uint64_t uniquePageGroupIdentifierID = 1;
105     return uniquePageGroupIdentifierID++;
106 }
107 #endif
108
109 EwkViewImpl::EwkViewImpl(Evas_Object* view)
110     : popupMenuProxy(0)
111     , popupMenuItems(0)
112 #if USE(ACCELERATED_COMPOSITING)
113     , evasGl(0)
114     , evasGlContext(0)
115     , evasGlSurface(0)
116 #endif
117 #if OS(TIZEN)
118 #if ENABLE(TIZEN_ORIENTATION_EVENTS)
119     , orientation(0)
120 #endif
121     , javascriptGlobalContext(0)
122 #if ENABLE(TIZEN_SUPPORT_WEBAPP_META_TAG)
123     , webAppIconURLs(0)
124 #endif
125     , isWaitingForJavaScriptPopupReply(false)
126     , authChallenge(0)
127     , policyDecision(0)
128     , openPanelListener(0)
129 #if ENABLE(TIZEN_CERTIFICATE_HANDLING)
130     , certificatePolicyDecision(0)
131 #endif
132 #if ENABLE(TIZEN_MEDIA_STREAM)
133     , userMediaPermissionRequests(0)
134 #endif
135 #if ENABLE(TIZEN_GEOLOCATION)
136     , geolocation(0)
137     , geolocationPermissionRequests(0)
138 #endif
139     , suspendRequested(false)
140     , suspendedPainting(false)
141     , suspendedResources(false)
142 #if ENABLE(TIZEN_NOTIFICATIONS)
143     , notifications(0)
144     , notificationPermissionRequests(0)
145 #endif
146 #if ENABLE(TIZEN_SQL_DATABASE)
147     , exceededDatabaseQuota(0)
148 #endif
149 #if ENABLE(TIZEN_WEBKIT2_POPUP_INTERNAL)
150     , popupPicker(0)
151 #endif
152     , isVerticalEdge(false)
153     , isHorizontalEdge(false)
154 #if ENABLE(TIZEN_GESTURE)
155 #if ENABLE(TOUCH_EVENTS)
156     , exceedTouchMoveThreshold(false)
157     , wasHandledTouchStart(false)
158     , wasHandledTouchMove(false)
159 #endif
160     , holdHorizontalPanning(false)
161     , holdVerticalPanning(false)
162 #endif // #if ENABLE(TIZEN_GESTURE)
163 #if ENABLE(TIZEN_RUNTIME_BACKEND_SELECTION)
164     , compositionAnimator(0)
165 #endif
166 #if ENABLE(TIZEN_DATALIST_ELEMENT)
167     , dataList(0)
168 #endif
169 #if ENABLE(TIZEN_APPLICATION_CACHE)
170     , applicationCachePermissionOrigin(0)
171     , isWaitingForApplicationCachePermission(false)
172 #endif
173     , exceededQuotaOrigin(0)
174     , isWaitingForExceededQuotaPopupReply(false)
175 #endif // #if OS(TIZEN)
176     , m_view(view)
177     , m_settings(Ewk_Settings::create(this))
178     , m_mouseEventsEnabled(false)
179 #if ENABLE(TOUCH_EVENTS)
180     , m_touchEventsEnabled(false)
181 #endif
182     , m_displayTimer(this, &EwkViewImpl::displayTimerFired)
183     , m_inputMethodContext(InputMethodContextEfl::create(this, smartData()->base.evas))
184 #if OS(TIZEN)
185 #if USE(TILED_BACKING_STORE)
186     , m_scaleFactor(1)
187 #endif
188 #endif // #if OS(TIZEN)
189 {
190     ASSERT(view);
191
192     // Enable mouse events by default
193     setMouseEventsEnabled(true);
194
195 #if OS(TIZEN)
196     javascriptPopup = adoptPtr<JavaScriptPopup>(new JavaScriptPopup(m_view));
197     openPanel = adoptPtr<OpenPanel>(new OpenPanel(m_view));
198
199 #if ENABLE(TIZEN_INPUT_TAG_EXTENSION)
200     inputPicker = adoptPtr<InputPicker>(new InputPicker(m_view));
201 #endif
202
203 #if ENABLE(TIZEN_GESTURE)
204 #if ENABLE(TOUCH_EVENTS)
205     touchDownPoint.x = 0;
206     touchDownPoint.y = 0;
207 #endif
208 #endif
209
210 #if ENABLE(TIZEN_GESTURE)
211     gestureRecognizer = GestureRecognizer::create(m_view);
212     gestureClient = GestureClient::create(this);
213 #endif
214
215 #if ENABLE(TIZEN_WEBKIT2_TILED_SCROLLBAR)
216     const char* hideScrollbar = getenv("TIZEN_WEBKIT2_TILED_SCROLLBAR_HIDE");
217     if (hideScrollbar && atoi(hideScrollbar) == 1)
218         mainFrameScrollbarVisibility = false;
219     else
220         mainFrameScrollbarVisibility = true;
221 #endif
222
223 #if ENABLE(TIZEN_SCREEN_ORIENTATION_SUPPORT_INTERNAL)
224     orientationLock.callback = 0;
225     orientationLock.data = 0;
226 #endif
227
228 #if ENABLE(TIZEN_WEBKIT2_CREATE_VIEW_WITH_CREATED_PAGE_GROUP_WITH_IDENTIFIER)
229     String pageGroupIdentifierID = String::number(generatePageGroupIdentifierID());
230     String pageGroupIdentifier = String::format("PageGroup%s", pageGroupIdentifierID.utf8().data());
231
232     WKRetainPtr<WKStringRef> pageGroupIdentifierRef(AdoptWK, WKStringCreateWithUTF8CString(pageGroupIdentifier.utf8().data()));
233     pageGroup = WebPageGroup::create(toWTFString(pageGroupIdentifierRef.get()));
234 #endif
235 #endif // #if OS(TIZEN)
236 }
237
238 EwkViewImpl::~EwkViewImpl()
239 {
240     void* item;
241     EINA_LIST_FREE(popupMenuItems, item)
242         delete static_cast<Ewk_Popup_Menu_Item*>(item);
243
244 #if OS(TIZEN)
245     if (javascriptGlobalContext)
246         JSGlobalContextRelease(javascriptGlobalContext);
247
248 #if ENABLE(TIZEN_SUPPORT_WEBAPP_META_TAG)
249     if (webAppIconURLs) {
250         void* data = 0;
251         EINA_LIST_FREE(webAppIconURLs, data)
252             ewkWebAppIconDataDelete(static_cast<Ewk_Web_App_Icon_Data*>(data));
253     }
254 #endif
255
256     if (authChallenge)
257         ewkAuthChallengeDelete(authChallenge);
258     if (policyDecision)
259         ewkPolicyDecisionDelete(policyDecision);
260
261 #if ENABLE(TIZEN_CERTIFICATE_HANDLING)
262     if (certificatePolicyDecision)
263         ewkCertificatePolicyDecisionDelete(certificatePolicyDecision);
264 #endif
265
266 #if ENABLE(TIZEN_MEDIA_STREAM)
267     if (userMediaPermissionRequests)
268         ewkUserMediaDeletePermissionRequestList(userMediaPermissionRequests);
269 #endif
270
271 #if ENABLE(TIZEN_DATALIST_ELEMENT)
272     deleteDataList();
273 #endif
274
275 #if ENABLE(TIZEN_GEOLOCATION)
276     if (geolocation)
277         ewkGeolocationDeleteGeolocation(geolocation);
278     if (geolocationPermissionRequests)
279         ewkGeolocationDeletePermissionRequestList(geolocationPermissionRequests);
280 #endif
281
282 #if ENABLE(TIZEN_NOTIFICATIONS)
283     if (notifications)
284         ewkNotificationDeleteNotificationList(notifications);
285     if (notificationPermissionRequests)
286         ewkNotificationDeletePermissionRequestList(notificationPermissionRequests);
287 #endif
288
289 #if ENABLE(TIZEN_SQL_DATABASE)
290     if (exceededDatabaseQuota)
291         ewkContextDeleteExceededQuota(exceededDatabaseQuota);
292 #endif
293
294 #if ENABLE(TIZEN_RUNTIME_BACKEND_SELECTION)
295     if (compositionAnimator)
296         ecore_animator_del(compositionAnimator);
297 #endif
298
299 #if ENABLE(TIZEN_APPLICATION_CACHE)
300     if (applicationCachePermissionOrigin)
301         deleteSecurityOrigin(applicationCachePermissionOrigin);
302 #endif
303
304     if (exceededQuotaOrigin)
305         deleteSecurityOrigin(exceededQuotaOrigin);
306 #endif // #if OS(TIZEN)
307 }
308
309 Ewk_View_Smart_Data* EwkViewImpl::smartData() const
310 {
311     return static_cast<Ewk_View_Smart_Data*>(evas_object_smart_data_get(m_view));
312 }
313
314 EwkViewImpl* EwkViewImpl::fromEvasObject(const Evas_Object* view)
315 {
316     ASSERT(view);
317     Ewk_View_Smart_Data* sd = static_cast<Ewk_View_Smart_Data*>(evas_object_smart_data_get(view));
318     ASSERT(sd);
319     ASSERT(sd->priv);
320     return sd->priv;
321 }
322
323 /**
324  * @internal
325  * Retrieves the internal WKPage for this view.
326  */
327 WKPageRef EwkViewImpl::wkPage()
328 {
329     return toAPI(pageProxy.get());
330 }
331
332 void EwkViewImpl::setCursor(const Cursor& cursor)
333 {
334     Ewk_View_Smart_Data* sd = smartData();
335
336     const char* group = cursor.platformCursor();
337     if (!group || group == m_cursorGroup)
338         return;
339
340     m_cursorGroup = group;
341     m_cursorObject = adoptRef(edje_object_add(sd->base.evas));
342
343     Ecore_Evas* ecoreEvas = ecore_evas_ecore_evas_get(sd->base.evas);
344     if (!m_theme || !edje_object_file_set(m_cursorObject.get(), m_theme, group)) {
345         m_cursorObject.clear();
346
347         ecore_evas_object_cursor_set(ecoreEvas, 0, 0, 0, 0);
348 #ifdef HAVE_ECORE_X
349         if (WebCore::isUsingEcoreX(sd->base.evas))
350             WebCore::applyFallbackCursor(ecoreEvas, group);
351 #endif
352         return;
353     }
354
355     Evas_Coord width, height;
356     edje_object_size_min_get(m_cursorObject.get(), &width, &height);
357     if (width <= 0 || height <= 0)
358         edje_object_size_min_calc(m_cursorObject.get(), &width, &height);
359     if (width <= 0 || height <= 0) {
360         width = defaultCursorSize;
361         height = defaultCursorSize;
362     }
363     evas_object_resize(m_cursorObject.get(), width, height);
364
365     const char* data;
366     int hotspotX = 0;
367     data = edje_object_data_get(m_cursorObject.get(), "hot.x");
368     if (data)
369         hotspotX = atoi(data);
370
371     int hotspotY = 0;
372     data = edje_object_data_get(m_cursorObject.get(), "hot.y");
373     if (data)
374         hotspotY = atoi(data);
375
376     ecore_evas_object_cursor_set(ecoreEvas, m_cursorObject.get(), EVAS_LAYER_MAX, hotspotX, hotspotY);
377 }
378
379 void EwkViewImpl::displayTimerFired(WebCore::Timer<EwkViewImpl>*)
380 {
381     Ewk_View_Smart_Data* sd = smartData();
382
383     if (!sd->image)
384         return;
385
386 #if USE(COORDINATED_GRAPHICS)
387     EWK_VIEW_IMPL_GET_OR_RETURN(sd, viewImpl);
388 #endif
389
390     Region dirtyRegion;
391     for (Vector<IntRect>::iterator it = m_dirtyRects.begin(); it != m_dirtyRects.end(); ++it)
392         dirtyRegion.unite(*it);
393
394     m_dirtyRects.clear();
395
396     Vector<IntRect> rects = dirtyRegion.rects();
397     Vector<IntRect>::iterator end = rects.end();
398
399     for (Vector<IntRect>::iterator it = rects.begin(); it != end; ++it) {
400         IntRect rect = *it;
401 #if USE(COORDINATED_GRAPHICS)
402         evas_gl_make_current(viewImpl->evasGl, viewImpl->evasGlSurface, viewImpl->evasGlContext);
403         viewImpl->pageViewportControllerClient->display(rect, IntPoint(sd->view.x, sd->view.y));
404 #endif
405
406         evas_object_image_data_update_add(sd->image, rect.x(), rect.y(), rect.width(), rect.height());
407     }
408 }
409
410 void EwkViewImpl::redrawRegion(const IntRect& rect)
411 {
412     if (!m_displayTimer.isActive())
413         m_displayTimer.startOneShot(0);
414     m_dirtyRects.append(rect);
415 }
416
417 /**
418  * @internal
419  * A download for that view was cancelled.
420  *
421  * Emits signal: "download,cancelled" with pointer to a Ewk_Download_Job.
422  */
423 void EwkViewImpl::informDownloadJobCancelled(Ewk_Download_Job* download)
424 {
425     evas_object_smart_callback_call(m_view, "download,cancelled", download);
426 }
427
428 /**
429  * @internal
430  * A download for that view has failed.
431  *
432  * Emits signal: "download,failed" with pointer to a Ewk_Download_Job_Error.
433  */
434 void EwkViewImpl::informDownloadJobFailed(Ewk_Download_Job* download, Ewk_Error* error)
435 {
436     Ewk_Download_Job_Error downloadError = { download, error };
437     evas_object_smart_callback_call(m_view, "download,failed", &downloadError);
438 }
439
440 /**
441  * @internal
442  * A download for that view finished successfully.
443  *
444  * Emits signal: "download,finished" with pointer to a Ewk_Download_Job.
445  */
446 void EwkViewImpl::informDownloadJobFinished(Ewk_Download_Job* download)
447 {
448     evas_object_smart_callback_call(m_view, "download,finished", download);
449 }
450
451 /**
452  * @internal
453  * A new download has been requested for that view.
454  *
455  * Emits signal: "download,request" with pointer to a Ewk_Download_Job.
456  */
457 void EwkViewImpl::informDownloadJobRequested(Ewk_Download_Job* download)
458 {
459     evas_object_smart_callback_call(m_view, "download,request", download);
460 }
461
462 /**
463  * @internal
464  * informs that a form request is about to be submitted.
465  *
466  * Emits signal: "form,submission,request" with pointer to Ewk_Form_Submission_Request.
467  */
468 void EwkViewImpl::informNewFormSubmissionRequest(Ewk_Form_Submission_Request* request)
469 {
470     evas_object_smart_callback_call(m_view, "form,submission,request", request);
471 }
472
473 #if ENABLE(FULLSCREEN_API)
474 /**
475  * @internal
476  * Calls fullscreen_enter callback or falls back to default behavior and enables fullscreen mode.
477  */
478 void EwkViewImpl::enterFullScreen()
479 {
480     Ewk_View_Smart_Data* sd = smartData();
481
482     if (!sd->api->fullscreen_enter || !sd->api->fullscreen_enter(sd)) {
483         Ecore_Evas* ecoreEvas = ecore_evas_ecore_evas_get(sd->base.evas);
484         ecore_evas_fullscreen_set(ecoreEvas, true);
485     }
486
487 #if OS(TIZEN)
488     ewk_view_main_frame_scrollbar_visible_set(m_view, false);
489     evas_object_smart_callback_call(m_view, "fullscreen,enterfullscreen", 0);
490 #endif
491 }
492
493 /**
494  * @internal
495  * Calls fullscreen_exit callback or falls back to default behavior and disables fullscreen mode.
496  */
497 void EwkViewImpl::exitFullScreen()
498 {
499     Ewk_View_Smart_Data* sd = smartData();
500
501     if (!sd->api->fullscreen_exit || !sd->api->fullscreen_exit(sd)) {
502         Ecore_Evas* ecoreEvas = ecore_evas_ecore_evas_get(sd->base.evas);
503         ecore_evas_fullscreen_set(ecoreEvas, false);
504     }
505
506 #if OS(TIZEN)
507     ewk_view_main_frame_scrollbar_visible_set(m_view, true);
508     evas_object_smart_callback_call(m_view, "fullscreen,exitfullscreen", 0);
509 #endif
510 }
511 #endif
512
513 void EwkViewImpl::setImageData(void* imageData, const IntSize& size)
514 {
515     Ewk_View_Smart_Data* sd = smartData();
516     if (!imageData || !sd->image)
517         return;
518
519     evas_object_resize(sd->image, size.width(), size.height());
520     evas_object_image_size_set(sd->image, size.width(), size.height());
521     evas_object_image_data_copy_set(sd->image, imageData);
522 }
523
524 #if ENABLE(INPUT_TYPE_COLOR)
525 bool EwkViewImpl::setColorPickerColor(const WebCore::Color& color)
526 {
527     if (!m_colorPickerResultListener)
528         return false;
529
530     WKRetainPtr<WKStringRef> colorString(AdoptWK, WKStringCreateWithUTF8CString(color.serialized().utf8().data()));
531     WKColorPickerResultListenerSetColor(m_colorPickerResultListener.get(), colorString.get());
532     m_colorPickerResultListener.clear();
533
534     return true;
535 }
536 #endif
537
538 /**
539  * @internal
540  * informs load failed with error information.
541  *
542  * Emits signal: "load,error" with pointer to Ewk_Error.
543  */
544 void EwkViewImpl::informLoadError(Ewk_Error* error)
545 {
546     evas_object_smart_callback_call(m_view, "load,error", error);
547 }
548
549 /**
550  * @internal
551  * informs load finished.
552  *
553  * Emits signal: "load,finished".
554  */
555 void EwkViewImpl::informLoadFinished()
556 {
557     informURLChange();
558     evas_object_smart_callback_call(m_view, "load,finished", 0);
559
560 #if OS(TIZEN)
561 #if ENABLE(TIZEN_CSS_OVERFLOW_SCROLL_ACCELERATION)
562     pageProxy->setLoadingFinished(true);
563 #endif
564
565 #if ENABLE(TIZEN_WEBKIT2_FORM_DATABASE)
566     ewk_view_form_password_data_fill(m_view);
567 #endif
568
569     if (!suspendRequested)
570         return;
571
572     suspendRequested = false;
573
574     if (!suspendedPainting) {
575         pageProxy->suspendPainting();
576         suspendedPainting = true;
577     }
578     if (!suspendedResources) {
579         pageProxy->suspendJavaScriptAndResource();
580         suspendedResources = true;
581     }
582 #endif
583 }
584
585 /**
586  * @internal
587  * informs load progress changed.
588  *
589  * Emits signal: "load,progress" with pointer to a double from 0.0 to 1.0.
590  */
591 void EwkViewImpl::informLoadProgress(double progress)
592 {
593     evas_object_smart_callback_call(m_view, "load,progress", &progress);
594 }
595
596 /**
597  * @internal
598  * informs view provisional load failed with error information.
599  *
600  * Emits signal: "load,provisional,failed" with pointer to Ewk_Error.
601  */
602 void EwkViewImpl::informProvisionalLoadFailed(Ewk_Error* error)
603 {
604     evas_object_smart_callback_call(m_view, "load,provisional,failed", error);
605 }
606
607 #if ENABLE(WAIT_UPVERSION)
608 #if USE(TILED_BACKING_STORE)
609 void EwkViewImpl::informLoadCommitted()
610 {
611     pageViewportController->didCommitLoad();
612 }
613 #endif
614 #endif
615
616 /**
617  * @internal
618  * informs view received redirect for provisional load.
619  *
620  * Emits signal: "load,provisional,redirect".
621  */
622 void EwkViewImpl::informProvisionalLoadRedirect()
623 {
624     informURLChange();
625     evas_object_smart_callback_call(m_view, "load,provisional,redirect", 0);
626 }
627
628 /**
629  * @internal
630  * informs view provisional load started.
631  *
632  * Emits signal: "load,provisional,started".
633  */
634 void EwkViewImpl::informProvisionalLoadStarted()
635 {
636 #if OS(TIZEN)
637     evas_object_smart_callback_call(m_view, "load,started", 0);
638 #endif
639
640 #if ENABLE(TIZEN_DRAG_SUPPORT)
641     if (pageClient->isDragMode())
642         pageClient->setDragMode(false);
643 #endif
644
645 #if ENABLE(TIZEN_CSS_OVERFLOW_SCROLL_ACCELERATION)
646     pageProxy->setLoadingFinished(false);
647 #endif
648
649     informURLChange();
650     evas_object_smart_callback_call(m_view, "load,provisional,started", 0);
651 }
652
653 /**
654  * @internal
655  * informs that a navigation policy decision should be taken.
656  *
657  * Emits signal: "policy,decision,navigation".
658  */
659 void EwkViewImpl::informNavigationPolicyDecision(Ewk_Navigation_Policy_Decision* decision)
660 {
661     evas_object_smart_callback_call(m_view, "policy,decision,navigation", decision);
662 }
663
664 /**
665  * @internal
666  * informs that a new window policy decision should be taken.
667  *
668  * Emits signal: "policy,decision,new,window".
669  */
670 void EwkViewImpl::informNewWindowPolicyDecision(Ewk_Navigation_Policy_Decision* decision)
671 {
672     evas_object_smart_callback_call(m_view, "policy,decision,new,window", decision);
673 }
674
675 /**
676  * @internal
677  * Load was initiated for a resource in the view.
678  *
679  * Emits signal: "resource,request,new" with pointer to resource request.
680  */
681 void EwkViewImpl::informResourceLoadStarted(Ewk_Resource* resource, Ewk_Url_Request* request)
682 {
683     Ewk_Resource_Request resourceRequest = {resource, request, 0};
684
685     evas_object_smart_callback_call(m_view, "resource,request,new", &resourceRequest);
686 }
687
688 /**
689  * @internal
690  * Received a response to a resource load request in the view.
691  *
692  * Emits signal: "resource,request,response" with pointer to resource response.
693  */
694 void EwkViewImpl::informResourceLoadResponse(Ewk_Resource* resource, Ewk_Url_Response* response)
695 {
696     Ewk_Resource_Load_Response resourceLoadResponse = {resource, response};
697     evas_object_smart_callback_call(m_view, "resource,request,response", &resourceLoadResponse);
698 }
699
700 /**
701  * @internal
702  * Failed loading a resource in the view.
703  *
704  * Emits signal: "resource,request,finished" with pointer to the resource load error.
705  */
706 void EwkViewImpl::informResourceLoadFailed(Ewk_Resource* resource, Ewk_Error* error)
707 {
708     Ewk_Resource_Load_Error resourceLoadError = {resource, error};
709     evas_object_smart_callback_call(m_view, "resource,request,failed", &resourceLoadError);
710 }
711
712 /**
713  * @internal
714  * Finished loading a resource in the view.
715  *
716  * Emits signal: "resource,request,finished" with pointer to the resource.
717  */
718 void EwkViewImpl::informResourceLoadFinished(Ewk_Resource* resource)
719 {
720     evas_object_smart_callback_call(m_view, "resource,request,finished", resource);
721 }
722
723 /**
724  * @internal
725  * Request was sent for a resource in the view.
726  *
727  * Emits signal: "resource,request,sent" with pointer to resource request and possible redirect response.
728  */
729 void EwkViewImpl::informResourceRequestSent(Ewk_Resource* resource, Ewk_Url_Request* request, Ewk_Url_Response* redirectResponse)
730 {
731     Ewk_Resource_Request resourceRequest = {resource, request, redirectResponse};
732     evas_object_smart_callback_call(m_view, "resource,request,sent", &resourceRequest);
733 }
734
735 /**
736  * @internal
737  * The view title was changed by the frame loader.
738  *
739  * Emits signal: "title,changed" with pointer to new title string.
740  */
741 void EwkViewImpl::informTitleChange(const String& title)
742 {
743     evas_object_smart_callback_call(m_view, "title,changed", const_cast<char*>(title.utf8().data()));
744 }
745
746 /**
747  * @internal
748  */
749 void EwkViewImpl::informTooltipTextChange(const String& text)
750 {
751     if (text.isEmpty())
752         evas_object_smart_callback_call(m_view, "tooltip,text,unset", 0);
753     else
754         evas_object_smart_callback_call(m_view, "tooltip,text,set", const_cast<char*>(text.utf8().data()));
755
756 }
757
758 /**
759  * @internal
760  * informs that the requested text was found.
761  *
762  * Emits signal: "text,found" with the number of matches.
763  */
764 void EwkViewImpl::informTextFound(unsigned matchCount)
765 {
766     evas_object_smart_callback_call(m_view, "text,found", &matchCount);
767 }
768
769 IntSize EwkViewImpl::size() const
770 {
771     int width, height;
772     evas_object_geometry_get(m_view, 0, 0, &width, &height);
773     return IntSize(width, height);
774 }
775
776 bool EwkViewImpl::isFocused() const
777 {
778     return evas_object_focus_get(m_view);
779 }
780
781 bool EwkViewImpl::isVisible() const
782 {
783     return evas_object_visible_get(m_view);
784 }
785
786 const char* EwkViewImpl::title() const
787 {
788     m_title = pageProxy->pageTitle().utf8().data();
789
790     return m_title;
791 }
792
793 /**
794  * @internal
795  * This function may return @c NULL.
796  */
797 InputMethodContextEfl* EwkViewImpl::inputMethodContext()
798 {
799     return m_inputMethodContext.get();
800 }
801
802 const char* EwkViewImpl::themePath() const
803 {
804     return m_theme;
805 }
806
807 void EwkViewImpl::setThemePath(const char* theme)
808 {
809     if (m_theme != theme) {
810         m_theme = theme;
811         pageProxy->setThemePath(theme);
812     }
813 }
814
815 const char* EwkViewImpl::customTextEncodingName() const
816 {
817     String customEncoding = pageProxy->customTextEncodingName();
818     if (customEncoding.isEmpty())
819         return 0;
820
821     m_customEncoding = customEncoding.utf8().data();
822
823     return m_customEncoding;
824 }
825
826 void EwkViewImpl::setCustomTextEncodingName(const char* encoding)
827 {
828     m_customEncoding = encoding;
829     pageProxy->setCustomTextEncodingName(encoding ? encoding : String());
830 }
831
832 void EwkViewImpl::setMouseEventsEnabled(bool enabled)
833 {
834     if (m_mouseEventsEnabled == enabled)
835         return;
836
837     m_mouseEventsEnabled = enabled;
838     if (enabled) {
839         Ewk_View_Smart_Data* sd = smartData();
840         evas_object_event_callback_add(m_view, EVAS_CALLBACK_MOUSE_DOWN, onMouseDown, sd);
841         evas_object_event_callback_add(m_view, EVAS_CALLBACK_MOUSE_UP, onMouseUp, sd);
842         evas_object_event_callback_add(m_view, EVAS_CALLBACK_MOUSE_MOVE, onMouseMove, sd);
843     } else {
844         evas_object_event_callback_del(m_view, EVAS_CALLBACK_MOUSE_DOWN, onMouseDown);
845         evas_object_event_callback_del(m_view, EVAS_CALLBACK_MOUSE_UP, onMouseUp);
846         evas_object_event_callback_del(m_view, EVAS_CALLBACK_MOUSE_MOVE, onMouseMove);
847     }
848 }
849
850 #if ENABLE(TOUCH_EVENTS)
851 void EwkViewImpl::setTouchEventsEnabled(bool enabled)
852 {
853     if (m_touchEventsEnabled == enabled)
854         return;
855
856     m_touchEventsEnabled = enabled;
857
858     if (enabled) {
859         // FIXME: We have to connect touch callbacks with mouse and multi events
860         // because the Evas creates mouse events for first touch and multi events
861         // for second and third touches. Below codes should be fixed when the Evas
862         // supports the touch events.
863         // See https://bugs.webkit.org/show_bug.cgi?id=97785 for details.
864         Ewk_View_Smart_Data* sd = smartData();
865         evas_object_event_callback_add(m_view, EVAS_CALLBACK_MOUSE_DOWN, onTouchDown, sd);
866         evas_object_event_callback_add(m_view, EVAS_CALLBACK_MOUSE_UP, onTouchUp, sd);
867         evas_object_event_callback_add(m_view, EVAS_CALLBACK_MOUSE_MOVE, onTouchMove, sd);
868         evas_object_event_callback_add(m_view, EVAS_CALLBACK_MULTI_DOWN, onTouchDown, sd);
869         evas_object_event_callback_add(m_view, EVAS_CALLBACK_MULTI_UP, onTouchUp, sd);
870         evas_object_event_callback_add(m_view, EVAS_CALLBACK_MULTI_MOVE, onTouchMove, sd);
871     } else {
872         evas_object_event_callback_del(m_view, EVAS_CALLBACK_MOUSE_DOWN, onTouchDown);
873         evas_object_event_callback_del(m_view, EVAS_CALLBACK_MOUSE_UP, onTouchUp);
874         evas_object_event_callback_del(m_view, EVAS_CALLBACK_MOUSE_MOVE, onTouchMove);
875         evas_object_event_callback_del(m_view, EVAS_CALLBACK_MULTI_DOWN, onTouchDown);
876         evas_object_event_callback_del(m_view, EVAS_CALLBACK_MULTI_UP, onTouchUp);
877         evas_object_event_callback_del(m_view, EVAS_CALLBACK_MULTI_MOVE, onTouchMove);
878     }
879 }
880 #endif
881
882 /**
883  * @internal
884  * Update the view's favicon and emits a "icon,changed" signal if it has
885  * changed.
886  *
887  * This function is called whenever the URL has changed or when the icon for
888  * the current page URL has changed.
889  */
890 void EwkViewImpl::informIconChange()
891 {
892     Ewk_Favicon_Database* iconDatabase = context->faviconDatabase();
893     ASSERT(iconDatabase);
894
895     m_faviconURL = ewk_favicon_database_icon_url_get(iconDatabase, m_url);
896     evas_object_smart_callback_call(m_view, "icon,changed", 0);
897 }
898
899 #if ENABLE(WEB_INTENTS)
900 /**
901  * @internal
902  * The view received a new intent request.
903  *
904  * Emits signal: "intent,request,new" with pointer to a Ewk_Intent.
905  */
906 void EwkViewImpl::informIntentRequest(Ewk_Intent* ewkIntent)
907 {
908     evas_object_smart_callback_call(m_view, "intent,request,new", ewkIntent);
909 }
910 #endif
911
912 #if ENABLE(WEB_INTENTS_TAG)
913 /**
914  * @internal
915  * The view received a new intent service registration.
916  *
917  * Emits signal: "intent,service,register" with pointer to a Ewk_Intent_Service.
918  */
919 void EwkViewImpl::informIntentServiceRegistration(Ewk_Intent_Service* ewkIntentService)
920 {
921     evas_object_smart_callback_call(m_view, "intent,service,register", ewkIntentService);
922 }
923 #endif // ENABLE(WEB_INTENTS_TAG)
924
925 #if USE(ACCELERATED_COMPOSITING)
926 bool EwkViewImpl::createGLSurface(const IntSize& viewSize)
927 {
928     Ewk_View_Smart_Data* sd = smartData();
929
930     Evas_GL_Config evasGlConfig = {
931         EVAS_GL_RGBA_8888,
932         EVAS_GL_DEPTH_BIT_8,
933         EVAS_GL_STENCIL_NONE,
934         EVAS_GL_OPTIONS_NONE,
935         EVAS_GL_MULTISAMPLE_NONE
936     };
937
938     ASSERT(!evasGlSurface);
939     evasGlSurface = evas_gl_surface_create(evasGl, &evasGlConfig, viewSize.width(), viewSize.height());
940     if (!evasGlSurface)
941         return false;
942
943     Evas_Native_Surface nativeSurface;
944     evas_gl_native_surface_get(evasGl, evasGlSurface, &nativeSurface);
945     evas_object_image_native_surface_set(sd->image, &nativeSurface);
946
947     return true;
948 }
949
950 bool EwkViewImpl::enterAcceleratedCompositingMode()
951 {
952     if (evasGl) {
953         EINA_LOG_DOM_WARN(_ewk_log_dom, "Accelerated compositing mode already entered.");
954         return false;
955     }
956
957     Evas* evas = evas_object_evas_get(m_view);
958     evasGl = evas_gl_new(evas);
959     if (!evasGl)
960         return false;
961
962     evasGlContext = evas_gl_context_create(evasGl, 0);
963     if (!evasGlContext) {
964         evas_gl_free(evasGl);
965         evasGl = 0;
966         return false;
967     }
968
969     if (!createGLSurface(size())) {
970         evas_gl_context_destroy(evasGl, evasGlContext);
971         evasGlContext = 0;
972
973         evas_gl_free(evasGl);
974         evasGl = 0;
975         return false;
976     }
977
978 #if ENABLE(WAIT_UPVERSION)
979     pageViewportControllerClient->setRendererActive(true);
980 #endif
981     return true;
982 }
983
984 bool EwkViewImpl::exitAcceleratedCompositingMode()
985 {
986     EINA_SAFETY_ON_NULL_RETURN_VAL(evasGl, false);
987
988     if (evasGlSurface) {
989         evas_gl_surface_destroy(evasGl, evasGlSurface);
990         evasGlSurface = 0;
991     }
992
993     if (evasGlContext) {
994         evas_gl_context_destroy(evasGl, evasGlContext);
995         evasGlContext = 0;
996     }
997
998     evas_gl_free(evasGl);
999     evasGl = 0;
1000
1001     return true;
1002 }
1003 #endif
1004
1005 #if ENABLE(INPUT_TYPE_COLOR)
1006 /**
1007  * @internal
1008  * Requests to show external color picker.
1009  */
1010 void EwkViewImpl::requestColorPicker(int r, int g, int b, int a, WKColorPickerResultListenerRef listener)
1011 {
1012     Ewk_View_Smart_Data* sd = smartData();
1013     EINA_SAFETY_ON_NULL_RETURN(sd->api->input_picker_color_request);
1014
1015     m_colorPickerResultListener = listener;
1016
1017     sd->api->input_picker_color_request(sd, r, g, b, a);
1018 }
1019
1020 /**
1021  * @internal
1022  * Requests to hide external color picker.
1023  */
1024 void EwkViewImpl::dismissColorPicker()
1025 {
1026     Ewk_View_Smart_Data* sd = smartData();
1027     EINA_SAFETY_ON_NULL_RETURN(sd->api->input_picker_color_dismiss);
1028
1029     m_colorPickerResultListener.clear();
1030
1031     sd->api->input_picker_color_dismiss(sd);
1032 }
1033 #endif
1034
1035 /**
1036  * @internal
1037  * informs that the view's back / forward list has changed.
1038  *
1039  * Emits signal: "back,forward,list,changed".
1040  */
1041 void EwkViewImpl::informBackForwardListChange()
1042 {
1043     evas_object_smart_callback_call(m_view, "back,forward,list,changed", 0);
1044 }
1045
1046 /**
1047  * @internal
1048  * Web process has crashed.
1049  *
1050  * Emits signal: "webprocess,crashed" with pointer to crash handling boolean.
1051  */
1052 void EwkViewImpl::informWebProcessCrashed()
1053 {
1054     bool handled = false;
1055     evas_object_smart_callback_call(m_view, "webprocess,crashed", &handled);
1056
1057     if (!handled) {
1058         CString url = pageProxy->urlAtProcessExit().utf8();
1059         WARN("WARNING: The web process experienced a crash on '%s'.\n", url.data());
1060
1061         // Display an error page
1062         ewk_view_html_string_load(m_view, "The web process has crashed.", 0, url.data());
1063     }
1064 }
1065
1066 void EwkViewImpl::informContentsSizeChange(const IntSize& size)
1067 {
1068 #if USE(COORDINATED_GRAPHICS)
1069     pageViewportControllerClient->didChangeContentsSize(size);
1070 #else
1071     UNUSED_PARAM(size);
1072 #endif
1073 }
1074
1075 COMPILE_ASSERT_MATCHING_ENUM(EWK_TEXT_DIRECTION_RIGHT_TO_LEFT, RTL);
1076 COMPILE_ASSERT_MATCHING_ENUM(EWK_TEXT_DIRECTION_LEFT_TO_RIGHT, LTR);
1077
1078 #if ENABLE(TIZEN_MULTIPLE_SELECT)
1079 void EwkViewImpl::requestPopupMenu(WebPopupMenuProxyEfl* popupMenu, const IntRect& rect, TextDirection textDirection, double pageScaleFactor, const Vector<WebPopupItem>& items, int32_t selectedIndex, bool multiple)
1080 #else
1081 void EwkViewImpl::requestPopupMenu(WebPopupMenuProxyEfl* popupMenu, const IntRect& rect, TextDirection textDirection, double pageScaleFactor, const Vector<WebPopupItem>& items, int32_t selectedIndex)
1082 #endif
1083 {
1084     Ewk_View_Smart_Data* sd = smartData();
1085     ASSERT(sd->api);
1086
1087     ASSERT(popupMenu);
1088
1089 #if ENABLE(TIZEN_MULTIPLE_SELECT)
1090     if (multiple ? !sd->api->multiple_popup_menu_show : !sd->api->popup_menu_show)
1091 #else
1092     if (!sd->api->popup_menu_show)
1093 #endif
1094         return;
1095
1096     if (popupMenuProxy)
1097         ewk_view_popup_menu_close(m_view);
1098     popupMenuProxy = popupMenu;
1099
1100     Eina_List* popupItems = 0;
1101     const size_t size = items.size();
1102     for (size_t i = 0; i < size; ++i)
1103         popupItems = eina_list_append(popupItems, Ewk_Popup_Menu_Item::create(items[i]).leakPtr());
1104     popupMenuItems = popupItems;
1105
1106 #if ENABLE(TIZEN_WEBKIT2_POPUP_INTERNAL)
1107 #if ENABLE(TIZEN_MULTIPLE_SELECT)
1108     if (multiple ? sd->api->multiple_popup_menu_show(sd, rect, static_cast<Ewk_Text_Direction>(textDirection), pageScaleFactor, popupMenuItems)
1109         : sd->api->popup_menu_show(sd, rect, static_cast<Ewk_Text_Direction>(textDirection), pageScaleFactor, popupMenuItems, selectedIndex)) {
1110 #else
1111     if (sd->api->popup_menu_show(sd, rect, static_cast<Ewk_Text_Direction>(textDirection), pageScaleFactor, popupMenuItems, selectedIndex)) {
1112 #endif
1113         /* maps.google.com generate mouse event in touch down without preventDefault.
1114          * So, popup menu is opend in touch down event and closed via fake mouse down
1115          * which generated by endTap.
1116          * In order to fix select of maps.google.com (based on touch behavior),
1117          * We should disable touch events when select popup is open.
1118          */
1119
1120 #if ENABLE(TIZEN_GESTURE)
1121         gestureClient->reset();
1122 #endif
1123         ewk_view_touch_events_enabled_set(m_view, false);
1124     }
1125 #else
1126     sd->api->popup_menu_show(sd, rect, static_cast<Ewk_Text_Direction>(textDirection), pageScaleFactor, popupItems, selectedIndex);
1127 #endif
1128 }
1129
1130 /**
1131  * @internal
1132  * Calls a smart member function for javascript alert().
1133  */
1134 void EwkViewImpl::requestJSAlertPopup(const WKEinaSharedString& message)
1135 {
1136     Ewk_View_Smart_Data* sd = smartData();
1137     ASSERT(sd->api);
1138
1139     if (!sd->api->run_javascript_alert)
1140         return;
1141
1142     sd->api->run_javascript_alert(sd, message);
1143 }
1144
1145 /**
1146  * @internal
1147  * Calls a smart member function for javascript confirm() and returns a value from the function. Returns false by default.
1148  */
1149 bool EwkViewImpl::requestJSConfirmPopup(const WKEinaSharedString& message)
1150 {
1151     Ewk_View_Smart_Data* sd = smartData();
1152     ASSERT(sd->api);
1153
1154     if (!sd->api->run_javascript_confirm)
1155         return false;
1156
1157     return sd->api->run_javascript_confirm(sd, message);
1158 }
1159
1160 /**
1161  * @internal
1162  * Calls a smart member function for javascript prompt() and returns a value from the function. Returns null string by default.
1163  */
1164 WKEinaSharedString EwkViewImpl::requestJSPromptPopup(const WKEinaSharedString& message, const WKEinaSharedString& defaultValue)
1165 {
1166     Ewk_View_Smart_Data* sd = smartData();
1167     ASSERT(sd->api);
1168
1169     if (!sd->api->run_javascript_prompt)
1170         return WKEinaSharedString();
1171
1172     return WKEinaSharedString::adopt(sd->api->run_javascript_prompt(sd, message, defaultValue));
1173 }
1174
1175 #if ENABLE(SQL_DATABASE)
1176 /**
1177  * @internal
1178  * Calls exceeded_database_quota callback or falls back to default behavior returns default database quota.
1179  */
1180 unsigned long long EwkViewImpl::informDatabaseQuotaReached(const String& databaseName, const String& displayName, unsigned long long currentQuota, unsigned long long currentOriginUsage, unsigned long long currentDatabaseUsage, unsigned long long expectedUsage)
1181 {
1182     Ewk_View_Smart_Data* sd = smartData();
1183     ASSERT(sd->api);
1184
1185     static const unsigned long long defaultQuota = 5 * 1024 * 1204; // 5 MB
1186     if (sd->api->exceeded_database_quota)
1187         return sd->api->exceeded_database_quota(sd, databaseName.utf8().data(), displayName.utf8().data(), currentQuota, currentOriginUsage, currentDatabaseUsage, expectedUsage);
1188
1189     return defaultQuota;
1190 }
1191 #endif
1192
1193 /**
1194  * @internal
1195  * The url of view was changed by the frame loader.
1196  *
1197  * Emits signal: "url,changed" with pointer to new url string.
1198  */
1199 void EwkViewImpl::informURLChange()
1200 {
1201     String activeURL = pageProxy->activeURL();
1202     if (activeURL.isEmpty())
1203         return;
1204
1205     CString rawActiveURL = activeURL.utf8();
1206     if (m_url == rawActiveURL.data())
1207         return;
1208
1209     m_url = rawActiveURL.data();
1210     const char* callbackArgument = static_cast<const char*>(m_url);
1211     evas_object_smart_callback_call(m_view, "url,changed", const_cast<char*>(callbackArgument));
1212 #if OS(TIZEN)
1213     evas_object_smart_callback_call(m_view, "uri,changed", const_cast<char*>(callbackArgument));
1214 #endif
1215
1216     // Update the view's favicon.
1217     informIconChange();
1218 }
1219
1220 WKPageRef EwkViewImpl::createNewPage()
1221 {
1222     Evas_Object* newEwkView = 0;
1223     evas_object_smart_callback_call(m_view, "create,window", &newEwkView);
1224
1225     if (!newEwkView)
1226         return 0;
1227
1228     EwkViewImpl* newViewImpl = EwkViewImpl::fromEvasObject(newEwkView);
1229     ASSERT(newViewImpl);
1230
1231     return static_cast<WKPageRef>(WKRetain(newViewImpl->page()));
1232 }
1233
1234 void EwkViewImpl::closePage()
1235 {
1236     evas_object_smart_callback_call(m_view, "close,window", 0);
1237 }
1238
1239 void EwkViewImpl::onMouseDown(void* data, Evas*, Evas_Object*, void* eventInfo)
1240 {
1241     Evas_Event_Mouse_Down* downEvent = static_cast<Evas_Event_Mouse_Down*>(eventInfo);
1242     Ewk_View_Smart_Data* sd = static_cast<Ewk_View_Smart_Data*>(data);
1243     EINA_SAFETY_ON_NULL_RETURN(sd->api);
1244     EINA_SAFETY_ON_NULL_RETURN(sd->api->mouse_down);
1245     sd->api->mouse_down(sd, downEvent);
1246 }
1247
1248 void EwkViewImpl::onMouseUp(void* data, Evas*, Evas_Object*, void* eventInfo)
1249 {
1250     Evas_Event_Mouse_Up* upEvent = static_cast<Evas_Event_Mouse_Up*>(eventInfo);
1251     Ewk_View_Smart_Data* sd = static_cast<Ewk_View_Smart_Data*>(data);
1252     EINA_SAFETY_ON_NULL_RETURN(sd->api);
1253     EINA_SAFETY_ON_NULL_RETURN(sd->api->mouse_up);
1254     sd->api->mouse_up(sd, upEvent);
1255 }
1256
1257 void EwkViewImpl::onMouseMove(void* data, Evas*, Evas_Object*, void* eventInfo)
1258 {
1259     Evas_Event_Mouse_Move* moveEvent = static_cast<Evas_Event_Mouse_Move*>(eventInfo);
1260     Ewk_View_Smart_Data* sd = static_cast<Ewk_View_Smart_Data*>(data);
1261     EINA_SAFETY_ON_NULL_RETURN(sd->api);
1262     EINA_SAFETY_ON_NULL_RETURN(sd->api->mouse_move);
1263     sd->api->mouse_move(sd, moveEvent);
1264 }
1265
1266 #if ENABLE(TOUCH_EVENTS)
1267 void EwkViewImpl::feedTouchEvents(Ewk_Touch_Event_Type type)
1268 {
1269     Ewk_View_Smart_Data* sd = smartData();
1270
1271     unsigned count = evas_touch_point_list_count(sd->base.evas);
1272     if (!count)
1273         return;
1274
1275     Eina_List* points = 0;
1276     for (unsigned i = 0; i < count; ++i) {
1277         Ewk_Touch_Point* point = new Ewk_Touch_Point;
1278         point->id = evas_touch_point_list_nth_id_get(sd->base.evas, i);
1279         evas_touch_point_list_nth_xy_get(sd->base.evas, i, &point->x, &point->y);
1280         point->state = evas_touch_point_list_nth_state_get(sd->base.evas, i);
1281 #if ENABLE(TOUCH_EVENTS) && ENABLE(TIZEN_GESTURE)
1282         if (type == EWK_TOUCH_CANCEL)
1283             point->state = EVAS_TOUCH_POINT_CANCEL;
1284 #endif
1285         points = eina_list_append(points, point);
1286     }
1287
1288     ewk_view_feed_touch_event(m_view, type, points, evas_key_modifier_get(sd->base.evas));
1289
1290     void* data;
1291     EINA_LIST_FREE(points, data)
1292         delete static_cast<Ewk_Touch_Point*>(data);
1293 }
1294
1295 void EwkViewImpl::onTouchDown(void* /* data */, Evas* /* canvas */, Evas_Object* ewkView, void* /* eventInfo */)
1296 {
1297     EwkViewImpl* viewImpl = EwkViewImpl::fromEvasObject(ewkView);
1298     viewImpl->feedTouchEvents(EWK_TOUCH_START);
1299 }
1300
1301 void EwkViewImpl::onTouchUp(void* /* data */, Evas* /* canvas */, Evas_Object* ewkView, void* /* eventInfo */)
1302 {
1303     EwkViewImpl* viewImpl = EwkViewImpl::fromEvasObject(ewkView);
1304     viewImpl->feedTouchEvents(EWK_TOUCH_END);
1305 }
1306
1307 void EwkViewImpl::onTouchMove(void* /* data */, Evas* /* canvas */, Evas_Object* ewkView, void* /* eventInfo */)
1308 {
1309     EwkViewImpl* viewImpl = EwkViewImpl::fromEvasObject(ewkView);
1310     viewImpl->feedTouchEvents(EWK_TOUCH_MOVE);
1311 }
1312 #endif
1313
1314 #if OS(TIZEN)
1315 #if ENABLE(TIZEN_WEBKIT2_TILED_BACKING_STORE)
1316 AffineTransform EwkViewImpl::transformFromView() const
1317 {
1318     AffineTransform transform;
1319     transform.scale(1 / m_scaleFactor);
1320     transform.translate(m_scrollPosition.x(), m_scrollPosition.y());
1321
1322     return transform;
1323 }
1324
1325 AffineTransform EwkViewImpl::transformToView() const
1326 {
1327     return transformFromView().inverse();
1328 }
1329 #endif
1330
1331 AffineTransform EwkViewImpl::transformFromScene() const
1332 {
1333     AffineTransform transform;
1334
1335 #if USE(TILED_BACKING_STORE)
1336     // FIXME: We have to scale firstly unlike open source, because we are using scaled scroll position.
1337     //transform.translate(m_scrollPosition.x(), m_scrollPosition.y());
1338     //transform.scale(1 / m_scaleFactor);
1339     transform.scale(1 / m_scaleFactor);
1340     transform.translate(m_scrollPosition.x(), m_scrollPosition.y());
1341 #endif
1342
1343     Ewk_View_Smart_Data* sd = smartData();
1344     transform.translate(-sd->view.x, -sd->view.y);
1345
1346     return transform;
1347 }
1348
1349 AffineTransform EwkViewImpl::transformToScene() const
1350 {
1351     return transformFromScene().inverse();
1352 }
1353
1354 AffineTransform EwkViewImpl::transformToScreen() const
1355 {
1356     AffineTransform transform;
1357
1358     int windowGlobalX = 0;
1359     int windowGlobalY = 0;
1360
1361     Ewk_View_Smart_Data* sd = smartData();
1362
1363 #ifdef HAVE_ECORE_X
1364     Ecore_Evas* ecoreEvas = ecore_evas_ecore_evas_get(sd->base.evas);
1365     Ecore_X_Window window = ecore_evas_software_x11_window_get(ecoreEvas); // Returns 0 if none.
1366
1367     int x, y; // x, y are relative to parent (in a reparenting window manager).
1368     while (window) {
1369         ecore_x_window_geometry_get(window, &x, &y, 0, 0);
1370         windowGlobalX += x;
1371         windowGlobalY += y;
1372         window = ecore_x_window_parent_get(window);
1373     }
1374 #endif
1375
1376     transform.translate(-sd->view.x, -sd->view.y);
1377     transform.translate(windowGlobalX, windowGlobalY);
1378
1379     return transform;
1380 }
1381
1382 #if ENABLE(TIZEN_WEBKIT2_SEPERATE_LOAD_PROGRESS)
1383 void EwkViewImpl::informLoadProgressStarted()
1384 {
1385     evas_object_smart_callback_call(m_view, "load,progress,started", 0);
1386 }
1387
1388 void EwkViewImpl::informLoadProgressFinished()
1389 {
1390     evas_object_smart_callback_call(m_view, "load,progress,finished", 0);
1391 }
1392 #endif
1393
1394 #if ENABLE(TIZEN_DATALIST_ELEMENT)
1395 void EwkViewImpl::deleteDataList()
1396 {
1397     EINA_SAFETY_ON_NULL_RETURN(dataList);
1398
1399     void* item;
1400     EINA_LIST_FREE(dataList, item)
1401         eina_stringshare_del(static_cast<char*>(item));
1402
1403     dataList = 0;
1404 }
1405 #endif
1406
1407 #if ENABLE(TOUCH_EVENTS) && ENABLE(TIZEN_GESTURE)
1408 void EwkViewImpl::feedTouchEventsByType(Ewk_Touch_Event_Type type)
1409 {
1410     feedTouchEvents(type);
1411 }
1412 #endif
1413 #endif //#if OS(TIZEN)