20051ea9654b81b8a90c217260630bb649323152
[WebKit-https.git] / Source / WebKit / efl / ewk / ewk_settings.cpp
1 /*
2     Copyright (C) 2009-2010 ProFUSION embedded systems
3     Copyright (C) 2009-2010 Samsung Electronics
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 "ewk_settings.h"
23
24 #include "EWebKit.h"
25 #if ENABLE(DATABASE)
26 #include "DatabaseTracker.h"
27 #endif
28 #include "IconDatabase.h"
29 #include "Image.h"
30 #include "IntSize.h"
31 #include "KURL.h"
32 #include "Language.h"
33 #include "ewk_private.h"
34
35 #include <Eina.h>
36 #include <eina_safety_checks.h>
37 #include <errno.h>
38 #include <string.h>
39 #include <sys/stat.h>
40 #include <sys/types.h>
41 #include <sys/utsname.h>
42 #include <unistd.h>
43 #include <wtf/text/CString.h>
44 #include <wtf/text/StringConcatenate.h>
45
46 #if USE(SOUP)
47 #include "ResourceHandle.h"
48 #include <libsoup/soup.h>
49 #endif
50
51 static const char* _ewk_default_web_database_path = 0;
52 static const char* _ewk_icon_database_path = 0;
53 static uint64_t _ewk_default_web_database_quota = 1 * 1024 * 1024;
54
55 static WTF::String _ewk_settings_webkit_platform_get()
56 {
57     WTF::String ua_platform;
58 #if PLATFORM(X11)
59     ua_platform = "X11";
60 #else
61     ua_platform = "Unknown";
62 #endif
63     return ua_platform;
64 }
65
66 static WTF::String _ewk_settings_webkit_os_version_get()
67 {
68     WTF::String ua_os_version;
69     struct utsname name;
70
71     if (uname(&name) != -1)
72         ua_os_version = WTF::String(name.sysname) + " " + WTF::String(name.machine);
73     else
74         ua_os_version = "Unknown";
75
76     return ua_os_version;
77 }
78
79 /**
80  * Returns the default quota for Web Database databases. By default
81  * this value is 1MB.
82  *
83  * @return the current default database quota in bytes
84  **/
85 uint64_t ewk_settings_web_database_default_quota_get()
86 {
87     return _ewk_default_web_database_quota;
88 }
89
90 /**
91  * Sets the current path to the directory WebKit will write Web
92  * Database databases.
93  *
94  * @path: the new database directory path
95  *
96  */
97 void ewk_settings_web_database_path_set(const char *path)
98 {
99 #if ENABLE(DATABASE)
100     WTF::String corePath = WTF::String::fromUTF8(path);
101     WebCore::DatabaseTracker::tracker().setDatabaseDirectoryPath(corePath);
102     if (!_ewk_default_web_database_path)
103         _ewk_default_web_database_path = eina_stringshare_add(corePath.utf8().data());
104     else
105         eina_stringshare_replace(&_ewk_default_web_database_path, corePath.utf8().data());
106
107 #endif
108 }
109
110 /**
111  * Return directory path where web database is stored.
112  *
113  * @return database path or NULL if none or web database is not supported.
114  *         This is guaranteed to be eina_stringshare, so whenever possible
115  *         save yourself some cpu cycles and use
116  *         eina_stringshare_ref() instead of eina_stringshare_add() or
117  *         strdup().
118  */
119 const char *ewk_settings_web_database_path_get()
120 {
121 #if ENABLE(DATABASE)
122     return _ewk_default_web_database_path;
123 #else
124     return 0;
125 #endif
126 }
127
128 /**
129  * Sets directory where to store icon database, opening database.
130  *
131  * @param directory where to store icon database, must be
132  *        write-able. If @c NULL is given, then database is closed.
133  *
134  * @return @c EINA_TRUE on success, @c EINA_FALSE on errors.
135  */
136 Eina_Bool ewk_settings_icon_database_path_set(const char *directory)
137 {
138     WebCore::iconDatabase()->delayDatabaseCleanup();
139
140     if (directory) {
141         struct stat st;
142
143         if (stat(directory, &st)) {
144             ERR("could not stat(%s): %s", directory, strerror(errno));
145             return EINA_FALSE;
146         }
147
148         if (!S_ISDIR(st.st_mode)) {
149             ERR("not a directory: %s", directory);
150             return EINA_FALSE;
151         }
152
153         if (access(directory, R_OK | W_OK)) {
154             ERR("could not access directory '%s' for read and write: %s",
155                 directory, strerror(errno));
156             return EINA_FALSE;
157         }
158
159         WebCore::iconDatabase()->setEnabled(true);
160         WebCore::iconDatabase()->open(WTF::String::fromUTF8(directory));
161         if (!_ewk_icon_database_path)
162             _ewk_icon_database_path = eina_stringshare_add(directory);
163         else
164             eina_stringshare_replace(&_ewk_icon_database_path, directory);
165     } else {
166         WebCore::iconDatabase()->setEnabled(false);
167         WebCore::iconDatabase()->close();
168         if (_ewk_icon_database_path) {
169             eina_stringshare_del(_ewk_icon_database_path);
170             _ewk_icon_database_path = 0;
171         }
172     }
173     return EINA_TRUE;
174 }
175
176 /**
177  * Return directory path where icon database is stored.
178  *
179  * @return database path or @c NULL if none is set or database is closed.
180  *         This is guaranteed to be eina_stringshare, so whenever possible
181  *         save yourself some cpu cycles and use
182  *         eina_stringshare_ref() instead of eina_stringshare_add() or
183  *         strdup().
184  */
185 const char* ewk_settings_icon_database_path_get(void)
186 {
187     if (!WebCore::iconDatabase()->isEnabled())
188         return 0;
189     if (!WebCore::iconDatabase()->isOpen())
190         return 0;
191
192     return _ewk_icon_database_path;
193 }
194
195 /**
196  * Remove all known icons from database.
197  *
198  * Database must be opened with ewk_settings_icon_database_path_set()
199  * in order to work.
200  *
201  * @return @c EINA_TRUE on success or @c EINA_FALSE otherwise, like
202  *         closed database.
203  */
204 Eina_Bool ewk_settings_icon_database_clear(void)
205 {
206     if (!WebCore::iconDatabase()->isEnabled())
207         return EINA_FALSE;
208     if (!WebCore::iconDatabase()->isOpen())
209         return EINA_FALSE;
210
211     WebCore::iconDatabase()->removeAllIcons();
212     return EINA_TRUE;
213 }
214
215 /**
216  * Query icon for given URL, returning associated cairo surface.
217  *
218  * @note in order to have this working, one must open icon database
219  *       with ewk_settings_icon_database_path_set().
220  *
221  * @param url which url to query icon.
222  *
223  * @return cairo surface if any, or NULL on failure.
224  */
225 cairo_surface_t* ewk_settings_icon_database_icon_surface_get(const char *url)
226 {
227     EINA_SAFETY_ON_NULL_RETURN_VAL(url, 0);
228
229     WebCore::KURL kurl(WebCore::KURL(), WTF::String::fromUTF8(url));
230     WebCore::Image *icon = WebCore::iconDatabase()->iconForPageURL(kurl.string(), WebCore::IntSize(16, 16));
231
232     if (!icon) {
233         ERR("no icon for url %s", url);
234         return 0;
235     }
236
237     return icon->nativeImageForCurrentFrame();
238 }
239
240 /**
241  * Create Evas_Object of type image representing the given URL.
242  *
243  * This is an utility function that creates an Evas_Object of type
244  * image set to have fill always match object size
245  * (evas_object_image_filled_add()), saving some code to use it from Evas.
246  *
247  * @note in order to have this working, one must open icon database
248  *       with ewk_settings_icon_database_path_set().
249  *
250  * @param url which url to query icon.
251  * @param canvas evas instance where to add resulting object.
252  *
253  * @return newly allocated Evas_Object instance or @c NULL on
254  *         errors. Delete the object with evas_object_del().
255  */
256 Evas_Object* ewk_settings_icon_database_icon_object_add(const char* url, Evas* canvas)
257 {
258     EINA_SAFETY_ON_NULL_RETURN_VAL(url, 0);
259     EINA_SAFETY_ON_NULL_RETURN_VAL(canvas, 0);
260
261     WebCore::KURL kurl(WebCore::KURL(), WTF::String::fromUTF8(url));
262     WebCore::Image* icon = WebCore::iconDatabase()->iconForPageURL(kurl.string(), WebCore::IntSize(16, 16));
263     cairo_surface_t* surface;
264
265     if (!icon) {
266         ERR("no icon for url %s", url);
267         return 0;
268     }
269
270     surface = icon->nativeImageForCurrentFrame();
271     return ewk_util_image_from_cairo_surface_add(canvas, surface);
272 }
273
274 /**
275  * Sets the given proxy URI to network backend.
276  *
277  * @param proxy URI.
278  */
279 void ewk_settings_proxy_uri_set(const char* proxy)
280 {
281 #if USE(SOUP)
282     SoupURI* uri = soup_uri_new(proxy);
283     EINA_SAFETY_ON_NULL_RETURN(uri);
284
285     SoupSession* session = WebCore::ResourceHandle::defaultSession();
286     g_object_set(session, SOUP_SESSION_PROXY_URI, uri, NULL);
287     soup_uri_free(uri);
288 #elif USE(CURL)
289     EINA_SAFETY_ON_TRUE_RETURN(1);
290 #endif
291 }
292
293 /**
294 * @internal
295 * Gets the default user agent string.
296 *
297 * @return A pointer to an eina_stringshare containing the user agent string.
298 */
299 const char* ewk_settings_default_user_agent_get()
300 {
301     WTF::String ua_version = makeString(String::number(WEBKIT_USER_AGENT_MAJOR_VERSION), '.', String::number(WEBKIT_USER_AGENT_MINOR_VERSION), '+');
302     WTF::String static_ua = makeString("Mozilla/5.0 (", _ewk_settings_webkit_platform_get(), "; U; ", _ewk_settings_webkit_os_version_get(), "; ", WebCore::defaultLanguage(), ") AppleWebKit/", ua_version) + makeString(" (KHTML, like Gecko) Version/5.0 Safari/", ua_version);
303
304     return eina_stringshare_add(static_ua.utf8().data());
305