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