[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#596094: unblock: epiphany-browser/2.30.5-1



Package: release.debian.org
Severity: normal
User: release.debian.org@packages.debian.org
Usertags: freeze-exception

Please unblock epiphany-browser for squeeze.

epiphany-browser (2.30.5-1) unstable; urgency=low

   * New upstream bugfix release:
     + debian/patches/13_accept-languages.patch:
       - Dropped, merged upstream.
     + debian/patches/14_download_nautilus.patch,
       debian/patches/99_autoreconf.patch,
       debian/patches/99_ltmain_as-needed.patch:
       - Refreshed.

epiphany-browser (2.30.3-1) unstable; urgency=low

   [ Josselin Mouette ]
   * 14_download_nautilus.patch: don’t open nautilus every time a file is
     saved. This is simply annoying.
 
   [ Sebastian Dröge ]
   * New upstream bugfix release:
     + debian/control.in:
       - Build depend on WebKit >= 1.2.3.
     + debian/patches/05_libexecdir.patch,
       debian/patches/14_download_nautilus.patch,
       debian/patches/99_autoreconf.patch:
       - Refreshed.

The upstream changes are mostly bug fixes and translation updates.
Together with the webkit update (which I hope will be unblocked too) it
fixes a lot of crashers.

        ===============
        Epiphany 2.30.5
        ===============
        
        Paperbag release!
          - Don't depend on GTK 2.21.x
        
        ===============
        Epiphany 2.30.4
        ===============
        
        This releases tries to sync with master as much as possible. Mostly bug fixes,
        cleanups and small enhancements have been cherry-picked.
        
        Changes:
          - Prevent a crasher in the download dialog
          - Highlight matches on "Find again"
          - Install introspection files in our own prefix, not g-i's
          - Fix feeds URL for relative URIs
          - Don't let ephy-favicon-cache store invalid files
          - Update libegg to latest master
          - Remove deprecated functions to work with GTK+ 2.22 / master
        
        ===============
        Epiphany 2.30.3
        ===============
        
        Changes:
        
          - Fix middle click on back/forward buttons and its menus
          - Fix a crasher when loading URIs with no path
          - Adapt to GtkNotebook signal signature changes
        
The diff for C sources is attached. 

Cheers,
-- 
 .''`.
: :' :     “You would need to ask a lawyer if you don't know
`. `'       that a handshake of course makes a valid contract.”
  `-        --  J???rg Schilling
--- epiphany-2.30.2/embed/downloader-view.c	2010-03-24 18:14:47.000000000 +0100
+++ epiphany-2.30.5/embed/downloader-view.c	2010-08-30 22:58:42.000000000 +0200
@@ -803,7 +803,8 @@ downloader_view_add_download (Downloader
 	}
 #endif
 
-	dv->priv->source_id = g_timeout_add (100, (GSourceFunc) update_buttons_timeout_cb, dv);
+	if (dv->priv->source_id == 0)
+	    dv->priv->source_id = g_timeout_add (100, (GSourceFunc) update_buttons_timeout_cb, dv);
 }
 
 static void
--- epiphany-2.30.2/embed/ephy-embed.c	2010-03-29 18:08:54.000000000 +0200
+++ epiphany-2.30.5/embed/ephy-embed.c	2010-08-30 22:58:42.000000000 +0200
@@ -49,9 +49,13 @@
 #include <string.h>
 #include <webkit/webkit.h>
 
-static void     ephy_embed_class_init  (EphyEmbedClass *klass);
-static void     ephy_embed_init        (EphyEmbed *gs);
-static void     ephy_embed_constructed (GObject *object);
+static void     ephy_embed_class_init       (EphyEmbedClass *klass);
+static void     ephy_embed_init             (EphyEmbed *gs);
+static void     ephy_embed_constructed      (GObject *object);
+static gboolean ephy_embed_inspect_show_cb  (WebKitWebInspector *inspector,
+                                             EphyEmbed *embed);
+static gboolean ephy_embed_inspect_close_cb (WebKitWebInspector *inspector,
+                                             EphyEmbed *embed);
 
 #define EPHY_EMBED_GET_PRIVATE(object)(G_TYPE_INSTANCE_GET_PRIVATE ((object), EPHY_TYPE_EMBED, EphyEmbedPrivate))
 
@@ -59,10 +63,13 @@ struct EphyEmbedPrivate
 {
   GtkBox *top_widgets_vbox;
   GtkScrolledWindow *scrolled_window;
+  GtkPaned *paned;
   WebKitWebView *web_view;
   EphyHistory *history;
   GtkWidget *inspector_window;
   char *loading_uri;
+  GtkWidget *inspector_scrolled_window;
+  gboolean inspector_attached;
   guint is_setting_zoom : 1;
   GSList *destroy_on_transition_list;
 };
@@ -335,6 +342,13 @@ zoom_changed_cb (WebKitWebView *web_view
 }
 
 static void
+ephy_embed_history_cleared_cb (EphyHistory *history,
+                               EphyEmbed *embed)
+{
+  ephy_web_view_clear_history (EPHY_WEB_VIEW (embed->priv->web_view));
+}
+
+static void
 ephy_embed_grab_focus (GtkWidget *widget)
 {
   GtkWidget *child;
@@ -346,6 +360,32 @@ ephy_embed_grab_focus (GtkWidget *widget
 }
 
 static void
+ephy_embed_dispose (GObject *object)
+{
+  EphyEmbed *embed = EPHY_EMBED (object);
+
+  if (embed->priv->inspector_window)
+  {
+    WebKitWebInspector *inspector;
+
+    inspector = webkit_web_view_get_inspector (embed->priv->web_view);
+
+    g_signal_handlers_disconnect_by_func (inspector,
+                                          ephy_embed_inspect_show_cb,
+                                          embed->priv->inspector_window);
+
+    g_signal_handlers_disconnect_by_func (inspector,
+                                          ephy_embed_inspect_close_cb,
+                                          embed->priv->inspector_window);
+
+    gtk_widget_destroy (GTK_WIDGET (embed->priv->inspector_window));
+    embed->priv->inspector_window = NULL;
+  }
+
+  G_OBJECT_CLASS (ephy_embed_parent_class)->dispose (object);
+}
+
+static void
 ephy_embed_finalize (GObject *object)
 {
   EphyEmbed *embed = EPHY_EMBED (object);
@@ -360,6 +400,10 @@ ephy_embed_finalize (GObject *object)
   }
   g_slist_free (embed->priv->destroy_on_transition_list);
 
+  g_signal_handlers_disconnect_by_func (embed->priv->history,
+                                        ephy_embed_history_cleared_cb,
+                                        embed);
+
   G_OBJECT_CLASS (ephy_embed_parent_class)->finalize (object);
 }
 
@@ -371,6 +415,7 @@ ephy_embed_class_init (EphyEmbedClass *k
 
   object_class->constructed = ephy_embed_constructed;
   object_class->finalize = ephy_embed_finalize;
+  object_class->dispose = ephy_embed_dispose;
   widget_class->grab_focus = ephy_embed_grab_focus;
 
   g_type_class_add_private (G_OBJECT_CLASS (klass), sizeof(EphyEmbedPrivate));
@@ -393,18 +438,94 @@ ephy_embed_inspect_web_view_cb (WebKitWe
 }
 
 static gboolean
+ephy_embed_attach_inspector_cb (WebKitWebInspector *inspector,
+                                EphyEmbed *embed)
+{
+  GtkAllocation allocation;
+  gtk_widget_get_allocation (GTK_WIDGET (embed->priv->scrolled_window), &allocation);
+
+  embed->priv->inspector_attached = TRUE;
+
+  if (embed->priv->paned == NULL)
+  {
+    embed->priv->paned = GTK_PANED (gtk_vpaned_new ());
+    g_object_ref_sink (embed->priv->paned);
+  }
+
+  /* Main view */
+  g_object_ref (embed->priv->scrolled_window);
+  gtk_container_remove (GTK_CONTAINER (embed),
+                        GTK_WIDGET (embed->priv->scrolled_window));
+  gtk_paned_pack1 (embed->priv->paned,
+                   GTK_WIDGET (embed->priv->scrolled_window),
+                   TRUE, FALSE);
+  g_object_unref (embed->priv->scrolled_window);
+
+  /* Set a sane position for the mover */
+  gtk_paned_set_position (embed->priv->paned, allocation.height * 0.5);
+
+  /* The inspector */
+  g_object_ref (embed->priv->inspector_scrolled_window);
+  gtk_container_remove (GTK_CONTAINER (embed->priv->inspector_window),
+                        GTK_WIDGET (embed->priv->inspector_scrolled_window));
+  gtk_paned_pack2 (embed->priv->paned,
+                   GTK_WIDGET (embed->priv->inspector_scrolled_window),
+                   FALSE, TRUE);
+  g_object_unref (embed->priv->inspector_scrolled_window);
+
+  /* Add the paned to the embed, show it, and hide the inspector window */
+  gtk_container_add (GTK_CONTAINER (embed), GTK_WIDGET (embed->priv->paned));
+  gtk_widget_show_all (GTK_WIDGET (embed->priv->paned));
+
+  gtk_widget_hide (embed->priv->inspector_window);
+
+  return TRUE;
+}
+
+static gboolean
+ephy_embed_detach_inspector_cb (WebKitWebInspector *inspector,
+                                EphyEmbed *embed)
+{
+  embed->priv->inspector_attached = FALSE;
+
+  gtk_container_remove (GTK_CONTAINER (embed),
+                        GTK_WIDGET (embed->priv->paned));
+
+  /* Main view */
+  gtk_widget_reparent (GTK_WIDGET (embed->priv->scrolled_window),
+                       GTK_WIDGET (embed));
+
+  /* The inspector */
+  gtk_widget_reparent (GTK_WIDGET (embed->priv->inspector_scrolled_window),
+                       GTK_WIDGET (embed->priv->inspector_window));
+
+  /* Get the view and the inspector back to their places */
+  gtk_widget_destroy (GTK_WIDGET (embed->priv->paned));
+  embed->priv->paned = NULL;
+
+  gtk_widget_show_all (embed->priv->inspector_window);
+  gtk_widget_show_all (embed->priv->inspector_scrolled_window);
+
+  return TRUE;
+}
+
+static gboolean
 ephy_embed_inspect_show_cb (WebKitWebInspector *inspector,
-                              GtkWidget *widget)
+                            EphyEmbed *embed)
 {
-  gtk_widget_show (widget);
+  if (!embed->priv->inspector_attached)
+    gtk_window_present (GTK_WINDOW (embed->priv->inspector_window));
+
   return TRUE;
 }
 
 static gboolean
 ephy_embed_inspect_close_cb (WebKitWebInspector *inspector,
-                               GtkWidget *widget)
+                             EphyEmbed *embed)
 {
-  gtk_widget_hide (widget);
+  if (!embed->priv->inspector_attached)
+    gtk_widget_hide (embed->priv->inspector_window);
+
   return TRUE;
 }
 
@@ -485,6 +606,7 @@ static const char*
 parse_extension (const char *filename)
 {
   const char *compression;
+  const char *last_separator;
 
   compression = file_is_compressed (filename);
 
@@ -511,7 +633,8 @@ parse_extension (const char *filename)
   }
 
   /* no compression, just look for the last dot in the filename */
-  return g_strrstr (filename, ".");
+  last_separator = strrchr (filename, G_DIR_SEPARATOR);
+  return strrchr ((last_separator) ? last_separator : filename, '.');
 }
 
 static gboolean
@@ -670,7 +793,7 @@ confirm_action_from_mime (WebKitWebView 
                           DownloadAction action)
 {
   GtkWidget *parent_window;
-  GtkWidget *dialog, *button, *image;
+  GtkWidget *dialog;
   const char *action_label;
   char *mime_description;
   EphyMimePermission mime_permission;
@@ -679,6 +802,9 @@ confirm_action_from_mime (WebKitWebView 
   int default_response;
   WebKitNetworkResponse *response;
   SoupMessage *message;
+  GtkMessageType mtype;
+  char *title;
+  char *secondary;
 
   parent_window = gtk_widget_get_toplevel (GTK_WIDGET(web_view));
   if (!gtk_widget_is_toplevel (parent_window))
@@ -721,58 +847,49 @@ confirm_action_from_mime (WebKitWebView 
   suggested_filename = webkit_download_get_suggested_filename (download);
 
   if (mime_permission != EPHY_MIME_PERMISSION_SAFE && helper_app) {
-    dialog = gtk_message_dialog_new (GTK_WINDOW (parent_window),
-                                     GTK_DIALOG_DESTROY_WITH_PARENT,
-                                     GTK_MESSAGE_WARNING, GTK_BUTTONS_NONE,
-                                     _("Download this potentially unsafe file?"));
-
-    gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog),
-                                              /* translators: First %s is the file type description,
-                                                 Second %s is the file name */
-                                              _("File Type: “%s”.\n\nIt is unsafe to open “%s” as "
-                                                "it could potentially damage your documents or "
-                                                "invade your privacy. You can download it instead."),
-                                              mime_description, suggested_filename);
+    title = _("Download this potentially unsafe file?");
+    mtype = GTK_MESSAGE_WARNING;
+    /* translators: First %s is the file type description, second %s is the
+     * file name */
+    secondary = g_strdup_printf (_("File Type: “%s”.\n\nIt is unsafe to open "
+                                   "“%s” as it could potentially damage your "
+                                   "documents or invade your privacy. "
+                                   "You can download it instead."),
+                                 mime_description, suggested_filename);
+
     action_label = STOCK_DOWNLOAD;
   } else if (action == DOWNLOAD_ACTION_OPEN && helper_app) {
-    dialog = gtk_message_dialog_new (GTK_WINDOW (parent_window),
-                                     GTK_DIALOG_DESTROY_WITH_PARENT,
-                                     GTK_MESSAGE_QUESTION, GTK_BUTTONS_NONE,
-                                     _("Open this file?"));
-
-    gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog),
-                                              /* translators: First %s is the file type description,
-                                                 Second %s is the file name,
-                                                 Third %s is the application used to open the file */
-                                              _("File Type: “%s”.\n\nYou can open “%s” using “%s” or save it."),
-                                              mime_description, suggested_filename,
-                                              g_app_info_get_name (helper_app));
+    title = _("Open this file?");
+    mtype = GTK_MESSAGE_QUESTION;
+    /* translators: First %s is the file type description, second %s is the
+     * file name, third %s is the application used to open the file */
+    secondary = g_strdup_printf (_("File Type: “%s”.\n\nYou can open “%s” "
+                                   "using “%s” or save it."),
+                                 mime_description, suggested_filename,
+                                 g_app_info_get_name (helper_app));
   } else  {
-    dialog = gtk_message_dialog_new (GTK_WINDOW (parent_window),
-                                     GTK_DIALOG_DESTROY_WITH_PARENT,
-                                     GTK_MESSAGE_QUESTION, GTK_BUTTONS_NONE,
-                                     _("Download this file?"));
-
-    gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog),
-                                              /* translators: First %s is the file type description,
-                                                 Second %s is the file name */
-                                              _("File Type: “%s”.\n\nYou have no application able to open “%s”. "
-                                                "You can download it instead."),
-                                              mime_description, suggested_filename);
+    title = _("Download this file?");
+    mtype = GTK_MESSAGE_QUESTION;
+    /* translators: First %s is the file type description, second %s is the
+     * file name */
+    secondary = g_strdup_printf (_("File Type: “%s”.\n\nYou have no "
+                                   "application able to open “%s”. "
+                                   "You can download it instead."),
+                                 mime_description, suggested_filename);
   }
 
-  g_free (mime_description);
+  dialog = gtk_message_dialog_new (GTK_WINDOW (parent_window),
+                                   GTK_DIALOG_DESTROY_WITH_PARENT,
+                                   mtype, GTK_BUTTONS_NONE,
+                                   title);
+  gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog),
+                                            secondary, NULL);
 
