~ubuntu-branches/ubuntu/vivid/liferea/vivid-proposed

« back to all changes in this revision

Viewing changes to src/webkit/webkit.c

  • Committer: Package Import Robot
  • Author(s): bojo42
  • Date: 2012-03-29 14:17:21 UTC
  • mfrom: (1.3.9) (3.2.5 sid)
  • Revision ID: package-import@ubuntu.com-20120329141721-tbfopcrc5797wxt7
Tags: 1.8.3-0.1ubuntu1
* New upstream release (LP: #290666, #371754, #741543, #716688)
* Merge from Debian unstable (LP: #935147), remaining changes:
* debian/patches:
  - drop gtk-status-icon.patch & notification-append as in upstream
  - drop fix_systray_behavior as mostly upstreamed and rest seems unused
  - 01_ubuntu_feedlists: update & rename, move planets to "Open Source"  
  - add_X-Ubuntu-Gettext-Domain: rebase
  - libunity.patch: rebase, apply before indicator patch (liferea_shell.c)
  - libindicate_increase_version.patch: exclude from libindicate.patch
  - deactivate libindicate.patch, seems partly upstreamed and needs rework
* debian/control: libindicate-dev, libindicate-gtk-dev & libunity-dev
* debian/liferea.indicate & liferea.install: ship indicator desktop file
* debian/rules: enable libindicate

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
/**
2
2
 * @file webkit.c  WebKit browser module for Liferea
3
3
 *
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>
7
8
 *
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
21
22
 */
22
23
 
 
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;
34
36
 
35
37
/**
 
38
 * Update the settings object if the preferences change.
 
39
 * This will affect all the webviews as they all use the same
 
40
 * settings object.
 
41
 */
 
42
static void
 
43
liferea_webkit_disable_javascript_cb (GConfClient *client,
 
44
                                      guint cnxn_id,
 
45
                                      GConfEntry *entry,
 
46
                                      gpointer user_data)
 
47
{
 
48
        GConfValue *disable_javascript;
 
49
 
 
50
        g_return_if_fail (entry != NULL);
 
51
 
 
52
        disable_javascript = gconf_entry_get_value (entry);
 
53
        if (!disable_javascript || disable_javascript->type != GCONF_VALUE_BOOL)
 
54
                return;
 
55
 
 
56
        g_object_set (
 
57
                settings,
 
58
                "enable-scripts",
 
59
                !gconf_value_get_bool (disable_javascript),
 
60
                NULL
 
61
        );
 
62
}
 
63
 
 
64
/**
 
65
 * Update the settings object if the preferences change.
 
66
 * This will affect all the webviews as they all use the same
 
67
 * settings object.
 
68
 */
 
69
static void
 
70
liferea_webkit_enable_plugins_cb (GConfClient *client,
 
71
                                  guint cnxn_id,
 
72
                                  GConfEntry *entry,
 
73
                                  gpointer user_data)
 
74
{
 
75
        GConfValue *enable_plugins;
 
76
 
 
77
        g_return_if_fail (entry != NULL);
 
78
 
 
79
        enable_plugins = gconf_entry_get_value (entry);
 
80
        if (!enable_plugins || enable_plugins->type != GCONF_VALUE_BOOL)
 
81
                return;
 
82
 
 
83
        g_object_set (
 
84
                settings,
 
85
                "enable-plugins",
 
86
                gconf_value_get_bool (enable_plugins),
 
87
                NULL
 
88
        );
 
89
}
 
90
 
 
91
static gchar *
 
92
webkit_get_font (guint *size)
 
93
{
 
94
        gchar *font = NULL;
 
95
 
 
96
        *size = 11;     /* default fallback */
 
97
 
 
98
        /* font configuration support */
 
99
        conf_get_str_value (USER_FONT, &font);
 
100
        if (0 == strlen (font)) {
 
101
                g_free (font);
 
102
                conf_get_str_value (DEFAULT_FONT, &font);
 
103
        }
 
104
 
 
105
        if (font) {
 
106
                /* The GTK2/GNOME font name format is "<font name> <size>" */
 
107
                gchar *tmp = strrchr(font, ' ');
 
108
                if (tmp) {
 
109
                        *tmp++ = 0;
 
110
                        *size = atoi(tmp);
 
111
                }
 
112
        }
 
113
 
 
114
        return font;
 
115
}
 
116
 
 
117
/**
36
118
 * HTML plugin init method
37
119
 */
38
120
static void
39
 
webkit_init (void)
 
121
liferea_webkit_init (void)
40
122
{
41
 
        gboolean disable_javascript, enable_plugins;
 
123
        gboolean        disable_javascript, enable_plugins;
 
124
        GConfClient     *client;
 
125
        gchar           *font;
 
126
        guint           fontSize;
42
127
 
43
128
        g_assert (!settings);
44
129
 
45
130
        settings = webkit_web_settings_new ();
 
131
        font = webkit_get_font (&fontSize);
46
132
 
47
 
        g_object_set (
48
 
                settings,
49
 
                "default-font-size",
50
 
                11,
51
 
                NULL
52
 
        );
 
133
        if (font) {
 
134
                g_object_set (
 
135
                        settings,
 
136
                        "default-font-family",
 
137
                        font,
 
138
                        NULL
 
139
                );
 
140
                g_object_set (
 
141
                        settings,
 
142
                        "default-font-size",
 
143
                        fontSize,
 
144
                        NULL
 
145
                );
 
146
                g_free (font);
 
147
        }
53
148
        g_object_set (
54
149
                settings,
55
150
                "minimum-font-size",
56
151
                7,
57
152
                NULL
58
153
        );
59
 
        disable_javascript = conf_get_bool_value (DISABLE_JAVASCRIPT);
 
154
        conf_get_bool_value (DISABLE_JAVASCRIPT, &disable_javascript);
60
155
        g_object_set (
61
156
                settings,
62
157
                "enable-scripts",
63
158
                !disable_javascript,
64
159
                NULL
65
160
        );
66
 
        enable_plugins = conf_get_bool_value (ENABLE_PLUGINS);
 
161
        conf_get_bool_value (ENABLE_PLUGINS, &enable_plugins);
67
162
        g_object_set (
68
163
                settings,
69
164
                "enable-plugins",
70
165
                enable_plugins,
71
166
                NULL
72
167
        );
 
168
 
 
169
 
 
170
        client = gconf_client_get_default ();
 
171
 
 
172
        gconf_client_notify_add (
 
173
                client,
 
174
                DISABLE_JAVASCRIPT,
 
175
                liferea_webkit_disable_javascript_cb,
 
176
                NULL, NULL, NULL
 
177
        );
 
178
        gconf_client_notify_add (
 
179
                client,
 
180
                ENABLE_PLUGINS,
 
181
                liferea_webkit_enable_plugins_cb,
 
182
                NULL, NULL, NULL
 
183
        );
 
184
 
 
185
        g_object_unref (client);
73
186
}
74
187
 
75
188
/**
79
192
 * HTML documents created internally.
80
193
 */
81
194
static void
82
 
webkit_write_html (
 
195
liferea_webkit_write_html (
83
196
        GtkWidget *scrollpane,
84
197
        const gchar *string,
85
198
        const guint length,
100
213
}
101
214
 
102
215
static void
103
 
webkit_title_changed (
104
 
        WebKitWebView *view,
105
 
        WebKitWebFrame *frame,
106
 
        const gchar *title,
107
 
        gpointer user_data
108
 
)
 
216
liferea_webkit_title_changed (WebKitWebView *view, GParamSpec *pspec, gpointer user_data)
109
217
{
110
218
        LifereaHtmlView *htmlview;
 
219
        gchar *title;
111
220
 
112
221
        htmlview = g_object_get_data (G_OBJECT (view), "htmlview");
 
222
        g_object_get (view, "title", &title, NULL);
 
223
 
113
224
        liferea_htmlview_title_changed (htmlview, title);
 
225
        g_free (title);
114
226
}
115
227
 
116
228
static void
117
 
webkit_progress_changed (WebKitWebView *view, gint progress, gpointer user_data)
 
229
liferea_webkit_progress_changed (WebKitWebView *view, gint progress, gpointer user_data)
118
230
{
119
231
}
120
232
 
121
233
static void
122
 
webkit_location_changed (WebKitWebView *view, const gchar *location)
 
234
liferea_webkit_location_changed (WebKitWebView *view, GParamSpec *pspec, gpointer user_data)
123
235
{
124
236
        LifereaHtmlView *htmlview;
 
237
        gchar *location;
125
238
 
126
239
        htmlview = g_object_get_data (G_OBJECT (view), "htmlview");
 
240
        g_object_get (view, "uri", &location, NULL);
 
241
 
127
242
        liferea_htmlview_location_changed (htmlview, location);
 
243
        g_free (location);
128
244
}
129
245
 
130
246
/**
131
247
 * Action executed when user hovers over a link
132
248
 */
133
249
static void
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)
135
251
{
136
252
        LifereaHtmlView *htmlview;
137
253
        gchar *selected_url;
138
254
 
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);
152
268
/**
153
269
 * A link has been clicked
154
270
 *
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.
157
273
 */
158
274
static gboolean
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)
164
280
{
165
281
        const gchar                     *uri;
166
282
        WebKitWebNavigationReason       reason;
173
289
 
174
290
        /* iframes in items return WEBKIT_WEB_NAVIGATION_REASON_OTHER
175
291
           and shouldn't be handled as clicks                          */
176
 
 
177
292
        if (reason != WEBKIT_WEB_NAVIGATION_REASON_LINK_CLICKED)
178
293
                return FALSE;
179
294
 
193
308
        return url_handled;
194
309
}
195
310
 
196
 
 
197
 
/**
198
 
 * FIXME: when https://bugs.webkit.org/show_bug.cgi?id=14807 is fixed,
199
 
 * do this properly.
200
 
 */
201
 
static void
202
 
webkit_load_committed (WebKitWebView *view, WebKitWebFrame *frame)
203
 
{
204
 
        webkit_location_changed (view, webkit_web_frame_get_uri (frame));
205
 
}
206
 
 
207
311
/**
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.
262
366
 */
263
367
static void
264
 
webkit_on_menu (WebKitWebView *view, GtkMenu *menu)
 
368
liferea_webkit_on_menu (WebKitWebView *view, GtkMenu *menu)
265
369
{
266
 
        LifereaHtmlView *htmlview;
267
 
        gchar           *selected_url;
268
 
 
269
 
        htmlview = g_object_get_data (G_OBJECT (view), "htmlview");
270
 
        
271
 
        selected_url = g_object_get_data (G_OBJECT (view), "selected_url");     
272
 
 
273
 
        /* don't pass empty URLs */
274
 
        if (selected_url && strlen (selected_url) == 0)
275
 
                selected_url = NULL;
276
 
        else
277
 
                selected_url = g_strdup (selected_url);
 
370
        LifereaHtmlView                 *htmlview;
 
371
        gchar                           *imageUri = NULL;
 
372
        gchar                           *linkUri = NULL;
 
373
        WebKitHitTestResult*            hitResult;
 
374
        WebKitHitTestResultContext      context;
 
375
        GdkEvent                        *event;
 
376
 
 
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);
 
380
 
 
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 */
278
387
                
279
 
        liferea_htmlview_prepare_context_menu (htmlview, menu, selected_url);
 
388
        htmlview = g_object_get_data (G_OBJECT (view), "htmlview");
 
389
        
 
390
        liferea_htmlview_prepare_context_menu (htmlview, menu, linkUri, imageUri);
280
391
}
281
392
 
