1 /*
2  * gcc -o web_example_02 web_example_02.c `pkg-config --cflags --libs elementary ewebkit` -D_GNU_SOURCE
3  */
4 #ifndef _GNU_SOURCE
5 # define _GNU_SOURCE
6 #endif
7 
8 #include <Elementary.h>
9 #ifdef HAVE_ELEMENTARY_WEB
10 #include <EWebKit.h>
11 #endif
12 
13 typedef struct _Tab_Data Tab_Data;
14 
15 typedef struct
16 {
17    Evas_Object *win;
18    Evas_Object *main_box;
19    Evas_Object *naviframe;
20    Evas_Object *url_entry;
21    Evas_Object *default_web;
22    Evas_Object *tabs;
23    Evas_Object *close_tab;
24    Evas_Object *search_box;
25    Evas_Object *search_entry;
26 
27    struct {
28         Evas_Object *back;
29         Evas_Object *fwd;
30         Evas_Object *refresh;
31    } nav;
32 
33    Tab_Data *current_tab;
34 
35    Eina_Bool exiting : 1;
36 } App_Data;
37 
38 struct _Tab_Data
39 {
40    Evas_Object *web;
41    App_Data *app;
42    Elm_Object_Item *tab;
43 };
44 
45 static Evas_Object * _web_create_window_cb(void *data, Evas_Object *obj, Eina_Bool js, const Elm_Web_Window_Features *wf);
46 
47 static void
nav_button_update(App_Data * ad)48 nav_button_update(App_Data *ad)
49 {
50    Eina_Bool back, fwd;
51 
52    back = !elm_web_back_possible_get(ad->current_tab->web);
53    fwd = !elm_web_forward_possible_get(ad->current_tab->web);
54 
55    elm_object_disabled_set(ad->nav.back, back);
56    elm_object_disabled_set(ad->nav.fwd, fwd);
57 }
58 
59 static void
tab_current_set(Tab_Data * td)60 tab_current_set(Tab_Data *td)
61 {
62    const char *url;
63 
64    if (td == td->app->current_tab)
65      return;
66 
67    td->app->current_tab = td;
68 
69    url = elm_web_url_get(td->web);
70    elm_object_text_set(td->app->url_entry, url);
71 
72    nav_button_update(td->app);
73    elm_entry_icon_visible_set(td->app->url_entry, EINA_TRUE);
74 
75    elm_naviframe_item_simple_promote(td->app->naviframe, td->web);
76 }
77 
78 static void
_tab_clicked_cb(void * data,Evas_Object * obj EINA_UNUSED,void * event_info)79 _tab_clicked_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info)
80 {
81    Tab_Data *td = data;
82    /* the first toolbar_item_append() calls the select callback before the item
83     * is assigned, so we need a workaround for that. */
84    if (!td->tab)
85      td->tab = event_info;
86    tab_current_set(td);
87 }
88 
89 static void
_title_changed_cb(void * data,Evas_Object * obj EINA_UNUSED,void * event_info)90 _title_changed_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info)
91 {
92    Tab_Data *td = data;
93    const char *title = event_info;
94    char buf[20] = "";
95 
96    if (title)
97      strncpy(buf, title, sizeof(buf) - 1);
98    elm_object_item_text_set(td->tab, buf);
99 }
100 
101 static void
_url_changed_cb(void * data,Evas_Object * obj EINA_UNUSED,void * event_info)102 _url_changed_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info)
103 {
104    Tab_Data *td = data;
105    const char *url = event_info;
106 
107    if (td != td->app->current_tab)
108      return;
109 
110    nav_button_update(td->app);
111    elm_object_text_set(td->app->url_entry, url);
112 }
113 
114 static void
_web_free_cb(void * data,Evas * e EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)115 _web_free_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
116 {
117    Tab_Data *td = data;
118 
119    if (td->tab)
120      elm_object_item_del(td->tab);
121 
122    free(td);
123 }
124 
125 static void
_tb_item_del_cb(void * data,Evas_Object * obj,void * event_info EINA_UNUSED)126 _tb_item_del_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
127 {
128    Tab_Data *td = data;
129    if (!td->app->exiting && !elm_toolbar_selected_item_get(obj))
130      {
131         td->app->current_tab = NULL;
132         elm_entry_icon_visible_set(td->app->url_entry, EINA_FALSE);
133         if (td->app->search_box)
134           evas_object_del(td->app->search_box);
135      }
136    td->tab = NULL;
137 }
138 
139 Tab_Data *
tab_add(App_Data * ad)140 tab_add(App_Data *ad)
141 {
142    Tab_Data *td;
143 
144    td = calloc(1, sizeof(Tab_Data));
145    if (!td) return NULL;
146 
147    td->web = elm_web_add(ad->win);
148    elm_web_window_create_hook_set(td->web, _web_create_window_cb, ad);
149    elm_web_inwin_mode_set(td->web, EINA_TRUE);
150    evas_object_size_hint_weight_set(td->web, EVAS_HINT_EXPAND,
151                                     EVAS_HINT_EXPAND);
152    evas_object_size_hint_align_set(td->web, EVAS_HINT_FILL, EVAS_HINT_FILL);
153    elm_naviframe_item_simple_push(ad->naviframe, td->web);
154 
155    td->app = ad;
156    td->tab = elm_toolbar_item_append(td->app->tabs, NULL, "New tab",
157                                      _tab_clicked_cb, td);
158    elm_object_item_del_cb_set(td->tab, _tb_item_del_cb);
159 
160    evas_object_data_set(td->web, "tab_data", td);
161 
162    evas_object_smart_callback_add(td->web, "title,changed", _title_changed_cb,
163                                   td);
164    evas_object_smart_callback_add(td->web, "url,changed", _url_changed_cb, td);
165    evas_object_event_callback_add(td->web, EVAS_CALLBACK_FREE, _web_free_cb,
166                                   td);
167 
168    elm_toolbar_item_selected_set(td->tab, EINA_TRUE);
169    return td;
170 }
171 
172 static char *
url_sanitize(const char * url)173 url_sanitize(const char *url)
174 {
175    char *fixed_url;
176    char *schema;
177    char *tmp;
178 
179    if (!url || !*url) return NULL;
180 
181    tmp = strstr(url, "://");
182    if (!tmp || (tmp == url) || (tmp > (url + 15)))
183      {
184         char *new_url = NULL;
185         if (ecore_file_exists(url))
186           {
187              schema = "file";
188              new_url = ecore_file_realpath(url);
189           }
190         else
191           schema = "http";
192 
193         if (asprintf(&fixed_url, "%s://%s", schema, new_url ? new_url : url) >
194             0)
195           {
196              free(new_url);
197              return fixed_url;
198           }
199         free(new_url);
200      }
201    else
202      return strdup(url);
203 
204    return NULL;
205 }
206 
207 static void
tab_url_set(Tab_Data * td,const char * url)208 tab_url_set(Tab_Data *td, const char *url)
209 {
210    char *sane_url = url_sanitize(url);
211    elm_web_url_set(td->web, sane_url);
212    free(sane_url);
213 }
214 
215 static void
_url_entry_activated_cb(void * data,Evas_Object * obj,void * event_info EINA_UNUSED)216 _url_entry_activated_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
217 {
218    App_Data *ad = data;
219    Tab_Data *td;
220    const char *url = eina_stringshare_ref(elm_object_text_get(obj));
221 
222    if (!ad->current_tab)
223      td = tab_add(ad);
224    else
225      td = ad->current_tab;
226    tab_url_set(td, url);
227    eina_stringshare_del(url);
228 }
229 
230 static void
_nav_back_cb(void * data,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)231 _nav_back_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
232 {
233    App_Data *ad = data;
234 
235    elm_web_back(ad->current_tab->web);
236 }
237 
238 static void
_nav_refresh_cb(void * data,Evas_Object * obj,void * event_info EINA_UNUSED)239 _nav_refresh_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
240 {
241    App_Data *ad = data;
242    const Evas_Modifier *mods = evas_key_modifier_get(evas_object_evas_get(obj));
243 
244    if (evas_key_modifier_is_set(mods, "Shift"))
245      elm_web_reload_full(ad->current_tab->web);
246    else
247      elm_web_reload(ad->current_tab->web);
248 }
249 
250 static void
_nav_fwd_cb(void * data,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)251 _nav_fwd_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
252 {
253    App_Data *ad = data;
254 
255    elm_web_forward(ad->current_tab->web);
256 }
257 
258 static void
_close_tab_cb(void * data,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)259 _close_tab_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
260 {
261    App_Data *ad = data;
262 
263    if (!ad->current_tab)
264      return;
265    evas_object_del(ad->current_tab->web);
266 }
267 
268 static void
_add_tab_cb(void * data,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)269 _add_tab_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
270 {
271    App_Data *ad = data;
272    tab_add(ad);
273    elm_object_focus_set(ad->url_entry, EINA_TRUE);
274 }
275 
276 static Evas_Object *
_web_create_window_cb(void * data,Evas_Object * obj EINA_UNUSED,Eina_Bool js EINA_UNUSED,const Elm_Web_Window_Features * wf EINA_UNUSED)277 _web_create_window_cb(void *data, Evas_Object *obj EINA_UNUSED,
278                       Eina_Bool js EINA_UNUSED, const Elm_Web_Window_Features *wf EINA_UNUSED)
279 {
280    App_Data *ad = data;
281    Tab_Data *td;
282 
283    td = tab_add(ad);
284    return td->web;
285 }
286 
287 static void
_win_del_request_cb(void * data,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)288 _win_del_request_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
289 {
290    App_Data *ad = data;
291    ad->exiting = EINA_TRUE;
292 }
293 
294 static void
_win_free_cb(void * data,Evas * e EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)295 _win_free_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
296 {
297    free(data);
298 }
299 
300 static void
_search_entry_changed_cb(void * data,Evas_Object * obj,void * event_info EINA_UNUSED)301 _search_entry_changed_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
302 {
303    App_Data *ad = data;
304    const char *text;
305 
306    text = elm_object_text_get(obj);
307    elm_web_text_search(ad->current_tab->web, text, EINA_FALSE, EINA_TRUE,
308                        EINA_TRUE);
309    elm_web_text_matches_unmark_all(ad->current_tab->web);
310    elm_web_text_matches_mark(ad->current_tab->web, text, EINA_FALSE, EINA_TRUE,
311                              0);
312 }
313 
314 static void
_search_entry_activate_cb(void * data,Evas_Object * obj,void * event_info EINA_UNUSED)315 _search_entry_activate_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
316 {
317    App_Data *ad = data;
318    const char *text;
319 
320    text = elm_object_text_get(obj);
321    elm_web_text_search(ad->current_tab->web, text, EINA_FALSE, EINA_TRUE,
322                        EINA_TRUE);
323 }
324 
325 static void
_search_next_cb(void * data,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)326 _search_next_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
327 {
328    App_Data *ad = data;
329    const char *text;
330 
331    text = elm_object_text_get(ad->search_entry);
332    elm_web_text_search(ad->current_tab->web, text, EINA_FALSE, EINA_TRUE,
333                        EINA_TRUE);
334 }
335 
336 static void
_search_prev_cb(void * data,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)337 _search_prev_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
338 {
339    App_Data *ad = data;
340    const char *text;
341 
342    text = elm_object_text_get(ad->search_entry);
343    elm_web_text_search(ad->current_tab->web, text, EINA_FALSE, EINA_FALSE,
344                        EINA_TRUE);
345 }
346 
347 static void
_search_close_cb(void * data,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)348 _search_close_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
349 {
350    App_Data *ad = data;
351    evas_object_del(ad->search_box);
352 }
353 
354 static void
_search_box_del_cb(void * data,Evas * e EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)355 _search_box_del_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
356 {
357    App_Data *ad = data;
358    ad->search_box = NULL;
359    ad->search_entry = NULL;
360 }
361 
362 static void
_win_search_trigger_cb(void * data,Evas * e EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info)363 _win_search_trigger_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
364 {
365    Evas_Event_Key_Down *ev = event_info;
366    App_Data *ad = data;
367    Evas_Object *box, *box2, *entry, *btn, *ic;
368 
369    if (strcmp(ev->keyname, "f") ||
370        !evas_key_modifier_is_set(ev->modifiers, "Control"))
371      return;
372    if (ad->search_box || !ad->current_tab)
373      return;
374 
375    box = elm_box_add(ad->win);
376    elm_box_horizontal_set(box, EINA_TRUE);
377    evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, 0.0);
378    evas_object_size_hint_align_set(box, EVAS_HINT_FILL, EVAS_HINT_FILL);
379    elm_box_pack_after(ad->main_box, box, ad->url_entry);
380    evas_object_show(box);
381 
382    evas_object_event_callback_add(box, EVAS_CALLBACK_DEL, _search_box_del_cb,
383                                   ad);
384 
385    entry = elm_entry_add(ad->win);
386    elm_entry_single_line_set(entry, EINA_TRUE);
387    elm_entry_scrollable_set(entry, EINA_TRUE);
388    evas_object_size_hint_weight_set(entry, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
389    evas_object_size_hint_align_set(entry, EVAS_HINT_FILL, EVAS_HINT_FILL);
390    elm_box_pack_end(box, entry);
391    evas_object_show(entry);
392 
393    evas_object_smart_callback_add(entry, "changed", _search_entry_changed_cb,
394                                   ad);
395    evas_object_smart_callback_add(entry, "activated", _search_entry_activate_cb,
396                                   ad);
397 
398    box2 = elm_box_add(ad->win);
399    elm_box_horizontal_set(box2, EINA_TRUE);
400    elm_object_part_content_set(entry, "end", box2);
401 
402    btn = elm_button_add(ad->win);
403    elm_box_pack_end(box2, btn);
404    evas_object_show(btn);
405 
406    ic = elm_icon_add(ad->win);
407    elm_icon_standard_set(ic, "arrow_up");
408    elm_object_part_content_set(btn, "icon", ic);
409 
410    evas_object_smart_callback_add(btn, "clicked", _search_prev_cb, ad);
411 
412    btn = elm_button_add(ad->win);
413    elm_box_pack_end(box2, btn);
414    evas_object_show(btn);
415 
416    ic = elm_icon_add(ad->win);
417    elm_icon_standard_set(ic, "arrow_down");
418    elm_object_part_content_set(btn, "icon", ic);
419 
420    evas_object_smart_callback_add(btn, "clicked", _search_next_cb, ad);
421 
422    btn = elm_button_add(ad->win);
423    elm_box_pack_end(box, btn);
424    evas_object_show(btn);
425 
426    ic = elm_icon_add(ad->win);
427    elm_icon_standard_set(ic, "close");
428    elm_object_part_content_set(btn, "icon", ic);
429 
430    evas_object_smart_callback_add(btn, "clicked", _search_close_cb, ad);
431 
432    ad->search_box = box;
433    ad->search_entry = entry;
434 
435    elm_object_focus_set(entry, EINA_TRUE);
436 }
437 
438 static void
default_content_set(Evas_Object * web)439 default_content_set(Evas_Object *web)
440 {
441 #ifdef HAVE_ELEMENTARY_WEB
442    Evas_Object *view, *frame;
443    const char contents[] = ""
444       "<html>\n"
445       "  <head>\n"
446       "    <title>Nothing to see here, move along</title>\n"
447       "  </head>\n"
448       "  <body>\n"
449       "    <a href=\"http://www.enlightenment.org\" target=\"_blank\">E</a>\n"
450       "    <br />\n"
451       "    <a href=\"http://www.google.com\" target=\"_blank\">Google</a>\n"
452       "    <br />\n"
453       "  </body>\n"
454       "</html>\n";
455 
456    view = elm_web_webkit_view_get(web);
457    frame = ewk_view_frame_main_get(view);
458    ewk_frame_contents_set(frame, contents, sizeof(contents) - 1, "text/html",
459                           "UTF-8", NULL);
460 #else
461    (void) web;
462 #endif
463 }
464 
465 EAPI_MAIN int
elm_main(int argc EINA_UNUSED,char ** argv EINA_UNUSED)466 elm_main(int argc EINA_UNUSED, char **argv EINA_UNUSED)
467 {
468    Evas_Object *win, *box, *box2, *btn, *ic, *url_bar, *naviframe, *tabs, *web;
469    Evas *e;
470    Evas_Modifier_Mask ctrl_mask;
471    App_Data *ad;
472 
473    if (!elm_need_web())
474      return -1;
475 
476    ad = calloc(1, sizeof(App_Data));
477    if (!ad) return -1;
478 
479    elm_policy_set(ELM_POLICY_QUIT, ELM_POLICY_QUIT_LAST_WINDOW_CLOSED);
480 
481    win = elm_win_util_standard_add("example-web", "Web Example");
482    elm_win_autodel_set(win, EINA_TRUE);
483 
484    e = evas_object_evas_get(win);
485    ctrl_mask = evas_key_modifier_mask_get(e, "Control");
486    if (!evas_object_key_grab(win, "f", ctrl_mask, 0, EINA_TRUE))
487      fprintf(stderr, "Could not grab trigger for search dialog\n");
488 
489    evas_object_smart_callback_add(win, "delete,request", _win_del_request_cb,
490                                   ad);
491    evas_object_event_callback_add(win, EVAS_CALLBACK_KEY_DOWN,
492                                   _win_search_trigger_cb, ad);
493    evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _win_free_cb, ad);
494 
495    box = elm_box_add(win);
496    evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
497    elm_win_resize_object_add(win, box);
498    evas_object_show(box);
499 
500    url_bar = elm_entry_add(win);
501    elm_entry_single_line_set(url_bar, EINA_TRUE);
502    elm_entry_scrollable_set(url_bar, EINA_TRUE);
503    evas_object_size_hint_weight_set(url_bar, EVAS_HINT_EXPAND, 0.0);
504    evas_object_size_hint_align_set(url_bar, EVAS_HINT_FILL, EVAS_HINT_FILL);
505    elm_box_pack_end(box, url_bar);
506    evas_object_show(url_bar);
507 
508    evas_object_smart_callback_add(url_bar, "activated", _url_entry_activated_cb, ad);
509 
510    box2 = elm_box_add(win);
511    elm_box_horizontal_set(box2, EINA_TRUE);
512    elm_object_part_content_set(url_bar, "icon", box2);
513    elm_entry_icon_visible_set(url_bar, EINA_FALSE);
514 
515    btn = elm_button_add(win);
516    elm_box_pack_end(box2, btn);
517    evas_object_show(btn);
518 
519    ad->nav.back = btn;
520 
521    ic = elm_icon_add(win);
522    elm_icon_standard_set(ic, "arrow_left");
523    elm_object_part_content_set(btn, "icon", ic);
524 
525    evas_object_smart_callback_add(btn, "clicked", _nav_back_cb, ad);
526 
527    btn = elm_button_add(win);
528    elm_box_pack_end(box2, btn);
529    evas_object_show(btn);
530 
531    ad->nav.refresh = btn;
532 
533    ic = elm_icon_add(win);
534    elm_icon_standard_set(ic, "refresh");
535    elm_object_part_content_set(btn, "icon", ic);
536 
537    evas_object_smart_callback_add(btn, "clicked", _nav_refresh_cb, ad);
538 
539    btn = elm_button_add(win);
540    elm_box_pack_end(box2, btn);
541    evas_object_show(btn);
542 
543    ad->nav.fwd = btn;
544 
545    ic = elm_icon_add(win);
546    elm_icon_standard_set(ic, "arrow_right");
547    elm_object_part_content_set(btn, "icon", ic);
548 
549    evas_object_smart_callback_add(btn, "clicked", _nav_fwd_cb, ad);
550 
551    box2 = elm_box_add(win);
552    elm_box_horizontal_set(box2, EINA_TRUE);
553    evas_object_size_hint_weight_set(box2, EVAS_HINT_EXPAND, 0.0);
554    evas_object_size_hint_align_set(box2, EVAS_HINT_FILL, EVAS_HINT_FILL);
555    elm_box_pack_end(box, box2);
556    evas_object_show(box2);
557 
558    btn = elm_button_add(win);
559    elm_box_pack_end(box2, btn);
560    evas_object_show(btn);
561 
562    ic = elm_icon_add(win);
563    elm_icon_standard_set(ic, "file");
564    elm_object_part_content_set(btn, "icon", ic);
565 
566    evas_object_smart_callback_add(btn, "clicked", _add_tab_cb, ad);
567 
568    tabs = elm_toolbar_add(win);
569    elm_toolbar_align_set(tabs, 0.0);
570    elm_toolbar_select_mode_set(tabs, ELM_OBJECT_SELECT_MODE_ALWAYS);
571    elm_toolbar_homogeneous_set(tabs, EINA_FALSE);
572    elm_toolbar_shrink_mode_set(tabs, ELM_TOOLBAR_SHRINK_MENU);
573    evas_object_size_hint_weight_set(tabs, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
574    evas_object_size_hint_align_set(tabs, EVAS_HINT_FILL, EVAS_HINT_FILL);
575    elm_box_pack_end(box2, tabs);
576    evas_object_show(tabs);
577 
578    btn = elm_button_add(win);
579    elm_box_pack_end(box2, btn);
580    evas_object_show(btn);
581 
582    evas_object_smart_callback_add(btn, "clicked", _close_tab_cb, ad);
583 
584    ic = elm_icon_add(win);
585    elm_icon_standard_set(ic, "close");
586    elm_object_part_content_set(btn, "icon", ic);
587 
588    naviframe = elm_naviframe_add(win);
589    evas_object_size_hint_weight_set(naviframe, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
590    evas_object_size_hint_align_set(naviframe, EVAS_HINT_FILL, EVAS_HINT_FILL);
591    elm_box_pack_end(box, naviframe);
592    evas_object_show(naviframe);
593 
594    elm_toolbar_menu_parent_set(tabs, naviframe);
595 
596    web = elm_web_add(win);
597    elm_web_window_create_hook_set(web, _web_create_window_cb, ad);
598    elm_web_history_enabled_set(web, EINA_FALSE);
599    evas_object_size_hint_weight_set(web, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
600    evas_object_size_hint_align_set(web, EVAS_HINT_FILL, EVAS_HINT_FILL);
601    elm_naviframe_item_simple_push(naviframe, web);
602 
603    default_content_set(web);
604 
605    ad->win = win;
606    ad->main_box = box;
607    ad->naviframe = naviframe;
608    ad->url_entry = url_bar;
609    ad->default_web = web;
610    ad->tabs = tabs;
611    ad->close_tab = btn;
612 
613    evas_object_resize(win, 480, 640);
614    evas_object_show(win);
615 
616    elm_run();
617 
618    return 0;
619 }
620 ELM_MAIN()
621