~midori/midori/nativeGTK+ErrorPages

« back to all changes in this revision

Viewing changes to midori/midori-view.c

  • Committer: Christian Dywan
  • Date: 2015-03-28 17:22:27 UTC
  • Revision ID: christian@twotoasts.de-20150328172227-7vyzvxcgt4lztysi
Implement Native error pages in GTK+

Show diffs side-by-side

added added

removed removed

Lines of Context:
625
625
                        gchar* slots = g_strjoinv (" , ", (gchar**)gcr_pkcs11_get_trust_lookup_uris ());
626
626
                        gchar* title = g_strdup_printf ("Error granting trust: %s", error->message);
627
627
                        midori_tab_stop_loading (MIDORI_TAB (view));
628
 
                        midori_view_display_error (view, NULL, NULL, NULL, title, slots, NULL,
 
628
                        midori_view_display_error (view, NULL, "security-low", NULL, title, slots, NULL,
629
629
                            _("Trust this website"), NULL);
630
630
                        g_free (title);
631
631
                        g_free (slots);
836
836
        #endif
837
837
        g_free (filepath);
838
838
    }
839
 
    else if (g_str_has_prefix (uri, "stock://"))
840
 
    {
841
 
        GdkPixbuf* pixbuf;
842
 
        const gchar* icon_name = &uri[8] ? &uri[8] : "";
843
 
        gint icon_size = GTK_ICON_SIZE_MENU;
844
 
        static gint icon_size_large_dialog = 0;
845
 
 
846
 
        if (!icon_size_large_dialog)
847
 
        {
848
 
            gint width = 48, height = 48;
849
 
            gtk_icon_size_lookup (GTK_ICON_SIZE_DIALOG, &width, &height);
850
 
            icon_size_large_dialog = gtk_icon_size_register ("large-dialog", width * 2, height * 2);
851
 
        }
852
 
 
853
 
        if (g_ascii_isalpha (icon_name[0]))
854
 
        {
855
 
            if (g_str_has_prefix (icon_name, "dialog/"))
856
 
            {
857
 
                icon_name = &icon_name [strlen("dialog/")];
858
 
                icon_size = icon_size_large_dialog;
859
 
            }
860
 
            else
861
 
                icon_size = GTK_ICON_SIZE_BUTTON;
862
 
        }
863
 
        else if (g_ascii_isdigit (icon_name[0]))
864
 
        {
865
 
            guint i = 0;
866
 
            while (icon_name[i])
867
 
                if (icon_name[i++] == '/')
868
 
                {
869
 
                    gchar* size = g_strndup (icon_name, i - 1);
870
 
                    icon_size = atoi (size);
871
 
                    /* Compatibility: map pixel to symbolic size */
872
 
                    if (icon_size == 16)
873
 
                        icon_size = GTK_ICON_SIZE_MENU;
874
 
                    g_free (size);
875
 
                    icon_name = &icon_name[i];
876
 
                }
877
 
        }
878
 
 
879
 
        /* Render icon as a PNG at the desired size */
880
 
        pixbuf = gtk_widget_render_icon (GTK_WIDGET (view), icon_name, icon_size, NULL);
881
 
        if (!pixbuf)
882
 
            pixbuf = gtk_widget_render_icon (GTK_WIDGET (view),
883
 
                GTK_STOCK_MISSING_IMAGE, icon_size, NULL);
884
 
        if (pixbuf)
885
 
        {
886
 
            gboolean success;
887
 
            gchar* buffer;
888
 
            gsize buffer_size;
889
 
            gchar* encoded;
890
 
            gchar* data_uri;
891
 
 
892
 
            success = gdk_pixbuf_save_to_buffer (pixbuf, &buffer, &buffer_size, "png", NULL, NULL);
893
 
            g_object_unref (pixbuf);
894
 
            if (!success)
895
 
                return;
896
 
 
897
 
            encoded = g_base64_encode ((guchar*)buffer, buffer_size);
898
 
            data_uri = g_strconcat ("data:image/png;base64,", encoded, NULL);
899
 
            g_free (encoded);
900
 
            #ifdef HAVE_WEBKIT2
901
 
            GInputStream* stream = g_memory_input_stream_new_from_data (buffer, buffer_size, g_free);
902
 
            webkit_uri_scheme_request_finish (request, stream, -1, "image/png");
903
 
            g_object_unref (stream);
904
 
            #else
905
 
            g_free (buffer);
906
 
            webkit_network_request_set_uri (request, data_uri);
907
 
            #endif
908
 
            g_free (data_uri);
909
 
            return;
910
 
        }
911
 
    }
912
839
}
913
840
 
914
841
static void
1117
1044
#endif
1118
1045
}
1119
1046
 
 
1047
static void
 
1048
midori_view_error_try_again_clicked_cb (MidoriOops* oops,
 
1049
                                        MidoriView* view)
 
1050
{
 
1051
    midori_view_reload (view, FALSE);
 
1052
}
 
1053
 
1120
1054
static gboolean
1121
1055
midori_view_display_error (MidoriView*     view,
1122
1056
                           const gchar*    uri,
1132
1066
                           void*           web_frame)
1133
1067
#endif
1134
1068
{
1135
 
    gchar* path = midori_paths_get_res_filename ("error.html");
1136
 
    gchar* template;
1137
 
 
1138
 
    if (g_file_get_contents (path, &template, NULL, NULL))
1139
 
    {
1140
 
        gchar* title_escaped;
1141
 
        const gchar* icon;
1142
 
        gchar* favicon;
1143
 
        gchar* result;
1144
 
        gboolean is_main_frame;
1145
 
 
1146
 
        #ifdef HAVE_WEBKIT2
1147
 
        is_main_frame = TRUE;
1148
 
        #else
1149
 
        is_main_frame = web_frame && (webkit_web_view_get_main_frame (WEBKIT_WEB_VIEW (view->web_view)) == web_frame);
1150
 
        #endif
1151
 
 
1152
 
        #if !GTK_CHECK_VERSION (3, 0, 0)
1153
 
        /* g_object_get_valist: object class `GtkSettings' has no property named `gtk-button-images' */
1154
 
        g_type_class_unref (g_type_class_ref (GTK_TYPE_BUTTON));
1155
 
        #endif
1156
 
 
1157
 
        GtkSettings* gtk_settings = gtk_widget_get_settings (view->web_view);
1158
 
        gboolean show_button_images = gtk_settings != NULL
1159
 
          && katze_object_get_boolean (gtk_settings, "gtk-button-images");
1160
 
        if (uri == NULL)
1161
 
            uri = midori_tab_get_uri (MIDORI_TAB (view));
1162
 
        title_escaped = g_markup_escape_text (title ? title : view->title, -1);
1163
 
        icon = katze_item_get_icon (view->item);
1164
 
        favicon = icon && !g_str_has_prefix (icon, "stock://")
1165
 
          ? g_strdup_printf ("<link rel=\"shortcut icon\" href=\"%s\" />", icon) : NULL;
1166
 
        result = sokoke_replace_variables (template,
1167
 
            "{dir}", gtk_widget_get_default_direction () == GTK_TEXT_DIR_RTL ?
1168
 
                "rtl" : "ltr",
1169
 
            "{title}", title_escaped,
1170
 
            "{favicon}", katze_str_non_null (favicon),
1171
 
            "{error_icon}", katze_str_non_null (error_icon),
1172
 
            "{message}", message,
1173
 
            "{description}", description,
1174
 
            "{suggestions}", katze_str_non_null (suggestions),
1175
 
            "{tryagain}", try_again,
1176
 
            "{uri}", uri,
1177
 
            "{hide-button-images}", show_button_images ? "" : "display:none",
1178
 
            "{autofocus}", is_main_frame ? "autofocus=\"true\" " : "",
1179
 
            NULL);
1180
 
        g_free (favicon);
1181
 
        g_free (title_escaped);
1182
 
        g_free (template);
1183
 
 
1184
 
        midori_view_set_html (view, result, uri, web_frame);
1185
 
 
1186
 
        g_free (result);
1187
 
        g_free (path);
1188
 
 
1189
 
        return TRUE;
1190
 
    }
1191
 
    g_free (path);
1192
 
 
1193
 
    return FALSE;
 
1069
    if (uri == NULL)
 
1070
        uri = midori_tab_get_uri (MIDORI_TAB (view));
 
1071
    if (title == NULL)
 
1072
        title = view->title ? view->title : uri;
 
1073
    const gchar* icon = error_icon ? error_icon : "dialog-error";
 
1074
    GtkWidget* error = midori_oops_new (uri, icon, title, message, description, suggestions, try_again);
 
1075
    g_signal_connect (error, "retried", G_CALLBACK (midori_view_error_try_again_clicked_cb), view);
 
1076
    midori_tab_set_widget (MIDORI_TAB (view), error);
 
1077
    return TRUE;
1194
1078
}
1195
1079
 
