From eeecbfedf3b0a9c1bdf3f17981dc885603d268af Mon Sep 17 00:00:00 2001
From: Xan Lopez <xan@src.gnome.org>
Date: Sat, 29 Dec 2007 16:59:00 +0000
Subject: Mozilla implementation of the embed history interfaces.

svn path=/trunk/; revision=7833
---
 embed/Makefile.am                      |   4 +-
 embed/mozilla/Makefile.am              |   2 +
 embed/mozilla/mozilla-embed.cpp        | 109 ++++++++++++++++++++++++++++++++-
 embed/mozilla/mozilla-history-item.cpp |  69 +++++++++++++++++++++
 embed/mozilla/mozilla-history-item.h   |  39 ++++++++++++
 5 files changed, 219 insertions(+), 4 deletions(-)
 create mode 100644 embed/mozilla/mozilla-history-item.cpp
 create mode 100644 embed/mozilla/mozilla-history-item.h

(limited to 'embed')

diff --git a/embed/Makefile.am b/embed/Makefile.am
index 3deefb9bd..22c8b56be 100644
--- a/embed/Makefile.am
+++ b/embed/Makefile.am
@@ -17,8 +17,7 @@ NOINST_H_FILES = \
 	ephy-embed-dialog.h		\
 	ephy-embed-find.h		\
 	ephy-encodings.h		\
-	ephy-favicon-cache.h            \
-	ephy-history-item.h
+	ephy-favicon-cache.h
 
 INST_H_FILES = \
 	ephy-adblock.h			\
@@ -36,6 +35,7 @@ INST_H_FILES = \
 	ephy-embed-shell.h		\
 	ephy-embed-utils.h              \
 	ephy-history.h			\
+	ephy-history-item.h             \
 	ephy-password-manager.h		\
 	ephy-permission-manager.h
 
diff --git a/embed/mozilla/Makefile.am b/embed/mozilla/Makefile.am
index fe12e84dd..cf2259316 100644
--- a/embed/mozilla/Makefile.am
+++ b/embed/mozilla/Makefile.am
@@ -59,6 +59,8 @@ libephymozillaembed_la_SOURCES = 	\
 	mozilla-embed-persist.h		\
 	mozilla-embed-single.cpp	\
 	mozilla-embed-single.h	        \
+	mozilla-history-item.cpp        \
+	mozilla-history-item.h          \
 	mozilla-notifiers.cpp		\
 	mozilla-notifiers.h
 
diff --git a/embed/mozilla/mozilla-embed.cpp b/embed/mozilla/mozilla-embed.cpp
index 40cc20ff9..ba1b589d8 100644
--- a/embed/mozilla/mozilla-embed.cpp
+++ b/embed/mozilla/mozilla-embed.cpp
@@ -41,12 +41,12 @@
 
 #include "ephy-command-manager.h"
 #include "ephy-debug.h"
+#include "mozilla-embed.h"
 #include "ephy-embed-container.h"
 #include "ephy-embed-shell.h"
 #include "ephy-embed-single.h"
 #include "mozilla-embed-event.h"
-
-#include "mozilla-embed.h"
+#include "mozilla-history-item.h"
 
 static void	mozilla_embed_class_init	(MozillaEmbedClass *klass);
 static void	mozilla_embed_init		(MozillaEmbed *gs);
@@ -877,6 +877,106 @@ impl_has_modified_forms (EphyEmbed *embed)
 	return NS_SUCCEEDED (rv) ? modified : FALSE;
 }
 
