aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--embed/ephy-history.c16
-rw-r--r--embed/ephy-history.h4
-rw-r--r--embed/mozilla/EphyHistoryListener.cpp172
-rw-r--r--embed/mozilla/EphyHistoryListener.h51
-rw-r--r--embed/mozilla/EphyUtils.cpp16
-rw-r--r--embed/mozilla/EphyUtils.h12
-rw-r--r--embed/mozilla/GlobalHistory.cpp3
-rw-r--r--embed/mozilla/GlobalHistory.h6
-rw-r--r--embed/mozilla/Makefile.am2
-rw-r--r--src/bookmarks/ephy-bookmarks.c25
-rw-r--r--src/ephy-window.c27
11 files changed, 316 insertions, 18 deletions
diff --git a/embed/ephy-history.c b/embed/ephy-history.c
index 90b0fb6f0..d485616b7 100644
--- a/embed/ephy-history.c
+++ b/embed/ephy-history.c
@@ -21,6 +21,7 @@
#include "config.h"
#include "ephy-history.h"
+#include "ephy-marshal.h"
#include "ephy-file-helpers.h"
#include "ephy-debug.h"
#include "ephy-node-db.h"
@@ -70,6 +71,7 @@ enum
{
VISITED,
CLEARED,
+ REDIRECT,
LAST_SIGNAL
};
@@ -197,7 +199,19 @@ ephy_history_class_init (EphyHistoryClass *klass)
G_TYPE_NONE,
0);
- g_type_class_add_private (object_class, sizeof(EphyHistoryPrivate));
+ signals[REDIRECT] =
+ g_signal_new ("redirect",
+ G_OBJECT_CLASS_TYPE (object_class),
+ G_SIGNAL_RUN_FIRST,
+ G_STRUCT_OFFSET (EphyHistoryClass, redirect),
+ NULL, NULL,
+ ephy_marshal_VOID__STRING_STRING,
+ G_TYPE_NONE,
+ 2,
+ G_TYPE_STRING,
+ G_TYPE_STRING);
+
+ g_type_class_add_private (object_class, sizeof (EphyHistoryPrivate));
}
static gboolean
diff --git a/embed/ephy-history.h b/embed/ephy-history.h
index 5a3ac1de3..7da9ff475 100644
--- a/embed/ephy-history.h
+++ b/embed/ephy-history.h
@@ -67,6 +67,10 @@ struct EphyHistoryClass
void (* visited) (EphyHistory *history,
const char *url);
void (* cleared) (EphyHistory *history);
+
+ void (* redirect) (EphyHistory *history,
+ const char *from_uri,
+ const char *to_uri);
};
GType ephy_history_get_type (void);
diff --git a/embed/mozilla/EphyHistoryListener.cpp b/embed/mozilla/EphyHistoryListener.cpp
new file mode 100644
index 000000000..14838f77e
--- /dev/null
+++ b/embed/mozilla/EphyHistoryListener.cpp
@@ -0,0 +1,172 @@
+/*
+ * Copyright (C) 2004 Christian Persch
+ *
+ * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * $Id$
+ */
+
+#include "mozilla-config.h"
+
+#include "config.h"
+
+#include "EphyHistoryListener.h"
+#include "EphyUtils.h"
+
+#include "ephy-debug.h"
+
+#define MOZILLA_STRICT_API
+#include <nsEmbedString.h>
+#undef MOZILLA_STRICT_API
+#include <nsCOMPtr.h>
+#include <nsIServiceManager.h>
+#include <nsIDocumentLoader.h>
+#include <nsIWebProgress.h>
+#include <nsIRequestObserver.h>
+#include <nsIURI.h>
+#include <nsIRequest.h>
+#include <nsIChannel.h>
+#include <nsIHttpChannel.h>
+#include <nsNetCID.h>
+#include <nsISupportsUtils.h>
+#include <nsCURILoader.h>
+
+EphyHistoryListener::EphyHistoryListener ()
+{
+ LOG ("EphyHistoryListener ctor")
+}
+
+EphyHistoryListener::~EphyHistoryListener ()
+{
+ LOG ("EphyHistoryListener dtor")
+}
+
+nsresult
+EphyHistoryListener::Init (EphyHistory *aHistory)
+{
+ mHistory = aHistory;
+
+ nsresult rv;
+ nsCOMPtr<nsIWebProgress> webProgress
+ (do_GetService(NS_DOCUMENTLOADER_SERVICE_CONTRACTID, &rv));
+ NS_ENSURE_TRUE (NS_SUCCEEDED (rv) && webProgress, rv);
+
+ rv = webProgress->AddProgressListener
+ (NS_STATIC_CAST(nsIWebProgressListener*,this),
+ nsIWebProgress::NOTIFY_STATE_REQUEST);
+
+ return rv;
+}
+
+NS_IMPL_ISUPPORTS2 (EphyHistoryListener,
+ nsIWebProgressListener,
+ nsISupportsWeakReference)
+
+/* void onStateChange (in nsIWebProgress aWebProgress, in nsIRequest aRequest, in long aStateFlags, in nsresult aStatus); */
+NS_IMETHODIMP
+EphyHistoryListener::OnStateChange (nsIWebProgress *aWebProgress,
+ nsIRequest *aRequest,
+ PRUint32 aStateFlags,
+ nsresult aStatus)
+{
+ nsresult rv = NS_OK;
+
+ /* we only care about redirects */
+ if (! (aStateFlags & nsIWebProgressListener::STATE_REDIRECTING))
+ {
+ return rv;
+ }
+
+ /* FIXME can I QI directly to nsIHttpChannel? */
+ nsCOMPtr<nsIChannel> channel (do_QueryInterface (aRequest));
+ nsCOMPtr<nsIHttpChannel> httpChannel (do_QueryInterface (channel));
+ if (!httpChannel) return rv;
+
+ PRUint32 status = 0;
+ rv = httpChannel->GetResponseStatus (&status);
+ if (rv == NS_ERROR_NOT_AVAILABLE) return NS_OK;
+ NS_ENSURE_SUCCESS (rv, rv);
+
+ /* we're only interested in 301 redirects (moved permanently) */
+ if (status != 301) return NS_OK;
+
+ nsCOMPtr<nsIURI> fromURI;
+ rv = channel->GetURI (getter_AddRefs (fromURI));
+ NS_ENSURE_TRUE (NS_SUCCEEDED (rv) && fromURI, rv);
+
+ nsEmbedCString location;
+ rv = httpChannel->GetResponseHeader
+ (NS_LITERAL_CSTRING ("Location"), location);
+ NS_ENSURE_TRUE (NS_SUCCEEDED (rv) && location.Length(), rv);
+
+ nsCOMPtr<nsIURI> toURI;
+ rv = EphyUtils::NewURI (getter_AddRefs (toURI), location,
+ nsnull /* use origin charset of fromURI */, fromURI);
+ NS_ENSURE_TRUE (NS_SUCCEEDED (rv) && toURI, rv);
+
+ nsEmbedCString fromSpec, toSpec;
+ rv = fromURI->GetSpec (fromSpec);
+ rv |= toURI->GetSpec(toSpec);
+ NS_ENSURE_SUCCESS (rv, rv);
+
+ g_signal_emit_by_name (mHistory, "redirect",
+ fromSpec.get(), toSpec.get());
+
+ return rv;
+}
+
+/* void onProgressChange (in nsIWebProgress aWebProgress, in nsIRequest aRequest, in long aCurSelfProgress, in long aMaxSelfProgress, in long aCurTotalProgress, in long aMaxTotalProgress); */
+NS_IMETHODIMP
+EphyHistoryListener::OnProgressChange (nsIWebProgress *aWebProgress,
+ nsIRequest *aRequest,
+ PRInt32 aCurSelfProgress,
+ PRInt32 aMaxSelfProgress,
+ PRInt32 aCurTotalProgress,
+ PRInt32 aMaxTotalProgress)
+{
+ NS_NOTREACHED("notification excluded in AddProgressListener(...)");
+ return NS_OK;
+}
+
+/* void onLocationChange (in nsIWebProgress aWebProgress, in nsIRequest aRequest, in nsIURI location); */
+NS_IMETHODIMP
+EphyHistoryListener::OnLocationChange (nsIWebProgress *aWebProgress,
+ nsIRequest *aRequest,
+ nsIURI *location)
+{
+ NS_NOTREACHED("notification excluded in AddProgressListener(...)");
+ return NS_OK;
+}
+
+/* void onStatusChange (in nsIWebProgress aWebProgress, in nsIRequest aRequest, in nsresult aStatus, in wstring aMessage); */
+NS_IMETHODIMP
+EphyHistoryListener::OnStatusChange (nsIWebProgress *aWebProgress,
+ nsIRequest *aRequest,
+ nsresult aStatus,
+ const PRUnichar *aMessage)
+{
+ NS_NOTREACHED("notification excluded in AddProgressListener(...)");
+ return NS_OK;
+}
+
+/* void onSecurityChange (in nsIWebProgress aWebProgress, in nsIRequest aRequest, in unsigned long state); */
+NS_IMETHODIMP
+EphyHistoryListener::OnSecurityChange (nsIWebProgress *aWebProgress,
+ nsIRequest *aRequest,
+ PRUint32 state)
+{
+ NS_NOTREACHED("notification excluded in AddProgressListener(...)");
+ return NS_OK;
+}
diff --git a/embed/mozilla/EphyHistoryListener.h b/embed/mozilla/EphyHistoryListener.h
new file mode 100644
index 000000000..38cf9e49f
--- /dev/null
+++ b/embed/mozilla/EphyHistoryListener.h
@@ -0,0 +1,51 @@
+/*
+ * Copyright (C) 2004 Christian Persch
+ *
+ * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * $Id$
+ */
+
+#ifndef EPHY_REDIRECT_LISTENER_H
+#define EPHY_REDIRECT_LISTENER_H
+
+#include "ephy-history.h"
+
+#include <nsIWebProgressListener.h>
+#include <nsWeakReference.h>
+
+#include <glib-object.h>
+
+/* 6a9533c6-f068-4e63-8225-5feba0b54d6b */
+#define EPHY_REDIRECTLISTENER_CID \
+{ 0x6a9533c6, 0xf068, 0x4e63, { 0x82, 0x25, 0x5f, 0xeb, 0xa0, 0xb5, 0x4d, 0x6b } }
+#define EPHY_REDIRECTLISTENER_CLASSNAME "Epiphany Redirect Listener Class"
+
+class EphyHistoryListener : public nsIWebProgressListener,
+ public nsSupportsWeakReference
+{
+ public:
+ EphyHistoryListener();
+ virtual ~EphyHistoryListener();
+
+ nsresult Init (EphyHistory *aHistory);
+
+ NS_DECL_ISUPPORTS
+ NS_DECL_NSIWEBPROGRESSLISTENER
+ private:
+ EphyHistory *mHistory;
+};
+
+#endif /* EPHY_REDIRECT_LISTENER_H */
diff --git a/embed/mozilla/EphyUtils.cpp b/embed/mozilla/EphyUtils.cpp
index c8d296737..3a5407cb8 100644
--- a/embed/mozilla/EphyUtils.cpp
+++ b/embed/mozilla/EphyUtils.cpp
@@ -52,15 +52,23 @@ EphyUtils::GetIOService (nsIIOService **ioService)
return rv;
}
-nsresult EphyUtils::NewURI (nsIURI **result, const nsAString &spec)
+nsresult
+EphyUtils::NewURI (nsIURI **result,
+ const nsAString &spec,
+ const char *charset,
+ nsIURI *baseURI)
{
nsEmbedCString cSpec;
NS_UTF16ToCString (spec, NS_CSTRING_ENCODING_UTF8, cSpec);
- return NewURI (result, cSpec);
+ return NewURI (result, cSpec, charset, baseURI);
}
-nsresult EphyUtils::NewURI (nsIURI **result, const nsACString &spec)
+nsresult
+EphyUtils::NewURI (nsIURI **result,
+ const nsACString &spec,
+ const char *charset,
+ nsIURI *baseURI)
{
nsresult rv;
@@ -68,7 +76,7 @@ nsresult EphyUtils::NewURI (nsIURI **result, const nsACString &spec)
rv = EphyUtils::GetIOService (getter_AddRefs (ioService));
NS_ENSURE_SUCCESS (rv, rv);
- rv = ioService->NewURI (spec, nsnull, nsnull, result);
+ rv = ioService->NewURI (spec, charset, baseURI, result);
return rv;
}
diff --git a/embed/mozilla/EphyUtils.h b/embed/mozilla/EphyUtils.h
index 90057e1d5..2977dda74 100644
--- a/embed/mozilla/EphyUtils.h
+++ b/embed/mozilla/EphyUtils.h
@@ -33,9 +33,15 @@ namespace EphyUtils
{
nsresult GetIOService (nsIIOService **ioService);
- nsresult NewURI (nsIURI **result, const nsAString &spec);
-
- nsresult NewURI (nsIURI **result, const nsACString &spec);
+ nsresult NewURI (nsIURI **result,
+ const nsAString &spec,
+ const char *charset = nsnull,
+ nsIURI *baseURI = nsnull);
+
+ nsresult NewURI (nsIURI **result,
+ const nsACString &spec,
+ const char *charset = nsnull,
+ nsIURI *baseURI = nsnull);
GtkWidget *FindEmbed (nsIDOMWindow *aDOMWindow);
diff --git a/embed/mozilla/GlobalHistory.cpp b/embed/mozilla/GlobalHistory.cpp
index 315685329..9d9140a35 100644
--- a/embed/mozilla/GlobalHistory.cpp
+++ b/embed/mozilla/GlobalHistory.cpp
@@ -37,6 +37,9 @@ NS_IMPL_ISUPPORTS2(MozGlobalHistory, nsIGlobalHistory2, nsIBrowserHistory)
MozGlobalHistory::MozGlobalHistory ()
{
mGlobalHistory = EPHY_HISTORY (ephy_embed_shell_get_global_history (embed_shell));
+
+ mHistoryListener = new EphyHistoryListener ();
+ mHistoryListener->Init (mGlobalHistory);
}
MozGlobalHistory::~MozGlobalHistory ()
diff --git a/embed/mozilla/GlobalHistory.h b/embed/mozilla/GlobalHistory.h
index cb128db21..b8743caf0 100644
--- a/embed/mozilla/GlobalHistory.h
+++ b/embed/mozilla/GlobalHistory.h
@@ -27,6 +27,11 @@
#include <nsIBrowserHistory.h>
#include <nsIGlobalHistory2.h>
+#include <nsCOMPtr.h>
+#include <nsAutoPtr.h>
+
+#include "EphyHistoryListener.h"
+
#define EPHY_GLOBALHISTORY_CLASSNAME "Epiphany Global History Implementation"
#define EPHY_GLOBALHISTORY_CID \
@@ -48,6 +53,7 @@ class MozGlobalHistory: public nsIBrowserHistory
private:
EphyHistory *mGlobalHistory;
+ nsRefPtr<EphyHistoryListener> mHistoryListener;
};
#endif /* EPHY_GLOBAL_HISTORY_H */
diff --git a/embed/mozilla/Makefile.am b/embed/mozilla/Makefile.am
index 0476f5822..60c229f66 100644
--- a/embed/mozilla/Makefile.am
+++ b/embed/mozilla/Makefile.am
@@ -11,6 +11,8 @@ libephymozillaembed_la_SOURCES = \
EphyHeaderSniffer.h \
EphyBrowser.cpp \
EphyBrowser.h \
+ EphyHistoryListener.cpp \
+ EphyHIstoryListener.h \
EphySingle.cpp \
EphySingle.h \
EphyUtils.cpp \
diff --git a/src/bookmarks/ephy-bookmarks.c b/src/bookmarks/ephy-bookmarks.c
index e12eec366..0d520f2ac 100644
--- a/src/bookmarks/ephy-bookmarks.c
+++ b/src/bookmarks/ephy-bookmarks.c
@@ -476,6 +476,29 @@ history_cleared_cb (EphyHistory *history, EphyBookmarks *bookmarks)
clear_favorites (bookmarks);
}
+#include <gtk/gtkmessagedialog.h>
+#include <gtk/gtkdialog.h>
+
+static void
+redirect_cb (EphyHistory *history,
+ const char *from_uri,
+ const char *to_uri,
+ EphyBookmarks *eb)
+{
+ EphyNode *bookmark;
+ GValue value = { 0, };
+
+ bookmark = ephy_bookmarks_find_bookmark (eb, from_uri);
+ if (bookmark != NULL)
+ {
+ g_value_init (&value, G_TYPE_STRING);
+ g_value_set_string (&value, to_uri);
+ ephy_node_set_property (bookmark, EPHY_NODE_BMK_PROP_LOCATION,
+ &value);
+ g_value_unset (&value);
+ }
+}
+
static void
ephy_setup_history_notifiers (EphyBookmarks *eb)
{
@@ -492,6 +515,8 @@ ephy_setup_history_notifiers (EphyBookmarks *eb)
G_CALLBACK (history_site_visited_cb), eb);
g_signal_connect (history, "cleared",
G_CALLBACK (history_cleared_cb), eb);
+ g_signal_connect (history, "redirect",
+ G_CALLBACK (redirect_cb), eb);
}
static void
diff --git a/src/ephy-window.c b/src/ephy-window.c
index 8b70cf6c1..d7c65dd45 100644
--- a/src/ephy-window.c
+++ b/src/ephy-window.c
@@ -685,7 +685,6 @@ static gboolean
confirm_close_with_modified_forms (EphyWindow *window)
{
GtkWidget *dialog;
- GtkWindowGroup *group;
int response;
dialog = gtk_message_dialog_new
@@ -708,15 +707,7 @@ confirm_close_with_modified_forms (EphyWindow *window)
/* FIXME set title */
gtk_window_set_icon_name (GTK_WINDOW (dialog), "web-browser");
- group = GTK_WINDOW (window)->group;
- if (group == NULL)
- {
- group = gtk_window_group_new ();
- gtk_window_group_add_window (group, GTK_WINDOW (window));
- g_object_unref (group);
- }
-
- gtk_window_group_add_window (group, GTK_WINDOW (dialog));
+ gtk_window_group_add_window (GTK_WINDOW (window)->group, GTK_WINDOW (dialog));
response = gtk_dialog_run (GTK_DIALOG (dialog));
@@ -2366,6 +2357,20 @@ open_bookmark_cb (EphyBookmarksMenu *menu,
}
static void
+ensure_window_group (EphyWindow *window)
+{
+ GtkWindowGroup *group;
+
+ group = GTK_WINDOW (window)->group;
+ if (group == NULL)
+ {
+ group = gtk_window_group_new ();
+ gtk_window_group_add_window (group, GTK_WINDOW (window));
+ g_object_unref (group);
+ }
+}
+
+static void
ephy_window_init (EphyWindow *window)
{
EphyExtension *manager;
@@ -2380,6 +2385,8 @@ ephy_window_init (EphyWindow *window)
g_object_ref (ephy_shell);
+ ensure_window_group (window);
+
/* Setup the UI manager and connect verbs */
setup_ui_manager (window);