aboutsummaryrefslogtreecommitdiffstats
path: root/embed/mozilla/EphyHistoryListener.cpp
diff options
context:
space:
mode:
authorChristian Persch <chpe@cvs.gnome.org>2004-12-02 23:16:41 +0800
committerChristian Persch <chpe@src.gnome.org>2004-12-02 23:16:41 +0800
commit37cc7f0bb5f9e4e7257ff9b7106dd92467590d43 (patch)
treed2c21062ffb30b383187311a657c26148c5ddf28 /embed/mozilla/EphyHistoryListener.cpp
parent2f0a4969602af118edfcb2959d422b7c03e022b0 (diff)
downloadgsoc2013-epiphany-37cc7f0bb5f9e4e7257ff9b7106dd92467590d43.tar
gsoc2013-epiphany-37cc7f0bb5f9e4e7257ff9b7106dd92467590d43.tar.gz
gsoc2013-epiphany-37cc7f0bb5f9e4e7257ff9b7106dd92467590d43.tar.bz2
gsoc2013-epiphany-37cc7f0bb5f9e4e7257ff9b7106dd92467590d43.tar.lz
gsoc2013-epiphany-37cc7f0bb5f9e4e7257ff9b7106dd92467590d43.tar.xz
gsoc2013-epiphany-37cc7f0bb5f9e4e7257ff9b7106dd92467590d43.tar.zst
gsoc2013-epiphany-37cc7f0bb5f9e4e7257ff9b7106dd92467590d43.zip
Update bookmarks from HTTP 301. Fixes bug #126312.
2004-12-02 Christian Persch <chpe@cvs.gnome.org> * 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.
Diffstat (limited to 'embed/mozilla/EphyHistoryListener.cpp')
-rw-r--r--embed/mozilla/EphyHistoryListener.cpp172
1 files changed, 172 insertions, 0 deletions
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;
+}