+static EphyHistoryItem*
+mozilla_get_nth_history_item (MozillaEmbed *embed,
+			      gboolean is_relative,
+			      int absolute_nth)
+{
+	char *url = NULL, *title = NULL;
+	nsresult rv;
+	nsCString nsUrl;
+	PRUnichar *nsTitle;
+	int nth = absolute_nth;
+	MozillaEmbedPrivate *mpriv = embed->priv;
+
+	if (is_relative)
+	{
+		nth += impl_shistory_get_pos (EPHY_EMBED (embed));
+	}
+	
+	rv = mpriv->browser->GetSHUrlAtIndex(nth, nsUrl);
+
+	if (NS_SUCCEEDED (rv) && nsUrl.Length())
+		url = g_strdup(nsUrl.get());
+
+	rv = mpriv->browser->GetSHTitleAtIndex(nth, &nsTitle);
+
+	if (NS_SUCCEEDED (rv) && nsTitle)
+	{
+		nsCString cTitle;
+		NS_UTF16ToCString (nsString(nsTitle),
+				   NS_CSTRING_ENCODING_UTF8, cTitle);
+		title = g_strdup (cTitle.get());
+		nsMemory::Free (nsTitle);
+	}
+
+	return (EphyHistoryItem*)mozilla_history_item_new (url, title, absolute_nth);
+}
+
+static GList*
+mozilla_construct_history_list (MozillaEmbed *embed, int start, int end)
+{
+	GList *list = NULL;
+	EphyHistoryItem *item;
+
+	while (start != end)
+	{
+		item = mozilla_get_nth_history_item (embed, FALSE, start);
+		list = g_list_prepend (list, item);
+
+		if (start < end)
+			start++;
+		else
+			start--;
+	}
+
+	return g_list_reverse (list);
+}
+
+static GList*
+impl_get_backward_history (EphyEmbed *embed)
+{
+	MozillaEmbed *membed = MOZILLA_EMBED (embed);
+	int start = impl_shistory_get_pos (embed) + -1;
+
+	return mozilla_construct_history_list (membed, start, -1);
+}
+
+static GList*
+impl_get_forward_history (EphyEmbed *embed)
+{
+	MozillaEmbed *membed = MOZILLA_EMBED (embed);
+	int start = impl_shistory_get_pos (embed) + 1;
+	int end = impl_shistory_n_items (embed);
+
+	return mozilla_construct_history_list (membed, start, end);
+}
+
+static EphyHistoryItem*
+impl_get_next_history_item (EphyEmbed *embed)
+{
+	return mozilla_get_nth_history_item (MOZILLA_EMBED (embed),
+					     TRUE,
+					     +1);
+}
+
+static EphyHistoryItem*
+impl_get_previous_history_item (EphyEmbed *embed)
+{
+	return mozilla_get_nth_history_item (MOZILLA_EMBED (embed),
+					     TRUE,
+					     -1);
+}
+
+static void
+impl_go_to_history_item (EphyEmbed *embed, EphyHistoryItem *item)
+{
+	int index = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (item),
+							HISTORY_ITEM_INDEX_KEY));
+
+	MOZILLA_EMBED (embed)->priv->browser->GoToHistoryIndex (index);
+}
+
 static void
 mozilla_embed_location_changed_cb (GtkMozEmbed *embed, 
 				   MozillaEmbed *membed)
@@ -1388,6 +1488,11 @@ ephy_embed_iface_init (EphyEmbedIface *iface)
 	iface->print_preview_navigate = impl_print_preview_navigate;
 	iface->has_modified_forms = impl_has_modified_forms;
 	iface->get_security_level = impl_get_security_level;
+	iface->get_backward_history = impl_get_backward_history;
+	iface->get_forward_history = impl_get_forward_history;
+	iface->get_next_history_item = impl_get_next_history_item;
+	iface->get_previous_history_item = impl_get_previous_history_item;
+	iface->go_to_history_item = impl_go_to_history_item;
 }
 
 static void
