563
561
midori_web_settings_init (MidoriWebSettings* web_settings)
565
web_settings->user_stylesheet_uri = web_settings->user_stylesheet_uri_cached = NULL;
566
web_settings->user_stylesheets = NULL;
568
#if defined (_WIN32) && !GTK_CHECK_VERSION (3, 0, 0)
569
/* Try to work-around black borders on native widgets and GTK+2 on Win32 */
570
midori_web_settings_add_style (web_settings, "black-widgets-workaround",
571
"input[type='checkbox'] { -webkit-appearance: checkbox !important }"
572
" input[type='radio'] { -webkit-appearance: radio !important }"
573
" * { -webkit-appearance: none !important }");
563
web_settings->user_stylesheet_uri = NULL;
576
565
g_signal_connect (web_settings, "notify::default-charset",
577
566
G_CALLBACK (notify_default_encoding_cb), NULL);
590
579
katze_assign (web_settings->accept, NULL);
591
580
katze_assign (web_settings->ident_string, NULL);
592
581
katze_assign (web_settings->user_stylesheet_uri, NULL);
593
katze_assign (web_settings->user_stylesheet_uri_cached, NULL);
594
if (web_settings->user_stylesheets != NULL)
595
g_hash_table_destroy (web_settings->user_stylesheets);
597
583
G_OBJECT_CLASS (midori_web_settings_parent_class)->finalize (object);
966
944
"code, code *, pre, pre *, blockquote, blockquote *, "
967
945
"input, textarea { font-family: %s !important; }",
968
946
font_family, monospace);
969
midori_web_settings_add_style (web_settings, "enforce-font-family", css);
947
midori_settings_add_style (MIDORI_SETTINGS (web_settings), "enforce-font-family", css);
970
948
g_free (font_family);
971
949
g_free (monospace);
975
midori_web_settings_remove_style (web_settings, "enforce-font-family");
953
midori_settings_remove_style (MIDORI_SETTINGS (web_settings), "enforce-font-family");
977
955
case PROP_ENABLE_FULLSCREEN:
978
956
g_object_set (web_settings, WEB_SETTINGS_STRING ("enable-fullscreen"),
979
957
g_value_get_boolean (value), NULL);
981
959
case PROP_USER_STYLESHEET_URI:
960
if ((web_settings->user_stylesheet_uri = g_value_dup_string (value)))
983
gint old_len = web_settings->user_stylesheet_uri_cached
984
? strlen (web_settings->user_stylesheet_uri_cached) : 0;
986
if ((web_settings->user_stylesheet_uri = g_value_dup_string (value)))
988
gchar* import = g_strdup_printf ("@import url(\"%s\");",
989
web_settings->user_stylesheet_uri);
990
gchar* encoded = g_base64_encode ((const guchar*)import, strlen (import));
991
new_len = strlen (encoded);
992
base64_space_pad (encoded, new_len);
994
katze_assign (web_settings->user_stylesheet_uri_cached, encoded);
996
/* Make original user-stylesheet-uri available to main.c */
997
g_object_set_data (G_OBJECT (web_settings), "user-stylesheet-uri",
998
web_settings->user_stylesheet_uri);
999
midori_web_settings_process_stylesheets (web_settings, new_len - old_len);
962
GError* error = NULL;
964
gchar* filename = g_filename_from_uri (web_settings->user_stylesheet_uri, NULL, &error);
967
if (g_file_get_contents (filename, &contents, NULL, &error))
969
midori_settings_add_style (MIDORI_SETTINGS (web_settings), "user-stylesheet-uri", contents);
974
printf (_("Could not read file specified by user-stylesheet-uri: %s\n"), error->message);
975
g_error_free (error);
980
printf (_("Could not convert user-stylesheet-uri to local file path: %s\n"), error->message);
981
g_error_free (error);
985
midori_settings_remove_style (MIDORI_SETTINGS (web_settings), "user-stylesheet-uri");
987
/* Make original user-stylesheet-uri available to main.c */
988
g_object_set_data (G_OBJECT (web_settings), "user-stylesheet-uri",
989
web_settings->user_stylesheet_uri);
1002
991
case PROP_PRINT_WITHOUT_DIALOG:
1003
992
web_settings->print_without_dialog = g_value_get_boolean(value);
1141
1130
return web_settings;
1145
midori_web_settings_process_stylesheets (MidoriWebSettings* settings,
1152
static guint length = 0;
1154
g_return_if_fail ((gint)length >= -delta_len);
1156
length += delta_len;
1158
/* Precalculate size to avoid re-allocations */
1159
css = g_string_sized_new (length);
1161
if (settings->user_stylesheet_uri_cached != NULL)
1162
g_string_append (css, settings->user_stylesheet_uri_cached);
1164
if (settings->user_stylesheets != NULL)
1166
g_hash_table_iter_init (&it, settings->user_stylesheets);
1167
while (g_hash_table_iter_next (&it, NULL, &value))
1168
g_string_append (css, (gchar*)value);
1171
/* data: uri prefix from Source/WebCore/page/Page.cpp:700 in WebKit */
1172
encoded = g_strconcat ("data:text/css;charset=utf-8;base64,", css->str, NULL);
1173
/* TODO: webkit_web_view_group_add_user_style_sheet */
1175
g_string_free (css, TRUE);
1179
base64_space_pad (gchar* base64,
1182
/* Replace '=' padding at the end with encoded spaces
1183
so WebKit will accept concatenations to this string */
1184
if (len > 2 && base64[len - 2] == '=')
1186
base64[len - 3] += 2;
1187
base64[len - 2] = 'A';
1189
if (len > 1 && base64[len - 1] == '=')
1190
base64[len - 1] = 'g';
1194
* midori_web_settings_add_style:
1195
* @settings: the MidoriWebSettings instance to modify
1196
* @rule_id: a static string identifier
1197
* @style: a CSS stylesheet
1199
* Adds or replaces a custom stylesheet.
1204
midori_web_settings_add_style (MidoriWebSettings* settings,
1205
const gchar* rule_id,
1211
g_return_if_fail (MIDORI_IS_WEB_SETTINGS (settings));
1212
g_return_if_fail (rule_id != NULL);
1213
g_return_if_fail (style != NULL);
1215
len = strlen (style);
1216
base64 = g_base64_encode ((const guchar*)style, len);
1217
len = ((len + 2) / 3) * 4;
1218
base64_space_pad (base64, len);
1220
if (settings->user_stylesheets == NULL)
1221
settings->user_stylesheets = g_hash_table_new_full (g_str_hash, NULL,
1224
g_hash_table_insert (settings->user_stylesheets, (gchar*)rule_id, base64);
1225
midori_web_settings_process_stylesheets (settings, len);
1229
* midori_web_settings_remove_style:
1230
* @settings: the MidoriWebSettings instance to modify
1231
* @rule_id: the string identifier used previously
1233
* Removes a stylesheet from midori settings.
1238
midori_web_settings_remove_style (MidoriWebSettings* settings,
1239
const gchar* rule_id)
1243
g_return_if_fail (MIDORI_IS_WEB_SETTINGS (settings));
1244
g_return_if_fail (rule_id != NULL);
1246
if (settings->user_stylesheets != NULL)
1248
if ((str = g_hash_table_lookup (settings->user_stylesheets, rule_id)))
1250
guint len = strlen (str);
1251
g_hash_table_remove (settings->user_stylesheets, rule_id);
1252
midori_web_settings_process_stylesheets (settings, -len);
1258
1134
* midori_settings_new_full:
1259
1135
* @extensions: (out) (allow-none): a pointer into which