-  button = gtk_button_new_with_mnemonic (_("_Save As..."));
-  image = gtk_image_new_from_stock (GTK_STOCK_SAVE_AS, GTK_ICON_SIZE_BUTTON);
-  gtk_button_set_image (GTK_BUTTON (button), image);
-  gtk_widget_set_can_default (button, TRUE);
-  /* don't show the image! see bug #307818 */
-  gtk_widget_show (button);
-  gtk_dialog_add_action_widget (GTK_DIALOG (dialog),
-                                button, DOWNLOAD_ACTION_DOWNLOAD);
+  g_free (mime_description);
 
   gtk_dialog_add_button (GTK_DIALOG (dialog),
+                         GTK_STOCK_SAVE_AS, DOWNLOAD_ACTION_DOWNLOAD);
+  gtk_dialog_add_button (GTK_DIALOG (dialog),
                          GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL);
   gtk_dialog_add_button (GTK_DIALOG (dialog),
                          action_label, action);
@@ -900,7 +1017,6 @@ ephy_embed_constructed (GObject *object)
   GtkWidget *scrolled_window;
   WebKitWebView *web_view;
   WebKitWebInspector *inspector;
-  GtkWidget *inspector_sw;
 
   embed->priv->top_widgets_vbox = GTK_BOX (gtk_vbox_new (FALSE, 0));
   gtk_box_pack_start (GTK_BOX (embed), GTK_WIDGET (embed->priv->top_widgets_vbox),
@@ -929,16 +1045,16 @@ ephy_embed_constructed (GObject *object)
   embed->priv->inspector_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
   inspector = webkit_web_view_get_inspector (web_view);
 
-  inspector_sw = gtk_scrolled_window_new (NULL, NULL);
-  gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (inspector_sw),
+  embed->priv->inspector_scrolled_window = gtk_scrolled_window_new (NULL, NULL);
+  gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (embed->priv->inspector_scrolled_window),
                                   GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
   gtk_container_add (GTK_CONTAINER (embed->priv->inspector_window),
-                     inspector_sw);
+                     embed->priv->inspector_scrolled_window);
 
   gtk_window_set_title (GTK_WINDOW (embed->priv->inspector_window),
                         _("Web Inspector"));
   gtk_window_set_default_size (GTK_WINDOW (embed->priv->inspector_window),
-                               600, 400);
+                               800, 600);
 
   g_signal_connect (embed->priv->inspector_window,
                     "delete-event", G_CALLBACK (gtk_widget_hide_on_delete),
@@ -946,16 +1062,24 @@ ephy_embed_constructed (GObject *object)
 
   g_object_connect (inspector,
                     "signal::inspect-web-view", G_CALLBACK (ephy_embed_inspect_web_view_cb),
-                    inspector_sw,
+                    embed->priv->inspector_scrolled_window,
                     "signal::show-window", G_CALLBACK (ephy_embed_inspect_show_cb),
-                    embed->priv->inspector_window,
+                    embed,
                     "signal::close-window", G_CALLBACK (ephy_embed_inspect_close_cb),
-                    embed->priv->inspector_window,
+                    embed,
+                    "signal::attach-window", G_CALLBACK (ephy_embed_attach_inspector_cb),
+                    embed,
+                    "signal::detach-window", G_CALLBACK (ephy_embed_detach_inspector_cb),
+                    embed,
                     NULL);
 
   ephy_embed_prefs_add_embed (embed);
 
   embed->priv->history = EPHY_HISTORY (ephy_embed_shell_get_global_history (ephy_embed_shell_get_default ()));
+
+  g_signal_connect (embed->priv->history,
+                    "cleared", G_CALLBACK (ephy_embed_history_cleared_cb),
+                    embed);
 }
 
 static void
@@ -964,6 +1088,7 @@ ephy_embed_init (EphyEmbed *embed)
   embed->priv = EPHY_EMBED_GET_PRIVATE (embed);
 
   embed->priv->scrolled_window = GTK_SCROLLED_WINDOW (gtk_scrolled_window_new (NULL, NULL));
+  embed->priv->paned = NULL;
 
   gtk_scrolled_window_set_policy (embed->priv->scrolled_window,
                                   GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
--- epiphany-2.30.2/embed/ephy-embed-persist.c	2010-03-09 22:51:28.000000000 +0100
+++ epiphany-2.30.5/embed/ephy-embed-persist.c	2010-08-30 22:58:42.000000000 +0200
@@ -763,7 +763,36 @@ ephy_embed_persist_save (EphyEmbedPersis
 	 */
 	g_object_ref (persist);
 
-	request = webkit_network_request_new (priv->source);
+	if (priv->embed)
+	{
+		EphyWebView *web_view;
+		SoupMessage *msg;
+		gchar *referer;
+
+		/* Get the webview associated to the embed */
+		web_view = ephy_embed_get_web_view (priv->embed);
+
+		/* Create the request with a SoupMessage to allow
+		   setting the 'Referer' as got from the embed */
+		msg = soup_message_new (SOUP_METHOD_GET, priv->source);
+		request = WEBKIT_NETWORK_REQUEST (
+			g_object_new (WEBKIT_TYPE_NETWORK_REQUEST,
+				      "message", msg,
+				      NULL));
+
+		/* Add the referer to the request headers */
+		referer = ephy_web_view_get_location (web_view, FALSE);
+		soup_message_headers_append (msg->request_headers,
+					     "Referer", referer);
+		g_free (referer);
+		g_object_unref (msg);
+	}
+	else
+	{
+		/* Create a normal network request otherwise */
+		request = webkit_network_request_new (priv->source);
+	}
+
 	priv->download = webkit_download_new (request);
 	g_object_unref (request);
 
@@ -795,7 +824,7 @@ ephy_embed_persist_save (EphyEmbedPersis
 						window,
 						GTK_FILE_CHOOSER_ACTION_SAVE,
 						priv->persist_key,
-						EPHY_FILE_FILTER_ALL_SUPPORTED);
+						EPHY_FILE_FILTER_ALL);
 
 		gtk_file_chooser_set_do_overwrite_confirmation
 				(GTK_FILE_CHOOSER (dialog), TRUE);
--- epiphany-2.30.2/embed/ephy-embed-prefs.c	2010-02-20 10:42:51.000000000 +0100
+++ epiphany-2.30.5/embed/ephy-embed-prefs.c	2010-08-30 22:58:42.000000000 +0200
@@ -278,6 +278,49 @@ webkit_pref_callback_font_family (GConfC
   }
 }
 
+/* Part of this code taken from libsoup (soup-session.c) */
+static gchar *
+build_accept_languages_header (GArray *languages)
+{
+  gchar **langs = NULL;
+  gchar *langs_str = NULL;
+  gint delta;
+  gint i;
+
+  g_return_val_if_fail (languages != NULL, NULL);
+
+  /* Calculate deltas for the quality values */
+  if (languages->len < 10)
+    delta = 10;
+  else if (languages->len < 20)
+    delta = 5;
+  else
+    delta = 1;
+
+  /* Set quality values for each language */
+  langs = (gchar **) languages->data;
+  for (i = 0; langs[i] != NULL; i++) {
+    gchar *lang = (gchar *) langs[i];
+    gint quality = 100 - i * delta;
+
+    if (quality > 0 && quality < 100) {
+      gchar buf[8];
+      g_ascii_formatd (buf, 8, "%.2f", quality/100.0);
+      langs[i] = g_strdup_printf ("%s;q=%s", lang, buf);
+    } else {
+      /* Just dup the string in this case */
+      langs[i] = g_strdup (lang);
+    }
+    g_free (lang);
+  }
+
+  /* Get the result string */
+  if (languages->len > 0)
+    langs_str = g_strjoinv (", ", langs);
+
+  return langs_str;
+}
+
 /* Based on Christian Persch's code from gecko backend of epiphany
    (old transform_accept_languages_list() function) */
 static void