1196
1080
static gboolean
1252
1136
                                     midori_uri_parse_hostname(uri, NULL));
1253
1137
    }
1254
1138
 
1255
 
    result = midori_view_display_error (view, uri, "stock://dialog/network-error", title,
 
1139
    result = midori_view_display_error (view, uri, "network-error", title,
1256
1140
                                        message, error->message, NULL,
1257
1141
                                        _("Try Again"), web_frame);
1258
1142
 
3672
3556
            (GCallback)midori_view_web_view_crashed_cb, view);
3673
3557
    view->scrolled_window = view->web_view;
3674
3558
    WebKitWebContext* context = webkit_web_view_get_context (WEBKIT_WEB_VIEW (view->web_view));
3675
 
    webkit_web_context_register_uri_scheme (context,
3676
 
        "res", midori_view_uri_scheme_res, NULL, NULL);
3677
 
    webkit_web_context_register_uri_scheme (context,
3678
 
        "stock", midori_view_uri_scheme_res, NULL, NULL);
3679
3559
    g_signal_connect (context, "download-started",
3680
3560
        G_CALLBACK (midori_view_download_started_cb), view);
3681
3561
    #endif
3682
3562
 
 
3563
    GtkWidget* content = gtk_vbox_new (FALSE, 0);
 
3564
    gtk_widget_show (content);
 
3565
    gtk_box_pack_start (GTK_BOX (content), view->scrolled_window, TRUE, TRUE, 0);
 
3566
 
3683
3567
    #if GTK_CHECK_VERSION(3, 2, 0)
3684
3568
    view->overlay = gtk_overlay_new ();
3685
3569
    gtk_widget_show (view->overlay);
3686
 
    gtk_container_add (GTK_CONTAINER (view->overlay), view->scrolled_window);
 
3570
    gtk_container_add (GTK_CONTAINER (view->overlay), content);
3687
3571
    gtk_box_pack_start (GTK_BOX (view), view->overlay, TRUE, TRUE, 0);
3688
3572
 
3689
3573
    /* Overlays must be created before showing GtkOverlay as of GTK+ 3.2 */
3708
3592
                             view->overlay_find);
3709
3593
    gtk_widget_set_no_show_all (view->overlay_find, TRUE);
3710
3594
    #else
3711
 
    gtk_box_pack_start (GTK_BOX (view), view->scrolled_window, TRUE, TRUE, 0);
 
3595
    gtk_box_pack_start (GTK_BOX (view), content, TRUE, TRUE, 0);
3712
3596
    #endif
3713
3597
 
3714
3598
    #ifndef HAVE_WEBKIT2
3884
3768
 
3885
3769
        if (handled)
3886
3770
        {
 
3771
            if (midori_tab_get_widget (MIDORI_TAB (view)) != NULL)
 
3772
                return;
3887
3773
            midori_tab_set_uri (MIDORI_TAB (view), uri);
3888
3774
            midori_tab_set_special (MIDORI_TAB (view), TRUE);
3889
3775
            katze_item_set_meta_integer (view->item, "delay", MIDORI_DELAY_UNDELAYED);
3896
3782
            midori_tab_set_uri (MIDORI_TAB (view), uri);
3897
3783
            midori_tab_set_special (MIDORI_TAB (view), TRUE);
3898
3784
            katze_item_set_meta_integer (view->item, "delay", MIDORI_DELAY_PENDING_UNDELAY);
3899
 
            midori_view_display_error (view, NULL, "stock://dialog/network-idle", NULL,
 
3785
            midori_view_display_error (view, NULL, "network-idle", NULL,
3900
3786
                _("Page loading delayed:"),
3901
3787
                _("Loading delayed either due to a recent crash or startup preferences."),
3902
3788
                NULL,