Tizen 2.1 base
[platform/framework/web/webkit-efl.git] / Tools / MiniBrowser / efl / main.c
1 /*
2  * Copyright (C) 2012 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 Lesser 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  *  Lesser General Public License for more details.
14  *
15  *  You should have received a copy of the GNU Lesser General Public
16  *  License along with this library; if not, write to the Free Software
17  *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
18  */
19
20 #include "EWebKit2.h"
21 #include <Ecore.h>
22 #include <Ecore_Evas.h>
23 #include <Eina.h>
24 #include <Evas.h>
25
26 static const int DEFAULT_WIDTH = 800;
27 static const int DEFAULT_HEIGHT = 600;
28 static const char DEFAULT_URL[] = "http://www.google.com/";
29 static const char APP_NAME[] = "EFL MiniBrowser";
30
31 #define info(format, args...)       \
32     do {                            \
33         if (verbose)                \
34             printf(format, ##args); \
35     } while (0)
36
37 static int verbose = 0;
38
39 typedef struct _MiniBrowser {
40     Ecore_Evas *ee;
41     Evas *evas;
42     Evas_Object *bg;
43     Evas_Object *browser;
44 } MiniBrowser;
45
46 static Eina_Bool main_signal_exit(void *data, int ev_type, void *ev)
47 {
48     ecore_main_loop_quit();
49     return EINA_TRUE;
50 }
51
52 static void closeWindow(Ecore_Evas *ee)
53 {
54     ecore_main_loop_quit();
55 }
56
57 static void on_ecore_evas_resize(Ecore_Evas *ee)
58 {
59     Evas_Object *webview;
60     Evas_Object *bg;
61     int w, h;
62
63     ecore_evas_geometry_get(ee, NULL, NULL, &w, &h);
64
65     bg = evas_object_name_find(ecore_evas_get(ee), "bg");
66     evas_object_move(bg, 0, 0);
67     evas_object_resize(bg, w, h);
68
69     webview = evas_object_name_find(ecore_evas_get(ee), "browser");
70     evas_object_move(webview, 0, 0);
71     evas_object_resize(webview, w, h);
72 }
73
74 static void
75 on_key_down(void *data, Evas *e, Evas_Object *obj, void *event_info)
76 {
77     Evas_Event_Key_Down *ev = (Evas_Event_Key_Down*) event_info;
78     static const char *encodings[] = {
79         "ISO-8859-1",
80         "UTF-8",
81         NULL
82     };
83     static int currentEncoding = -1;
84     if (!strcmp(ev->key, "F1")) {
85         info("Back (F1) was pressed\n");
86         if (!ewk_view_back(obj))
87             info("Back ignored: No back history\n");
88     } else if (!strcmp(ev->key, "F2")) {
89         info("Forward (F2) was pressed\n");
90         if (!ewk_view_forward(obj))
91             info("Forward ignored: No forward history\n");
92     } else if (!strcmp(ev->key, "F3")) {
93         currentEncoding = (currentEncoding + 1) % (sizeof(encodings) / sizeof(encodings[0]));
94         info("Set encoding (F3) pressed. New encoding to %s", encodings[currentEncoding]);
95         ewk_view_setting_encoding_custom_set(obj, encodings[currentEncoding]);
96     } else if (!strcmp(ev->key, "F5")) {
97             info("Reload (F5) was pressed, reloading.\n");
98             ewk_view_reload(obj);
99     } else if (!strcmp(ev->key, "F6")) {
100             info("Stop (F6) was pressed, stop loading.\n");
101             ewk_view_stop(obj);
102     }
103 }
104
105 static void
106 title_set(Ecore_Evas *ee, const char *title, int progress)
107 {
108     Eina_Strbuf* buffer;
109
110     if (!title || !*title) {
111         ecore_evas_title_set(ee, APP_NAME);
112         return;
113     }
114
115     buffer = eina_strbuf_new();
116     if (progress < 100)
117         eina_strbuf_append_printf(buffer, "%s (%d%%) - %s", title, progress, APP_NAME);
118     else
119         eina_strbuf_append_printf(buffer, "%s - %s", title, APP_NAME);
120
121     ecore_evas_title_set(ee, eina_strbuf_string_get(buffer));
122     eina_strbuf_free(buffer);
123 }
124
125 static void
126 on_title_changed(void *user_data, Evas_Object *webview, void *event_info)
127 {
128     MiniBrowser *app = (MiniBrowser *)user_data;
129     const char *title = (const char *)event_info;
130
131     title_set(app->ee, title, 100);
132 }
133
134 static void
135 on_progress(void *user_data, Evas_Object *webview, void *event_info)
136 {
137     MiniBrowser *app = (MiniBrowser *)user_data;
138     double progress = *(double *)event_info;
139
140     title_set(app->ee, ewk_view_title_get(app->browser), progress * 100);
141 }
142
143 static void
144 on_error(void *user_data, Evas_Object *webview, void *event_info)
145 {
146     Eina_Strbuf* buffer;
147     const Ewk_Web_Error *error = (const Ewk_Web_Error *)event_info;
148
149     buffer = eina_strbuf_new();
150     eina_strbuf_append_printf(buffer, "<html><body><div style=\"color:#ff0000\">ERROR!</div><br><div>Code: %d<br>Description: %s<br>URL: %s</div></body</html>",
151                               ewk_web_error_code_get(error), ewk_web_error_description_get(error), ewk_web_error_url_get(error));
152
153     ewk_view_html_string_load(webview, eina_strbuf_string_get(buffer), 0, ewk_web_error_url_get(error));
154     eina_strbuf_free(buffer);
155 }
156
157 static MiniBrowser *browserCreate(const char *url)
158 {
159     MiniBrowser *app = malloc(sizeof(MiniBrowser));
160
161     app->ee = ecore_evas_new(0, 0, 0, DEFAULT_WIDTH, DEFAULT_HEIGHT, 0);
162
163     ecore_evas_title_set(app->ee, APP_NAME);
164     ecore_evas_callback_resize_set(app->ee, on_ecore_evas_resize);
165     ecore_evas_borderless_set(app->ee, 0);
166     ecore_evas_show(app->ee);
167     ecore_evas_callback_delete_request_set(app->ee, closeWindow);
168
169     app->evas = ecore_evas_get(app->ee);
170
171     app->bg = evas_object_rectangle_add(app->evas);
172     evas_object_name_set(app->bg, "bg");
173     evas_object_size_hint_weight_set(app->bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
174
175     evas_object_move(app->bg, 0, 0);
176     evas_object_resize(app->bg, DEFAULT_WIDTH, DEFAULT_HEIGHT);
177     evas_object_color_set(app->bg, 255, 150, 150, 255);
178     evas_object_show(app->bg);
179
180     /* Create webview */
181     app->browser = ewk_view_add(app->evas);
182     ewk_view_theme_set(app->browser, THEME_DIR"/default.edj");
183     evas_object_name_set(app->browser, "browser");
184
185     evas_object_smart_callback_add(app->browser, "load,error", on_error, app);
186     evas_object_smart_callback_add(app->browser, "load,progress", on_progress, app);
187     evas_object_smart_callback_add(app->browser, "title,changed", on_title_changed, app);
188
189     evas_object_event_callback_add(app->browser, EVAS_CALLBACK_KEY_DOWN, on_key_down, app);
190
191     evas_object_size_hint_weight_set(app->browser, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
192     evas_object_resize(app->browser, DEFAULT_WIDTH, DEFAULT_HEIGHT);
193     evas_object_show(app->browser);
194     evas_object_focus_set(app->browser, EINA_TRUE);
195
196     ewk_view_url_set(app->browser, url);
197
198     return app;
199 }
200
201 int main(int argc, char *argv[])
202 {
203     const char *url;
204     int args = 1;
205
206     if (!ewk_init())
207         return EXIT_FAILURE;
208
209     if (args < argc)
210         url = argv[args];
211     else
212         url = DEFAULT_URL;
213
214     MiniBrowser *browser = browserCreate(url);
215
216     Ecore_Event_Handler *handle = ecore_event_handler_add(ECORE_EVENT_SIGNAL_EXIT, main_signal_exit, 0);
217
218     ecore_main_loop_begin();
219
220     ecore_event_handler_del(handle);
221     ecore_evas_free(browser->ee);
222     free(browser);
223
224     ewk_shutdown();
225
226     return 0;
227 }