diff options
-rw-r--r-- | embed/ephy-history.c | 16 | ||||
-rw-r--r-- | embed/ephy-history.h | 4 | ||||
-rw-r--r-- | embed/mozilla/EphyHistoryListener.cpp | 172 | ||||
-rw-r--r-- | embed/mozilla/EphyHistoryListener.h | 51 | ||||
-rw-r--r-- | embed/mozilla/EphyUtils.cpp | 16 | ||||
-rw-r--r-- | embed/mozilla/EphyUtils.h | 12 | ||||
-rw-r--r-- | embed/mozilla/GlobalHistory.cpp | 3 | ||||
-rw-r--r-- | embed/mozilla/GlobalHistory.h | 6 | ||||
-rw-r--r-- | embed/mozilla/Makefile.am | 2 | ||||
-rw-r--r-- | src/bookmarks/ephy-bookmarks.c | 25 | ||||
-rw-r--r-- | src/ephy-window.c | 27 |
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); |