~midori/midori/gtk3WebKit2only

« back to all changes in this revision

Viewing changes to midori/midori-view.c

  • Committer: Christian Dywan
  • Date: 2014-12-07 23:48:47 UTC
  • Revision ID: christian.dywan@canonical.com-20141207234847-l2xz8lblt5m03uht
Native GTK+ tabs: errors and private browsing info

Show diffs side-by-side

added added

removed removed

Lines of Context:
528
528
        webkit_policy_decision_ignore (decision);
529
529
        return TRUE;
530
530
    }
531
 
    else if (midori_tab_get_special (MIDORI_TAB (view)))
532
 
    {
533
 
        GTlsCertificate* tls_cert = g_object_get_data (G_OBJECT (view->web_view), "tls-cert");
534
 
        gchar* tls_uri = g_object_get_data (G_OBJECT (view->web_view), "tls-uri");
535
 
        gchar* hostname = midori_uri_parse_hostname (tls_uri, NULL);
536
 
        if (tls_cert != NULL && tls_uri != NULL && hostname != NULL)
537
 
        {
538
 
            webkit_web_context_allow_tls_certificate_for_host (webkit_web_context_get_default (),
539
 
                tls_cert, hostname);
540
 
            GError* error = NULL;
541
 
            GcrCertificate* gcr_cert = midori_location_action_get_gcr_certificate (tls_cert);
542
 
            gcr_trust_add_pinned_certificate (gcr_cert, GCR_PURPOSE_SERVER_AUTH, hostname, NULL, &error);
543
 
            g_object_unref (gcr_cert);
544
 
        }
545
 
        g_free (hostname);
546
 
    }
547
531
 
548
532
    if (katze_item_get_meta_integer (view->item, "delay") == MIDORI_DELAY_PENDING_UNDELAY)
549
533
    {
664
648
        }
665
649
        g_free (filepath);
666
650
    }
667
 
    else if (g_str_has_prefix (uri, "stock://"))
668
 
    {
669
 
        GdkPixbuf* pixbuf;
670
 
        const gchar* icon_name = &uri[8] ? &uri[8] : "";
671
 
        gint icon_size = GTK_ICON_SIZE_MENU;
672
 
        static gint icon_size_large_dialog = 0;
673
 
 
674
 
        if (!icon_size_large_dialog)
675
 
        {
676
 
            gint width = 48, height = 48;
677
 
            gtk_icon_size_lookup (GTK_ICON_SIZE_DIALOG, &width, &height);
678
 
            icon_size_large_dialog = gtk_icon_size_register ("large-dialog", width * 2, height * 2);
679
 
        }
680
 
 
681
 
        if (g_ascii_isalpha (icon_name[0]))
682
 
        {
683
 
            if (g_str_has_prefix (icon_name, "dialog/"))
684
 
            {
685
 
                icon_name = &icon_name [strlen("dialog/")];
686
 
                icon_size = icon_size_large_dialog;
687
 
            }
688
 
            else
689
 
                icon_size = GTK_ICON_SIZE_BUTTON;
690
 
        }
691
 
        else if (g_ascii_isdigit (icon_name[0]))
692
 
        {
693
 
            guint i = 0;
694
 
            while (icon_name[i])
695
 
                if (icon_name[i++] == '/')
696
 
                {
697
 
                    gchar* size = g_strndup (icon_name, i - 1);
698
 
                    icon_size = atoi (size);
699
 
                    /* Compatibility: map pixel to symbolic size */
700
 
                    if (icon_size == 16)
701
 
                        icon_size = GTK_ICON_SIZE_MENU;
702
 
                    g_free (size);
703
 
                    icon_name = &icon_name[i];
704
 
                }
705
 
        }
706
 
 
707
 
        /* Render icon as a PNG at the desired size */
708
 
        pixbuf = gtk_widget_render_icon (GTK_WIDGET (view), icon_name, icon_size, NULL);
709
 
        if (!pixbuf)
710
 
            pixbuf = gtk_widget_render_icon (GTK_WIDGET (view),
711
 
                GTK_STOCK_MISSING_IMAGE, icon_size, NULL);
712
 
        if (pixbuf)
713
 
        {
714
 
            gboolean success;
715
 
            gchar* buffer;
716
 
            gsize buffer_size;
717
 
            gchar* encoded;
718
 
            gchar* data_uri;
719
 
 
720
 
            success = gdk_pixbuf_save_to_buffer (pixbuf, &buffer, &buffer_size, "png", NULL, NULL);
721
 
            g_object_unref (pixbuf);
722
 
            if (!success)
723
 
                return;
724
 
 
725
 
            encoded = g_base64_encode ((guchar*)buffer, buffer_size);
726
 
            data_uri = g_strconcat ("data:image/png;base64,", encoded, NULL);
727
 
            g_free (encoded);
728
 
            GInputStream* stream = g_memory_input_stream_new_from_data (buffer, buffer_size, g_free);
729
 
            webkit_uri_scheme_request_finish (request, stream, -1, "image/png");
730
 
            g_object_unref (stream);
731
 
            g_free (data_uri);
732
 
            return;
733
 
        }
734
 
    }
