From 37cc7f0bb5f9e4e7257ff9b7106dd92467590d43 Mon Sep 17 00:00:00 2001 From: Christian Persch Date: Thu, 2 Dec 2004 15:16:41 +0000 Subject: Update bookmarks from HTTP 301. Fixes bug #126312. 2004-12-02 Christian Persch * embed/ephy-history.c: (ephy_history_class_init): * embed/ephy-history.h: * embed/mozilla/EphyHistoryListener.cpp: * embed/mozilla/EphyHistoryListener.h: * embed/mozilla/EphyUtils.cpp: * embed/mozilla/EphyUtils.h: * embed/mozilla/GlobalHistory.cpp: * embed/mozilla/GlobalHistory.h: * embed/mozilla/Makefile.am: * src/bookmarks/ephy-bookmarks.c: (redirect_cb), (ephy_setup_history_notifiers): * src/ephy-window.c: (confirm_close_with_modified_forms), (ensure_window_group), (ephy_window_init): Update bookmarks from HTTP 301. Fixes bug #126312. --- embed/mozilla/EphyHistoryListener.cpp | 172 ++++++++++++++++++++++++++++++++++ embed/mozilla/EphyHistoryListener.h | 51 ++++++++++ embed/mozilla/EphyUtils.cpp | 16 +++- embed/mozilla/EphyUtils.h | 12 ++- embed/mozilla/GlobalHistory.cpp | 3 + embed/mozilla/GlobalHistory.h | 6 ++ embed/mozilla/Makefile.am | 2 + 7 files changed, 255 insertions(+), 7 deletions(-) create mode 100644 embed/mozilla/EphyHistoryListener.cpp create mode 100644 embed/mozilla/EphyHistoryListener.h (limited to 'embed/mozilla') 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 +#undef MOZILLA_STRICT_API +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +EphyHistoryListener::EphyHistoryListener () +{ + LOG ("EphyHistoryListener ctor") +} + +EphyHistoryListener::~EphyHistoryListener () +{ + LOG ("EphyHistoryListener dtor") +} + +nsresult +EphyHistoryListener::Init (EphyHistory *aHistory) +{ + mHistory = aHistory; + + nsresult rv; + nsCOMPtr 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 channel (do_QueryInterface (aRequest)); + nsCOMPtr 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 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 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 +#include + +#include + +/* 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 #include +#include +#include + +#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 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 \ -- cgit