aboutsummaryrefslogtreecommitdiffstats
path: root/embed/mozilla/EphyProtocolHandler.cpp
diff options
context:
space:
mode:
authorChristian Persch <chpe@cvs.gnome.org>2005-05-26 06:08:01 +0800
committerChristian Persch <chpe@src.gnome.org>2005-05-26 06:08:01 +0800
commitc951555722d4933277a1d468c6508f5ad34711b1 (patch)
tree13d85691d343cc9315e9c172df44d5d80d64a3e4 /embed/mozilla/EphyProtocolHandler.cpp
parent2029610e09684f3dec57d3b00af6084f97699fe2 (diff)
downloadgsoc2013-epiphany-c951555722d4933277a1d468c6508f5ad34711b1.tar
gsoc2013-epiphany-c951555722d4933277a1d468c6508f5ad34711b1.tar.gz
gsoc2013-epiphany-c951555722d4933277a1d468c6508f5ad34711b1.tar.bz2
gsoc2013-epiphany-c951555722d4933277a1d468c6508f5ad34711b1.tar.lz
gsoc2013-epiphany-c951555722d4933277a1d468c6508f5ad34711b1.tar.xz
gsoc2013-epiphany-c951555722d4933277a1d468c6508f5ad34711b1.tar.zst
gsoc2013-epiphany-c951555722d4933277a1d468c6508f5ad34711b1.zip
Add protocol handler, which I'll use for our custom error pages. Since
2005-05-26 Christian Persch <chpe@cvs.gnome.org> * embed/mozilla/ContentHandler.cpp: * embed/mozilla/EphyProtocolHandler.cpp: * embed/mozilla/EphyProtocolHandler.h: * embed/mozilla/EphyUtils.cpp: * embed/mozilla/EphyUtils.h: * embed/mozilla/GtkNSSClientAuthDialogs.cpp: * embed/mozilla/GtkNSSDialogs.cpp: * embed/mozilla/GtkNSSKeyPairDialogs.cpp: * embed/mozilla/Makefile.am: * embed/mozilla/MozDownload.cpp: * embed/mozilla/MozRegisterComponents.cpp: Add protocol handler, which I'll use for our custom error pages. Since it's almost gratis, add about:epiphany back.
Diffstat (limited to 'embed/mozilla/EphyProtocolHandler.cpp')
-rw-r--r--embed/mozilla/EphyProtocolHandler.cpp181
1 files changed, 181 insertions, 0 deletions
diff --git a/embed/mozilla/EphyProtocolHandler.cpp b/embed/mozilla/EphyProtocolHandler.cpp
new file mode 100644
index 000000000..334e261b4
--- /dev/null
+++ b/embed/mozilla/EphyProtocolHandler.cpp
@@ -0,0 +1,181 @@
+/*
+ * Copyright (C) 2001 Matt Aubury, Philip Langdale
+ * Copyright (C) 2004 Crispin Flowerday
+ * Copyright (C) 2005 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 <nsCOMPtr.h>
+#include <nsIIOService.h>
+#include <nsIServiceManager.h>
+#include <nsIURI.h>
+#include <nsIChannel.h>
+#include <nsIOutputStream.h>
+#include <nsIInputStream.h>
+#include <nsILoadGroup.h>
+#include <nsIInterfaceRequestor.h>
+#include <nsIStorageStream.h>
+#include <nsIInputStreamChannel.h>
+#include <nsIScriptSecurityManager.h>
+#include <nsNetCID.h>
+#include <nsString.h>
+#include <nsEscape.h>
+
+#include <glib/gi18n.h>
+
+#include "EphyProtocolHandler.h"
+#include "EphyUtils.h"
+
+#include "ephy-debug.h"
+
+#include <string.h>
+
+static NS_DEFINE_CID(kSimpleURICID, NS_SIMPLEURI_CID);
+static NS_DEFINE_CID(kInputStreamChannelCID, NS_INPUTSTREAMCHANNEL_CID);
+
+EphyProtocolHandler::EphyProtocolHandler (void)
+{
+ LOG ("EphyProtocolHandler ctor [%p]\n", this);
+}
+
+EphyProtocolHandler::~EphyProtocolHandler()
+{
+ LOG ("EphyProtocolHandler dtor [%p]\n", this);
+}
+
+NS_IMPL_ISUPPORTS2 (EphyProtocolHandler, nsIProtocolHandler, nsIAboutModule)
+
+/* readonly attribute string scheme; */
+NS_IMETHODIMP
+EphyProtocolHandler::GetScheme(nsACString &aScheme)
+{
+ aScheme.Assign("epiphany");
+ return NS_OK;
+}
+
+/* readonly attribute long defaultPort; */
+NS_IMETHODIMP
+EphyProtocolHandler::GetDefaultPort(PRInt32 *aDefaultPort)
+{
+ NS_ENSURE_ARG_POINTER (aDefaultPort);
+
+ *aDefaultPort = -1;
+ return NS_OK;
+}
+
+/* readonly attribute short protocolFlags; */
+NS_IMETHODIMP
+EphyProtocolHandler::GetProtocolFlags(PRUint32 *aProtocolFlags)
+{
+ NS_ENSURE_ARG_POINTER (aProtocolFlags);
+
+ *aProtocolFlags = nsIProtocolHandler::URI_NORELATIVE | nsIProtocolHandler::URI_NOAUTH;
+ return NS_OK;
+}
+
+/* nsIURI newURI (in string aSpec, in nsIURI aBaseURI); */
+NS_IMETHODIMP
+EphyProtocolHandler::NewURI(const nsACString &aSpec,
+ const char *aOriginCharset,
+ nsIURI *aBaseURI,
+ nsIURI **_retval)
+{
+ nsresult rv;
+ nsCOMPtr<nsIURI> uri (do_CreateInstance(kSimpleURICID, &rv));
+ NS_ENSURE_SUCCESS (rv, rv);
+
+ rv = uri->SetSpec (aSpec);
+ NS_ENSURE_SUCCESS (rv, rv);
+
+ NS_ADDREF(*_retval = uri);
+ return NS_OK;
+}
+
+/* nsIChannel newChannel (in nsIURI aURI); */
+NS_IMETHODIMP
+EphyProtocolHandler::NewChannel(nsIURI *aURI,
+ nsIChannel **_retval)
+{
+ NS_ENSURE_ARG(aURI);
+
+#if 0
+ PRBool isEpiphany = PR_FALSE;
+ if (NS_SUCCEEDED (aURI->SchemeIs ("epiphany", &isEpiphany)) && isEpiphany)
+ {
+ return HandleEpiphany (aURI, _retval);
+ }
+#endif
+
+ PRBool isAbout = PR_FALSE;
+ if (NS_SUCCEEDED (aURI->SchemeIs ("about", &isAbout)) && isAbout)
+ {
+ return Redirect (nsDependentCString ("file://" SHARE_DIR "/epiphany.xhtml"), _retval);
+ }
+
+ return NS_ERROR_ILLEGAL_VALUE;
+}
+
+/* boolean allowPort (in long port, in string scheme); */
+NS_IMETHODIMP
+EphyProtocolHandler::AllowPort(PRInt32 port,
+ const char *scheme,
+ PRBool *_retval)
+{
+ *_retval = PR_FALSE;
+ return NS_OK;
+}
+
+/* private functions */
+
+nsresult
+EphyProtocolHandler::Redirect (const nsACString &aURL,
+ nsIChannel **_retval)
+{
+ nsresult rv;
+ nsCOMPtr<nsIIOService> ioService;
+ rv = EphyUtils::GetIOService (getter_AddRefs (ioService));
+ NS_ENSURE_SUCCESS (rv, rv);
+
+ nsCOMPtr<nsIChannel> tempChannel;
+ rv = ioService->NewChannel(aURL, nsnull, nsnull, getter_AddRefs(tempChannel));
+ NS_ENSURE_SUCCESS (rv, rv);
+
+ nsCOMPtr<nsIURI> uri;
+ rv = ioService->NewURI(aURL, nsnull, nsnull, getter_AddRefs(uri));
+ NS_ENSURE_SUCCESS (rv, rv);
+
+ tempChannel->SetOriginalURI (uri);
+
+ nsCOMPtr<nsIScriptSecurityManager> securityManager =
+ do_GetService(NS_SCRIPTSECURITYMANAGER_CONTRACTID, &rv);
+ NS_ENSURE_SUCCESS (rv, rv);
+
+ nsCOMPtr<nsIPrincipal> principal;
+ rv = securityManager->GetCodebasePrincipal(uri, getter_AddRefs(principal));
+ NS_ENSURE_SUCCESS (rv, rv);
+
+ nsCOMPtr<nsISupports> owner (do_QueryInterface(principal));
+ rv = tempChannel->SetOwner(owner);
+
+ NS_ADDREF(*_retval = tempChannel);
+ return rv;
+}