diff --git a/embed/mozilla/mozilla-history-item.cpp b/embed/mozilla/mozilla-history-item.cpp
new file mode 100644
index 000000000..b3c364e25
--- /dev/null
+++ b/embed/mozilla/mozilla-history-item.cpp
@@ -0,0 +1,69 @@
+#include "mozilla-history-item.h"
+#include "ephy-history-item.h"
+
+static void mozilla_history_item_finalize (GObject *object);
+
+static const char*
+impl_get_url (EphyHistoryItem *item)
+{
+  return MOZILLA_HISTORY_ITEM (item)->url;
+}
+
+static const char*
+impl_get_title (EphyHistoryItem *item)
+{
+  return MOZILLA_HISTORY_ITEM (item)->title;
+}
+
+static void
+mozilla_history_item_iface_init (EphyHistoryItemIface *iface)
+{
+  iface->get_url = impl_get_url;
+  iface->get_title = impl_get_title;
+}
+
+G_DEFINE_TYPE_WITH_CODE (MozillaHistoryItem, mozilla_history_item, G_TYPE_OBJECT,
+                         G_IMPLEMENT_INTERFACE (EPHY_TYPE_HISTORY_ITEM,
+                                                mozilla_history_item_iface_init))
+
+static void
+mozilla_history_item_class_init (MozillaHistoryItemClass *klass)
+{
+  GObjectClass *gobject_class = (GObjectClass *)klass;
+
+  gobject_class->finalize = mozilla_history_item_finalize;
+}
+
+static void
+mozilla_history_item_init (MozillaHistoryItem *self)
+{
+}
+
+static void
+mozilla_history_item_finalize (GObject *object)
+{
+  MozillaHistoryItem *self = (MozillaHistoryItem *)object;
+
+  g_free (self->url);
+  g_free (self->title);
+
+  G_OBJECT_CLASS (mozilla_history_item_parent_class)->finalize (object);
+}
+
+MozillaHistoryItem*
+mozilla_history_item_new (const char *url, const char *title, int index)
+{
+  MozillaHistoryItem *item;
+
+  g_return_val_if_fail (url != NULL, NULL);
+  g_return_val_if_fail (title != NULL, NULL);
+
+  item = (MozillaHistoryItem*) g_object_new (MOZILLA_TYPE_HISTORY_ITEM, NULL);
+
+  item->url = g_strdup (url);
+  item->title = g_strdup (title);
+
+  g_object_set_data (G_OBJECT (item), HISTORY_ITEM_INDEX_KEY, GINT_TO_POINTER (index));
+
+  return item;
+}
diff --git a/embed/mozilla/mozilla-history-item.h b/embed/mozilla/mozilla-history-item.h
new file mode 100644
index 000000000..270fb6f53
--- /dev/null
+++ b/embed/mozilla/mozilla-history-item.h
@@ -0,0 +1,39 @@
+#ifndef __MOZILLA_HISTORY_ITEM_H__
+#define __MOZILLA_HISTORY_ITEM_H__
+
+#include <glib.h>
+#include <glib-object.h>
+
+G_BEGIN_DECLS
+
+#define MOZILLA_TYPE_HISTORY_ITEM (mozilla_history_item_get_type())
+#define MOZILLA_HISTORY_ITEM(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), MOZILLA_TYPE_HISTORY_ITEM, MozillaHistoryItem))
+#define MOZILLA_HISTORY_ITEM_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), MOZILLA_TYPE_HISTORY_ITEM, MozillaHistoryItemClass))
+#define MOZILLA_IS_HISTORY_ITEM(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MOZILLA_TYPE_HISTORY_ITEM))
+#define MOZILLA_IS_HISTORY_ITEM_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), MOZILLA_TYPE_HISTORY_ITEM))
+#define MOZILLA_HISTORY_ITEM_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), MOZILLA_TYPE_HISTORY_ITEM, MozillaHistoryItemClass))
+
+#define HISTORY_ITEM_INDEX_KEY	"NTh"
+
+typedef struct _MozillaHistoryItem      MozillaHistoryItem;
+typedef struct _MozillaHistoryItemClass MozillaHistoryItemClass;
+
+struct _MozillaHistoryItemClass
+{
+  GObjectClass parent_class;
+};
+
+struct _MozillaHistoryItem
+{
+  GObject parent_instance;
+
+  char *url;
+  char *title;
+};
+
+GType               mozilla_history_item_get_type (void) G_GNUC_CONST;
+MozillaHistoryItem *mozilla_history_item_new      (const char *url, const char *title, int index) G_GNUC_MALLOC;
+
+G_END_DECLS
+
+#endif /* __MOZILLA_HISTORY_ITEM_H__ */
-- 
cgit