735
651
}
736
652
 
737
653
static void
867
783
    webkit_web_view_load_alternate_html (web_view, data, uri, uri);
868
784
}
869
785
 
 
786
static void
 
787
midori_view_error_try_again_clicked_cb (MidoriOops* oops,
 
788
                                        MidoriView* view)
 
789
{
 
790
    if (midori_tab_get_load_error (MIDORI_TAB (view)) == MIDORI_LOAD_ERROR_SECURITY)
 
791
    {
 
792
        g_print ("trust\n");
 
793
        GTlsCertificate* tls_cert = g_object_get_data (G_OBJECT (view->web_view), "tls-cert");
 
794
        gchar* tls_uri = g_object_get_data (G_OBJECT (view->web_view), "tls-uri");
 
795
        gchar* hostname = midori_uri_parse_hostname (tls_uri, NULL);
 
796
        if (tls_cert != NULL && tls_uri != NULL && hostname != NULL)
 
797
        {
 
798
            webkit_web_context_allow_tls_certificate_for_host (webkit_web_context_get_default (),
 
799
                tls_cert, hostname);
 
800
            GError* error = NULL;
 
801
            GcrCertificate* gcr_cert = midori_location_action_get_gcr_certificate (tls_cert);
 
802
            gcr_trust_add_pinned_certificate (gcr_cert, GCR_PURPOSE_SERVER_AUTH, hostname, NULL, &error);
 
803
            g_object_unref (gcr_cert);
 
804
        }
 
805
        g_free (hostname);
 
806
    }
 
807
    g_print ("reload\n");
 
808
    midori_view_reload (view, FALSE);
 
809
}
 
810
 
870
811
static gboolean
871
812
midori_view_display_error (MidoriView*     view,
872
813
                           const gchar*    uri,
878
819
                           const gchar*    try_again,
879
820
                           void*           web_frame)
880
821
{
881
 
    gchar* path = midori_paths_get_res_filename ("error.html");
882
 
    gchar* template;
883
 
 
884
 
    if (g_file_get_contents (path, &template, NULL, NULL))
885
 
    {
886
 
        gchar* title_escaped;
887
 
        const gchar* icon;
888
 
        gchar* favicon;
889
 
        gchar* result;
890
 
        gboolean is_main_frame;
891
 
 
892
 
        is_main_frame = TRUE;
893
 
        GtkSettings* gtk_settings = gtk_widget_get_settings (view->web_view);
894
 
        gboolean show_button_images = gtk_settings != NULL
895
 
          && katze_object_get_boolean (gtk_settings, "gtk-button-images");
896
 
        if (uri == NULL)
897
 
            uri = midori_tab_get_uri (MIDORI_TAB (view));
898
 
        title_escaped = g_markup_escape_text (title ? title : view->title, -1);
899
 
        icon = katze_item_get_icon (view->item);
900
 
        favicon = icon && !g_str_has_prefix (icon, "stock://")
901
 
          ? g_strdup_printf ("<link rel=\"shortcut icon\" href=\"%s\" />", icon) : NULL;
902
 
        result = sokoke_replace_variables (template,
903
 
            "{dir}", gtk_widget_get_default_direction () == GTK_TEXT_DIR_RTL ?
904
 
                "rtl" : "ltr",
905
 
            "{title}", title_escaped,
906
 
            "{favicon}", katze_str_non_null (favicon),
907
 
            "{error_icon}", katze_str_non_null (error_icon),
908
 
            "{message}", message,
909
 
            "{description}", description,
910
 
            "{suggestions}", katze_str_non_null (suggestions),
911
 
            "{tryagain}", try_again,
912
 
            "{uri}", uri,
913
 
            "{hide-button-images}", show_button_images ? "" : "display:none",
914
 
            "{autofocus}", is_main_frame ? "autofocus=\"true\" " : "",
915
 
            NULL);
916
 
        g_free (favicon);
917
 
        g_free (title_escaped);
918
 
        g_free (template);
919
 
 
920
 
        midori_view_set_html (view, result, uri, web_frame);
921
 
 
922
 
        g_free (result);
923
 
        g_free (path);
924
 
 
925
 
        return TRUE;
926
 
    }
927
 
    g_free (path);
928
 
 
929
 
    return FALSE;
 
822
    if (uri == NULL)
 
823
        uri = midori_tab_get_uri (MIDORI_TAB (view));
 
824
    if (title == NULL)
 
825
        title = view->title;
 
826
    const gchar* icon = error_icon ? error_icon : "dialog-error";
 
827
    GtkWidget* error = midori_oops_new (uri, icon, title, message, description, suggestions, try_again);
 
828
    g_signal_connect (error, "retried", G_CALLBACK (midori_view_error_try_again_clicked_cb), view);
 
829
    midori_tab_set_widget (MIDORI_TAB (view), error);
 
830
    return TRUE;
930
831
}
931
832
 
