[epiphany/gnome-3-34] window-commands: use cancellables where required
- From: Michael Catanzaro <mcatanzaro src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [epiphany/gnome-3-34] window-commands: use cancellables where required
- Date: Wed, 18 Dec 2019 12:49:34 +0000 (UTC)
commit 0cd636dc2a8c9e0eda823c62f60bf67698a434fd
Author: Michael Catanzaro <mcatanzaro gnome org>
Date: Tue Dec 17 03:05:48 2019 +0000
window-commands: use cancellables where required
Make sure objects survive until the callback when exporting bookmarks.
If the web app creation dialog is destroyed before setting web app icon
or title, the EphyApplicationDialogData gets used after it's freed.
Fix that.
(cherry picked from commit 1d519fc99f5501ad81edbc2ce1da054784a4d3a9)
src/window-commands.c | 36 +++++++++++++++++++++++++++---------
1 file changed, 27 insertions(+), 9 deletions(-)
---
diff --git a/src/window-commands.c b/src/window-commands.c
index 2b48f2855..c295fed12 100644
--- a/src/window-commands.c
+++ b/src/window-commands.c
@@ -442,13 +442,14 @@ bookmarks_export_cb (GObject *source_object,
gpointer user_data)
{
EphyBookmarksManager *manager = EPHY_BOOKMARKS_MANAGER (source_object);
+ GtkWidget *window = GTK_WIDGET (user_data);
GtkWidget *export_info_dialog;
gboolean exported;
g_autoptr (GError) error = NULL;
exported = ephy_bookmarks_export_finish (manager, result, &error);
- export_info_dialog = gtk_message_dialog_new (GTK_WINDOW (user_data),
+ export_info_dialog = gtk_message_dialog_new (GTK_WINDOW (window),
GTK_DIALOG_MODAL,
exported ? GTK_MESSAGE_INFO : GTK_MESSAGE_WARNING,
GTK_BUTTONS_OK,
@@ -457,6 +458,9 @@ bookmarks_export_cb (GObject *source_object,
error->message);
gtk_dialog_run (GTK_DIALOG (export_info_dialog));
gtk_widget_destroy (export_info_dialog);
+
+ g_object_unref (manager);
+ g_object_unref (window);
}
void
@@ -491,7 +495,11 @@ window_cmd_export_bookmarks (GSimpleAction *action,
gtk_native_dialog_hide (GTK_NATIVE_DIALOG (dialog));
filename = gtk_file_chooser_get_filename (dialog);
- ephy_bookmarks_export (manager, filename, NULL, bookmarks_export_cb, window);
+ ephy_bookmarks_export (g_object_ref (manager),
+ filename,
+ NULL,
+ bookmarks_export_cb,
+ g_object_ref (window));
g_free (filename);
}
@@ -932,11 +940,14 @@ typedef struct {
GtkWidget *box;
char *icon_href;
GdkRGBA icon_rgba;
+ GCancellable *cancellable;
} EphyApplicationDialogData;
static void
ephy_application_dialog_data_free (EphyApplicationDialogData *data)
{
+ g_cancellable_cancel (data->cancellable);
+ g_object_unref (data->cancellable);
g_free (data->icon_href);
g_free (data);
}
@@ -1157,8 +1168,12 @@ fill_default_application_image_cb (GObject *source,
EphyApplicationDialogData *data = user_data;
char *uri = NULL;
GdkRGBA color = { 0.5, 0.5, 0.5, 0.3 };
+ GError *error = NULL;
- ephy_web_view_get_best_web_app_icon_finish (EPHY_WEB_VIEW (source), async_result, &uri, &color, NULL);
+ ephy_web_view_get_best_web_app_icon_finish (EPHY_WEB_VIEW (source), async_result, &uri, &color, &error);
+
+ if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
+ return;
data->icon_href = uri;
data->icon_rgba = color;
@@ -1173,7 +1188,7 @@ fill_default_application_image_cb (GObject *source,
static void
fill_default_application_image (EphyApplicationDialogData *data)
{
- ephy_web_view_get_best_web_app_icon (data->view, NULL, fill_default_application_image_cb, data);
+ ephy_web_view_get_best_web_app_icon (data->view, data->cancellable, fill_default_application_image_cb,
data);
}
typedef struct {
@@ -1245,15 +1260,18 @@ fill_default_application_title_cb (GObject *source,
{
EphyApplicationDialogData *data = user_data;
char *title;
+ GError *error = NULL;
- title = ephy_web_view_get_web_app_title_finish (EPHY_WEB_VIEW (source), async_result, NULL);
- set_default_application_title (data, title);
+ /* Confusing: this can return NULL for no title, even when there is no error. */
+ title = ephy_web_view_get_web_app_title_finish (EPHY_WEB_VIEW (source), async_result, &error);
+ if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
+ set_default_application_title (data, title);
}
static void
fill_default_application_title (EphyApplicationDialogData *data)
{
- ephy_web_view_get_web_app_title (data->view, NULL, fill_default_application_title_cb, data);
+ ephy_web_view_get_web_app_title (data->view, data->cancellable, fill_default_application_title_cb, data);
}
static void
@@ -1476,6 +1494,7 @@ window_cmd_save_as_application (GSimpleAction *action,
data->image = image;
data->entry = entry;
data->spinner = spinner;
+ data->cancellable = g_cancellable_new ();
g_object_bind_property (image, "visible", spinner, "visible", G_BINDING_INVERT_BOOLEAN);
@@ -1587,8 +1606,7 @@ take_snapshot (EphyEmbed *embed,
WebKitWebView *view;
view = EPHY_GET_WEBKIT_WEB_VIEW_FROM_EMBED (embed);
- g_object_ref (view);
- webkit_web_view_get_snapshot (view,
+ webkit_web_view_get_snapshot (g_object_ref (view),
WEBKIT_SNAPSHOT_REGION_FULL_DOCUMENT,
WEBKIT_SNAPSHOT_OPTIONS_NONE,
NULL,
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]