aboutsummaryrefslogtreecommitdiffstats
path: root/embed/xulrunner/components
diff options
context:
space:
mode:
authorChristian Persch <chpe@src.gnome.org>2007-09-15 03:03:48 +0800
committerChristian Persch <chpe@src.gnome.org>2007-09-15 03:03:48 +0800
commit73dfdccb77d9de0081b91b10c7484dea40443b4e (patch)
treecba067efd4a9b40281da90c8013b40f742ef12fa /embed/xulrunner/components
parent97e986150af1792ca00489ffa96c1454790562a8 (diff)
downloadgsoc2013-epiphany-73dfdccb77d9de0081b91b10c7484dea40443b4e.tar
gsoc2013-epiphany-73dfdccb77d9de0081b91b10c7484dea40443b4e.tar.gz
gsoc2013-epiphany-73dfdccb77d9de0081b91b10c7484dea40443b4e.tar.bz2
gsoc2013-epiphany-73dfdccb77d9de0081b91b10c7484dea40443b4e.tar.lz
gsoc2013-epiphany-73dfdccb77d9de0081b91b10c7484dea40443b4e.tar.xz
gsoc2013-epiphany-73dfdccb77d9de0081b91b10c7484dea40443b4e.tar.zst
gsoc2013-epiphany-73dfdccb77d9de0081b91b10c7484dea40443b4e.zip
Move EphyHistoryListener from embed/ to components/ since it's only used by GlobalHistory code.
svn path=/trunk/; revision=7437
Diffstat (limited to 'embed/xulrunner/components')
-rw-r--r--embed/xulrunner/components/EphyHistoryListener.cpp170
-rw-r--r--embed/xulrunner/components/EphyHistoryListener.h49
-rw-r--r--embed/xulrunner/components/Makefile.am2
3 files changed, 221 insertions, 0 deletions
diff --git a/embed/xulrunner/components/EphyHistoryListener.cpp b/embed/xulrunner/components/EphyHistoryListener.cpp
new file mode 100644
index 000000000..5da2170e7
--- /dev/null
+++ b/embed/xulrunner/components/EphyHistoryListener.cpp
@@ -0,0 +1,170 @@
+/*
+ * Copyright © 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * $Id$
+ */
+
+#include <xpcom-config.h>
+#include "config.h"
+
+#include <nsStringGlue.h>
+
+#include <nsCOMPtr.h>
+#include <nsCURILoader.h>
+#include <nsIChannel.h>
+#include <nsIDocumentLoader.h>
+#include <nsIHttpChannel.h>
+#include <nsIRequest.h>
+#include <nsIRequestObserver.h>
+#include <nsISupportsUtils.h>
+#include <nsIURI.h>
+#include <nsIWebProgress.h>
+#include <nsNetCID.h>
+#include <nsServiceManagerUtils.h>
+
+#include "EphyUtils.h"
+
+#include "ephy-debug.h"
+
+#include "EphyHistoryListener.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
+ (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;
+ }
+
+ 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);
+
+ nsCString location;
+ rv = httpChannel->GetResponseHeader
+ (nsCString ("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);
+
+ nsCString 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/xulrunner/components/EphyHistoryListener.h b/embed/xulrunner/components/EphyHistoryListener.h
new file mode 100644
index 000000000..23f955f05
--- /dev/null
+++ b/embed/xulrunner/components/EphyHistoryListener.h
@@ -0,0 +1,49 @@
+/*
+ * Copyright © 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * $Id$
+ */
+
+#ifndef EPHY_REDIRECT_LISTENER_H
+#define EPHY_REDIRECT_LISTENER_H
+
+#include "ephy-history.h"
+
+#include <nsIWebProgressListener.h>
+#include <nsWeakReference.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/xulrunner/components/Makefile.am b/embed/xulrunner/components/Makefile.am
index 7280d6541..d4c0d997b 100644
--- a/embed/xulrunner/components/Makefile.am
+++ b/embed/xulrunner/components/Makefile.am
@@ -9,6 +9,8 @@ libephycomponents_la_SOURCES = \
EphyAboutModule.h \
EphyContentPolicy.cpp \
EphyContentPolicy.h \
+ EphyHistoryListener.cpp \
+ EphyHistoryListener.h \
EphyRedirectChannel.cpp \
EphyRedirectChannel.h \
EphySidebar.cpp \