932
833
static gboolean
982
883
                                     midori_uri_parse_hostname(uri, NULL));
983
884
    }
984
885
 
985
 
    result = midori_view_display_error (view, uri, "stock://dialog/network-error", title,
 
886
    result = midori_view_display_error (view, uri, "network-error", title,
986
887
                                        message, error->message, NULL,
987
888
                                        _("Try Again"), web_frame);
988
889
    midori_tab_set_load_error (MIDORI_TAB (view), MIDORI_LOAD_ERROR_NETWORK);
1009
910
    }
1010
911
    else
1011
912
    {
1012
 
        midori_view_display_error (view, NULL, NULL, NULL, _("Security unknown"),
 
913
        midori_view_display_error (view, NULL, "security-low", NULL, _("Security unknown"),
1013
914
            midori_location_action_tls_flags_to_string (errors), NULL,
1014
915
            _("Trust this website"), NULL);
1015
916
        g_object_set_data_full (G_OBJECT (web_view), "tls-cert", g_object_ref (certificate), (GDestroyNotify)g_object_unref);
3037
2938
    WebKitWebContext* context = webkit_web_view_get_context (WEBKIT_WEB_VIEW (view->web_view));
3038
2939
    webkit_web_context_register_uri_scheme (context,
3039
2940
        "res", midori_view_uri_scheme_res, NULL, NULL);
3040
 
    webkit_web_context_register_uri_scheme (context,
3041
 
        "stock", midori_view_uri_scheme_res, NULL, NULL);
3042
2941
    g_signal_connect (context, "download-started",
3043
2942
        G_CALLBACK (midori_view_download_started_cb), view);
3044
2943
 
3045
2944
    view->overlay = gtk_overlay_new ();
3046
2945
    gtk_widget_show (view->overlay);
3047
 
    gtk_container_add (GTK_CONTAINER (view->overlay), view->web_view);
 
2946
    GtkWidget* content = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
 
2947
    gtk_widget_show (content);
 
2948
    gtk_box_pack_start (GTK_BOX (content), view->web_view, TRUE, TRUE, 0);
 
2949
    gtk_container_add (GTK_CONTAINER (view->overlay), content);
3048
2950
    gtk_box_pack_start (GTK_BOX (view), view->overlay, TRUE, TRUE, 0);
3049
2951
 
3050
2952
    /* Overlays must be created before showing GtkOverlay as of GTK+ 3.2 */
3200
3102
 
3201
3103
        if (handled)
3202
3104
        {
 
3105
            if (midori_tab_get_widget (MIDORI_TAB (view)) != NULL)
 
3106
                return;
3203
3107
            midori_tab_set_uri (MIDORI_TAB (view), uri);
3204
3108
            midori_tab_set_special (MIDORI_TAB (view), TRUE);
3205
3109
            katze_item_set_meta_integer (view->item, "delay", MIDORI_DELAY_UNDELAYED);
3209
3113
 
3210
3114
        if (katze_item_get_meta_integer (view->item, "delay") == MIDORI_DELAY_DELAYED)
3211
3115
        {
3212
 
            midori_tab_set_uri (MIDORI_TAB (view), uri);
3213
 
            midori_tab_set_special (MIDORI_TAB (view), TRUE);
3214
3116
            katze_item_set_meta_integer (view->item, "delay", MIDORI_DELAY_PENDING_UNDELAY);
3215
 
            midori_view_display_error (view, NULL, "stock://dialog/network-idle", NULL,
 
3117
            midori_view_display_error (view, NULL, "network-idle", NULL,
3216
3118
                _("Page loading delayed:"),
3217
3119
                _("Loading delayed either due to a recent crash or startup preferences."),
3218
3120
                NULL,