diff options
author | Christian Persch <chpe@src.gnome.org> | 2007-09-15 03:03:48 +0800 |
---|---|---|
committer | Christian Persch <chpe@src.gnome.org> | 2007-09-15 03:03:48 +0800 |
commit | 73dfdccb77d9de0081b91b10c7484dea40443b4e (patch) | |
tree | cba067efd4a9b40281da90c8013b40f742ef12fa /embed/xulrunner/components | |
parent | 97e986150af1792ca00489ffa96c1454790562a8 (diff) | |
download | gsoc2013-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.cpp | 170 | ||||
-rw-r--r-- | embed/xulrunner/components/EphyHistoryListener.h | 49 | ||||
-rw-r--r-- | embed/xulrunner/components/Makefile.am | 2 |
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 \ |