cssprovider: Handle errors completely via new error functions
This commit is contained in:
@ -838,8 +838,7 @@ static void scanner_apply_scope (GScanner *scanner,
|
|||||||
static void css_provider_reset_parser (GtkCssProvider *css_provider);
|
static void css_provider_reset_parser (GtkCssProvider *css_provider);
|
||||||
static gboolean css_provider_parse_value (GtkCssProvider *css_provider,
|
static gboolean css_provider_parse_value (GtkCssProvider *css_provider,
|
||||||
const gchar *value_str,
|
const gchar *value_str,
|
||||||
GValue *value,
|
GValue *value);
|
||||||
GError **error);
|
|
||||||
static gboolean gtk_css_provider_load_from_path_internal (GtkCssProvider *css_provider,
|
static gboolean gtk_css_provider_load_from_path_internal (GtkCssProvider *css_provider,
|
||||||
const gchar *path,
|
const gchar *path,
|
||||||
gboolean reset,
|
gboolean reset,
|
||||||
@ -1437,7 +1436,7 @@ gtk_css_provider_get_style_property (GtkStyleProvider *provider,
|
|||||||
val_str = g_value_get_string (val);
|
val_str = g_value_get_string (val);
|
||||||
found = TRUE;
|
found = TRUE;
|
||||||
|
|
||||||
css_provider_parse_value (GTK_CSS_PROVIDER (provider), val_str, value, NULL);
|
css_provider_parse_value (GTK_CSS_PROVIDER (provider), val_str, value);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1550,6 +1549,14 @@ gtk_css_provider_error (GtkCssProvider *provider,
|
|||||||
g_free (message);
|
g_free (message);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
gtk_css_provider_take_error (GtkCssProvider *provider,
|
||||||
|
GError *error)
|
||||||
|
{
|
||||||
|
gtk_css_provider_error_literal (provider, error->domain, error->code, error->message);
|
||||||
|
g_error_free (error);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
gtk_css_provider_invalid_token (GtkCssProvider *provider,
|
gtk_css_provider_invalid_token (GtkCssProvider *provider,
|
||||||
const char *expected)
|
const char *expected)
|
||||||
@ -2277,8 +2284,7 @@ symbolic_color_parse_str (const gchar *string,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static GtkSymbolicColor *
|
static GtkSymbolicColor *
|
||||||
symbolic_color_parse (const gchar *str,
|
symbolic_color_parse (const gchar *str)
|
||||||
GError **error)
|
|
||||||
{
|
{
|
||||||
GtkSymbolicColor *color;
|
GtkSymbolicColor *color;
|
||||||
gchar *end;
|
gchar *end;
|
||||||
@ -2287,11 +2293,6 @@ symbolic_color_parse (const gchar *str,
|
|||||||
|
|
||||||
if (*end != '\0')
|
if (*end != '\0')
|
||||||
{
|
{
|
||||||
g_set_error_literal (error,
|
|
||||||
GTK_CSS_PROVIDER_ERROR,
|
|
||||||
GTK_CSS_PROVIDER_ERROR_FAILED,
|
|
||||||
"Could not parse symbolic color");
|
|
||||||
|
|
||||||
if (color)
|
if (color)
|
||||||
{
|
{
|
||||||
gtk_symbolic_color_unref (color);
|
gtk_symbolic_color_unref (color);
|
||||||
@ -2555,8 +2556,7 @@ gradient_parse_str (const gchar *str,
|
|||||||
static gchar *
|
static gchar *
|
||||||
path_parse_str (GtkCssProvider *css_provider,
|
path_parse_str (GtkCssProvider *css_provider,
|
||||||
const gchar *str,
|
const gchar *str,
|
||||||
gchar **end_ptr,
|
gchar **end_ptr)
|
||||||
GError **error)
|
|
||||||
{
|
{
|
||||||
gchar *path, *chr;
|
gchar *path, *chr;
|
||||||
const gchar *start, *end;
|
const gchar *start, *end;
|
||||||
@ -2640,8 +2640,8 @@ path_parse_str (GtkCssProvider *css_provider,
|
|||||||
|
|
||||||
if (!g_file_test (path, G_FILE_TEST_EXISTS | G_FILE_TEST_IS_REGULAR))
|
if (!g_file_test (path, G_FILE_TEST_EXISTS | G_FILE_TEST_IS_REGULAR))
|
||||||
{
|
{
|
||||||
g_set_error (error, G_FILE_ERROR, G_FILE_ERROR_EXIST,
|
gtk_css_provider_error (css_provider, G_FILE_ERROR, G_FILE_ERROR_EXIST,
|
||||||
"File doesn't exist: %s", path);
|
"File doesn't exist: %s", path);
|
||||||
g_free (path);
|
g_free (path);
|
||||||
path = NULL;
|
path = NULL;
|
||||||
*end_ptr = (gchar *)start;
|
*end_ptr = (gchar *)start;
|
||||||
@ -2652,23 +2652,22 @@ path_parse_str (GtkCssProvider *css_provider,
|
|||||||
|
|
||||||
static gchar *
|
static gchar *
|
||||||
path_parse (GtkCssProvider *css_provider,
|
path_parse (GtkCssProvider *css_provider,
|
||||||
const gchar *str,
|
const gchar *str)
|
||||||
GError **error)
|
|
||||||
{
|
{
|
||||||
gchar *path;
|
gchar *path;
|
||||||
gchar *end;
|
gchar *end;
|
||||||
|
|
||||||
path = path_parse_str (css_provider, str, &end, error);
|
path = path_parse_str (css_provider, str, &end);
|
||||||
|
|
||||||
if (!path)
|
if (!path)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
if (*end != '\0')
|
if (*end != '\0')
|
||||||
{
|
{
|
||||||
g_set_error_literal (error,
|
gtk_css_provider_error (css_provider,
|
||||||
GTK_CSS_PROVIDER_ERROR,
|
GTK_CSS_PROVIDER_ERROR,
|
||||||
GTK_CSS_PROVIDER_ERROR_FAILED,
|
GTK_CSS_PROVIDER_ERROR_FAILED,
|
||||||
"Error parsing path");
|
"Error parsing path");
|
||||||
g_free (path);
|
g_free (path);
|
||||||
path = NULL;
|
path = NULL;
|
||||||
}
|
}
|
||||||
@ -2679,8 +2678,7 @@ path_parse (GtkCssProvider *css_provider,
|
|||||||
static Gtk9Slice *
|
static Gtk9Slice *
|
||||||
slice_parse_str (GtkCssProvider *css_provider,
|
slice_parse_str (GtkCssProvider *css_provider,
|
||||||
const gchar *str,
|
const gchar *str,
|
||||||
gchar **end_ptr,
|
gchar **end_ptr)
|
||||||
GError **error)
|
|
||||||
{
|
{
|
||||||
gdouble distance_top, distance_bottom;
|
gdouble distance_top, distance_bottom;
|
||||||
gdouble distance_left, distance_right;
|
gdouble distance_left, distance_right;
|
||||||
@ -2689,11 +2687,12 @@ slice_parse_str (GtkCssProvider *css_provider,
|
|||||||
Gtk9Slice *slice;
|
Gtk9Slice *slice;
|
||||||
gchar *path;
|
gchar *path;
|
||||||
gint i = 0;
|
gint i = 0;
|
||||||
|
GError *error = NULL;
|
||||||
|
|
||||||
SKIP_SPACES (str);
|
SKIP_SPACES (str);
|
||||||
|
|
||||||
/* Parse image url */
|
/* Parse image url */
|
||||||
path = path_parse_str (css_provider, str, end_ptr, error);
|
path = path_parse_str (css_provider, str, end_ptr);
|
||||||
|
|
||||||
if (!path)
|
if (!path)
|
||||||
return NULL;
|
return NULL;
|
||||||
@ -2759,11 +2758,12 @@ slice_parse_str (GtkCssProvider *css_provider,
|
|||||||
mods[1] = mods[0];
|
mods[1] = mods[0];
|
||||||
}
|
}
|
||||||
|
|
||||||
pixbuf = gdk_pixbuf_new_from_file (path, error);
|
pixbuf = gdk_pixbuf_new_from_file (path, &error);
|
||||||
g_free (path);
|
g_free (path);
|
||||||
|
|
||||||
if (!pixbuf)
|
if (!pixbuf)
|
||||||
{
|
{
|
||||||
|
gtk_css_provider_take_error (css_provider, error);
|
||||||
*end_ptr = (gchar *) str;
|
*end_ptr = (gchar *) str;
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@ -2898,8 +2898,7 @@ resolve_binding_sets (const gchar *value_str,
|
|||||||
static gboolean
|
static gboolean
|
||||||
css_provider_parse_value (GtkCssProvider *css_provider,
|
css_provider_parse_value (GtkCssProvider *css_provider,
|
||||||
const gchar *value_str,
|
const gchar *value_str,
|
||||||
GValue *value,
|
GValue *value)
|
||||||
GError **error)
|
|
||||||
{
|
{
|
||||||
GtkCssProviderPrivate *priv;
|
GtkCssProviderPrivate *priv;
|
||||||
GType type;
|
GType type;
|
||||||
@ -3005,8 +3004,7 @@ css_provider_parse_value (GtkCssProvider *css_provider,
|
|||||||
gchar *path;
|
gchar *path;
|
||||||
GdkPixbuf *pixbuf;
|
GdkPixbuf *pixbuf;
|
||||||
|
|
||||||
g_clear_error (error);
|
path = path_parse_str (css_provider, value_str, &end);
|
||||||
path = path_parse_str (css_provider, value_str, &end, error);
|
|
||||||
|
|
||||||
if (path)
|
if (path)
|
||||||
{
|
{
|
||||||
@ -3056,11 +3054,11 @@ css_provider_parse_value (GtkCssProvider *css_provider,
|
|||||||
|
|
||||||
if (!enum_value)
|
if (!enum_value)
|
||||||
{
|
{
|
||||||
g_set_error (error,
|
gtk_css_provider_error (css_provider,
|
||||||
GTK_CSS_PROVIDER_ERROR,
|
GTK_CSS_PROVIDER_ERROR,
|
||||||
GTK_CSS_PROVIDER_ERROR_FAILED,
|
GTK_CSS_PROVIDER_ERROR_FAILED,
|
||||||
"Unknown value '%s' for enum type '%s'",
|
"Unknown value '%s' for enum type '%s'",
|
||||||
value_str, g_type_name (type));
|
value_str, g_type_name (type));
|
||||||
parsed = FALSE;
|
parsed = FALSE;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -3093,11 +3091,11 @@ css_provider_parse_value (GtkCssProvider *css_provider,
|
|||||||
|
|
||||||
if (!flag_value)
|
if (!flag_value)
|
||||||
{
|
{
|
||||||
g_set_error (error,
|
gtk_css_provider_error (css_provider,
|
||||||
GTK_CSS_PROVIDER_ERROR,
|
GTK_CSS_PROVIDER_ERROR,
|
||||||
GTK_CSS_PROVIDER_ERROR_FAILED,
|
GTK_CSS_PROVIDER_ERROR_FAILED,
|
||||||
"Unknown flag '%s' for type '%s'",
|
"Unknown flag '%s' for type '%s'",
|
||||||
value_str, g_type_name (type));
|
value_str, g_type_name (type));
|
||||||
parsed = FALSE;
|
parsed = FALSE;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -3112,11 +3110,11 @@ css_provider_parse_value (GtkCssProvider *css_provider,
|
|||||||
|
|
||||||
if (!flag_value)
|
if (!flag_value)
|
||||||
{
|
{
|
||||||
g_set_error (error,
|
gtk_css_provider_error (css_provider,
|
||||||
GTK_CSS_PROVIDER_ERROR,
|
GTK_CSS_PROVIDER_ERROR,
|
||||||
GTK_CSS_PROVIDER_ERROR_FAILED,
|
GTK_CSS_PROVIDER_ERROR_FAILED,
|
||||||
"Unknown flag '%s' for type '%s'",
|
"Unknown flag '%s' for type '%s'",
|
||||||
value_str, g_type_name (type));
|
value_str, g_type_name (type));
|
||||||
parsed = FALSE;
|
parsed = FALSE;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -3131,7 +3129,7 @@ css_provider_parse_value (GtkCssProvider *css_provider,
|
|||||||
{
|
{
|
||||||
Gtk9Slice *slice;
|
Gtk9Slice *slice;
|
||||||
|
|
||||||
slice = slice_parse_str (css_provider, value_str, &end, error);
|
slice = slice_parse_str (css_provider, value_str, &end);
|
||||||
|
|
||||||
if (slice)
|
if (slice)
|
||||||
g_value_take_boxed (value, slice);
|
g_value_take_boxed (value, slice);
|
||||||
@ -3140,11 +3138,11 @@ css_provider_parse_value (GtkCssProvider *css_provider,
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
g_set_error (error,
|
gtk_css_provider_error (css_provider,
|
||||||
GTK_CSS_PROVIDER_ERROR,
|
GTK_CSS_PROVIDER_ERROR,
|
||||||
GTK_CSS_PROVIDER_ERROR_FAILED,
|
GTK_CSS_PROVIDER_ERROR_FAILED,
|
||||||
"Cannot parse string '%s' for type %s",
|
"Cannot parse string '%s' for type %s",
|
||||||
value_str, g_type_name (type));
|
value_str, g_type_name (type));
|
||||||
parsed = FALSE;
|
parsed = FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3159,11 +3157,10 @@ css_provider_parse_value (GtkCssProvider *css_provider,
|
|||||||
priv->value_pos += (end - value_str);
|
priv->value_pos += (end - value_str);
|
||||||
parsed = FALSE;
|
parsed = FALSE;
|
||||||
|
|
||||||
if (error && !*error)
|
gtk_css_provider_error_literal (css_provider,
|
||||||
g_set_error_literal (error,
|
GTK_CSS_PROVIDER_ERROR,
|
||||||
GTK_CSS_PROVIDER_ERROR,
|
GTK_CSS_PROVIDER_ERROR_FAILED,
|
||||||
GTK_CSS_PROVIDER_ERROR_FAILED,
|
"Failed to parse value");
|
||||||
"Failed to parse value");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return parsed;
|
return parsed;
|
||||||
@ -3247,8 +3244,7 @@ scanner_report_warning (GtkCssProvider *css_provider,
|
|||||||
|
|
||||||
static GTokenType
|
static GTokenType
|
||||||
parse_rule (GtkCssProvider *css_provider,
|
parse_rule (GtkCssProvider *css_provider,
|
||||||
GScanner *scanner,
|
GScanner *scanner)
|
||||||
GError **error)
|
|
||||||
{
|
{
|
||||||
GtkCssProviderPrivate *priv;
|
GtkCssProviderPrivate *priv;
|
||||||
GTokenType expected_token;
|
GTokenType expected_token;
|
||||||
@ -3291,7 +3287,7 @@ parse_rule (GtkCssProvider *css_provider,
|
|||||||
}
|
}
|
||||||
|
|
||||||
color_str = g_strstrip (scanner->value.v_identifier);
|
color_str = g_strstrip (scanner->value.v_identifier);
|
||||||
color = symbolic_color_parse (color_str, error);
|
color = symbolic_color_parse (color_str);
|
||||||
|
|
||||||
if (!color)
|
if (!color)
|
||||||
{
|
{
|
||||||
@ -3322,12 +3318,10 @@ parse_rule (GtkCssProvider *css_provider,
|
|||||||
if (scanner->token == G_TOKEN_IDENTIFIER &&
|
if (scanner->token == G_TOKEN_IDENTIFIER &&
|
||||||
g_str_has_prefix (scanner->value.v_identifier, "url"))
|
g_str_has_prefix (scanner->value.v_identifier, "url"))
|
||||||
path = path_parse (css_provider,
|
path = path_parse (css_provider,
|
||||||
g_strstrip (scanner->value.v_identifier),
|
g_strstrip (scanner->value.v_identifier));
|
||||||
error);
|
|
||||||
else if (scanner->token == G_TOKEN_STRING)
|
else if (scanner->token == G_TOKEN_STRING)
|
||||||
path = path_parse (css_provider,
|
path = path_parse (css_provider,
|
||||||
g_strstrip (scanner->value.v_string),
|
g_strstrip (scanner->value.v_string));
|
||||||
error);
|
|
||||||
|
|
||||||
if (path == NULL)
|
if (path == NULL)
|
||||||
{
|
{
|
||||||
@ -3353,7 +3347,7 @@ parse_rule (GtkCssProvider *css_provider,
|
|||||||
|
|
||||||
/* FIXME: Avoid recursive importing */
|
/* FIXME: Avoid recursive importing */
|
||||||
loaded = gtk_css_provider_load_from_path_internal (css_provider, path,
|
loaded = gtk_css_provider_load_from_path_internal (css_provider, path,
|
||||||
FALSE, error);
|
FALSE, NULL);
|
||||||
|
|
||||||
/* Restore previous state */
|
/* Restore previous state */
|
||||||
css_provider_reset_parser (css_provider);
|
css_provider_reset_parser (css_provider);
|
||||||
@ -3534,9 +3528,19 @@ parse_rule (GtkCssProvider *css_provider,
|
|||||||
g_value_set_string (val, value_str);
|
g_value_set_string (val, value_str);
|
||||||
g_hash_table_insert (priv->cur_properties, prop, val);
|
g_hash_table_insert (priv->cur_properties, prop, val);
|
||||||
}
|
}
|
||||||
else if ((parse_func && (parse_func) (value_str, val, error)) ||
|
else if (!parse_func && css_provider_parse_value (css_provider, value_str, val))
|
||||||
(!parse_func && css_provider_parse_value (css_provider, value_str, val, error)))
|
{
|
||||||
g_hash_table_insert (priv->cur_properties, prop, val);
|
g_hash_table_insert (priv->cur_properties, prop, val);
|
||||||
|
}
|
||||||
|
else if (parse_func)
|
||||||
|
{
|
||||||
|
GError *error = NULL;
|
||||||
|
|
||||||
|
if ((*parse_func) (value_str, val, &error))
|
||||||
|
g_hash_table_insert (priv->cur_properties, prop, val);
|
||||||
|
else
|
||||||
|
gtk_css_provider_take_error (css_provider, error);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
g_value_unset (val);
|
g_value_unset (val);
|
||||||
@ -3595,7 +3599,7 @@ parse_stylesheet (GtkCssProvider *css_provider,
|
|||||||
GTokenType expected_token;
|
GTokenType expected_token;
|
||||||
|
|
||||||
css_provider_reset_parser (css_provider);
|
css_provider_reset_parser (css_provider);
|
||||||
expected_token = parse_rule (css_provider, priv->scanner, &priv->error);
|
expected_token = parse_rule (css_provider, priv->scanner);
|
||||||
|
|
||||||
if (expected_token != G_TOKEN_NONE)
|
if (expected_token != G_TOKEN_NONE)
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user