282
393
/**
286
397
 * And we ignore them.
287
398
 */
288
399
static gboolean
289
 
webkit_javascript_message  (WebKitWebView *view,
290
 
                            const char *message,
291
 
                            int line,
292
 
                            const char *source_id
293
 
                            )
 
400
liferea_webkit_javascript_message  (WebKitWebView *view,
 
401
                                    const char *message,
 
402
                                    int line,
 
403
                                    const char *source_id)
294
404
{
295
405
        return TRUE;
296
406
}
302
412
 * and embeds WebKitWebView into it.
303
413
 */
304
414
static GtkWidget *
305
 
webkit_new (LifereaHtmlView *htmlview)
 
415
liferea_webkit_new (LifereaHtmlView *htmlview)
306
416
{
307
417
        WebKitWebView *view;
308
418
        GtkWidget *scrollpane;
322
432
        /** Create HTML widget and pack it into the scrolled window */
323
433
        view = WEBKIT_WEB_VIEW (webkit_web_view_new ());
324
434
 
325
 
        webkit_web_view_set_settings (view, WEBKIT_WEB_SETTINGS (settings));
 
435
        webkit_web_view_set_settings (view, settings);
326
436
 
327
437
        gtk_container_add (GTK_CONTAINER (scrollpane), GTK_WIDGET (view));
328
438
 
336
446
        /** Connect signal callbacks */
337
447
        g_signal_connect (
338
448
                view,
339
 
                "title-changed",
340
 
                G_CALLBACK (webkit_title_changed),
 
449
                "notify::title",
 
450
                G_CALLBACK (liferea_webkit_title_changed),
341
451
                view
342
452
        );
343
453
        g_signal_connect (
344
454
                view,
345
455
                "load-progress-changed",
346
 
                G_CALLBACK (webkit_progress_changed),
 
456
                G_CALLBACK (liferea_webkit_progress_changed),
347
457
                view
348
458
        );
349
459
        g_signal_connect (
350
460
                view,
351
461
                "hovering-over-link",
352
 
                G_CALLBACK (webkit_on_url),
 
462
                G_CALLBACK (liferea_webkit_on_url),
353
463
                view
354
464
        );
355
465
        g_signal_connect (
356
466
                view,
357
467
                "navigation-policy-decision-requested",
358
 
                G_CALLBACK (webkit_link_clicked),
 
468
                G_CALLBACK (liferea_webkit_link_clicked),
359
469
                view
360
470
        );
361
471
        g_signal_connect (
367
477
        g_signal_connect (
368
478
                view,
369
479
                "populate-popup",
370
 
                G_CALLBACK (webkit_on_menu),
 
480
                G_CALLBACK (liferea_webkit_on_menu),
371
481
                view
372
482
        );
373
483
        g_signal_connect (
374
484
                view,
375
 
                "load-committed",
376
 
                G_CALLBACK (webkit_load_committed),
 
485
                "notify::uri",
 
486
                G_CALLBACK (liferea_webkit_location_changed),
377
487
                view
378
488
        );
379
489
        g_signal_connect (
380
490
                view,
381
491
                "console-message",
382
 
                G_CALLBACK (webkit_javascript_message),
 
492
                G_CALLBACK (liferea_webkit_javascript_message),
383
493
                view
384
494
        );
385
495
        g_signal_connect (
397
507
 * Launch URL
398
508
 */
399
509
static void
400
 
webkit_launch_url (GtkWidget *scrollpane, const gchar *url)
 
510
liferea_webkit_launch_url (GtkWidget *scrollpane, const gchar *url)
401
511
{
402
512
        // FIXME: hack to make URIs like "gnome.org" work
403
513
        // https://bugs.webkit.org/show_bug.cgi?id=24195
408
518
                http_url = g_strdup (url);
409
519
        }
410
520
 
411
 
        // Register the new url for the history
412
 
        webkit_location_changed (
413
 
                WEBKIT_WEB_VIEW (gtk_bin_get_child (GTK_BIN (scrollpane))),
414
 
                http_url
415
 
        );
416
 
 
417
521
        webkit_web_view_load_uri (
418
522
                WEBKIT_WEB_VIEW (gtk_bin_get_child (GTK_BIN (scrollpane))),
419
523
                http_url
426
530
 * Change zoom level of the HTML scrollpane
427
531
 */
428
532
static void
429
 
webkit_change_zoom_level (GtkWidget *scrollpane, gfloat zoom_level)
 
533
liferea_webkit_change_zoom_level (GtkWidget *scrollpane, gfloat zoom_level)
430
534
{
431
535
        WebKitWebView *view;
432
536
        view = WEBKIT_WEB_VIEW (gtk_bin_get_child (GTK_BIN (scrollpane)));
434
538
}
435
539
 
436
540
/**
 
541
 * Return whether text is selected
 
542
 */
 
543
static gboolean
 
544
liferea_webkit_has_selection (GtkWidget *scrollpane)
 
545
{
 
546
        WebKitWebView *view;
 
547
        view = WEBKIT_WEB_VIEW (gtk_bin_get_child (GTK_BIN (scrollpane)));
 
548
 
 
549
        /* 
 
550
           Currently (libwebkit-1.0 1.2.0) this doesn't work:
 
551
 
 
552
                return webkit_web_view_has_selection (view);
 
553
 
 
554
           So we use *_can_copy_clipboard() as a workaround.
 
555
        */
 
556
        
 
557
        return webkit_web_view_can_copy_clipboard (view);
 
558
}
 
559
 
 
560
/**
 
561
 * Copy selected text to the clipboard
 
562
 */
 
563
static void
 
564
liferea_webkit_copy_selection (GtkWidget *scrollpane)
 
565
{
 
566
        WebKitWebView *view;
 
567
        view = WEBKIT_WEB_VIEW (gtk_bin_get_child (GTK_BIN (scrollpane)));
 
568
        webkit_web_view_copy_clipboard (view);
 
569
}
 
570
 
 
571
/**
437
572
 * Return current zoom level as a float
438
573
 */
439
574
static gfloat
440
 
webkit_get_zoom_level (GtkWidget *scrollpane)
 
575
liferea_webkit_get_zoom_level (GtkWidget *scrollpane)
441
576
{
442
577
        WebKitWebView *view;
443
578
        view = WEBKIT_WEB_VIEW (gtk_bin_get_child (GTK_BIN (scrollpane)));
450
585
 * Copied from gtkhtml/gtkhtml.c
451
586
 */
452
587
static gboolean
453
 
webkit_scroll_pagedown (GtkWidget *scrollpane)
 
588
liferea_webkit_scroll_pagedown (GtkWidget *scrollpane)
454
589
{
455
590
        GtkScrolledWindow *itemview;
456
591
        GtkAdjustment *vertical_adjustment;
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;
469
604
        }
476
611
}
477
612
 
478
613
static void
479
 
webkit_set_proxy (const gchar *host, guint port, const gchar *user, const gchar *pwd)
 
614
liferea_webkit_set_proxy (const gchar *host, guint port, const gchar *user, const gchar *pwd)
480
615
{
481
616
        SoupURI *proxy = NULL;
482
617
 
496
631
 
497
632
static struct
498
633
htmlviewImpl webkitImpl = {
499
 
        .init           = webkit_init,
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,
507
 
        .setOffLine     = NULL
 
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
508
645
};
509
646
 
510
647
DECLARE_HTMLVIEW_IMPL (webkitImpl);