File epiphany-fix-memory-leaks.patch of Package epiphany

From 9954541fdc25579033d396554717b4e4c30c8cfb Mon Sep 17 00:00:00 2001
From: Carlos Garcia Campos <cgarcia@igalia.com>
Date: Thu, 14 Jun 2012 17:35:58 +0000
Subject: Fix memory leak

---
Index: epiphany-3.4.2/src/window-commands.c
===================================================================
--- epiphany-3.4.2.orig/src/window-commands.c
+++ epiphany-3.4.2/src/window-commands.c
@@ -370,14 +370,15 @@ download_status_changed_cb (WebKitDownlo
 			    EphyApplicationDialogData *data)
 {
 	WebKitDownloadStatus status = webkit_download_get_status (download);
-	const char *destination;
+	char *filename;
 
 	switch (status)
 	{
 	case WEBKIT_DOWNLOAD_STATUS_FINISHED:
-		destination = g_filename_from_uri (webkit_download_get_destination_uri (download),
+		filename = g_filename_from_uri (webkit_download_get_destination_uri (download),
 						   NULL, NULL);
-		gtk_image_set_from_file (GTK_IMAGE (data->image), destination);
+		gtk_image_set_from_file (GTK_IMAGE (data->image), filename);
+		g_free (filename);
 		break;
 	case WEBKIT_DOWNLOAD_STATUS_ERROR:
 	case WEBKIT_DOWNLOAD_STATUS_CANCELLED:
Index: epiphany-3.4.2/embed/ephy-download.c
===================================================================
--- epiphany-3.4.2.orig/embed/ephy-download.c
+++ epiphany-3.4.2/embed/ephy-download.c
@@ -184,47 +184,34 @@ ephy_download_get_content_type (EphyDown
   return content_type;
 }
 
+
+/* Helper function to decide what EphyDownloadActionType should be the
+ * default for the download. This implies that you want something to
+ * happen, this function will never return EPHY_DOWNLOAD_ACTION_NONE.
+ */
 static EphyDownloadActionType
 decide_action_from_mime (EphyDownload *ephy_download)
 {
-  WebKitNetworkResponse *response;
-  SoupMessage *message;
-  char *mime_description = NULL;
+  char *content_type;
   GAppInfo *helper_app = NULL;
   EphyDownloadActionType action;
-  WebKitDownload *download;
-
-  download = ephy_download_get_webkit_download (ephy_download);
-
-  response = webkit_download_get_network_response (download);
-  message = webkit_network_response_get_message (response);
-
-  if (message) {
-    char *content_type = ephy_download_get_content_type (ephy_download);
 
-    if (content_type) {
-      mime_description = g_content_type_get_description (content_type);
-      helper_app = g_app_info_get_default_for_type (content_type, FALSE);
+  content_type = ephy_download_get_content_type (ephy_download);
+  if (content_type) {
+    helper_app = g_app_info_get_default_for_type (content_type, FALSE);
+    if (helper_app)
+      action = EPHY_DOWNLOAD_ACTION_OPEN;
 
-      if (helper_app)
-        action = EPHY_DOWNLOAD_ACTION_OPEN;
-
-      g_free (content_type);
-    }
-  }
-
-  if (mime_description == NULL) {
-    mime_description = g_strdup (C_("file type", "Unknown"));
-    action = EPHY_DOWNLOAD_ACTION_BROWSE_TO;
+    g_free (content_type);
   }
 
-  /* Sometimes downloads can have a mime_description but a NULL helper_app
-   * in that case action is never changed so DOWNLOAD_ACTION_DOWNLOAD remains
-   * as action value. This is the same response value as Save as...
-   * button, which is wrong for the Download button.
+  /* Downloads that have no content_type, or no helper_app, are
+   * considered unsafe/unable to open. Default them to BROWSE_TO.
    */
   if (helper_app == NULL)
     action = EPHY_DOWNLOAD_ACTION_BROWSE_TO;
+  else
+    g_object_unref (helper_app);
 
   return action;
 }
Index: epiphany-3.4.2/lib/widgets/ephy-download-widget.c
===================================================================
--- epiphany-3.4.2.orig/lib/widgets/ephy-download-widget.c
+++ epiphany-3.4.2/lib/widgets/ephy-download-widget.c
@@ -135,6 +135,17 @@ download_clicked_cb (GtkButton *button,
 }
 
 static void
+update_download_icon (EphyDownloadWidget *widget)
+{
+  GIcon *new_icon;
+
+  new_icon = get_gicon_from_download (widget->priv->download);
+  gtk_image_set_from_gicon (GTK_IMAGE (widget->priv->icon), new_icon,
+                            GTK_ICON_SIZE_LARGE_TOOLBAR);
+  g_object_unref (new_icon);
+}
+
+static void
 widget_progress_cb (GObject *object,
                     GParamSpec *pspec,
                     EphyDownloadWidget *widget)
@@ -152,9 +163,7 @@ widget_progress_cb (GObject *object,
   progress = webkit_download_get_progress (download) * 100;
 
   if (progress % 10 == 0)
-    gtk_image_set_from_gicon (GTK_IMAGE (widget->priv->icon),
-                              get_gicon_from_download (widget->priv->download),
-                              GTK_ICON_SIZE_LARGE_TOOLBAR);
+    update_download_icon (widget);
 
   time = get_remaining_time (download);
 
@@ -434,6 +443,7 @@ ephy_download_widget_new (EphyDownload *
 
   char *dest, *basename;
   WebKitDownload *download;
+  GIcon *gicon;
 
   g_return_val_if_fail (EPHY_IS_DOWNLOAD (ephy_download), NULL);
 
@@ -449,8 +459,10 @@ ephy_download_widget_new (EphyDownload *
   button = totem_glow_button_new ();
   menu = gtk_button_new ();
 
-  icon = gtk_image_new_from_gicon (get_gicon_from_download (ephy_download),
-                                   GTK_ICON_SIZE_LARGE_TOOLBAR);
+  gicon = get_gicon_from_download (ephy_download);
+  icon = gtk_image_new_from_gicon (gicon, GTK_ICON_SIZE_LARGE_TOOLBAR);
+  g_object_unref (gicon);
+
   text = gtk_label_new (dest);
   gtk_misc_set_alignment (GTK_MISC (text), 0, 0.5);
   gtk_label_set_ellipsize (GTK_LABEL (text), PANGO_ELLIPSIZE_END);
Index: epiphany-3.4.2/src/ephy-session.c
===================================================================
--- epiphany-3.4.2.orig/src/ephy-session.c
+++ epiphany-3.4.2/src/ephy-session.c
@@ -1109,6 +1109,7 @@ write_tab (xmlTextWriterPtr writer,
 	   EphyEmbed *embed)
 {
 	const char *address, *title;
+	char *new_address = NULL;
 	int ret;
 
 	ret = xmlTextWriterStartElement (writer, (xmlChar *) "embed");
@@ -1119,10 +1120,11 @@ write_tab (xmlTextWriterPtr writer,
 	 * loading. */
 	if (g_str_has_prefix (address, EPHY_ABOUT_SCHEME))
 	{
-		address = g_strconcat ("about", address + EPHY_ABOUT_SCHEME_LEN, NULL);
+		new_address = g_strconcat ("about", address + EPHY_ABOUT_SCHEME_LEN, NULL);
 	}
 	ret = xmlTextWriterWriteAttribute (writer, (xmlChar *) "url",
-					   (const xmlChar *) address);
+					   (const xmlChar *) (new_address ? new_address : address));
+	g_free (new_address);
 	if (ret < 0) return ret;
 
 	title = ephy_web_view_get_title (ephy_embed_get_web_view (embed));
Index: epiphany-3.4.2/src/bookmarks/ephy-bookmarks-editor.c
===================================================================
--- epiphany-3.4.2.orig/src/bookmarks/ephy-bookmarks-editor.c
+++ epiphany-3.4.2/src/bookmarks/ephy-bookmarks-editor.c
@@ -1139,9 +1139,8 @@ ephy_bookmarks_editor_update_menu (EphyB
 		key_normal = (priority == EPHY_NODE_NORMAL_PRIORITY);
 
 		EPHY_TOPIC_ACTION_NAME_PRINTF (name, node);
-
-		g_list_free (selected);
 	}
+	g_list_free (selected);
 
 	selected = ephy_node_view_get_selection (EPHY_NODE_VIEW (editor->priv->bm_view));
 	if (bmk_focus && selected)
@@ -1154,9 +1153,8 @@ ephy_bookmarks_editor_update_menu (EphyB
 		mutable = !ephy_node_get_property_boolean (node, EPHY_NODE_BMK_PROP_IMMUTABLE);
 		
 		EPHY_BOOKMARK_ACTION_NAME_PRINTF (name, node);
-
-		g_list_free (selected);
 	}
+	g_list_free (selected);
 
 	open_in_window_label = ngettext ("Open in New _Window",
 					 "Open in New _Windows",
@@ -1460,6 +1458,19 @@ node_dropped_cb (EphyNodeView *view,
 	}
 }
 
+static gboolean
+webkit_favicon_database_has_favicon (WebKitFaviconDatabase *database, const char *page_uri)
+{
+    gboolean result;
+    char *uri;
+
+    uri = webkit_favicon_database_get_favicon_uri (database, page_uri);
+    result = (uri != NULL);
+    g_free (uri);
+
+    return result;
+}
+
 static void
 icon_loaded_cb (WebKitFaviconDatabase *database, GAsyncResult *result, GValue *value)
 {
@@ -1489,7 +1500,7 @@ provide_favicon (EphyNode *node, GValue
                 favicon = webkit_favicon_database_try_get_favicon_pixbuf (database, page_location,
 									  FAVICON_SIZE, FAVICON_SIZE);
 
-		if (!favicon && webkit_favicon_database_get_favicon_uri (database, page_location))
+		if (!favicon && webkit_favicon_database_has_favicon (database, page_location))
 		  webkit_favicon_database_get_favicon_pixbuf (database, page_location,
 							      FAVICON_SIZE, FAVICON_SIZE, NULL,
 							      (GAsyncReadyCallback) icon_loaded_cb, value);
Index: epiphany-3.4.2/src/ephy-completion-model.c
===================================================================
--- epiphany-3.4.2.orig/src/ephy-completion-model.c
+++ epiphany-3.4.2/src/ephy-completion-model.c
@@ -416,7 +416,7 @@ query_completed_cb (EphyHistoryService *
 
   g_free (user_data->search_string);
   g_slice_free (FindURLsData, user_data);
-
+  g_list_free_full (urls, (GDestroyNotify)ephy_history_url_free);
   g_slist_free_full (list, (GDestroyNotify)free_potential_row);
 }
 
openSUSE Build Service is sponsored by