@@ -290,7 +333,7 @@ webkit_pref_callback_accept_languages (G
   GConfValue *gcvalue;
   GArray *array;
   GSList *languages, *l;
-  char **langs;
+  char **array_data;
   char *langs_str;
   char *webkit_pref;
 
@@ -318,14 +361,15 @@ webkit_pref_callback_accept_languages (G
 
   ephy_langs_sanitise (array);
 
-  langs = (char **) g_array_free (array, FALSE);
-  langs_str = g_strjoinv (", ", langs);
+  langs_str = build_accept_languages_header (array);
 
   /* Update Soup session */
   session = webkit_get_default_session ();
   g_object_set (G_OBJECT (session), webkit_pref, langs_str, NULL);
 
-  g_strfreev (langs);
+  /* Free memory */
+  array_data = (char **) g_array_free (array, FALSE);
+  g_strfreev (array_data);
   g_free (langs_str);
 }
 
--- epiphany-2.30.2/embed/ephy-embed-single.c	2010-02-26 02:25:49.000000000 +0100
+++ epiphany-2.30.5/embed/ephy-embed-single.c	2010-08-30 22:58:42.000000000 +0200
@@ -319,26 +319,6 @@ ephy_embed_single_class_init (EphyEmbedS
                 G_TYPE_STRING);
 
   /**
-   * EphyEmbedSingle::add-sidebar:
-   * @single:
-   * @url: The url of the sidebar to be added
-   * @title: The title of the sidebar to be added
-   *
-   * The ::add-sidebar signal is emitted when the user clicks a javascript link that
-   * requests adding a url to the sidebar.
-   **/
-  g_signal_new ("add-sidebar",
-                EPHY_TYPE_EMBED_SINGLE,
-                G_SIGNAL_RUN_LAST,
-                G_STRUCT_OFFSET (EphyEmbedSingleClass, add_sidebar),
-                g_signal_accumulator_true_handled, NULL,
-                ephy_marshal_BOOLEAN__STRING_STRING,
-                G_TYPE_BOOLEAN,
-                2,
-                G_TYPE_STRING | G_SIGNAL_TYPE_STATIC_SCOPE,
-                G_TYPE_STRING | G_SIGNAL_TYPE_STATIC_SCOPE);
-
-  /**
    * EphyEmbedSingle::add-search-engine
    * @single:
    * @url: The url of the search engine definition file
--- epiphany-2.30.2/embed/ephy-embed-single.h	2010-01-08 19:20:59.000000000 +0100
+++ epiphany-2.30.5/embed/ephy-embed-single.h	2010-08-30 22:58:42.000000000 +0200
@@ -68,10 +68,6 @@ struct _EphyEmbedSingleClass
                                char *mime_type,
                                char *uri);
 
-  gboolean (* add_sidebar)    (EphyEmbedSingle *single,
-                               const char *url,
-                               const char *title);
-
   gboolean (* add_search_engine) (EphyEmbedSingle *single,
                                   const char *url,
                                   const char *icon_url,
--- epiphany-2.30.2/embed/ephy-favicon-cache.c	2010-01-08 19:20:59.000000000 +0100
+++ epiphany-2.30.5/embed/ephy-favicon-cache.c	2010-08-30 22:58:42.000000000 +0200
@@ -101,7 +101,6 @@ enum
 	EPHY_NODE_FAVICON_PROP_FILENAME	 = 3,
 	EPHY_NODE_FAVICON_PROP_LAST_USED = 4,
 	EPHY_NODE_FAVICON_PROP_STATE	 = 5,
-	EPHY_NODE_FAVICON_PROP_CHECKOLD  = 6,
 	EPHY_NODE_FAVICON_PROP_CHECKED	 = 7,
 };
 
@@ -444,13 +443,33 @@ ephy_favicon_cache_finalize (GObject *ob
 	G_OBJECT_CLASS (ephy_favicon_cache_parent_class)->finalize (object);
 }
 
+static gboolean
+is_valid_mime_type (const char *mime_type)
+{
+
+	gboolean valid = FALSE;
+
+	valid = g_strcmp0 (mime_type, "image/x-ico") == 0 ||
+		g_strcmp0 (mime_type, "image/vnd.microsoft.icon") == 0 ||
+		g_strcmp0 (mime_type, "image/png") == 0 ||
+		g_strcmp0 (mime_type, "image/gif") == 0 ||
+		g_strcmp0 (mime_type, "application/octet-stream") == 0;
+
+	return valid;
+}
+
 static void
 favicon_download_status_changed_cb (WebKitDownload *download,
 				    GParamSpec *spec,
 				    EphyFaviconCache *cache)
 {
 	WebKitDownloadStatus status = webkit_download_get_status (download);
-	const char* url = webkit_download_get_uri (download);
+	const char *url = webkit_download_get_uri (download);
+	const char *destination = webkit_download_get_destination_uri (download);
+	const char *mime_type;
+	GFile *file;
+	GFileInfo *file_info;
+	gboolean valid;
 
 	switch (status) {
 	case WEBKIT_DOWNLOAD_STATUS_FINISHED:
@@ -458,12 +477,30 @@ favicon_download_status_changed_cb (WebK
 
 		g_hash_table_remove (cache->priv->downloads_hash, url);
 
-		g_signal_emit (G_OBJECT (cache), signals[CHANGED], 0, url);
+		file = g_file_new_for_uri (destination);
+		file_info = g_file_query_info (file,
+					       G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE,
+					       0, NULL, NULL);
+
+		mime_type = g_file_info_get_content_type (file_info);
+		valid = is_valid_mime_type (mime_type);
+
+		if (!valid)
+		{
+			LOG ("Deleting invalid %s type", mime_type);
+			g_file_delete (file, NULL, NULL);
+		}
+		else
+		{
+			g_signal_emit (G_OBJECT (cache), signals[CHANGED], 0, url);
+		}
+
+		g_object_unref (file);
+		g_object_unref (file_info);
 
 		g_object_unref (download);
 
 		cache->priv->dirty = TRUE;
-
 		break;
 	case WEBKIT_DOWNLOAD_STATUS_ERROR:
 	case WEBKIT_DOWNLOAD_STATUS_CANCELLED:
@@ -471,9 +508,15 @@ favicon_download_status_changed_cb (WebK
 
 		g_hash_table_remove (cache->priv->downloads_hash, url);
 
-		/* TODO: remove a partially downloaded file */
 		/* FIXME: re-schedule to try again after n days? */
+		file = g_file_new_for_uri (destination);
+		if (g_file_query_exists (file, NULL))
+		{
+			LOG ("Deleting incomplete favicon download");
+			g_file_delete (file, NULL, NULL);
+		}
 
+		g_object_unref (file);
 		g_object_unref (download);
 
 		cache->priv->dirty = TRUE;
@@ -522,7 +565,7 @@ ephy_favicon_cache_download (EphyFavicon
 
 /**
  * ephy_favicons_cache_get:
- * @cache:
+ * @cache: an #EphyFaviconCache
  * @url: the URL of the icon to retrieve
  * 
  * Note: This will always return %NULL for non-http URLs.
@@ -682,18 +725,16 @@ ephy_favicon_cache_get (EphyFaviconCache
 		{
 			return NULL;
 		}
-		valid = strcmp (mime_type, "image/x-ico") == 0 ||
-			strcmp (mime_type, "image/vnd.microsoft.icon") == 0 ||
-			strcmp (mime_type, "image/png") == 0 ||
-			strcmp (mime_type, "image/gif") == 0;
-		is_ao = strcmp (mime_type, "application/octet-stream") == 0;
+
+		valid = is_valid_mime_type (mime_type);
+		is_ao = g_strcmp0 (mime_type, "application/octet-stream") == 0;
 
 		g_object_unref (file_info);
-		g_object_unref (file);
 
-		/* As a special measure, we try to load an application/octet-stream file
-		 * as an ICO file, since we cannot detect a ICO file without .ico extension
-		 * (the mime system has no magic for it).
+		/* As a special measure, we try to load an
+		 * application/octet-stream file as an ICO file, since we
+		 * cannot detect a ICO file without .ico extension (the mime
+		 * system has no magic for it).
 		 */
 		if (is_ao)
 		{
@@ -731,16 +772,13 @@ ephy_favicon_cache_get (EphyFaviconCache
 		else
 		{
 			/* remove invalid file from cache */
-			/* gnome_vfs_unlink (pix_file); */
+			g_file_delete (file, NULL, NULL);
 		}
+		g_object_unref (file);
 
 		ephy_node_set_property_int (icon,
 					    EPHY_NODE_FAVICON_PROP_CHECKED,
 					    (int) checklevel);
-
-		/* epiphany 1.6 compat */
-		ephy_node_set_property_boolean
-			(icon, EPHY_NODE_FAVICON_PROP_CHECKOLD, valid);
 	}
 
 	/* if it still needs the check, mime type couldn't be checked. Deny! */
@@ -795,7 +833,7 @@ ephy_favicon_cache_get (EphyFaviconCache
 
 /**
  * ephy_favicons_cache_clear:
- * @cache:
+ * @cache: the #EphyFaviconCache to clear
  * 
  * Clears the favicon cache and removes any stored icon files from disk.
  */
--- epiphany-2.30.2/embed/ephy-web-view.c	2010-04-07 10:37:25.000000000 +0200
+++ epiphany-2.30.5/embed/ephy-web-view.c	2010-08-30 22:58:42.000000000 +0200
@@ -1247,8 +1247,21 @@ do_hook_into_links (JSContextRef js_cont
       char *type = js_get_element_attribute (js_context, obj, "type");
       char *title = js_get_element_attribute (js_context, obj, "title");
       char *address = js_get_element_attribute (js_context, obj, "href");
+      SoupURI *feed_uri, *current_uri;
 
-      g_signal_emit_by_name (web_view, "ge-feed-link", type, title, address);
+      feed_uri = soup_uri_new (address);
+      if (!feed_uri) {
+        current_uri = soup_uri_new (ephy_web_view_get_address (web_view));
+        feed_uri = soup_uri_new_with_base (current_uri, address);
+        soup_uri_free (current_uri);
+      }
+
+      if (feed_uri) {
+        g_free (address);
+        address = soup_uri_to_string (feed_uri, FALSE);
+        g_signal_emit_by_name (web_view, "ge-feed-link", type, title, address);
+        soup_uri_free (feed_uri);
+      }
 
       g_free (type);
       g_free (title);
@@ -1623,24 +1636,6 @@ ephy_web_view_class_init (EphyWebViewCla
             0);
 
 /**
- * EphyWebView::dom-content-loaded:
- * @view: the #EphyWebView that received the signal
- *
- * The ::dom-content-loaded signal is emitted when 
- * the document has been loaded (excluding images and other loads initiated by this document).
- * That's true also for frameset and all the frames within it.
- **/
-    g_signal_new ("dom_content_loaded",
-            EPHY_TYPE_WEB_VIEW,
-            G_SIGNAL_RUN_FIRST,
-            G_STRUCT_OFFSET (EphyWebViewClass, dom_content_loaded),
-            NULL, NULL,
-            g_cclosure_marshal_VOID__POINTER,
-            G_TYPE_NONE,
-            1,
-            G_TYPE_POINTER);
-
-/**
  * EphyWebView::search-key-press:
  * @view: the #EphyWebView that received the signal
  * @event: the #GdkEventKey which triggered this signal
@@ -2045,6 +2040,32 @@ normalize_or_autosearch_url (EphyWebView
   return effective_url;
 }
 
+static void
+update_navigation_flags (EphyWebView *view)
+{
+  EphyWebViewPrivate *priv = view->priv;
+  guint flags = 0;
+  WebKitWebView *web_view = WEBKIT_WEB_VIEW (view);
+
+  if (ephy_web_view_can_go_up (view)) {
+    flags |= EPHY_WEB_VIEW_NAV_UP;
+  }
+
+  if (webkit_web_view_can_go_back (web_view)) {
+    flags |= EPHY_WEB_VIEW_NAV_BACK;
+  }
+
+  if (webkit_web_view_can_go_forward (web_view)) {
+    flags |= EPHY_WEB_VIEW_NAV_FORWARD;
+  }
+
+  if (priv->nav_flags != (EphyWebViewNavigationFlags)flags) {
+    priv->nav_flags = (EphyWebViewNavigationFlags)flags;
+
+    g_object_notify (G_OBJECT (view), "navigation");
+  }
+}
+
 /**
  * ephy_web_view_load_request:
  * @view: the #EphyWebView in which to load the request
@@ -2150,6 +2171,36 @@ ephy_web_view_copy_back_history (EphyWeb
 }
 
 /**
+ * ephy_web_view_clear_history:
+ * @view: the #EphyWebView to clear the history from
+ *
+ * Clears history of @view.
+ **/
+void
+ephy_web_view_clear_history (EphyWebView *view)
+{
+  WebKitWebBackForwardList *history_list;
+
+  g_return_if_fail (EPHY_IS_WEB_VIEW (view));
+
+  history_list = webkit_web_view_get_back_forward_list (WEBKIT_WEB_VIEW (view));
+  if (history_list != NULL) {
+    WebKitWebHistoryItem *current_item;
+
+    /* Save a ref to the first element to add it later */
+    current_item = webkit_web_back_forward_list_get_current_item (history_list);
+    g_object_ref (current_item);
+
+    /* Clear the history and add the first element once again */
+    webkit_web_back_forward_list_clear (history_list);
+    webkit_web_back_forward_list_add_item (history_list, current_item);
+    g_object_unref (current_item);
+
+    update_navigation_flags (view);
+  }
+}
+
+/**
  * ephy_web_view_set_address:
  * @view: an #EphyWebView
  * @address: address to set @view to
@@ -2330,32 +2381,6 @@ update_net_state_message (EphyWebView *v
     g_free (host);
 }
 
-static void
-update_navigation_flags (EphyWebView *view)
-{
-  EphyWebViewPrivate *priv = view->priv;
-  guint flags = 0;
-  WebKitWebView *web_view = WEBKIT_WEB_VIEW (view);
-
-  if (ephy_web_view_can_go_up (view)) {
-    flags |= EPHY_WEB_VIEW_NAV_UP;
-  }
-
-  if (webkit_web_view_can_go_back (web_view)) {
-    flags |= EPHY_WEB_VIEW_NAV_BACK;
-  }
-
-  if (webkit_web_view_can_go_forward (web_view)) {
-    flags |= EPHY_WEB_VIEW_NAV_FORWARD;
-  }
-
-  if (priv->nav_flags != (EphyWebViewNavigationFlags)flags) {
-    priv->nav_flags = (EphyWebViewNavigationFlags)flags;
-
-    g_object_notify (G_OBJECT (view), "navigation");
-  }
-}
-
 /**
  * ephy_web_view_update_from_net_state:
  * @view: an #EphyWebView
@@ -2658,7 +2683,7 @@ ephy_web_view_can_go_up (EphyWebView *vi
     return FALSE;
   }
 
-  result = (uri->fragment || uri->query || strlen (uri->path) > 1);
+  result = uri->fragment || uri->query || (uri->path && (strlen (uri->path) > 1));
   soup_uri_free (uri);
 
   return result;
--- epiphany-2.30.2/embed/ephy-web-view.h	2010-04-07 10:37:25.000000000 +0200
+++ epiphany-2.30.5/embed/ephy-web-view.h	2010-08-30 22:58:42.000000000 +0200
@@ -124,8 +124,6 @@ struct _EphyWebViewClass
                                  EphyEmbedEvent *event);
   gboolean (* dom_mouse_down)	(EphyWebView *view,
                                  EphyEmbedEvent *event);
-  void	 (* dom_content_loaded) (EphyWebView *view,
-                                 gpointer event);
   void	 (* popup_blocked)	(EphyWebView *view,
                                  const char *address,
                                  const char *target,
@@ -155,6 +153,7 @@ void                       ephy_web_view
                                                                   const char                      *url);
 void                       ephy_web_view_copy_back_history       (EphyWebView                     *source,
                                                                   EphyWebView                     *dest);
+void                       ephy_web_view_clear_history           (EphyWebView                     *view);
 gboolean                   ephy_web_view_is_loading              (EphyWebView                     *view);
 const char *               ephy_web_view_get_loading_title       (EphyWebView                     *view);
 GdkPixbuf *                ephy_web_view_get_icon                (EphyWebView                     *view);
--- epiphany-2.30.2/lib/egg/eggmarshalers.h	2010-01-11 21:38:12.000000000 +0100
+++ epiphany-2.30.5/lib/egg/eggmarshalers.h	2010-08-31 00:55:51.000000000 +0200
@@ -6,7 +6,7 @@
 
 G_BEGIN_DECLS
 
-/* VOID:INT,INT (../../../lib/egg/eggmarshalers.list:1) */
+/* VOID:INT,INT (./eggmarshalers.list:1) */
 extern void _egg_marshal_VOID__INT_INT (GClosure     *closure,
                                         GValue       *return_value,
                                         guint         n_param_values,
--- epiphany-2.30.2/lib/ephy-file-helpers.c	2010-02-27 11:26:59.000000000 +0100
+++ epiphany-2.30.5/lib/ephy-file-helpers.c	2010-08-30 22:58:42.000000000 +0200
@@ -229,7 +229,7 @@ ephy_file_tmp_filename (const char *base
 	int fd;
 	char *name = g_strdup (base);
 
-	fd = mkstemp (name);
+	fd = g_mkstemp (name);
 
 	if (fd != -1)
 	{
--- epiphany-2.30.2/lib/ephy-gui.c	2010-01-08 19:21:00.000000000 +0100
+++ epiphany-2.30.5/lib/ephy-gui.c	2010-08-30 22:58:42.000000000 +0200
@@ -20,7 +20,6 @@
 #include "config.h"
 
 #include "ephy-gui.h"
-#include "eel-gconf-extensions.h"
 #include "ephy-stock-icons.h"
 #include "ephy-debug.h"
 
@@ -506,45 +505,3 @@ ephy_gui_message_dialog_get_content_box 
 
 	return container;
 }
-
-/* Until bug #345349 is fixed */
-void
-ephy_gui_message_dialog_set_wrap_mode (GtkMessageDialog *dialog,
-				       PangoWrapMode wrap_mode)
-{
-	GtkContainer *container;
-	GList *children, *l;
-
-	container = GTK_CONTAINER (dialog->label->parent);
-	g_return_if_fail (GTK_IS_CONTAINER (container));
-
-	children = gtk_container_get_children (container);
-	for (l = children; l != NULL; l = l->next)
-	{
-		GtkWidget *child = l->data;
-
-		if (GTK_IS_LABEL (child))
-		{
-			g_print ("Setting wrap mode on label %p\n", child);
-			gtk_label_set_line_wrap_mode (GTK_LABEL (child),
-						      wrap_mode);
-		}
-	}
-}
-
-static void
-checkbutton_toggled_cb (GtkToggleButton *button,
-			const char *pref)
-{
-	eel_gconf_set_boolean (pref, gtk_toggle_button_get_active (button));
-}
-
-void
-ephy_gui_connect_checkbutton_to_gconf (GtkWidget *widget,
-				       const char *pref)
-{
-	gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget),
-				      eel_gconf_get_boolean (pref));
-	g_signal_connect (widget, "toggled",
-			  G_CALLBACK (checkbutton_toggled_cb), (gpointer) pref);
-}
--- epiphany-2.30.2/lib/ephy-gui.h	2010-01-08 19:21:00.000000000 +0100
+++ epiphany-2.30.5/lib/ephy-gui.h	2010-08-30 22:58:42.000000000 +0200
@@ -72,9 +72,6 @@ void		ephy_gui_window_update_user_time	 
 
 GtkWidget      *ephy_gui_message_dialog_get_content_box	 (GtkWidget *dialog);
 
-void		ephy_gui_message_dialog_set_wrap_mode	 (GtkMessageDialog *dialog,
-							  PangoWrapMode wrap_mode);
-
 void		ephy_gui_connect_checkbutton_to_gconf	 (GtkWidget *widget,
 							  const char *pref);
 
--- epiphany-2.30.2/lib/widgets/ephy-location-entry.c	2010-02-11 15:51:53.000000000 +0100
+++ epiphany-2.30.5/lib/widgets/ephy-location-entry.c	2010-08-30 22:58:42.000000000 +0200
@@ -466,8 +466,6 @@ editable_changed_cb (GtkEditable *editab
 		g_regex_unref (quote_regex);
 	}
 
-	update_favicon (entry);
-
 	g_signal_emit (entry, signals[USER_CHANGED], 0);
 }
 
@@ -736,8 +734,8 @@ each_url_get_data_binder (EphyDragEachSe
 	g_free (title);
 }
 
-#define DRAG_ICON_LAYOUT_BORDER		2
-#define DRAG_ICON_ICON_SPACING		DRAG_ICON_LAYOUT_BORDER * 2
+#define DRAG_ICON_LAYOUT_PADDING	2
+#define DRAG_ICON_ICON_PADDING		4
 #define DRAG_ICON_MAX_WIDTH_CHARS	32
 
 static GdkPixmap *
@@ -754,8 +752,12 @@ favicon_create_drag_pixmap (EphyLocation
 	PangoFontMetrics *metrics;
 	int pixmap_height, pixmap_width;
 	int layout_width, layout_height;
-	int icon_width = 0, icon_height = 0, offset_x = 0;
+	int icon_width = 0, icon_height = 0, favicon_offset_x = 0;
 	int char_width;
+	cairo_t *cr;
+	GtkStateType state;
+
+	state = gtk_widget_get_state (widget);
 
 	g_signal_emit (entry, signals[GET_LOCATION], 0, &address);
 	g_signal_emit (entry, signals[GET_TITLE], 0, &title);
@@ -776,8 +778,6 @@ favicon_create_drag_pixmap (EphyLocation
 		g_string_append (text, address);
 	}
 
-	/* Now build the pixmap */
-
 	if (priv->favicon != NULL)
 	{
 		icon_width = gdk_pixbuf_get_width (priv->favicon);
@@ -787,7 +787,6 @@ favicon_create_drag_pixmap (EphyLocation
 	context = gtk_widget_get_pango_context (widget);
 	layout = pango_layout_new (context);
 
-	context = gtk_widget_get_pango_context (widget);
 	style = gtk_widget_get_style (widget);
 	metrics = pango_context_get_metrics (context,
 					     style->font_desc,
@@ -800,64 +799,57 @@ favicon_create_drag_pixmap (EphyLocation
 	pango_layout_set_width (layout, char_width * DRAG_ICON_MAX_WIDTH_CHARS);
 	pango_layout_set_text (layout, text->str, text->len);
 
-	pango_layout_get_size (layout, &layout_width, &layout_height);
-
-	pixmap_width  = layout_width  / PANGO_SCALE + DRAG_ICON_LAYOUT_BORDER * 2;
+	pango_layout_get_pixel_size (layout, &layout_width, &layout_height);
 
 	if (priv->favicon != NULL)
 	{
-		offset_x = icon_width + 2 * DRAG_ICON_ICON_SPACING;
-		pixmap_width += offset_x;
-		pixmap_height = MAX (layout_height / PANGO_SCALE, icon_height) + DRAG_ICON_LAYOUT_BORDER * 2;
-	}
-	else
-	{
-		pixmap_height = layout_height / PANGO_SCALE + DRAG_ICON_LAYOUT_BORDER * 2;
+		favicon_offset_x = icon_width + (2 * DRAG_ICON_ICON_PADDING);
 	}
 
+	pixmap_width = layout_width + favicon_offset_x +
+			(DRAG_ICON_LAYOUT_PADDING * 2);
+	pixmap_height = MAX (layout_height, icon_height) +
+			(DRAG_ICON_LAYOUT_PADDING * 2);
+
 	drawable = gdk_pixmap_new (gtk_widget_get_window (widget),
-				   pixmap_width  + 2,
+				   pixmap_width + 2,
 				   pixmap_height + 2,
 				   -1);
+	cr = gdk_cairo_create (drawable);
+
+	cairo_rectangle (cr, 1, 1, pixmap_width, pixmap_height);
+	cairo_set_line_width (cr, 1.0);
 
-	gdk_draw_rectangle (drawable,
-			    style->base_gc [gtk_widget_get_state (widget)],
-			    TRUE,
-			    0, 0,
-			    pixmap_width + 1,
-			    pixmap_height + 1);
+	cairo_set_source_rgb (cr, 0.0, 0.0, 0.0);
+	cairo_stroke_preserve (cr);
 
+	gdk_cairo_set_source_color (cr, &style->bg[state]);
+	cairo_fill (cr);
 
 	if (priv->favicon != NULL)
 	{
-		gdk_draw_pixbuf (drawable,
-				 style->fg_gc[gtk_widget_get_state (widget)],
-				 priv->favicon,
-				 0, 0, 
-				 1 + DRAG_ICON_LAYOUT_BORDER + DRAG_ICON_ICON_SPACING,
-				 1 + DRAG_ICON_LAYOUT_BORDER + (pixmap_height - icon_height) / 2,
-				 -1, -1,
-				 GDK_RGB_DITHER_NONE, 0, 0);
-	}
-
-	gdk_draw_layout (drawable,
-			 style->text_gc [gtk_widget_get_state (widget)],
-			 1 + DRAG_ICON_LAYOUT_BORDER + offset_x,
-			 1 + DRAG_ICON_LAYOUT_BORDER,
-			 layout);
-
-	gdk_draw_rectangle (drawable,
-			    style->black_gc,
-			    FALSE,
-			    0, 0,
-			    pixmap_width + 1,
-			    pixmap_height + 1);
+		double x;
+		double y;
+
+		x = 1 + DRAG_ICON_LAYOUT_PADDING + DRAG_ICON_ICON_PADDING;
+		y = 1 + DRAG_ICON_LAYOUT_PADDING + (pixmap_height - icon_height) / 2;
+		gdk_cairo_set_source_pixbuf (cr, priv->favicon, x, y);
+		cairo_rectangle (cr, x, y, icon_width, icon_height);
+		cairo_fill (cr);
+	}
+
+	cairo_move_to (cr,
+		       1 + DRAG_ICON_LAYOUT_PADDING + favicon_offset_x,
+		       1 + DRAG_ICON_LAYOUT_PADDING);
+	gdk_cairo_set_source_color (cr, &style->text[state]);
+	pango_cairo_show_layout (cr, layout);
 
+	cairo_destroy (cr);
 	g_object_unref (layout);
 
 	g_free (address);
 	g_free (title);
-	g_string_free (text,TRUE);
+	g_string_free (text, TRUE);
 
 	return drawable;
 }
@@ -1253,16 +1245,11 @@ ephy_location_entry_set_completion (Ephy
 	g_signal_connect_after (completion, "action-activated",
 				G_CALLBACK (action_activated_after_cb), entry);
 
-	/* FIXME: this works fine, but the favicons seem to be
-	 * added-removed the view constantly, and the visual effect is
-	 * very ugly */
-#if 0
 	cell = gtk_cell_renderer_pixbuf_new ();
 	gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (completion),
 				    cell, FALSE);
 	gtk_cell_layout_add_attribute (GTK_CELL_LAYOUT (completion),
 				       cell, "pixbuf", favicon_col);
-#endif
 
 	cell = gtk_cell_renderer_text_new ();
 	g_object_set (cell,
--- epiphany-2.30.2/lib/widgets/ephy-spinner.c	2010-02-11 15:51:53.000000000 +0100
+++ epiphany-2.30.5/lib/widgets/ephy-spinner.c	2010-08-30 22:58:42.000000000 +0200
@@ -625,8 +625,7 @@ ephy_spinner_expose (GtkWidget *widget,
 	EphySpinnerImages *images;
 	GtkAllocation allocation;
 	GdkPixbuf *pixbuf;
-	GdkWindow *window;
-	GdkGC *gc;
+	cairo_t *cr;
 	int x_offset, y_offset, width, height;
 	GdkRectangle pix_area, dest;
 
@@ -675,15 +674,12 @@ ephy_spinner_expose (GtkWidget *widget,
 		return FALSE;
 	}
 
-	window = gtk_widget_get_window (widget);
-	gc = gdk_gc_new (window);
-	gdk_draw_pixbuf (window, gc, pixbuf,
-			 dest.x - x_offset - allocation.x,
-			 dest.y - y_offset - allocation.y,
-			 dest.x, dest.y,
-			 dest.width, dest.height,
-			 GDK_RGB_DITHER_MAX, 0, 0);
-	g_object_unref (gc);
+	cr = gdk_cairo_create (gtk_widget_get_window (widget));
+
+	gdk_cairo_set_source_pixbuf (cr, pixbuf, dest.x, dest.y);
+	cairo_paint (cr);
+
+	cairo_destroy (cr);
 
 	return FALSE;
 }
--- epiphany-2.30.2/src/ephy-action-helper.h	2010-01-08 19:21:01.000000000 +0100
+++ epiphany-2.30.5/src/ephy-action-helper.h	2010-08-19 04:44:26.000000000 +0200
@@ -28,6 +28,11 @@
 
 G_BEGIN_DECLS
 
+enum
+{
+	SENS_FLAG = 1 << 0
+};
+
 void ephy_action_change_sensitivity_flags (GtkAction *action,
 					   guint flags,
 					   gboolean set);
--- epiphany-2.30.2/src/ephy-find-toolbar.c	2010-02-08 20:18:47.000000000 +0100
+++ epiphany-2.30.5/src/ephy-find-toolbar.c	2010-08-30 22:58:42.000000000 +0200
@@ -73,10 +73,16 @@ enum
 
 typedef enum
 {
-	EPHY_FIND_FOUND		= 0,
-	EPHY_FIND_NOTFOUND	= 1,
-	EPHY_FIND_FOUNDWRAPPED	= 2
-} EphyEmbedFindResult;
+	EPHY_FIND_RESULT_FOUND		= 0,
+	EPHY_FIND_RESULT_NOTFOUND	= 1,
+	EPHY_FIND_RESULT_FOUNDWRAPPED	= 2
+} EphyFindResult;
+
+typedef enum
+{
+	EPHY_FIND_DIRECTION_NEXT,
+	EPHY_FIND_DIRECTION_PREV
+} EphyFindDirection;
 
 static guint signals[LAST_SIGNAL];
 
@@ -131,7 +137,7 @@ set_status_notfound_cb (EphyFindToolbar 
 
 static void
 set_status (EphyFindToolbar *toolbar,
-	    EphyEmbedFindResult result)
+	    EphyFindResult result)
 {
 	EphyFindToolbarPrivate *priv = toolbar->priv;
 	char *text = NULL;
@@ -139,10 +145,10 @@ set_status (EphyFindToolbar *toolbar,
 
 	switch (result)
 	{
-		case EPHY_FIND_FOUND:
+		case EPHY_FIND_RESULT_FOUND:
 			text = NULL;
 			break;
-		case EPHY_FIND_NOTFOUND:
+		case EPHY_FIND_RESULT_NOTFOUND:
 			{
 				text = _("Not found");
 
@@ -155,7 +161,7 @@ set_status (EphyFindToolbar *toolbar,
 				priv->source_id = g_timeout_add (500, (GSourceFunc) set_status_notfound_cb, toolbar);
 			}
 			break;
-		case EPHY_FIND_FOUNDWRAPPED:
+		case EPHY_FIND_RESULT_FOUNDWRAPPED:
 			text = _("Wrapped");
 			break;
 	}
@@ -239,15 +245,16 @@ ephy_find_toolbar_mark_matches (EphyFind
         webkit_web_view_set_highlight_text_matches (web_view, TRUE);
 }
 
-static EphyEmbedFindResult
+static EphyFindResult
 real_find (EphyFindToolbarPrivate *priv,
-	   gboolean forward)
+	   EphyFindDirection direction)
 {
         WebKitWebView *web_view = priv->web_view;
         gboolean case_sensitive = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (priv->case_sensitive));
+        gboolean forward = (direction == EPHY_FIND_DIRECTION_NEXT);
 
         if (!priv->find_string || !g_strcmp0 (priv->find_string, ""))
-                return EPHY_FIND_NOTFOUND;
+                return EPHY_FIND_RESULT_NOTFOUND;
 
         if (!webkit_web_view_search_text
             (web_view, priv->find_string, case_sensitive, forward, FALSE)) {
@@ -255,27 +262,27 @@ real_find (EphyFindToolbarPrivate *priv,
                 if (!webkit_web_view_search_text
                     (web_view, priv->find_string, case_sensitive, forward, TRUE)) {
                         /* there's no result */
-                        return EPHY_FIND_NOTFOUND;
+                        return EPHY_FIND_RESULT_NOTFOUND;
                 } else {
                         /* found wrapped */
-                        return EPHY_FIND_FOUNDWRAPPED;
+                        return EPHY_FIND_RESULT_FOUNDWRAPPED;
                 }
         }
 
-        return EPHY_FIND_FOUND;
+        return EPHY_FIND_RESULT_FOUND;
 }
 
 static gboolean
 do_search (EphyFindToolbar *toolbar)
 {
 	EphyFindToolbarPrivate *priv = toolbar->priv;
-	EphyEmbedFindResult result;
+	EphyFindResult result;
 
 	priv->find_source_id = 0;
 
 	ephy_find_toolbar_mark_matches (toolbar);
 
-	result = real_find (priv, TRUE);
+	result = real_find (priv, EPHY_FIND_DIRECTION_NEXT);
 	set_status (toolbar, result);
 
 	return FALSE;
@@ -429,11 +436,12 @@ case_sensitive_toggled_cb (GtkWidget *ch
 	 */
 	if (case_sensitive)
 	{
-		EphyEmbedFindResult result;
+		EphyFindResult result;
 
-		result = real_find (toolbar->priv, FALSE);
-		if (result != EPHY_FIND_NOTFOUND)
-			result = real_find (toolbar->priv, TRUE);
+		result = real_find (toolbar->priv, EPHY_FIND_DIRECTION_PREV);
+		if (result != EPHY_FIND_RESULT_NOTFOUND)
+			result = real_find (toolbar->priv,
+					    EPHY_FIND_DIRECTION_NEXT);
 
 		set_status (toolbar, result);
 	}
@@ -778,7 +786,8 @@ ephy_find_toolbar_set_embed (EphyFindToo
 typedef struct
 {
 	EphyFindToolbar *toolbar;
-	gboolean next;
+	gboolean direction;
+	gboolean highlight;
 } FindAgainCBStruct;
 
 static void
@@ -787,24 +796,19 @@ find_again_data_destroy_cb (FindAgainCBS
 	g_slice_free (FindAgainCBStruct, data);
 }
 
-static EphyEmbedFindResult
-ephy_find_toolbar_find_again (EphyFindToolbar *toolbar,
-                              gboolean forward,
-                              gboolean links_only)
-{
-  EphyFindToolbarPrivate *priv = toolbar->priv;
-
-  return real_find (priv, forward);
-}
-
 static gboolean
 find_again_cb (FindAgainCBStruct *data)
 {
-	EphyEmbedFindResult result;
+	EphyFindResult result;
 	EphyFindToolbarPrivate *priv = data->toolbar->priv;
 
-	result = ephy_find_toolbar_find_again (data->toolbar, data->next,
-				  priv->links_only);
+	result = real_find (priv, data->direction);
+
+	/* Highlight matches again if the toolbar was hidden when the user
+	 * requested find-again. */
+	if (result != EPHY_FIND_RESULT_NOTFOUND && data->highlight)
+		ephy_find_toolbar_mark_matches (data->toolbar);
+
 	set_status (data->toolbar, result);
 
 	priv->find_again_source_id = 0;
@@ -812,28 +816,30 @@ find_again_cb (FindAgainCBStruct *data)
 	return FALSE;
 }
 
-void
-ephy_find_toolbar_find_next (EphyFindToolbar *toolbar)
+static void
+find_again (EphyFindToolbar *toolbar, EphyFindDirection direction)
 {
 	GtkWidget *widget = GTK_WIDGET (toolbar);
 	EphyFindToolbarPrivate *priv = toolbar->priv;
 	FindAgainCBStruct *data;
+	gboolean visible;
 
-	if (!gtk_widget_get_visible (widget)) {
+	visible = gtk_widget_get_visible (widget);
+	if (!visible) {
 		gtk_widget_show (widget);
 		gtk_widget_grab_focus (widget);
 	}
 
-	/* We need to do this here (and in find_previous) to give time to the embed
-	 * to sync with the size change due to the toolbar being shown, otherwise
-	 * the toolbar can obscure the result. See GNOME bug #415074.
+	/* We need to do this to give time to the embed to sync with the size
+	 * change due to the toolbar being shown, otherwise the toolbar can
+	 * obscure the result. See GNOME bug #415074.
 	 */
-
 	if (priv->find_again_source_id != 0) return;
 
 	data = g_slice_new0 (FindAgainCBStruct);
 	data->toolbar = toolbar;
-	data->next = TRUE;
+	data->direction = direction;
+	data->highlight = !visible;
 
 	priv->find_again_source_id = g_idle_add_full (G_PRIORITY_DEFAULT_IDLE,
 						      (GSourceFunc) find_again_cb,
@@ -842,27 +848,15 @@ ephy_find_toolbar_find_next (EphyFindToo
 }
 
 void
-ephy_find_toolbar_find_previous (EphyFindToolbar *toolbar)
+ephy_find_toolbar_find_next (EphyFindToolbar *toolbar)
 {
-	GtkWidget *widget = GTK_WIDGET (toolbar);
-	EphyFindToolbarPrivate *priv = toolbar->priv;
-	FindAgainCBStruct *data;
-
-	if (!gtk_widget_get_visible (widget)) {
-		gtk_widget_show (widget);
-		gtk_widget_grab_focus (widget);
-	}
-
-	if (priv->find_again_source_id != 0) return;
-
-	data = g_slice_new0 (FindAgainCBStruct);
-	data->toolbar = toolbar;
-	data->next = FALSE;
+	find_again (toolbar, EPHY_FIND_DIRECTION_NEXT);
+}
 
-	priv->find_again_source_id = g_idle_add_full (G_PRIORITY_DEFAULT_IDLE,
-						      (GSourceFunc) find_again_cb,
-						      data,
-						      (GDestroyNotify) find_again_data_destroy_cb);
+void
+ephy_find_toolbar_find_previous (EphyFindToolbar *toolbar)
+{
+	find_again (toolbar, EPHY_FIND_DIRECTION_PREV);
 }
 
 void
@@ -885,15 +879,6 @@ ephy_find_toolbar_open (EphyFindToolbar 
 	gtk_widget_grab_focus (GTK_WIDGET (toolbar));
 }
 
-static void
-ephy_find_toolbar_set_selection (EphyFindToolbar *toolbar,
-                                 gboolean attention)
-{
-        WebKitWebView *web_view = toolbar->priv->web_view;
-
-        webkit_web_view_set_highlight_text_matches (web_view, attention);
-}
-
 void
 ephy_find_toolbar_close (EphyFindToolbar *toolbar)
 {
@@ -902,7 +887,8 @@ ephy_find_toolbar_close (EphyFindToolbar
 	gtk_widget_hide (GTK_WIDGET (toolbar));
 
 	if (priv->web_view == NULL) return;
-	ephy_find_toolbar_set_selection (toolbar, FALSE);
+
+	webkit_web_view_set_highlight_text_matches (priv->web_view, FALSE);
 }
 
 void
--- epiphany-2.30.2/src/ephy-location-action.c	2010-02-15 20:05:56.000000000 +0100
+++ epiphany-2.30.5/src/ephy-location-action.c	2010-08-30 22:58:42.000000000 +0200
@@ -101,7 +101,6 @@ match_func (GtkEntryCompletion *completi
 	char *item = NULL;
 	char *url = NULL;
 	char *keywords = NULL;
-	char *extra = NULL;
 
 	gboolean ret = FALSE;
 	GtkTreeModel *model;
@@ -113,7 +112,6 @@ match_func (GtkEntryCompletion *completi
 			    EPHY_COMPLETION_TEXT_COL, &item,
 			    EPHY_COMPLETION_URL_COL, &url,
 			    EPHY_COMPLETION_KEYWORDS_COL, &keywords,
-			    EPHY_COMPLETION_EXTRA_COL, &extra,
 			    -1);
 	
 	if (!key)
@@ -441,7 +439,7 @@ focus_out_event_cb (GtkWidget *entry,
 
 static void
 switch_page_cb (GtkNotebook *notebook,
-		GtkNotebookPage *page,
+		GtkWidget *page,
 		guint page_num,
 		GtkAction *action)
 {
--- epiphany-2.30.2/src/ephy-navigation-action.c	2010-04-07 11:47:52.000000000 +0200
+++ epiphany-2.30.5/src/ephy-navigation-action.c	2010-08-30 22:55:16.000000000 +0200
@@ -25,11 +25,8 @@
 #include "ephy-navigation-action.h"
 
 #include "ephy-debug.h"
-#include "ephy-embed-container.h"
 #include "ephy-embed-shell.h"
-#include "ephy-embed-utils.h"
 #include "ephy-favicon-cache.h"
-#include "ephy-gui.h"
 #include "ephy-history.h"
 #include "ephy-link.h"
 #include "ephy-shell.h"
@@ -39,21 +36,11 @@
 #include <gtk/gtk.h>
 #include <webkit/webkit.h>
 
-#define HISTORY_ITEM_DATA_KEY	  "HistoryItem"
-#define URL_DATA_KEY	          "GoURL"
-
 #define EPHY_NAVIGATION_ACTION_GET_PRIVATE(object)(G_TYPE_INSTANCE_GET_PRIVATE ((object), EPHY_TYPE_NAVIGATION_ACTION, EphyNavigationActionPrivate))
 
-typedef enum
-{
-	WEBKIT_HISTORY_BACKWARD,
-	WEBKIT_HISTORY_FORWARD
-} WebKitHistoryType;
-
 struct _EphyNavigationActionPrivate
 {
 	EphyWindow *window;
-	EphyNavigationDirection direction;
 	char *arrow_tooltip;
 	guint statusbar_cid;
 };
@@ -62,7 +49,6 @@ enum
 {
 	PROP_0,
 	PROP_ARROW_TOOLTIP,
-	PROP_DIRECTION,
 	PROP_WINDOW
 };
 
@@ -71,264 +57,15 @@ static void ephy_navigation_action_class
 
 G_DEFINE_TYPE (EphyNavigationAction, ephy_navigation_action, EPHY_TYPE_LINK_ACTION)
 
-#define MAX_LABEL_LENGTH 48
-
-static GtkWidget *
-new_history_menu_item (const char *origtext,
-		       const char *address)
-{
-	EphyFaviconCache *cache;
-	EphyHistory *history;
-	GtkWidget *item, *image;
-	GdkPixbuf *icon = NULL;
-	GtkLabel *label;
-	const char *icon_address;
-
-	g_return_val_if_fail (address != NULL && origtext != NULL, NULL);
-
-	item = gtk_image_menu_item_new_with_label (origtext);
-
-	label = GTK_LABEL (gtk_bin_get_child (GTK_BIN (item)));
-	gtk_label_set_ellipsize (label, PANGO_ELLIPSIZE_END);
-	gtk_label_set_max_width_chars (label, MAX_LABEL_LENGTH);
-
-	history = EPHY_HISTORY
-		(ephy_embed_shell_get_global_history (embed_shell));
-	icon_address = ephy_history_get_icon (history, address);
-
-	cache = EPHY_FAVICON_CACHE
-		(ephy_embed_shell_get_favicon_cache (embed_shell));
-	icon = ephy_favicon_cache_get (cache, icon_address);
-
-	if (icon != NULL)
-	{
-		image = gtk_image_new_from_pixbuf (icon);
-		gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (item), image);
-		gtk_widget_show (image);
-		g_object_unref (icon);
-	}
-
-	gtk_widget_show (item);
-
-	return item;
-}
-
-static void
-activate_back_or_forward_menu_item_cb (GtkWidget *menuitem,
-				       EphyNavigationAction *action)
-{
-	WebKitWebHistoryItem *item;
-	EphyEmbed *embed;
-
-	embed = ephy_embed_container_get_active_child (EPHY_EMBED_CONTAINER (action->priv->window));
-	g_return_if_fail (embed != NULL);
-
-	if (ephy_gui_is_middle_click ())
-	{
-		embed = ephy_link_open (EPHY_LINK (action), "about:blank", NULL,
-				        EPHY_LINK_NEW_TAB);
-		g_return_if_fail (embed != NULL);
-	}
-
-	item = (WebKitWebHistoryItem*)g_object_get_data (G_OBJECT (menuitem), HISTORY_ITEM_DATA_KEY);
-	g_return_if_fail (item != NULL);
-
-	webkit_web_view_go_to_back_forward_item (EPHY_GET_WEBKIT_WEB_VIEW_FROM_EMBED (embed), item);
-}
-
-static void
-select_menu_item_cb (GtkWidget *menuitem,
-	             EphyNavigationAction *action)
-{
-	const char *url;
-	GtkWidget *statusbar;
-	WebKitWebHistoryItem *item;
-
-	item = (WebKitWebHistoryItem*)g_object_get_data (G_OBJECT (menuitem), HISTORY_ITEM_DATA_KEY);
-	if (item)
-	{
-		url = webkit_web_history_item_get_uri (item);
-	}
-	else
-	{
-		url = g_object_get_data (G_OBJECT (menuitem), URL_DATA_KEY);
-		g_return_if_fail (url != NULL);
-	}
-
-	statusbar = ephy_window_get_statusbar (action->priv->window);
-
-	gtk_statusbar_push (GTK_STATUSBAR (statusbar), action->priv->statusbar_cid, url);
-}
-
-static void
-deselect_menu_item_cb (GtkWidget *menuitem,
-	               EphyNavigationAction *action)
-{
-	GtkWidget *statusbar;
-
-	statusbar = ephy_window_get_statusbar (action->priv->window);
-
-	gtk_statusbar_pop (GTK_STATUSBAR (statusbar), action->priv->statusbar_cid);
-}
-
-static void
-activate_up_menu_item_cb (GtkWidget *menuitem,
-			  EphyNavigationAction *action)
-{
-	EphyEmbed *embed;
-	char *url;
-
-	embed = ephy_embed_container_get_active_child (EPHY_EMBED_CONTAINER (action->priv->window));
-	g_return_if_fail (embed != NULL);
-
-	url = g_object_get_data (G_OBJECT (menuitem), URL_DATA_KEY);
-	g_return_if_fail (url != NULL);
-
-	ephy_link_open (EPHY_LINK (action), url, NULL,
-			ephy_gui_is_middle_click () ? EPHY_LINK_NEW_TAB : 0);
-}
-
-static GList*
-webkit_construct_history_list (WebKitWebView *web_view, WebKitHistoryType hist_type) 
-{
-	WebKitWebBackForwardList *web_back_forward_list;
-	GList *webkit_items;
-
-	web_back_forward_list = webkit_web_view_get_back_forward_list (web_view);
-
-	if (hist_type == WEBKIT_HISTORY_FORWARD)
-		webkit_items = g_list_reverse (webkit_web_back_forward_list_get_forward_list_with_limit (web_back_forward_list,
-													 EPHY_WEBKIT_BACK_FORWARD_LIMIT));
-	else
-		webkit_items = webkit_web_back_forward_list_get_back_list_with_limit (web_back_forward_list,
-										      EPHY_WEBKIT_BACK_FORWARD_LIMIT);
-
-	return webkit_items;
-}
-
-static GtkWidget *
-build_back_or_forward_menu (EphyNavigationAction *action)
-{
-	EphyWindow *window = action->priv->window;
-	GtkMenuShell *menu;
-	EphyEmbed *embed;
-	GList *list, *l;
-	WebKitWebView *web_view;
-
-	embed = ephy_embed_container_get_active_child (EPHY_EMBED_CONTAINER (window));
-	g_return_val_if_fail (embed != NULL, NULL);
-
-	web_view = EPHY_GET_WEBKIT_WEB_VIEW_FROM_EMBED (embed);
-	g_return_val_if_fail (web_view != NULL, NULL);
-
-	if (action->priv->direction == EPHY_NAVIGATION_DIRECTION_BACK)
-		list = webkit_construct_history_list (web_view,
-						      WEBKIT_HISTORY_BACKWARD);
-	else
-		list = webkit_construct_history_list (web_view,
-						      WEBKIT_HISTORY_FORWARD);
-
-	menu = GTK_MENU_SHELL (gtk_menu_new ());
 
-	l = list;
-
-	for (l = list; l != NULL; l = l->next)
-	{
-		GtkWidget *item;
-		WebKitWebHistoryItem *hitem;
-		const char *url;
-		char *title;
-
-		hitem = (WebKitWebHistoryItem*)l->data;
-		url = webkit_web_history_item_get_uri (hitem);
-
-		title = g_strdup (webkit_web_history_item_get_title (hitem));
-
-		if ((title == NULL || g_strstrip (title)[0] == '\0'))
-			item = new_history_menu_item (url, url);
-		else
-			item = new_history_menu_item (title, url);
-
-		g_free (title);
-
-		g_object_set_data_full (G_OBJECT (item), HISTORY_ITEM_DATA_KEY,
-					g_object_ref (hitem), g_object_unref);
-
-		g_signal_connect (item, "activate",
-				  G_CALLBACK (activate_back_or_forward_menu_item_cb),
-				  action);
-		g_signal_connect (item, "select",
-				  G_CALLBACK (select_menu_item_cb),
-				  action);
-		g_signal_connect (item, "deselect",
-				  G_CALLBACK (deselect_menu_item_cb),
-				  action);
-
-		gtk_menu_shell_append (menu, item);
-		gtk_widget_show_all (item);
-	}
-	
-	g_list_free (list);
-
-	return GTK_WIDGET (menu);
-}
+#define MAX_LABEL_LENGTH 48
 
 static GtkWidget *
-build_up_menu (EphyNavigationAction *action)
+build_dropdown_menu (EphyNavigationAction *action)
 {
-	EphyWindow *window = action->priv->window;
-	EphyEmbed *embed;
-	EphyHistory *history;
-	GtkMenuShell *menu;
-	GtkWidget *item;
-	GSList *list, *l;
-	char *url;
-
-	embed = ephy_embed_container_get_active_child (EPHY_EMBED_CONTAINER (window));
-	g_return_val_if_fail (embed != NULL, NULL);
-
-	menu = GTK_MENU_SHELL (gtk_menu_new ());
-
-    	history = EPHY_HISTORY
-		(ephy_embed_shell_get_global_history (embed_shell));
+	EphyNavigationActionClass *class = EPHY_NAVIGATION_ACTION_GET_CLASS (action);
 
-	list = ephy_web_view_get_go_up_list (ephy_embed_get_web_view (embed));
-
-	for (l = list; l != NULL; l = l->next)
-	{
-		EphyNode *node;
-		const char *title = NULL;
-
-		url = g_strdup (l->data);
-
-		if (url == NULL) continue;
-
-		node = ephy_history_get_page (history, url);
-		if (node != NULL)
-		{
-			title = ephy_node_get_property_string (node, EPHY_NODE_PAGE_PROP_TITLE);
-		}
-
-		item = new_history_menu_item (title ? title : url, url);
-
-		g_object_set_data_full (G_OBJECT (item), URL_DATA_KEY, url,
-					(GDestroyNotify) g_free);
-		g_signal_connect (item, "activate",
-				  G_CALLBACK (activate_up_menu_item_cb), action);
-		g_signal_connect (item, "select",
-				  G_CALLBACK (select_menu_item_cb), action);
-		g_signal_connect (item, "deselect",
-				  G_CALLBACK (deselect_menu_item_cb), action);
-
-		gtk_menu_shell_append (menu, item);
-		gtk_widget_show (item);
-	}
-
-	/* the list data has been consumed */
-	g_slist_foreach (list, (GFunc) g_free, NULL);
-	g_slist_free (list);
-
-	return GTK_WIDGET (menu);
+	return class->build_dropdown_menu (action);
 }
 
 static void
@@ -337,22 +74,9 @@ menu_activated_cb (GtkMenuToolButton *bu
 {
 	GtkWidget *menu = NULL;
 
-	LOG ("menu_activated_cb dir %d", action->priv->direction);
-
-	switch (action->priv->direction)
-	{
-		case EPHY_NAVIGATION_DIRECTION_UP:
-			menu = build_up_menu (action);
-			break;
-		case EPHY_NAVIGATION_DIRECTION_FORWARD:
-		case EPHY_NAVIGATION_DIRECTION_BACK:
-			menu = build_back_or_forward_menu (action);
-			break;
-		default:
-			g_assert_not_reached ();
-			break;
-	}
+	LOG ("menu_activated_cb");
 
+	menu = build_dropdown_menu (action);
 	gtk_menu_tool_button_set_menu (button, menu);
 }
 
@@ -382,75 +106,6 @@ connect_proxy (GtkAction *gaction,
 }
 
 static void
-ephy_navigation_action_activate (GtkAction *gtk_action)
-{
-	EphyNavigationAction *action = EPHY_NAVIGATION_ACTION (gtk_action);
-	EphyWindow *window = action->priv->window;
-	EphyEmbed *embed;
-	WebKitWebView *web_view;
-
-	embed = ephy_embed_container_get_active_child (EPHY_EMBED_CONTAINER (window));
-	g_return_if_fail (embed != NULL);
-
-	web_view = EPHY_GET_WEBKIT_WEB_VIEW_FROM_EMBED (embed);
-
-	if (action->priv->direction == EPHY_NAVIGATION_DIRECTION_BACK)
-	{
-		if (ephy_gui_is_middle_click ())
-		{
-			embed = ephy_shell_new_tab (ephy_shell_get_default (),
-						    EPHY_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (embed))),
-						    embed,
-						    NULL,
-						    EPHY_NEW_TAB_IN_EXISTING_WINDOW);
-			web_view = EPHY_GET_WEBKIT_WEB_VIEW_FROM_EMBED (embed);
-		}
-		webkit_web_view_go_back (web_view);
-	}
-	else if (action->priv->direction == EPHY_NAVIGATION_DIRECTION_FORWARD)
-	{
-		if (ephy_gui_is_middle_click ())
-		{
-			const char *forward_uri;
-			WebKitWebHistoryItem *forward_item;
-			WebKitWebBackForwardList *history;
-
-			/* Forward history is not copied when opening
-			   a new tab, so get the forward URI manually
-			   and load it */
-			history = webkit_web_view_get_back_forward_list (EPHY_GET_WEBKIT_WEB_VIEW_FROM_EMBED (embed));
-			forward_item = webkit_web_back_forward_list_get_forward_item (history);
-			forward_uri = webkit_web_history_item_get_original_uri (forward_item);
-
-			embed = ephy_shell_new_tab (ephy_shell_get_default (),
-						    EPHY_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (embed))),
-						    embed,
-						    NULL,
-						    EPHY_NEW_TAB_IN_EXISTING_WINDOW);
-
-			web_view = EPHY_GET_WEBKIT_WEB_VIEW_FROM_EMBED (embed);
-			webkit_web_view_load_uri (web_view, forward_uri);
-		}
-		else
-		{
-			webkit_web_view_go_forward (web_view);
-		}
-	}
-	else if (action->priv->direction == EPHY_NAVIGATION_DIRECTION_UP)
-	{
-		GSList *up_list;
-		
-		up_list = ephy_web_view_get_go_up_list (ephy_embed_get_web_view (embed));
-		ephy_link_open (EPHY_LINK (action),
-				up_list->data,
-				NULL,
-				ephy_gui_is_middle_click () ? EPHY_LINK_NEW_TAB : 0);
-		g_slist_foreach (up_list, (GFunc) g_free, NULL);
-		g_slist_free (up_list);
-	}
-}
-
-static void
 ephy_navigation_action_init (EphyNavigationAction *action)
 {
 	action->priv = EPHY_NAVIGATION_ACTION_GET_PRIVATE (action);
@@ -480,9 +135,6 @@ ephy_navigation_action_set_property (GOb
 			nav->priv->arrow_tooltip = g_value_dup_string (value);
 			g_object_notify (object, "tooltip");
 			break;
-		case PROP_DIRECTION:
-			nav->priv->direction = g_value_get_int (value);
-			break;
 		case PROP_WINDOW:
 			{
 				GtkWidget *statusbar;
@@ -513,9 +165,6 @@ ephy_navigation_action_get_property (GOb
 		case PROP_ARROW_TOOLTIP:
 			g_value_set_string (value, nav->priv->arrow_tooltip);
 			break;
-		case PROP_DIRECTION:
-			g_value_set_int (value, nav->priv->direction);
-			break;
 		case PROP_WINDOW:
 			g_value_set_object (value, nav->priv->window);
 			break;
@@ -534,7 +183,8 @@ ephy_navigation_action_class_init (EphyN
 
 	action_class->toolbar_item_type = GTK_TYPE_MENU_TOOL_BUTTON;
 	action_class->connect_proxy = connect_proxy;
-	action_class->activate = ephy_navigation_action_activate;
+
+	class->build_dropdown_menu = NULL;
 
 	g_object_class_install_property (object_class,
 					 PROP_ARROW_TOOLTIP,
@@ -543,13 +193,6 @@ ephy_navigation_action_class_init (EphyN
 							      G_PARAM_READWRITE | G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB));
 
 	g_object_class_install_property (object_class,
-					 PROP_DIRECTION,
-					 g_param_spec_int ("direction", NULL, NULL,
-							   0,
-							   G_MAXINT,
-							   0,
-							   G_PARAM_READWRITE | G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB));
-	g_object_class_install_property (object_class,
 					 PROP_WINDOW,
 					 g_param_spec_object ("window", NULL, NULL,
 							      G_TYPE_OBJECT,
@@ -557,3 +200,59 @@ ephy_navigation_action_class_init (EphyN
 
 	g_type_class_add_private (object_class, sizeof (EphyNavigationActionPrivate));
 }
+
+EphyWindow *
+_ephy_navigation_action_get_window (EphyNavigationAction *action)
+{
+	  g_return_val_if_fail (EPHY_IS_NAVIGATION_ACTION (action), NULL);
+
+	  return action->priv->window;
+}
+
+guint
+_ephy_navigation_action_get_statusbar_context_id (EphyNavigationAction *action)
+{
+	  g_return_val_if_fail (EPHY_IS_NAVIGATION_ACTION (action), 0);
+
+	  return action->priv->statusbar_cid;
+}
+
+GtkWidget *
+_ephy_navigation_action_new_history_menu_item (const char *origtext,
+					       const char *address)
+{
+	EphyFaviconCache *cache;
+	EphyHistory *history;
+	GtkWidget *item, *image;
+	GdkPixbuf *icon = NULL;
+	GtkLabel *label;
+	const char *icon_address;
+
+	g_return_val_if_fail (address != NULL && origtext != NULL, NULL);
+
+	item = gtk_image_menu_item_new_with_label (origtext);
+
+	label = GTK_LABEL (gtk_bin_get_child (GTK_BIN (item)));
+	gtk_label_set_ellipsize (label, PANGO_ELLIPSIZE_END);
+	gtk_label_set_max_width_chars (label, MAX_LABEL_LENGTH);
+
+	history = EPHY_HISTORY
+		(ephy_embed_shell_get_global_history (embed_shell));
+	icon_address = ephy_history_get_icon (history, address);
+
+	cache = EPHY_FAVICON_CACHE
+		(ephy_embed_shell_get_favicon_cache (embed_shell));
+	icon = ephy_favicon_cache_get (cache, icon_address);
+
+	if (icon != NULL)
+	{
+		image = gtk_image_new_from_pixbuf (icon);
+		gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (item), image);
+		gtk_widget_show (image);
+		g_object_unref (icon);
+	}
+
+	gtk_widget_show (item);
+
+	return item;
+}
--- epiphany-2.30.2/src/ephy-navigation-action.h	2010-01-08 19:21:01.000000000 +0100
+++ epiphany-2.30.5/src/ephy-navigation-action.h	2010-08-19 04:44:26.000000000 +0200
@@ -26,6 +26,7 @@
 #define EPHY_NAVIGATION_ACTION_H
 
 #include "ephy-link-action.h"
+#include "ephy-window.h"
 
 G_BEGIN_DECLS
 
@@ -40,17 +41,10 @@ typedef struct _EphyNavigationAction		Ep
 typedef struct _EphyNavigationActionPrivate	EphyNavigationActionPrivate;
 typedef struct _EphyNavigationActionClass	EphyNavigationActionClass;
 
-typedef enum
-{
-	EPHY_NAVIGATION_DIRECTION_UP,
-	EPHY_NAVIGATION_DIRECTION_BACK,
-	EPHY_NAVIGATION_DIRECTION_FORWARD
-} EphyNavigationDirection;
-
 struct _EphyNavigationAction
 {
 	EphyLinkAction parent;
-	
+
 	/*< private >*/
 	EphyNavigationActionPrivate *priv;
 };
@@ -58,10 +52,21 @@ struct _EphyNavigationAction
 struct _EphyNavigationActionClass
 {
 	EphyLinkActionClass parent_class;
+
+        /*< virtual >*/
+        GtkWidget *(*build_dropdown_menu) (EphyNavigationAction *action);
 };
 
 GType ephy_navigation_action_get_type (void);
 
+/*< Protected >*/
+
+EphyWindow     *_ephy_navigation_action_get_window       (EphyNavigationAction *action);
+
+guint           _ephy_navigation_action_get_statusbar_context_id (EphyNavigationAction *action);
+
+GtkWidget      *_ephy_navigation_action_new_history_menu_item (const char *origtext,
+                                                               const char *address);
 G_END_DECLS
 
 #endif
--- epiphany-2.30.2/src/ephy-navigation-history-action.c	1970-01-01 01:00:00.000000000 +0100
+++ epiphany-2.30.5/src/ephy-navigation-history-action.c	2010-08-30 22:55:16.000000000 +0200
@@ -0,0 +1,465 @@
+/*
+ *  Copyright © 2003, 2004 Marco Pesenti Gritti
+ *  Copyright © 2003, 2004 Christian Persch
+ *  Copyright © 2008 Jan Alonzo
+ *  Copyright © 2009 Igalia S.L.
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2, or (at your option)
+ *  any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#include "config.h"
+#include "ephy-navigation-history-action.h"
+
+#include "ephy-action-helper.h"
+#include "ephy-debug.h"
+#include "ephy-embed-container.h"
+#include "ephy-embed-shell.h"
+#include "ephy-embed-utils.h"
+#include "ephy-gui.h"
+#include "ephy-history.h"
+#include "ephy-link.h"
+#include "ephy-shell.h"
+#include "ephy-type-builtins.h"
+#include "ephy-window.h"
+
+#include <gtk/gtk.h>
+#include <webkit/webkit.h>
+
+#define HISTORY_ITEM_DATA_KEY "HistoryItem"
+
+#define EPHY_NAVIGATION_HISTORY_ACTION_GET_PRIVATE(object)		\
+  (G_TYPE_INSTANCE_GET_PRIVATE ((object),				\
+				EPHY_TYPE_NAVIGATION_HISTORY_ACTION,	\
+				EphyNavigationHistoryActionPrivate))
+
+typedef enum {
+  WEBKIT_HISTORY_BACKWARD,
+  WEBKIT_HISTORY_FORWARD
+} WebKitHistoryType;
+
+struct _EphyNavigationHistoryActionPrivate {
+  EphyNavigationHistoryDirection direction;
+  EphyHistory *history;
+};
+
+enum {
+  PROP_0,
+  PROP_DIRECTION
+};
+
+static void ephy_navigation_history_action_init       (EphyNavigationHistoryAction *action);
+static void ephy_navigation_history_action_class_init (EphyNavigationHistoryActionClass *klass);
+
+G_DEFINE_TYPE (EphyNavigationHistoryAction, ephy_navigation_history_action, EPHY_TYPE_NAVIGATION_ACTION)
+
+static void
+set_new_back_history (EphyEmbed *source, EphyEmbed *dest, gint offset)
+{
+  WebKitWebView *source_view, *dest_view;
+  WebKitWebBackForwardList* source_list, *dest_list;
+  WebKitWebHistoryItem *item;
+  GList *items;
+  guint limit;
+  guint i;
+
+  g_return_if_fail (EPHY_IS_EMBED (source));
+  g_return_if_fail (EPHY_IS_EMBED (dest));
+
+  source_view = EPHY_GET_WEBKIT_WEB_VIEW_FROM_EMBED (source);
+  dest_view = EPHY_GET_WEBKIT_WEB_VIEW_FROM_EMBED (dest);
+
+  source_list = webkit_web_view_get_back_forward_list (source_view);
+  dest_list = webkit_web_view_get_back_forward_list (dest_view);
+
+  if (offset >= 0) {
+    /* Copy the whole back history in this case (positive offset) */
+    ephy_web_view_copy_back_history (ephy_embed_get_web_view (source),
+                                     ephy_embed_get_web_view (dest));
+
+    items = webkit_web_back_forward_list_get_forward_list_with_limit (source_list,
+                                                                      EPHY_WEBKIT_BACK_FORWARD_LIMIT);
+    limit = offset - 1;
+  } else {
+    items = webkit_web_back_forward_list_get_back_list_with_limit (source_list,
+                                                                   EPHY_WEBKIT_BACK_FORWARD_LIMIT);
+    limit = g_list_length (items) + offset;
+  }
+
+  /* Add the remaining items to the BackForward list */
+  items = g_list_reverse (items);
+  for (i = 0; i < limit; i++) {
+    item = webkit_web_history_item_copy ((WebKitWebHistoryItem*)items->data);
+    webkit_web_back_forward_list_add_item (dest_list, item);
+    g_object_unref (item);
+
+    items = items->next;
+  }
+  g_list_free (items);
+}
+
+static void
+middle_click_handle_on_history_menu_item (EphyNavigationHistoryAction *action,
+                                          EphyEmbed *embed,
+                                          WebKitWebHistoryItem *item)
+{
+  EphyEmbed *new_embed = NULL;
+  WebKitWebView *web_view;
+  WebKitWebBackForwardList *history;
+  GList *list;
+  const gchar *url;
+  guint current;
+  gint offset;
+
+  web_view = EPHY_GET_WEBKIT_WEB_VIEW_FROM_EMBED (embed);
+
+  /* Save old history and item's offset from current */
+  history = webkit_web_view_get_back_forward_list (web_view);
+  if (action->priv->direction == EPHY_NAVIGATION_HISTORY_DIRECTION_BACK) {
+    list = webkit_web_back_forward_list_get_back_list_with_limit (history,
+                                                                  EPHY_WEBKIT_BACK_FORWARD_LIMIT);
+    current = -1;
+  } else {
+    list = webkit_web_back_forward_list_get_forward_list_with_limit (history,
+                                                                     EPHY_WEBKIT_BACK_FORWARD_LIMIT);
+    current = g_list_length (list);
+  }
+  offset = current - g_list_index (list, item);
+
+  new_embed = ephy_shell_new_tab (ephy_shell_get_default (),
+                                  EPHY_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (embed))),
+                                  embed,
+                                  NULL,
+                                  EPHY_NEW_TAB_IN_EXISTING_WINDOW |
+                                  EPHY_NEW_TAB_DONT_COPY_HISTORY);
+  g_return_if_fail (new_embed != NULL);
+
+  /* We manually set the back history instead of trusting
+     ephy_shell_new_tab because the logic is more complex than
+     usual, due to handling also the forward history */
+  set_new_back_history (embed, new_embed, offset);
+
+  /* Load the new URL */
+  url = webkit_web_history_item_get_original_uri (item);
+  ephy_web_view_load_url (ephy_embed_get_web_view (new_embed), url);
+}
+
+static void
+activate_back_or_forward_menu_item_cb (GtkWidget *menuitem,
+				       EphyNavigationHistoryAction *action)
+{
+  WebKitWebHistoryItem *item;
+  EphyWindow *window;
+  EphyEmbed *embed;
+
+  window = _ephy_navigation_action_get_window (EPHY_NAVIGATION_ACTION (action));
+  embed = ephy_embed_container_get_active_child (EPHY_EMBED_CONTAINER (window));
+  g_return_if_fail (embed != NULL);
+
+  item = (WebKitWebHistoryItem*)g_object_get_data (G_OBJECT (menuitem), HISTORY_ITEM_DATA_KEY);
+  g_return_if_fail (item != NULL);
+
+  if (ephy_gui_is_middle_click ()) {
+    middle_click_handle_on_history_menu_item (action, embed, item);
+  } else {
+    WebKitWebView *web_view;
+
+    web_view = EPHY_GET_WEBKIT_WEB_VIEW_FROM_EMBED (embed);
+    webkit_web_view_go_to_back_forward_item (web_view, item);
+  }
+}
+
+static void
+select_menu_item_cb (GtkWidget *menuitem,
+		     EphyNavigationHistoryAction *action)
+{
+  WebKitWebHistoryItem *item;
+
+  item = (WebKitWebHistoryItem*)g_object_get_data (G_OBJECT (menuitem),
+						   HISTORY_ITEM_DATA_KEY);
+  if (item) {
+    const char *url;
+    EphyWindow *window;
+    EphyNavigationAction *nav_action;
+    GtkWidget *statusbar;
+    guint statusbar_cid;
+
+    url = webkit_web_history_item_get_uri (item);
+    window = _ephy_navigation_action_get_window (EPHY_NAVIGATION_ACTION (action));
+    statusbar = ephy_window_get_statusbar (window);
+
+    /* Update status bar */
+    nav_action = EPHY_NAVIGATION_ACTION (action);
+    statusbar_cid = _ephy_navigation_action_get_statusbar_context_id (nav_action);
+    gtk_statusbar_push (GTK_STATUSBAR (statusbar), statusbar_cid, url);
+  }
+}
+
+static void
+deselect_menu_item_cb (GtkWidget *menuitem,
+		       EphyNavigationAction *action)
+{
+  GtkWidget *statusbar;
+  EphyWindow *window;
+  EphyNavigationAction *nav_action;
+  guint statusbar_cid;
+
+  window = _ephy_navigation_action_get_window (EPHY_NAVIGATION_ACTION (action));
+  statusbar = ephy_window_get_statusbar (window);
+
+  /* Update status bar */
+  nav_action = EPHY_NAVIGATION_ACTION (action);
+  statusbar_cid = _ephy_navigation_action_get_statusbar_context_id (nav_action);
+  gtk_statusbar_pop (GTK_STATUSBAR (statusbar), statusbar_cid);
+}
+
+static void
+ephy_history_cleared_cb (EphyHistory *history,
+                         EphyNavigationHistoryAction *action)
+{
+  ephy_action_change_sensitivity_flags (GTK_ACTION (action), SENS_FLAG, TRUE);
+}
+
+static GList*
+webkit_construct_history_list (WebKitWebView *web_view, WebKitHistoryType hist_type)
+{
+  WebKitWebBackForwardList *web_back_forward_list;
+  GList *webkit_items;
+
+  web_back_forward_list = webkit_web_view_get_back_forward_list (web_view);
+
+  if (hist_type == WEBKIT_HISTORY_FORWARD) {
+    webkit_items =
+      g_list_reverse (webkit_web_back_forward_list_get_forward_list_with_limit (web_back_forward_list,
+                                                                                EPHY_WEBKIT_BACK_FORWARD_LIMIT));
+  } else {
+    webkit_items =
+      webkit_web_back_forward_list_get_back_list_with_limit (web_back_forward_list,
+                                                             EPHY_WEBKIT_BACK_FORWARD_LIMIT);
+  }
+
+  return webkit_items;
+}
+
+static GtkWidget *
+build_dropdown_menu (EphyNavigationAction *nav_action)
+{
+  EphyNavigationHistoryAction *action;
+  EphyWindow *window;
+  GtkMenuShell *menu;
+  EphyEmbed *embed;
+  GList *list, *l;
+  WebKitWebView *web_view;
+
+  action = EPHY_NAVIGATION_HISTORY_ACTION (nav_action);
+  window = _ephy_navigation_action_get_window (nav_action);
+  embed = ephy_embed_container_get_active_child (EPHY_EMBED_CONTAINER (window));
+  g_return_val_if_fail (embed != NULL, NULL);
+
+  menu = GTK_MENU_SHELL (gtk_menu_new ());
+
+  web_view = EPHY_GET_WEBKIT_WEB_VIEW_FROM_EMBED (embed);
+  g_return_val_if_fail (web_view != NULL, NULL);
+
+  if (action->priv->direction == EPHY_NAVIGATION_HISTORY_DIRECTION_BACK) {
+    list = webkit_construct_history_list (web_view,
+                                          WEBKIT_HISTORY_BACKWARD);
+  } else {
+    list = webkit_construct_history_list (web_view,
+                                          WEBKIT_HISTORY_FORWARD);
+  }
+
+  for (l = list; l != NULL; l = l->next) {
+    GtkWidget *item;
+    WebKitWebHistoryItem *hitem;
+    const char *url;
+    char *title;
+
+    hitem = (WebKitWebHistoryItem*)l->data;
+    url = webkit_web_history_item_get_uri (hitem);
+
+    title = g_strdup (webkit_web_history_item_get_title (hitem));
+
+    if ((title == NULL || g_strstrip (title)[0] == '\0'))
+      item = _ephy_navigation_action_new_history_menu_item (url, url);
+    else
+      item = _ephy_navigation_action_new_history_menu_item (title, url);
+
+    g_free (title);
+
+    g_object_set_data_full (G_OBJECT (item), HISTORY_ITEM_DATA_KEY,
+                            g_object_ref (hitem), g_object_unref);
+
+    g_signal_connect (item, "activate",
+                      G_CALLBACK (activate_back_or_forward_menu_item_cb),
+                      action);
+    g_signal_connect (item, "select",
+                      G_CALLBACK (select_menu_item_cb),
+                      action);
+    g_signal_connect (item, "deselect",
+                      G_CALLBACK (deselect_menu_item_cb),
+                      action);
+
+    gtk_menu_shell_append (menu, item);
+    gtk_widget_show_all (item);
+  }
+
+  g_list_free (list);
+
+  return GTK_WIDGET (menu);
+}
+
+static void
+action_activate (GtkAction *action)
+{
+  EphyNavigationHistoryAction *history_action;
+  EphyWindow *window;
+  EphyEmbed *embed;
+  WebKitWebView *web_view;
+
+  history_action = EPHY_NAVIGATION_HISTORY_ACTION (action);
+  window = _ephy_navigation_action_get_window (EPHY_NAVIGATION_ACTION (action));
+  embed = ephy_embed_container_get_active_child (EPHY_EMBED_CONTAINER (window));
+  g_return_if_fail (embed != NULL);
+
+  web_view = EPHY_GET_WEBKIT_WEB_VIEW_FROM_EMBED (embed);
+
+  if (history_action->priv->direction == EPHY_NAVIGATION_HISTORY_DIRECTION_BACK) {
+    if (ephy_gui_is_middle_click ()) {
+      embed = ephy_shell_new_tab (ephy_shell_get_default (),
+                                  EPHY_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (embed))),
+                                  embed,
+                                  NULL,
+                                  EPHY_NEW_TAB_IN_EXISTING_WINDOW);
+      web_view = EPHY_GET_WEBKIT_WEB_VIEW_FROM_EMBED (embed);
+    }
+    webkit_web_view_go_back (web_view);
+  } else if (history_action->priv->direction == EPHY_NAVIGATION_HISTORY_DIRECTION_FORWARD) {
+    if (ephy_gui_is_middle_click ()) {
+      const char *forward_uri;
+      WebKitWebHistoryItem *forward_item;
+      WebKitWebBackForwardList *history;
+
+      /* Forward history is not copied when opening
+         a new tab, so get the forward URI manually
+         and load it */
+      history = webkit_web_view_get_back_forward_list (EPHY_GET_WEBKIT_WEB_VIEW_FROM_EMBED (embed));
+      forward_item = webkit_web_back_forward_list_get_forward_item (history);
+      forward_uri = webkit_web_history_item_get_original_uri (forward_item);
+
+      embed = ephy_shell_new_tab (ephy_shell_get_default (),
+                                  EPHY_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (embed))),
+                                  embed,
+                                  NULL,
+                                  EPHY_NEW_TAB_IN_EXISTING_WINDOW);
+
+      web_view = EPHY_GET_WEBKIT_WEB_VIEW_FROM_EMBED (embed);
+      webkit_web_view_load_uri (web_view, forward_uri);
+    } else {
+      webkit_web_view_go_forward (web_view);
+    }
+  }
+}
+
+static void
+ephy_navigation_history_action_init (EphyNavigationHistoryAction *action)
+{
+  EphyHistory *history;
+
+  action->priv = EPHY_NAVIGATION_HISTORY_ACTION_GET_PRIVATE (action);
+
+  history = EPHY_HISTORY (ephy_embed_shell_get_global_history (embed_shell));
+  action->priv->history = EPHY_HISTORY (g_object_ref (history));
+
+  g_signal_connect (action->priv->history,
+                    "cleared", G_CALLBACK (ephy_history_cleared_cb),
+                    action);
+}
+
+static void
+ephy_navigation_history_action_finalize (GObject *object)
+{
+  EphyNavigationHistoryAction *action = EPHY_NAVIGATION_HISTORY_ACTION (object);
+
+  g_signal_handlers_disconnect_by_func (action->priv->history,
+                                        ephy_history_cleared_cb,
+                                        action);
+  g_object_unref (action->priv->history);
+  action->priv->history = NULL;
+
+  G_OBJECT_CLASS (ephy_navigation_history_action_parent_class)->finalize (object);
+}
+
+static void
+ephy_navigation_history_action_set_property (GObject *object,
+					     guint prop_id,
+					     const GValue *value,
+					     GParamSpec *pspec)
+{
+  EphyNavigationHistoryAction *nav = EPHY_NAVIGATION_HISTORY_ACTION (object);
+
+  switch (prop_id) {
+  case PROP_DIRECTION:
+    nav->priv->direction = g_value_get_int (value);
+    break;
+  default:
+    G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+    break;
+  }
+}
+
+static void
+ephy_navigation_history_action_get_property (GObject *object,
+					     guint prop_id,
+					     GValue *value,
+					     GParamSpec *pspec)
+{
+  EphyNavigationHistoryAction *nav = EPHY_NAVIGATION_HISTORY_ACTION (object);
+
+  switch (prop_id) {
+  case PROP_DIRECTION:
+    g_value_set_int (value, nav->priv->direction);
+    break;
+  default:
+    G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+    break;
+  }
+}
+
+static void
+ephy_navigation_history_action_class_init (EphyNavigationHistoryActionClass *klass)
+{
+  GObjectClass *object_class = G_OBJECT_CLASS (klass);
+  GtkActionClass *action_class = GTK_ACTION_CLASS (klass);
+  EphyNavigationActionClass *nav_action_class = EPHY_NAVIGATION_ACTION_CLASS (klass);
+
+  object_class->finalize = ephy_navigation_history_action_finalize;
+  object_class->set_property = ephy_navigation_history_action_set_property;
+  object_class->get_property = ephy_navigation_history_action_get_property;
+
+  action_class->activate = action_activate;
+
+  nav_action_class->build_dropdown_menu = build_dropdown_menu;
+
+  g_object_class_install_property (object_class,
+				   PROP_DIRECTION,
+				   g_param_spec_int ("direction", NULL, NULL,
+						     0,
+						     G_MAXINT,
+						     0,
+						     G_PARAM_READWRITE | G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB));
+
+  g_type_class_add_private (object_class, sizeof (EphyNavigationHistoryActionPrivate));
+}
--- epiphany-2.30.2/src/ephy-navigation-history-action.h	1970-01-01 01:00:00.000000000 +0100
+++ epiphany-2.30.5/src/ephy-navigation-history-action.h	2010-08-19 04:44:26.000000000 +0200
@@ -0,0 +1,67 @@
+/*
+ *  Copyright © 2003, 2004 Marco Pesenti Gritti
+ *  Copyright © 2003, 2004 Christian Persch
+ *  Copyright © 2010, Igalia S.L.
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2, or (at your option)
+ *  any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#if !defined (__EPHY_EPIPHANY_H_INSIDE__) && !defined (EPIPHANY_COMPILATION)
+#error "Only <epiphany/epiphany.h> can be included directly."
+#endif
+
+#ifndef EPHY_NAVIGATION_HISTORY_ACTION_H
+#define EPHY_NAVIGATION_HISTORY_ACTION_H
+
+#include "ephy-navigation-action.h"
+
+G_BEGIN_DECLS
+
+#define EPHY_TYPE_NAVIGATION_HISTORY_ACTION            (ephy_navigation_history_action_get_type ())
+#define EPHY_NAVIGATION_HISTORY_ACTION(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), EPHY_TYPE_NAVIGATION_HISTORY_ACTION, EphyNavigationHistoryAction))
+#define EPHY_NAVIGATION_HISTORY_ACTION_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass), EPHY_TYPE_NAVIGATION_HISTORY_ACTION, EphyNavigationHistoryActionClass))
+#define EPHY_IS_NAVIGATION_HISTORY_ACTION(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), EPHY_TYPE_NAVIGATION_HISTORY_ACTION))
+#define EPHY_IS_NAVIGATION_HISTORY_ACTION_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((obj), EPHY_TYPE_NAVIGATION_HISTORY_ACTION))
+#define EPHY_NAVIGATION_HISTORY_ACTION_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS((obj), EPHY_TYPE_NAVIGATION_HISTORY_ACTION, EphyNavigationHistoryActionClass))
+
+typedef enum
+{
+  EPHY_NAVIGATION_HISTORY_DIRECTION_BACK,
+  EPHY_NAVIGATION_HISTORY_DIRECTION_FORWARD
+} EphyNavigationHistoryDirection;
+
+typedef struct _EphyNavigationHistoryAction		EphyNavigationHistoryAction;
+typedef struct _EphyNavigationHistoryActionPrivate	EphyNavigationHistoryActionPrivate;
+typedef struct _EphyNavigationHistoryActionClass	EphyNavigationHistoryActionClass;
+
+struct _EphyNavigationHistoryAction
+{
+  EphyNavigationAction parent;
+
+  /*< private >*/
+  EphyNavigationHistoryActionPrivate *priv;
+};
+
+struct _EphyNavigationHistoryActionClass
+{
+  EphyNavigationActionClass parent_class;
+};
+
+GType ephy_navigation_history_action_get_type (void);
+
+G_END_DECLS
+
+#endif
--- epiphany-2.30.2/src/ephy-navigation-up-action.c	1970-01-01 01:00:00.000000000 +0100
+++ epiphany-2.30.5/src/ephy-navigation-up-action.c	2010-08-30 22:55:16.000000000 +0200
@@ -0,0 +1,196 @@
+/*
+ *  Copyright © 2003, 2004 Marco Pesenti Gritti
+ *  Copyright © 2003, 2004 Christian Persch
+ *  Copyright © 2008 Jan Alonzo
+ *  Copyright © 2009 Igalia S.L.
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2, or (at your option)
+ *  any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#include "config.h"
+#include "ephy-navigation-up-action.h"
+
+#include "ephy-debug.h"
+#include "ephy-embed-container.h"
+#include "ephy-embed-shell.h"
+#include "ephy-embed-utils.h"
+#include "ephy-gui.h"
+#include "ephy-history.h"
+#include "ephy-link.h"
+#include "ephy-shell.h"
+#include "ephy-type-builtins.h"
+#include "ephy-window.h"
+
+#include <gtk/gtk.h>
+#include <webkit/webkit.h>
+
+#define URL_DATA_KEY "GoURL"
+
+static void ephy_navigation_up_action_init       (EphyNavigationUpAction *action);
+static void ephy_navigation_up_action_class_init (EphyNavigationUpActionClass *klass);
+
+G_DEFINE_TYPE (EphyNavigationUpAction, ephy_navigation_up_action, EPHY_TYPE_NAVIGATION_ACTION)
+
+static void
+activate_up_menu_item_cb (GtkWidget *menuitem,
+			  EphyNavigationUpAction *action)
+{
+  EphyWindow *window;
+  EphyEmbed *embed;
+  char *url;
+
+  window = _ephy_navigation_action_get_window (EPHY_NAVIGATION_ACTION (action));
+  embed = ephy_embed_container_get_active_child (EPHY_EMBED_CONTAINER (window));
+  g_return_if_fail (embed != NULL);
+
+  url = g_object_get_data (G_OBJECT (menuitem), URL_DATA_KEY);
+  g_return_if_fail (url != NULL);
+
+  ephy_link_open (EPHY_LINK (action), url, NULL,
+		  ephy_gui_is_middle_click () ? EPHY_LINK_NEW_TAB : 0);
+}
+
+static void
+select_menu_item_cb (GtkWidget *menuitem,
+		     EphyNavigationUpAction *action)
+{
+  const char *url;
+  EphyWindow *window;
+  EphyNavigationAction *nav_action;
+  GtkWidget *statusbar;
+  guint statusbar_cid;
+
+  url = g_object_get_data (G_OBJECT (menuitem), URL_DATA_KEY);
+  window = _ephy_navigation_action_get_window (EPHY_NAVIGATION_ACTION (action));
+  statusbar = ephy_window_get_statusbar (window);
+  g_return_if_fail (url != NULL);
+
+  /* Update status bar */
+  nav_action = EPHY_NAVIGATION_ACTION (action);
+  statusbar_cid = _ephy_navigation_action_get_statusbar_context_id (nav_action);
+  gtk_statusbar_push (GTK_STATUSBAR (statusbar), statusbar_cid, url);
+}
+
+static void
+deselect_menu_item_cb (GtkWidget *menuitem,
+		       EphyNavigationAction *action)
+{
+  GtkWidget *statusbar;
+  EphyWindow *window;
+  EphyNavigationAction *nav_action;
+  guint statusbar_cid;
+
+  window = _ephy_navigation_action_get_window (EPHY_NAVIGATION_ACTION (action));
+  statusbar = ephy_window_get_statusbar (window);
+
+  /* Update status bar */
+  nav_action = EPHY_NAVIGATION_ACTION (action);
+  statusbar_cid = _ephy_navigation_action_get_statusbar_context_id (nav_action);
+  gtk_statusbar_pop (GTK_STATUSBAR (statusbar), statusbar_cid);
+}
+
+static GtkWidget *
+build_dropdown_menu (EphyNavigationAction *nav_action)
+{
+  EphyNavigationUpAction *action;
+  EphyWindow *window;
+  EphyEmbed *embed;
+  EphyHistory *history;
+  GtkMenuShell *menu;
+  GtkWidget *item;
+  GSList *list, *l;
+  char *url;
+
+  action = EPHY_NAVIGATION_UP_ACTION (nav_action);
+  window = _ephy_navigation_action_get_window (nav_action);
+  embed = ephy_embed_container_get_active_child (EPHY_EMBED_CONTAINER (window));
+  g_return_val_if_fail (embed != NULL, NULL);
+
+  menu = GTK_MENU_SHELL (gtk_menu_new ());
+  history = EPHY_HISTORY (ephy_embed_shell_get_global_history (embed_shell));
+
+  list = ephy_web_view_get_go_up_list (ephy_embed_get_web_view (embed));
+  for (l = list; l != NULL; l = l->next) {
+    EphyNode *node;
+    const char *title = NULL;
+
+    url = g_strdup (l->data);
+
+    if (url == NULL) continue;
+
+    node = ephy_history_get_page (history, url);
+    if (node != NULL) {
+      title = ephy_node_get_property_string (node, EPHY_NODE_PAGE_PROP_TITLE);
+    }
+
+    item = _ephy_navigation_action_new_history_menu_item (title ? title : url, url);
+
+    g_object_set_data_full (G_OBJECT (item), URL_DATA_KEY, url,
+                            (GDestroyNotify) g_free);
+    g_signal_connect (item, "activate",
+                      G_CALLBACK (activate_up_menu_item_cb), action);
+    g_signal_connect (item, "select",
+                      G_CALLBACK (select_menu_item_cb),
+                      action);
+    g_signal_connect (item, "deselect",
+                      G_CALLBACK (deselect_menu_item_cb),
+                      action);
+
+    gtk_menu_shell_append (menu, item);
+    gtk_widget_show (item);
+  }
+
+  /* the list data has been consumed */
+  g_slist_foreach (list, (GFunc) g_free, NULL);
+  g_slist_free (list);
+
+  return GTK_WIDGET (menu);
+}
+
+static void
+action_activate (GtkAction *action)
+{
+  EphyWindow *window;
+  EphyEmbed *embed;
+  GSList *up_list;
+
+  window = _ephy_navigation_action_get_window (EPHY_NAVIGATION_ACTION (action));
+  embed = ephy_embed_container_get_active_child (EPHY_EMBED_CONTAINER (window));
+  g_return_if_fail (embed != NULL);
+
+  up_list = ephy_web_view_get_go_up_list (ephy_embed_get_web_view (embed));
+  ephy_link_open (EPHY_LINK (action),
+		  up_list->data,
+		  NULL,
+		  ephy_gui_is_middle_click () ? EPHY_LINK_NEW_TAB : 0);
+  g_slist_foreach (up_list, (GFunc) g_free, NULL);
+  g_slist_free (up_list);
+}
+
+static void
+ephy_navigation_up_action_init (EphyNavigationUpAction *action)
+{
+}
+
+static void
+ephy_navigation_up_action_class_init (EphyNavigationUpActionClass *klass)
+{
+  GtkActionClass *action_class = GTK_ACTION_CLASS (klass);
+  EphyNavigationActionClass *nav_action_class = EPHY_NAVIGATION_ACTION_CLASS (klass);
+
+  action_class->activate = action_activate;
+  nav_action_class->build_dropdown_menu = build_dropdown_menu;
+}
--- epiphany-2.30.2/src/ephy-navigation-up-action.h	1970-01-01 01:00:00.000000000 +0100
+++ epiphany-2.30.5/src/ephy-navigation-up-action.h	2010-08-19 04:44:26.000000000 +0200
@@ -0,0 +1,57 @@
+/*
+ *  Copyright © 2003, 2004 Marco Pesenti Gritti
+ *  Copyright © 2003, 2004 Christian Persch
+ *  Copyright © 2010, Igalia S.L.
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2, or (at your option)
+ *  any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#if !defined (__EPHY_EPIPHANY_H_INSIDE__) && !defined (EPIPHANY_COMPILATION)
+#error "Only <epiphany/epiphany.h> can be included directly."
+#endif
+
+#ifndef EPHY_NAVIGATION_UP_ACTION_H
+#define EPHY_NAVIGATION_UP_ACTION_H
+
+#include "ephy-navigation-action.h"
+
+G_BEGIN_DECLS
+
+#define EPHY_TYPE_NAVIGATION_UP_ACTION            (ephy_navigation_up_action_get_type ())
+#define EPHY_NAVIGATION_UP_ACTION(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), EPHY_TYPE_NAVIGATION_UP_ACTION, EphyNavigationUpAction))
+#define EPHY_NAVIGATION_UP_ACTION_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass), EPHY_TYPE_NAVIGATION_UP_ACTION, EphyNavigationUpActionClass))
+#define EPHY_IS_NAVIGATION_UP_ACTION(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), EPHY_TYPE_NAVIGATION_UP_ACTION))
+#define EPHY_IS_NAVIGATION_UP_ACTION_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((obj), EPHY_TYPE_NAVIGATION_UP_ACTION))
+#define EPHY_NAVIGATION_UP_ACTION_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS((obj), EPHY_TYPE_NAVIGATION_UP_ACTION, EphyNavigationUpActionClass))
+
+typedef struct _EphyNavigationUpAction		EphyNavigationUpAction;
+typedef struct _EphyNavigationUpActionClass	EphyNavigationUpActionClass;
+
+struct _EphyNavigationUpAction
+{
+  EphyNavigationAction parent;
+};
+
+struct _EphyNavigationUpActionClass
+{
+  EphyNavigationActionClass parent_class;
+};
+
+GType ephy_navigation_up_action_get_type (void);
+
+G_END_DECLS
+
+#endif
--- epiphany-2.30.2/src/ephy-notebook.c	2010-02-17 09:13:15.000000000 +0100
+++ epiphany-2.30.5/src/ephy-notebook.c	2010-08-19 04:44:26.000000000 +0200
@@ -329,7 +329,7 @@ button_press_cb (EphyNotebook *notebook,
 
 static void
 ephy_notebook_switch_page_cb (GtkNotebook *notebook,
-			      GtkNotebookPage *page,
+			      GtkWidget *page,
 			      guint page_num,
 			      gpointer data)
 {
--- epiphany-2.30.2/src/ephy-shell.c	2010-02-04 22:07:36.000000000 +0100
+++ epiphany-2.30.5/src/ephy-shell.c	2010-08-30 22:58:42.000000000 +0200
@@ -149,43 +149,6 @@ ephy_shell_new_window_cb (EphyEmbedSingl
 		 NULL, NULL, flags, chromemask, is_popup, 0);
 }
 
-
-static gboolean
-ephy_shell_add_sidebar_cb (EphyEmbedSingle *embed_single,
-			   const char *url,
-			   const char *title,
-			   EphyShell *shell)
-{
-	EphySession *session;
-	EphyWindow *window;
-	GtkWidget *dialog;
-
-	session = EPHY_SESSION (ephy_shell_get_session (shell));
-	g_return_val_if_fail (EPHY_IS_SESSION (session), FALSE);
-
-	window = ephy_session_get_active_window (session);
-
-	dialog = gtk_message_dialog_new (GTK_WINDOW (window),
-					 GTK_DIALOG_DESTROY_WITH_PARENT,
-					 GTK_MESSAGE_ERROR,
-					 GTK_BUTTONS_OK,
-					 _("Sidebar extension required"));
-
-	gtk_window_set_title (GTK_WINDOW (dialog), _("Sidebar Extension Required"));
-	gtk_window_set_icon_name (GTK_WINDOW (dialog), EPHY_STOCK_EPHY);
-
-	gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog),
-		  _("The link you clicked needs the sidebar extension to be "
-		    "installed."));
-
-	g_signal_connect_swapped (dialog, "response", 
-				  G_CALLBACK (gtk_widget_destroy), dialog);
-
-	gtk_widget_show (dialog);
-
-	return TRUE;
-}
-
 #ifdef ENABLE_NETWORK_MANAGER
 
 static void
@@ -223,10 +186,6 @@ impl_get_embed_single (EphyEmbedShell *e
 					 G_CALLBACK (ephy_shell_new_window_cb),
 					 shell, G_CONNECT_AFTER);
 
-		g_signal_connect_object (embed_single, "add-sidebar",
-					 G_CALLBACK (ephy_shell_add_sidebar_cb),
-					 shell, G_CONNECT_AFTER);
-
 		priv->embed_single_connected = TRUE;
 
 #ifdef ENABLE_NETWORK_MANAGER
@@ -435,6 +394,7 @@ ephy_shell_new_tab_full (EphyShell *shel
 	gboolean open_page = FALSE;
 	gboolean jump_to;
 	gboolean active_is_blank = FALSE;
+	gboolean copy_history = TRUE;
 	GtkWidget *nb;
 	int position = -1;
 	gboolean is_empty = FALSE;
@@ -443,6 +403,7 @@ ephy_shell_new_tab_full (EphyShell *shel
 	if (flags & EPHY_NEW_TAB_OPEN_PAGE) open_page = TRUE;
 	if (flags & EPHY_NEW_TAB_IN_NEW_WINDOW) in_new_window = TRUE;
 	if (flags & EPHY_NEW_TAB_IN_EXISTING_WINDOW) in_new_window = FALSE;
+	if (flags & EPHY_NEW_TAB_DONT_COPY_HISTORY) copy_history = FALSE;
 
 	in_new_window = in_new_window && !eel_gconf_get_boolean (CONF_LOCKDOWN_FULLSCREEN);
 	g_return_val_if_fail (open_page == (gboolean)(request != NULL), NULL);
@@ -493,11 +454,11 @@ ephy_shell_new_tab_full (EphyShell *shel
 		ephy_embed_container_add_child (EPHY_EMBED_CONTAINER (window), embed, position, jump_to);
 	}
 
-	if (previous_embed != NULL)
-	{	
+	if (copy_history && previous_embed != NULL)
+	{
 		ephy_web_view_copy_back_history (ephy_embed_get_web_view (previous_embed),
 						 ephy_embed_get_web_view (embed));
-	}		
+	}
 
 	ephy_gui_window_update_user_time (GTK_WIDGET (window), user_time);
 
--- epiphany-2.30.2/src/ephy-shell.h	2010-02-15 20:05:56.000000000 +0100
+++ epiphany-2.30.5/src/ephy-shell.h	2010-08-19 04:44:26.000000000 +0200
@@ -69,6 +69,7 @@ typedef enum
 
 	/* The way to load */
 	EPHY_NEW_TAB_FROM_EXTERNAL      = 1 << 12,
+	EPHY_NEW_TAB_DONT_COPY_HISTORY  = 1 << 13,
 	
 } EphyNewTabFlags;
 
--- epiphany-2.30.2/src/ephy-toolbar.c	2010-01-08 19:21:01.000000000 +0100
+++ epiphany-2.30.5/src/ephy-toolbar.c	2010-08-19 04:44:26.000000000 +0200
@@ -30,6 +30,8 @@
 #include "ephy-location-entry.h"
 #include "ephy-location-action.h"
 #include "ephy-navigation-action.h"
+#include "ephy-navigation-history-action.h"
+#include "ephy-navigation-up-action.h"
 #include "ephy-topic-action.h"
 #include "ephy-zoom-action.h"
 #include "ephy-spinner-tool-item.h"
@@ -61,11 +63,6 @@ enum
 	LAST_ACTION
 };
 
-enum
-{
-	SENS_FLAG = 1 << 0
-};
-
 #define EPHY_TOOLBAR_GET_PRIVATE(object)(G_TYPE_INSTANCE_GET_PRIVATE ((object), EPHY_TYPE_TOOLBAR, EphyToolbarPrivate))
 
 struct _EphyToolbarPrivate
@@ -135,6 +132,7 @@ ephy_toolbar_update_fixed_visibility (Ep
 
 	show = priv->leave_fullscreen_visible;
 	g_object_set (priv->sep_item, "visible", show, NULL);
+	g_object_set (priv->exit_button, "visible", show, NULL);
 	g_object_set (priv->fixed_toolbar, "visible", show, NULL);
 }
 
@@ -225,7 +223,7 @@ ephy_toolbar_set_window (EphyToolbar *to
 	g_object_unref (priv->action_group);
 
 	action = priv->actions[BACK_ACTION] =
-		g_object_new (EPHY_TYPE_NAVIGATION_ACTION,
+		g_object_new (EPHY_TYPE_NAVIGATION_HISTORY_ACTION,
 			      "name", "NavigationBack",
 			      "label", _("_Back"),
 			      "stock_id", GTK_STOCK_GO_BACK,
@@ -235,7 +233,7 @@ ephy_toolbar_set_window (EphyToolbar *to
 			       */
 			      "arrow-tooltip", _("Back history"),
 			      "window", priv->window,
-			      "direction", EPHY_NAVIGATION_DIRECTION_BACK,
+			      "direction", EPHY_NAVIGATION_HISTORY_DIRECTION_BACK,
 			      "is_important", TRUE,
 			      NULL);
 	g_signal_connect_swapped (action, "open-link",
@@ -245,7 +243,7 @@ ephy_toolbar_set_window (EphyToolbar *to
 	g_object_unref (action);
 
 	action = priv->actions[FORWARD_ACTION] =
-		g_object_new (EPHY_TYPE_NAVIGATION_ACTION,
+		g_object_new (EPHY_TYPE_NAVIGATION_HISTORY_ACTION,
 			      "name", "NavigationForward",
 			      "label", _("_Forward"),
 			      "stock_id", GTK_STOCK_GO_FORWARD,
@@ -255,7 +253,7 @@ ephy_toolbar_set_window (EphyToolbar *to
 			       */
 			      "arrow-tooltip", _("Forward history"),
 			      "window", priv->window,
-			      "direction", EPHY_NAVIGATION_DIRECTION_FORWARD,
+			      "direction", EPHY_NAVIGATION_HISTORY_DIRECTION_FORWARD,
 			      NULL);
 	g_signal_connect_swapped (action, "open-link",
 				  G_CALLBACK (ephy_link_open), toolbar);
@@ -264,7 +262,7 @@ ephy_toolbar_set_window (EphyToolbar *to
 	g_object_unref (action);
 
 	action = priv->actions[UP_ACTION] =
-		g_object_new (EPHY_TYPE_NAVIGATION_ACTION,
+		g_object_new (EPHY_TYPE_NAVIGATION_UP_ACTION,
 			      "name", "NavigationUp",
 			      "label", _("_Up"),
 			      "stock_id", GTK_STOCK_GO_UP,
@@ -274,7 +272,6 @@ ephy_toolbar_set_window (EphyToolbar *to
 			       */
 			      "arrow-tooltip", _("List of upper levels"),
 			      "window", priv->window,
-			      "direction", EPHY_NAVIGATION_DIRECTION_UP,
 			      NULL);
 	g_signal_connect_swapped (action, "open-link",
 				  G_CALLBACK (ephy_link_open), toolbar);
--- epiphany-2.30.2/src/ephy-window.c	2010-02-27 11:26:59.000000000 +0100
+++ epiphany-2.30.5/src/ephy-window.c	2010-08-30 22:55:16.000000000 +0200
@@ -87,7 +87,7 @@ static EphyEmbed *ephy_window_open_link	
 						 EphyEmbed *embed,
 						 EphyLinkFlags flags);
 static void notebook_switch_page_cb		(GtkNotebook *notebook,
-						 GtkNotebookPage *page,
+						 GtkWidget *page,
 						 guint page_num,
 						 EphyWindow *window);
 static void ephy_window_view_statusbar_cb       (GtkAction *action,
@@ -3981,7 +3981,7 @@ ephy_window_show (GtkWidget *widget)
 
 static void
 notebook_switch_page_cb (GtkNotebook *notebook,
-			 GtkNotebookPage *page,
+			 GtkWidget *page,
 			 guint page_num,
 			 EphyWindow *window)
 {
--- epiphany-2.30.2/src/epiphany.h	2010-04-08 16:57:23.000000000 +0200
+++ epiphany-2.30.5/src/epiphany.h	2010-08-31 00:55:35.000000000 +0200
@@ -25,7 +25,7 @@
 /* From GTK_CHECK_VERSION */
 #define EPHY_MAJOR_VERSION (2)
 #define EPHY_MINOR_VERSION (30)
-#define EPHY_MICRO_VERSION (2)
+#define EPHY_MICRO_VERSION (5)
 
 #define EPHY_CHECK_VERSION(major, minor, micro)\
   (EPHY_MAJOR_VERSION > (major) || \
--- epiphany-2.30.2/src/pdm-dialog.c	2010-01-08 19:21:01.000000000 +0100
+++ epiphany-2.30.5/src/pdm-dialog.c	2010-08-31 00:30:35.000000000 +0200
@@ -1488,7 +1488,7 @@ pdm_dialog_password_remove (PdmActionInf
 
 static void
 sync_notebook_tab (GtkWidget *notebook,
-		   GtkNotebookPage *page,
+		   GtkWidget *page,
 		   int page_num,
 		   PdmDialog *dialog)
 {
--- epiphany-2.30.2/src/popup-commands.c	2010-02-04 22:07:36.000000000 +0100
+++ epiphany-2.30.5/src/popup-commands.c	2010-08-30 22:58:42.000000000 +0200
@@ -26,7 +26,6 @@
 #include "ephy-embed-persist.h"
 #include "ephy-embed-utils.h"
 #include "ephy-prefs.h"
-#include "eel-gconf-extensions.h"
 #include "ephy-file-helpers.h"
 #include "ephy-bookmarks-ui.h"
 #include "ephy-web-view.h"
@@ -237,6 +236,7 @@ save_property_url (GtkAction *action,
 	ephy_embed_persist_set_persist_key
 		(persist, CONF_STATE_SAVE_DIR);
 	ephy_embed_persist_set_source (persist, location);
+	ephy_embed_persist_set_embed (persist, embed);
 
 	g_signal_connect (persist, "completed",
 			  G_CALLBACK (save_property_url_completed_cb), NULL);
--- epiphany-2.30.2/src/window-commands.c	2010-04-07 10:37:25.000000000 +0200
+++ epiphany-2.30.5/src/window-commands.c	2010-08-30 22:58:42.000000000 +0200
@@ -344,7 +344,7 @@ window_cmd_file_save_as (GtkAction *acti
 					GTK_WIDGET (window),
 					GTK_FILE_CHOOSER_ACTION_SAVE,
 					CONF_STATE_SAVE_DIR,
-					EPHY_FILE_FILTER_ALL_SUPPORTED);
+					EPHY_FILE_FILTER_ALL);
 
 	gtk_file_chooser_set_do_overwrite_confirmation (GTK_FILE_CHOOSER (dialog), TRUE);
 
@@ -1040,7 +1040,7 @@ window_cmd_help_about (GtkAction *action
 			       "name", _("GNOME Web Browser"),
 			       "version", VERSION,
 			       "copyright", "Copyright © 2002–2004 Marco Pesenti Gritti\n"
-			                    "Copyright © 2003–2009 The GNOME Web Browser Developers",
+			                    "Copyright © 2003–2010 The GNOME Web Browser Developers",
 			       "artists", artists,
 			       "authors", authors,
 			       "comments", comments,

Reply to: