tizen 2.3 release
[framework/uifw/elementary.git] / src / lib / elm_web2.c
1 #include <Elementary.h>
2 #include "elm_priv.h"
3 #include "elm_widget_web.h"
4
5 #if defined(HAVE_ELEMENTARY_WEB) && defined(USE_WEBKIT2)
6 #include <EWebKit2.h>
7
8 EAPI const char ELM_WEB_SMART_NAME[] = "elm_web";
9
10 static Ewk_View_Smart_Class _ewk_view_parent_sc =
11   EWK_VIEW_SMART_CLASS_INIT_NULL;
12
13 static const Evas_Smart_Cb_Description _elm_web_smart_callbacks[] = {
14    { "url,changed", "s" },
15    { NULL, NULL }
16 };
17
18 EVAS_SMART_SUBCLASS_NEW
19   (ELM_WEB_SMART_NAME, _elm_web, Elm_Web_Smart_Class, Elm_Widget_Smart_Class,
20   elm_widget_smart_class_get, _elm_web_smart_callbacks);
21
22 static void
23 _view_smart_add(Evas_Object *obj)
24 {
25    View_Smart_Data *sd;
26
27    sd = calloc(1, sizeof(View_Smart_Data));
28    evas_object_smart_data_set(obj, sd);
29
30    _ewk_view_parent_sc.sc.add(obj);
31 }
32
33 static void
34 _view_smart_del(Evas_Object *obj)
35 {
36    _ewk_view_parent_sc.sc.del(obj);
37 }
38
39 /**
40  * Creates a new view object given the parent.
41  *
42  * @param parent object to use as parent.
43  *
44  * @return newly added Evas_Object or @c NULL on errors.
45  */
46 Evas_Object *
47 _view_add(Evas_Object *parent)
48 {
49    Evas *canvas = evas_object_evas_get(parent);
50    static Evas_Smart *smart = NULL;
51    Evas_Object *view;
52
53    if (!smart)
54      {
55         static Ewk_View_Smart_Class api =
56           EWK_VIEW_SMART_CLASS_INIT_NAME_VERSION("EWK_View_Elementary");
57
58         ewk_view_smart_class_set(&api);
59         ewk_view_smart_class_set(&_ewk_view_parent_sc);
60
61         // TODO: check every api method and provide overrides with hooks!
62         // TODO: hooks should provide extension points
63         // TODO: extension should have some kind of "default implementation",
64         // TODO: that can be replaced or controlled by hooks.
65         // TODO: ie: run_javascript_alert() should present an elm_win
66         // TODO: by default, but user could override it to show as inwin.
67         api.sc.add = _view_smart_add;
68         api.sc.del = _view_smart_del;
69
70         smart = evas_smart_class_new(&api.sc);
71         if (!smart)
72           {
73              CRITICAL("Could not create smart class");
74              return NULL;
75           }
76      }
77
78    view = ewk_view_smart_add(canvas, smart, ewk_context_default_get());
79    if (!view)
80      {
81         ERR("Could not create smart object object for view");
82         return NULL;
83      }
84
85    return view;
86 }
87
88 static int _elm_need_web = 0;
89
90 EAPI Eina_Bool
91 elm_need_web(void)
92 {
93    if (_elm_need_web++) return EINA_TRUE;
94    ewk_init();
95    return EINA_TRUE;
96 }
97
98 static void
99 _elm_web_smart_add(Evas_Object *obj)
100 {
101    EVAS_SMART_DATA_ALLOC(obj, Elm_Web_Smart_Data);
102
103    elm_widget_resize_object_set(obj, _view_add(obj), EINA_TRUE);
104
105    _elm_web_parent_sc->base.add(obj);
106
107    elm_widget_can_focus_set(obj, EINA_TRUE);
108 }
109
110 static void
111 _elm_web_smart_del(Evas_Object *obj)
112 {
113    _elm_web_parent_sc->base.del(obj); /* handles freeing sd */
114 }
115
116 static void
117 _elm_web_smart_set_user(Elm_Web_Smart_Class *sc)
118 {
119    ELM_WIDGET_CLASS(sc)->base.add = _elm_web_smart_add;
120    ELM_WIDGET_CLASS(sc)->base.del = _elm_web_smart_del;
121 }
122
123 EAPI const Elm_Web_Smart_Class *
124 elm_web_smart_class_get(void)
125 {
126    static Elm_Web_Smart_Class _sc =
127      ELM_WEB_SMART_CLASS_INIT_NAME_VERSION(ELM_WEB_SMART_NAME);
128    static const Elm_Web_Smart_Class *class = NULL;
129    Evas_Smart_Class *esc = (Evas_Smart_Class *)&_sc;
130
131    if (class) return class;
132
133    _elm_web_smart_set(&_sc);
134    esc->callbacks = _elm_web_smart_callbacks;
135    class = &_sc;
136
137    return class;
138 }
139
140 EAPI Evas_Object *
141 elm_web_add(Evas_Object *parent)
142 {
143    Evas_Object *obj;
144
145    EINA_SAFETY_ON_NULL_RETURN_VAL(parent, NULL);
146
147    obj = elm_widget_add(_elm_web_smart_class_new(), parent);
148    if (!obj) return NULL;
149
150    if (!elm_widget_sub_object_add(parent, obj))
151      ERR("could not add %p as sub object of %p", obj, parent);
152
153    //Tizen Only: This should be removed when eo is applied.
154    ELM_WIDGET_DATA_GET(obj, sd);
155    sd->on_create = EINA_FALSE;
156
157    return obj;
158 }
159
160 EAPI Evas_Object *
161 elm_web_webkit_view_get(const Evas_Object *obj)
162 {
163    ELM_WEB_CHECK(obj) NULL;
164
165    ELM_WEB_DATA_GET(obj, sd);
166
167    return ELM_WIDGET_DATA(sd)->resize_obj;
168 }
169
170 EAPI void
171 elm_web_window_create_hook_set(Evas_Object *obj,
172                                Elm_Web_Window_Open func,
173                                void *data)
174 {
175    ELM_WEB_CHECK(obj);
176
177    (void)func;
178    (void)data;
179 }
180
181 EAPI void
182 elm_web_dialog_alert_hook_set(Evas_Object *obj,
183                               Elm_Web_Dialog_Alert func,
184                               void *data)
185 {
186    ELM_WEB_CHECK(obj);
187
188    (void)func;
189    (void)data;
190 }
191
192 EAPI void
193 elm_web_dialog_confirm_hook_set(Evas_Object *obj,
194                                 Elm_Web_Dialog_Confirm func,
195                                 void *data)
196 {
197    ELM_WEB_CHECK(obj);
198
199    (void)func;
200    (void)data;
201 }
202
203 EAPI void
204 elm_web_dialog_prompt_hook_set(Evas_Object *obj,
205                                Elm_Web_Dialog_Prompt func,
206                                void *data)
207 {
208    ELM_WEB_CHECK(obj);
209
210    (void)func;
211    (void)data;
212 }
213
214 EAPI void
215 elm_web_dialog_file_selector_hook_set(Evas_Object *obj,
216                                       Elm_Web_Dialog_File_Selector func,
217                                       void *data)
218 {
219    ELM_WEB_CHECK(obj);
220
221    (void)func;
222    (void)data;
223 }
224
225 EAPI void
226 elm_web_console_message_hook_set(Evas_Object *obj,
227                                  Elm_Web_Console_Message func,
228                                  void *data)
229 {
230    ELM_WEB_CHECK(obj);
231
232    (void)func;
233    (void)data;
234 }
235
236 EAPI void
237 elm_web_useragent_set(Evas_Object *obj,
238                       const char *user_agent)
239 {
240    ELM_WEB_CHECK(obj);
241
242    // FIXME : need to implement
243    (void)user_agent;
244 }
245
246 EAPI const char *
247 elm_web_useragent_get(const Evas_Object *obj)
248 {
249    ELM_WEB_CHECK(obj) NULL;
250
251    // FIXME : need to implement
252    return NULL;
253 }
254
255 EAPI Eina_Bool
256 elm_web_uri_set(Evas_Object *obj,
257                 const char *uri)
258 {
259    ELM_WEB_CHECK(obj) EINA_FALSE;
260
261    ELM_WEB_DATA_GET(obj, sd);
262
263    return ewk_view_url_set(ELM_WIDGET_DATA(sd)->resize_obj, uri);
264 }
265
266 EAPI const char *
267 elm_web_uri_get(const Evas_Object *obj)
268 {
269    ELM_WEB_CHECK(obj) NULL;
270
271    ELM_WEB_DATA_GET(obj, sd);
272
273    return ewk_view_url_get(ELM_WIDGET_DATA(sd)->resize_obj);
274 }
275
276 EAPI const char *
277 elm_web_title_get(const Evas_Object *obj)
278 {
279    ELM_WEB_CHECK(obj) NULL;
280
281    ELM_WEB_DATA_GET(obj, sd);
282
283    return ewk_view_title_get(ELM_WIDGET_DATA(sd)->resize_obj);
284 }
285
286 EAPI void
287 elm_web_bg_color_set(Evas_Object *obj,
288                      int r,
289                      int g,
290                      int b,
291                      int a)
292 {
293    ELM_WEB_CHECK(obj);
294
295    (void)r;
296    (void)g;
297    (void)b;
298    (void)a;
299 }
300
301 EAPI void
302 elm_web_bg_color_get(const Evas_Object *obj,
303                      int *r,
304                      int *g,
305                      int *b,
306                      int *a)
307 {
308    ELM_WEB_CHECK(obj);
309
310    if (r) *r = 0;
311    if (g) *g = 0;
312    if (b) *b = 0;
313    if (a) *a = 0;
314 }
315
316 EAPI const char *
317 elm_web_selection_get(const Evas_Object *obj)
318 {
319    ELM_WEB_CHECK(obj) NULL;
320
321    return NULL;
322 }
323
324 EAPI void
325 elm_web_popup_selected_set(Evas_Object *obj,
326                            int idx)
327 {
328    ELM_WEB_CHECK(obj);
329
330    (void)idx;
331 }
332
333 EAPI Eina_Bool
334 elm_web_popup_destroy(Evas_Object *obj)
335 {
336    ELM_WEB_CHECK(obj) EINA_FALSE;
337
338    return EINA_FALSE;
339 }
340
341 EAPI Eina_Bool
342 elm_web_text_search(const Evas_Object *obj,
343                     const char *string,
344                     Eina_Bool case_sensitive,
345                     Eina_Bool forward,
346                     Eina_Bool wrap)
347 {
348    ELM_WEB_CHECK(obj) EINA_FALSE;
349
350    (void)string;
351    (void)case_sensitive;
352    (void)forward;
353    (void)wrap;
354    return EINA_FALSE;
355 }
356
357 EAPI unsigned int
358 elm_web_text_matches_mark(Evas_Object *obj,
359                           const char *string,
360                           Eina_Bool case_sensitive,
361                           Eina_Bool highlight,
362                           unsigned int limit)
363 {
364    ELM_WEB_CHECK(obj) 0;
365
366    (void)string;
367    (void)case_sensitive;
368    (void)highlight;
369    (void)limit;
370    return 0;
371 }
372
373 EAPI Eina_Bool
374 elm_web_text_matches_unmark_all(Evas_Object *obj)
375 {
376    ELM_WEB_CHECK(obj) EINA_FALSE;
377
378    return EINA_FALSE;
379 }
380
381 EAPI Eina_Bool
382 elm_web_text_matches_highlight_set(Evas_Object *obj,
383                                    Eina_Bool highlight)
384 {
385    ELM_WEB_CHECK(obj) EINA_FALSE;
386
387    (void)highlight;
388    return EINA_FALSE;
389 }
390
391 EAPI Eina_Bool
392 elm_web_text_matches_highlight_get(const Evas_Object *obj)
393 {
394    ELM_WEB_CHECK(obj) EINA_FALSE;
395
396    return EINA_FALSE;
397 }
398
399 EAPI double
400 elm_web_load_progress_get(const Evas_Object *obj)
401 {
402    ELM_WEB_CHECK(obj) - 1.0;
403
404    return EINA_FALSE;
405 }
406
407 EAPI Eina_Bool
408 elm_web_stop(Evas_Object *obj)
409 {
410    ELM_WEB_CHECK(obj) EINA_FALSE;
411
412    return EINA_FALSE;
413 }
414
415 EAPI Eina_Bool
416 elm_web_reload(Evas_Object *obj)
417 {
418    ELM_WEB_CHECK(obj) EINA_FALSE;
419
420    return EINA_FALSE;
421 }
422
423 EAPI Eina_Bool
424 elm_web_reload_full(Evas_Object *obj)
425 {
426    ELM_WEB_CHECK(obj) EINA_FALSE;
427
428    return EINA_FALSE;
429 }
430
431 EAPI Eina_Bool
432 elm_web_back(Evas_Object *obj)
433 {
434    ELM_WEB_CHECK(obj) EINA_FALSE;
435
436    return EINA_FALSE;
437 }
438
439 EAPI Eina_Bool
440 elm_web_forward(Evas_Object *obj)
441 {
442    ELM_WEB_CHECK(obj) EINA_FALSE;
443
444    return EINA_FALSE;
445 }
446
447 EAPI Eina_Bool
448 elm_web_navigate(Evas_Object *obj,
449                  int steps)
450 {
451    ELM_WEB_CHECK(obj) EINA_FALSE;
452
453    return EINA_FALSE;
454    (void)steps;
455 }
456
457 EAPI Eina_Bool
458 elm_web_back_possible_get(Evas_Object *obj)
459 {
460    ELM_WEB_CHECK(obj) EINA_FALSE;
461
462    return EINA_FALSE;
463 }
464
465 EAPI Eina_Bool
466 elm_web_forward_possible_get(Evas_Object *obj)
467 {
468    ELM_WEB_CHECK(obj) EINA_FALSE;
469
470    return EINA_FALSE;
471 }
472
473 EAPI Eina_Bool
474 elm_web_navigate_possible_get(Evas_Object *obj,
475                               int steps)
476 {
477    ELM_WEB_CHECK(obj) EINA_FALSE;
478
479    (void)steps;
480    return EINA_FALSE;
481 }
482
483 EAPI Eina_Bool
484 elm_web_history_enabled_get(const Evas_Object *obj)
485 {
486    ELM_WEB_CHECK(obj) EINA_FALSE;
487
488    return EINA_FALSE;
489 }
490
491 EAPI void
492 elm_web_history_enabled_set(Evas_Object *obj,
493                             Eina_Bool enable)
494 {
495    ELM_WEB_CHECK(obj);
496
497    (void)enable;
498 }
499
500 EAPI void
501 elm_web_zoom_set(Evas_Object *obj,
502                  double zoom)
503 {
504    ELM_WEB_CHECK(obj);
505
506    (void)zoom;
507 }
508
509 EAPI double
510 elm_web_zoom_get(const Evas_Object *obj)
511 {
512    ELM_WEB_CHECK(obj) - 1.0;
513
514    return -1.0;
515 }
516
517 EAPI void
518 elm_web_zoom_mode_set(Evas_Object *obj,
519                       Elm_Web_Zoom_Mode mode)
520 {
521    ELM_WEB_CHECK(obj);
522
523    (void)mode;
524 }
525
526 EAPI Elm_Web_Zoom_Mode
527 elm_web_zoom_mode_get(const Evas_Object *obj)
528 {
529    ELM_WEB_CHECK(obj) ELM_WEB_ZOOM_MODE_LAST;
530
531    return ELM_WEB_ZOOM_MODE_LAST;
532 }
533
534 EAPI void
535 elm_web_region_show(Evas_Object *obj,
536                     int x,
537                     int y,
538                     int w __UNUSED__,
539                     int h __UNUSED__)
540 {
541    ELM_WEB_CHECK(obj);
542
543    (void)x;
544    (void)y;
545 }
546
547 EAPI void
548 elm_web_region_bring_in(Evas_Object *obj,
549                         int x,
550                         int y,
551                         int w __UNUSED__,
552                         int h __UNUSED__)
553 {
554    ELM_WEB_CHECK(obj);
555
556    (void)x;
557    (void)y;
558 }
559
560 EAPI void
561 elm_web_inwin_mode_set(Evas_Object *obj,
562                        Eina_Bool value)
563 {
564    ELM_WEB_CHECK(obj);
565
566    (void)value;
567 }
568
569 EAPI Eina_Bool
570 elm_web_inwin_mode_get(const Evas_Object *obj)
571 {
572    ELM_WEB_CHECK(obj) EINA_FALSE;
573
574    return EINA_FALSE;
575 }
576
577 EAPI void
578 elm_web_window_features_ref(Elm_Web_Window_Features *wf)
579 {
580    // FIXME : need to implement
581    (void)wf;
582 }
583
584 EAPI void
585 elm_web_window_features_unref(Elm_Web_Window_Features *wf)
586 {
587    // FIXME : need to implement
588    (void)wf;
589 }
590
591 EAPI Eina_Bool
592 elm_web_window_features_property_get(const Elm_Web_Window_Features *wf,
593                                      Elm_Web_Window_Feature_Flag flag)
594 {
595    // FIXME : need to implement
596    (void)wf;
597    (void)flag;
598    return EINA_FALSE;
599 }
600
601 EAPI void
602 elm_web_window_features_region_get(const Elm_Web_Window_Features *wf,
603                                    Evas_Coord *x,
604                                    Evas_Coord *y,
605                                    Evas_Coord *w,
606                                    Evas_Coord *h)
607 {
608    // FIXME : need to implement
609    (void)wf;
610    (void)x;
611    (void)y;
612    (void)w;
613    (void)h;
614    return;
615 }
616 #endif