/* * 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 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "EphyProtocolHandler.h" #include "EphyUtils.h" #include "ephy-debug.h" #include static NS_DEFINE_CID(kSimpleURICID, NS_SIMPLEURI_CID); static NS_DEFINE_CID(kInputStreamChannelCID, NS_INPUTSTREAMCHANNEL_CID); EphyProtocolHandler::EphyProtocolHandler() { 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 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 ioService; rv = EphyUtils::GetIOService (getter_AddRefs (ioService)); NS_ENSURE_SUCCESS (rv, rv); nsCOMPtr tempChannel; rv = ioService->NewChannel(aURL, nsnull, nsnull, getter_AddRefs(tempChannel)); NS_ENSURE_SUCCESS (rv, rv); nsCOMPtr uri; rv = ioService->NewURI(aURL, nsnull, nsnull, getter_AddRefs(uri)); NS_ENSURE_SUCCESS (rv, rv); tempChannel->SetOriginalURI (uri); nsCOMPtr securityManager = do_GetService(NS_SCRIPTSECURITYMANAGER_CONTRACTID, &rv); NS_ENSURE_SUCCESS (rv, rv); nsCOMPtr principal; rv = securityManager->GetCodebasePrincipal(uri, getter_AddRefs(principal)); NS_ENSURE_SUCCESS (rv, rv); nsCOMPtr owner (do_QueryInterface(principal)); rv = tempChannel->SetOwner(owner); NS_ADDREF(*_retval = tempChannel); return rv; }