mirror of
https://gitlab.gnome.org/GNOME/gtk.git
synced 2024-11-07 01:00:28 +00:00
GtkCssProvider: improve file paths parser.
It will now return a full path, and check about the file being sane.
This commit is contained in:
parent
1772b00e85
commit
8e96e4e41f
@ -1571,8 +1571,9 @@ gradient_parse (const gchar *str)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static gchar *
|
static gchar *
|
||||||
url_parse_str (const gchar *str,
|
path_parse_str (GtkCssProvider *css_provider,
|
||||||
gchar **end_ptr)
|
const gchar *str,
|
||||||
|
gchar **end_ptr)
|
||||||
{
|
{
|
||||||
gchar *path, *chr;
|
gchar *path, *chr;
|
||||||
|
|
||||||
@ -1607,6 +1608,54 @@ url_parse_str (const gchar *str,
|
|||||||
|
|
||||||
*end_ptr = chr + 1;
|
*end_ptr = chr + 1;
|
||||||
|
|
||||||
|
/* Always return an absolute path */
|
||||||
|
if (!g_path_is_absolute (path))
|
||||||
|
{
|
||||||
|
GtkCssProviderPrivate *priv;
|
||||||
|
gchar *dirname, *full_path;
|
||||||
|
|
||||||
|
priv = css_provider->priv;
|
||||||
|
|
||||||
|
/* Use relative path to the current CSS file path, if any */
|
||||||
|
dirname = g_path_get_dirname (priv->filename);
|
||||||
|
|
||||||
|
full_path = g_build_filename (dirname, path, NULL);
|
||||||
|
g_free (path);
|
||||||
|
g_free (dirname);
|
||||||
|
|
||||||
|
path = full_path;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!g_file_test (path, G_FILE_TEST_EXISTS | G_FILE_TEST_IS_REGULAR))
|
||||||
|
{
|
||||||
|
g_warning ("File doesn't exist: %s\n", path);
|
||||||
|
g_free (path);
|
||||||
|
path = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return path;
|
||||||
|
}
|
||||||
|
|
||||||
|
static gchar *
|
||||||
|
path_parse (GtkCssProvider *css_provider,
|
||||||
|
const gchar *str)
|
||||||
|
{
|
||||||
|
gchar *path, *end;
|
||||||
|
|
||||||
|
path = path_parse_str (css_provider, str, &end);
|
||||||
|
|
||||||
|
if (*end != '\0')
|
||||||
|
{
|
||||||
|
g_warning ("Error parsing file path \"%s\", stopped at char %ld : '%c'",
|
||||||
|
str, end - str, *end);
|
||||||
|
|
||||||
|
if (path)
|
||||||
|
{
|
||||||
|
g_free (path);
|
||||||
|
path = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return path;
|
return path;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1627,28 +1676,11 @@ slice_parse_str (GtkCssProvider *css_provider,
|
|||||||
SKIP_SPACES (str);
|
SKIP_SPACES (str);
|
||||||
|
|
||||||
/* Parse image url */
|
/* Parse image url */
|
||||||
path = url_parse_str (str, end_ptr);
|
path = path_parse_str (css_provider, str, end_ptr);
|
||||||
|
|
||||||
if (!path)
|
if (!path)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
if (!g_path_is_absolute (path))
|
|
||||||
{
|
|
||||||
GtkCssProviderPrivate *priv;
|
|
||||||
gchar *dirname, *full_path;
|
|
||||||
|
|
||||||
priv = css_provider->priv;
|
|
||||||
|
|
||||||
/* Use relative path to the current CSS file path, if any */
|
|
||||||
dirname = g_path_get_dirname (priv->filename);
|
|
||||||
|
|
||||||
full_path = g_build_filename (dirname, path, NULL);
|
|
||||||
g_free (path);
|
|
||||||
g_free (dirname);
|
|
||||||
|
|
||||||
path = full_path;
|
|
||||||
}
|
|
||||||
|
|
||||||
str = *end_ptr;
|
str = *end_ptr;
|
||||||
SKIP_SPACES (str);
|
SKIP_SPACES (str);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user