2
2
* @file webkit.c WebKit browser module for Liferea
4
* Copyright (C) 2007-2009 Lars Lindner <lars.lindner@gmail.com>
4
* Copyright (C) 2007-2010 Lars Lindner <lars.lindner@gmail.com>
5
5
* Copyright (C) 2008 Lars Strojny <lars@strojny.net>
6
* Copyright (C) 2009 Emilio Pozuelo Monfort <pochu27@gmail.com>
6
7
* Copyright (C) 2009 Adrian Bunk <bunk@users.sourceforge.net>
8
9
* This program is free software; you can redistribute it and/or modify
20
21
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
24
#include <gconf/gconf-client.h>
23
25
#include <libsoup/soup.h>
24
26
#include <webkit/webkit.h>
25
27
#include <string.h>
33
35
static WebKitWebSettings *settings = NULL;
38
* Update the settings object if the preferences change.
39
* This will affect all the webviews as they all use the same
43
liferea_webkit_disable_javascript_cb (GConfClient *client,
48
GConfValue *disable_javascript;
50
g_return_if_fail (entry != NULL);
52
disable_javascript = gconf_entry_get_value (entry);
53
if (!disable_javascript || disable_javascript->type != GCONF_VALUE_BOOL)
59
!gconf_value_get_bool (disable_javascript),
65
* Update the settings object if the preferences change.
66
* This will affect all the webviews as they all use the same
70
liferea_webkit_enable_plugins_cb (GConfClient *client,
75
GConfValue *enable_plugins;
77
g_return_if_fail (entry != NULL);
79
enable_plugins = gconf_entry_get_value (entry);
80
if (!enable_plugins || enable_plugins->type != GCONF_VALUE_BOOL)
86
gconf_value_get_bool (enable_plugins),
92
webkit_get_font (guint *size)
96
*size = 11; /* default fallback */
98
/* font configuration support */
99
conf_get_str_value (USER_FONT, &font);
100
if (0 == strlen (font)) {
102
conf_get_str_value (DEFAULT_FONT, &font);
106
/* The GTK2/GNOME font name format is "<font name> <size>" */
107
gchar *tmp = strrchr(font, ' ');
36
118
* HTML plugin init method
121
liferea_webkit_init (void)
41
gboolean disable_javascript, enable_plugins;
123
gboolean disable_javascript, enable_plugins;
43
128
g_assert (!settings);
45
130
settings = webkit_web_settings_new ();
131
font = webkit_get_font (&fontSize);
136
"default-font-family",
55
150
"minimum-font-size",
59
disable_javascript = conf_get_bool_value (DISABLE_JAVASCRIPT);
154
conf_get_bool_value (DISABLE_JAVASCRIPT, &disable_javascript);
63
158
!disable_javascript,
66
enable_plugins = conf_get_bool_value (ENABLE_PLUGINS);
161
conf_get_bool_value (ENABLE_PLUGINS, &enable_plugins);
170
client = gconf_client_get_default ();
172
gconf_client_notify_add (
175
liferea_webkit_disable_javascript_cb,
178
gconf_client_notify_add (
181
liferea_webkit_enable_plugins_cb,
185
g_object_unref (client);
103
webkit_title_changed (
105
WebKitWebFrame *frame,
216
liferea_webkit_title_changed (WebKitWebView *view, GParamSpec *pspec, gpointer user_data)
110
218
LifereaHtmlView *htmlview;
112
221
htmlview = g_object_get_data (G_OBJECT (view), "htmlview");
222
g_object_get (view, "title", &title, NULL);
113
224
liferea_htmlview_title_changed (htmlview, title);
117
webkit_progress_changed (WebKitWebView *view, gint progress, gpointer user_data)
229
liferea_webkit_progress_changed (WebKitWebView *view, gint progress, gpointer user_data)
122
webkit_location_changed (WebKitWebView *view, const gchar *location)
234
liferea_webkit_location_changed (WebKitWebView *view, GParamSpec *pspec, gpointer user_data)
124
236
LifereaHtmlView *htmlview;
126
239
htmlview = g_object_get_data (G_OBJECT (view), "htmlview");
240
g_object_get (view, "uri", &location, NULL);
127
242
liferea_htmlview_location_changed (htmlview, location);
131
247
* Action executed when user hovers over a link
134
webkit_on_url (WebKitWebView *view, const gchar *title, const gchar *url, gpointer user_data)
250
liferea_webkit_on_url (WebKitWebView *view, const gchar *title, const gchar *url, gpointer user_data)
136
252
LifereaHtmlView *htmlview;
137
253
gchar *selected_url;
139
htmlview = g_object_get_data (G_OBJECT (view), "htmlview");
255
htmlview = g_object_get_data (G_OBJECT (view), "htmlview");
140
256
selected_url = g_object_get_data (G_OBJECT (view), "selected_url");
141
257
if (selected_url)
142
258
g_free (selected_url);
153
269
* A link has been clicked
155
* When a link has been clicked the the link management is dispatched to Liferea core in
156
* order to manage the different filetypes, remote URLs.
271
* When a link has been clicked the link management is dispatched to Liferea
272
* core in order to manage the different filetypes, remote URLs.
159
webkit_link_clicked (WebKitWebView *view,
160
WebKitWebFrame *frame,
161
WebKitNetworkRequest *request,
162
WebKitWebNavigationAction *navigation_action,
163
WebKitWebPolicyDecision *policy_decision)
275
liferea_webkit_link_clicked (WebKitWebView *view,
276
WebKitWebFrame *frame,
277
WebKitNetworkRequest *request,
278
WebKitWebNavigationAction *navigation_action,
279
WebKitWebPolicyDecision *policy_decision)
165
281
const gchar *uri;
166
282
WebKitWebNavigationReason reason;
193
308
return url_handled;
198
* FIXME: when https://bugs.webkit.org/show_bug.cgi?id=14807 is fixed,
202
webkit_load_committed (WebKitWebView *view, WebKitWebFrame *frame)
204
webkit_location_changed (view, webkit_web_frame_get_uri (frame));
208
312
* A new window was requested. This is the case e.g. if the link
209
313
* has target="_blank". In that case, we don't open the link in a new
261
365
* Add menu items to #menu to extend the context menu.
264
webkit_on_menu (WebKitWebView *view, GtkMenu *menu)
368
liferea_webkit_on_menu (WebKitWebView *view, GtkMenu *menu)
266
LifereaHtmlView *htmlview;
269
htmlview = g_object_get_data (G_OBJECT (view), "htmlview");
271
selected_url = g_object_get_data (G_OBJECT (view), "selected_url");
273
/* don't pass empty URLs */
274
if (selected_url && strlen (selected_url) == 0)
277
selected_url = g_strdup (selected_url);
370
LifereaHtmlView *htmlview;
371
gchar *imageUri = NULL;
372
gchar *linkUri = NULL;
373
WebKitHitTestResult* hitResult;
374
WebKitHitTestResultContext context;
377
event = gtk_get_current_event ();
378
hitResult = webkit_web_view_get_hit_test_result (view, (GdkEventButton *)event);
379
g_object_get (hitResult, "context", &context, NULL);
381
if (context & WEBKIT_HIT_TEST_RESULT_CONTEXT_LINK)
382
g_object_get (hitResult, "link-uri", &linkUri, NULL);
383
if (context & WEBKIT_HIT_TEST_RESULT_CONTEXT_IMAGE)
384
g_object_get (hitResult, "image-uri", &imageUri, NULL);
385
if (context & WEBKIT_HIT_TEST_RESULT_CONTEXT_MEDIA)
386
g_object_get (hitResult, "media-uri", &linkUri, NULL); /* treat media as normal link */
279
liferea_htmlview_prepare_context_menu (htmlview, menu, selected_url);
388
htmlview = g_object_get_data (G_OBJECT (view), "htmlview");
390
liferea_htmlview_prepare_context_menu (htmlview, menu, linkUri, imageUri);
322
432
/** Create HTML widget and pack it into the scrolled window */
323
433
view = WEBKIT_WEB_VIEW (webkit_web_view_new ());
325
webkit_web_view_set_settings (view, WEBKIT_WEB_SETTINGS (settings));
435
webkit_web_view_set_settings (view, settings);
327
437
gtk_container_add (GTK_CONTAINER (scrollpane), GTK_WIDGET (view));
336
446
/** Connect signal callbacks */
337
447
g_signal_connect (
340
G_CALLBACK (webkit_title_changed),
450
G_CALLBACK (liferea_webkit_title_changed),
343
453
g_signal_connect (
345
455
"load-progress-changed",
346
G_CALLBACK (webkit_progress_changed),
456
G_CALLBACK (liferea_webkit_progress_changed),
349
459
g_signal_connect (
351
461
"hovering-over-link",
352
G_CALLBACK (webkit_on_url),
462
G_CALLBACK (liferea_webkit_on_url),
355
465
g_signal_connect (
357
467
"navigation-policy-decision-requested",
358
G_CALLBACK (webkit_link_clicked),
468
G_CALLBACK (liferea_webkit_link_clicked),
361
471
g_signal_connect (
367
477
g_signal_connect (
369
479
"populate-popup",
370
G_CALLBACK (webkit_on_menu),
480
G_CALLBACK (liferea_webkit_on_menu),
373
483
g_signal_connect (
376
G_CALLBACK (webkit_load_committed),
486
G_CALLBACK (liferea_webkit_location_changed),
379
489
g_signal_connect (
381
491
"console-message",
382
G_CALLBACK (webkit_javascript_message),
492
G_CALLBACK (liferea_webkit_javascript_message),
385
495
g_signal_connect (
408
518
http_url = g_strdup (url);
411
// Register the new url for the history
412
webkit_location_changed (
413
WEBKIT_WEB_VIEW (gtk_bin_get_child (GTK_BIN (scrollpane))),
417
521
webkit_web_view_load_uri (
418
522
WEBKIT_WEB_VIEW (gtk_bin_get_child (GTK_BIN (scrollpane))),
541
* Return whether text is selected
544
liferea_webkit_has_selection (GtkWidget *scrollpane)
547
view = WEBKIT_WEB_VIEW (gtk_bin_get_child (GTK_BIN (scrollpane)));
550
Currently (libwebkit-1.0 1.2.0) this doesn't work:
552
return webkit_web_view_has_selection (view);
554
So we use *_can_copy_clipboard() as a workaround.
557
return webkit_web_view_can_copy_clipboard (view);
561
* Copy selected text to the clipboard
564
liferea_webkit_copy_selection (GtkWidget *scrollpane)
567
view = WEBKIT_WEB_VIEW (gtk_bin_get_child (GTK_BIN (scrollpane)));
568
webkit_web_view_copy_clipboard (view);
437
572
* Return current zoom level as a float
440
webkit_get_zoom_level (GtkWidget *scrollpane)
575
liferea_webkit_get_zoom_level (GtkWidget *scrollpane)
442
577
WebKitWebView *view;
443
578
view = WEBKIT_WEB_VIEW (gtk_bin_get_child (GTK_BIN (scrollpane)));
462
597
g_assert (NULL != itemview);
463
598
vertical_adjustment = gtk_scrolled_window_get_vadjustment (itemview);
464
599
old_value = gtk_adjustment_get_value (vertical_adjustment);
465
new_value = old_value + vertical_adjustment->page_increment;
466
limit = vertical_adjustment->upper - vertical_adjustment->page_size;
600
new_value = old_value + gtk_adjustment_get_page_increment (vertical_adjustment);
601
limit = gtk_adjustment_get_upper (vertical_adjustment) - gtk_adjustment_get_page_size (vertical_adjustment);
467
602
if (new_value > limit) {
468
603
new_value = limit;
498
633
htmlviewImpl webkitImpl = {
500
.create = webkit_new,
501
.write = webkit_write_html,
502
.launch = webkit_launch_url,
503
.zoomLevelGet = webkit_get_zoom_level,
504
.zoomLevelSet = webkit_change_zoom_level,
505
.scrollPagedown = webkit_scroll_pagedown,
506
.setProxy = webkit_set_proxy,
634
.init = liferea_webkit_init,
635
.create = liferea_webkit_new,
636
.write = liferea_webkit_write_html,
637
.launch = liferea_webkit_launch_url,
638
.zoomLevelGet = liferea_webkit_get_zoom_level,
639
.zoomLevelSet = liferea_webkit_change_zoom_level,
640
.hasSelection = liferea_webkit_has_selection,
641
.copySelection = liferea_webkit_copy_selection,
642
.scrollPagedown = liferea_webkit_scroll_pagedown,
643
.setProxy = liferea_webkit_set_proxy,
644
.setOffLine = NULL // FIXME: blocked on https://bugs.webkit.org/show_bug.cgi?id=18893
510
647
DECLARE_HTMLVIEW_IMPL (webkitImpl);