Bug 320498 Fix NewChannel impls to handle null in argument
r=darin sr=darin
This commit is contained in:
Родитель
093f371fe6
Коммит
7b09668c76
|
@ -1,244 +0,0 @@
|
|||
//* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/* ***** BEGIN LICENSE BLOCK *****
|
||||
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
||||
*
|
||||
* The contents of this file are subject to the Mozilla Public License Version
|
||||
* 1.1 (the "License"); you may not use this file except in compliance with
|
||||
* the License. You may obtain a copy of the License at
|
||||
* http://www.mozilla.org/MPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
* for the specific language governing rights and limitations under the
|
||||
* License.
|
||||
*
|
||||
* The Original Code is Mozilla Annotation Service
|
||||
*
|
||||
* The Initial Developer of the Original Code is
|
||||
* Google Inc.
|
||||
* Portions created by the Initial Developer are Copyright (C) 2005
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
* Brett Wilson <brettw@gmail.com> (original author)
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
* of those above. If you wish to allow use of your version of this file only
|
||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
* use your version of this file under the terms of the MPL, indicate your
|
||||
* decision by deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this file under
|
||||
* the terms of any one of the MPL, the GPL or the LGPL.
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
|
||||
/**
|
||||
* Implementation of moz-anno: URLs for accessing annotation values. This just
|
||||
* reads binary data from the annotation service.
|
||||
*
|
||||
* There is a special case for favicons. Annotation URLs with the name "favicon"
|
||||
* will be sent to the favicon service. If the favicon service doesn't have the
|
||||
* data, a stream containing the default favicon will be returned.
|
||||
*/
|
||||
|
||||
#include "nsAnnoProtocolHandler.h"
|
||||
#include "nsFaviconService.h"
|
||||
#include "nsIChannel.h"
|
||||
#include "nsIInputStreamChannel.h"
|
||||
#include "nsILoadGroup.h"
|
||||
#include "nsIStandardURL.h"
|
||||
#include "nsIStringStream.h"
|
||||
#include "nsISupportsUtils.h"
|
||||
#include "nsIURI.h"
|
||||
#include "nsNetUtil.h"
|
||||
#include "nsServiceManagerUtils.h"
|
||||
#include "nsStringStream.h"
|
||||
|
||||
NS_IMPL_ISUPPORTS1(nsAnnoProtocolHandler, nsIProtocolHandler)
|
||||
|
||||
// nsAnnoProtocolHandler::GetScheme
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsAnnoProtocolHandler::GetScheme(nsACString& aScheme)
|
||||
{
|
||||
aScheme.AssignLiteral("moz-anno");
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
|
||||
// nsAnnoProtocolHandler::GetDefaultPort
|
||||
//
|
||||
// There is no default port for annotation URLs
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsAnnoProtocolHandler::GetDefaultPort(PRInt32 *aDefaultPort)
|
||||
{
|
||||
*aDefaultPort = -1;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
|
||||
// nsAnnoProtocolHandler::GetProtocolFlags
|
||||
//
|
||||
// No special protocol flags.
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsAnnoProtocolHandler::GetProtocolFlags(PRUint32 *aProtocolFlags)
|
||||
{
|
||||
*aProtocolFlags = (URI_NORELATIVE | URI_NOAUTH);
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
|
||||
// nsAnnoProtocolHandler::NewURI
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsAnnoProtocolHandler::NewURI(const nsACString& aSpec,
|
||||
const char *aOriginCharset,
|
||||
nsIURI *aBaseURI, nsIURI **_retval)
|
||||
{
|
||||
nsCOMPtr <nsIURI> uri = do_CreateInstance(NS_SIMPLEURI_CONTRACTID);
|
||||
if (!uri)
|
||||
return NS_ERROR_OUT_OF_MEMORY;
|
||||
nsresult rv = uri->SetSpec(aSpec);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
|
||||
*_retval = nsnull;
|
||||
uri.swap(*_retval);
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
|
||||
// nsAnnoProtocolHandler::NewChannel
|
||||
//
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsAnnoProtocolHandler::NewChannel(nsIURI *aURI, nsIChannel **_retval)
|
||||
{
|
||||
nsresult rv;
|
||||
|
||||
nsCAutoString path;
|
||||
rv = aURI->GetPath(path);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
|
||||
nsCOMPtr<nsIAnnotationService> annotationService = do_GetService(
|
||||
"@mozilla.org/browser/annotation-service;1", &rv);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
|
||||
// annotation info
|
||||
nsCOMPtr<nsIURI> annoURI;
|
||||
nsCAutoString annoName;
|
||||
rv = ParseAnnoURI(aURI, getter_AddRefs(annoURI), annoName);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
|
||||
// get the data from the annotation service and hand it off to the stream
|
||||
PRUint8* data;
|
||||
PRUint32 dataLen;
|
||||
nsCAutoString mimeType;
|
||||
|
||||
if (annoName.EqualsLiteral(FAVICON_ANNOTATION_NAME)) {
|
||||
// special handling for favicons: ask favicon service
|
||||
nsFaviconService* faviconService = nsFaviconService::GetFaviconService();
|
||||
if (! faviconService) {
|
||||
NS_WARNING("Favicon service is unavailable.");
|
||||
return GetDefaultIcon(_retval);
|
||||
}
|
||||
rv = faviconService->GetFaviconData(annoURI, mimeType, &dataLen, &data);
|
||||
if (NS_FAILED(rv))
|
||||
return GetDefaultIcon(_retval);
|
||||
|
||||
// don't allow icons without MIME types
|
||||
if (mimeType.IsEmpty()) {
|
||||
NS_Free(data);
|
||||
return GetDefaultIcon(_retval);
|
||||
}
|
||||
} else {
|
||||
// normal handling for annotations
|
||||
rv = annotationService->GetAnnotationBinary(annoURI, annoName, &data,
|
||||
&dataLen, mimeType);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
|
||||
// disallow annotations with no MIME types
|
||||
if (mimeType.IsEmpty()) {
|
||||
NS_Free(data);
|
||||
return NS_ERROR_NOT_AVAILABLE;
|
||||
}
|
||||
}
|
||||
|
||||
nsCOMPtr<nsIStringInputStream> stream = do_CreateInstance(
|
||||
NS_STRINGINPUTSTREAM_CONTRACTID, &rv);
|
||||
if (NS_FAILED(rv)) {
|
||||
NS_Free(data);
|
||||
return rv;
|
||||
}
|
||||
rv = stream->AdoptData((char*)data, dataLen);
|
||||
if (NS_FAILED(rv)) {
|
||||
NS_Free(data);
|
||||
return rv;
|
||||
}
|
||||
|
||||
nsCOMPtr<nsIChannel> channel;
|
||||
rv = NS_NewInputStreamChannel(getter_AddRefs(channel), aURI, stream, mimeType);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
|
||||
*_retval = channel;
|
||||
NS_ADDREF(*_retval);
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
|
||||
// nsAnnoProtocolHandler::AllowPort
|
||||
//
|
||||
// Don't override any bans on bad ports.
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsAnnoProtocolHandler::AllowPort(PRInt32 port, const char *scheme,
|
||||
PRBool *_retval)
|
||||
{
|
||||
*_retval = PR_FALSE;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
|
||||
// nsAnnoProtocolHandler::ParseAnnoURI
|
||||
//
|
||||
// Splits an annotation URL into its URI and name parts
|
||||
|
||||
nsresult
|
||||
nsAnnoProtocolHandler::ParseAnnoURI(nsIURI* aURI,
|
||||
nsIURI** aResultURI, nsCString& aName)
|
||||
{
|
||||
nsresult rv;
|
||||
nsCAutoString path;
|
||||
rv = aURI->GetPath(path);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
|
||||
PRInt32 firstColon = path.FindChar(':');
|
||||
if (firstColon <= 0)
|
||||
return NS_ERROR_MALFORMED_URI;
|
||||
|
||||
rv = NS_NewURI(aResultURI, Substring(path, firstColon + 1));
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
|
||||
aName = Substring(path, 0, firstColon);
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
|
||||
// nsAnnoProtocolHandler::GetDefaultIcon
|
||||
//
|
||||
// This creates a channel for the default web page favicon.
|
||||
|
||||
nsresult
|
||||
nsAnnoProtocolHandler::GetDefaultIcon(nsIChannel** aChannel)
|
||||
{
|
||||
nsresult rv;
|
||||
nsCOMPtr<nsIURI> uri;
|
||||
rv = NS_NewURI(getter_AddRefs(uri), NS_LITERAL_CSTRING(FAVICON_DEFAULT_URL));
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
return NS_NewChannel(aChannel, uri);
|
||||
}
|
|
@ -109,6 +109,7 @@ nsWyciwygProtocolHandler::NewURI(const nsACString &aSpec,
|
|||
NS_IMETHODIMP
|
||||
nsWyciwygProtocolHandler::NewChannel(nsIURI* url, nsIChannel* *result)
|
||||
{
|
||||
NS_ENSURE_ARG_POINTER(url);
|
||||
nsresult rv;
|
||||
|
||||
nsWyciwygChannel* channel = new nsWyciwygChannel();
|
||||
|
|
|
@ -118,6 +118,7 @@ NS_IMETHODIMP
|
|||
nsLDAPProtocolHandler::NewChannel(nsIURI* uri,
|
||||
nsIChannel* *result)
|
||||
{
|
||||
NS_ENSURE_ARG_POINTER(uri);
|
||||
nsresult rv;
|
||||
nsLDAPChannel *channel;
|
||||
|
||||
|
|
|
@ -245,6 +245,7 @@ NS_IMETHODIMP GeckoProtocolHandlerImpl::NewURI(const nsACString & aSpec, const c
|
|||
/* nsIChannel newChannel (in nsIURI aURI); */
|
||||
NS_IMETHODIMP GeckoProtocolHandlerImpl::NewChannel(nsIURI *aURI, nsIChannel **_retval)
|
||||
{
|
||||
NS_ENSURE_ARG_POINTER(aURI);
|
||||
GeckoProtocolChannel *channel = new GeckoProtocolChannel;
|
||||
if (!channel)
|
||||
{
|
||||
|
|
|
@ -125,6 +125,7 @@ NS_IMETHODIMP
|
|||
nsDateTimeHandler::NewProxiedChannel(nsIURI* url, nsIProxyInfo* proxyInfo,
|
||||
nsIChannel* *result)
|
||||
{
|
||||
NS_ENSURE_ARG_POINTER(url);
|
||||
nsresult rv;
|
||||
|
||||
nsDateTimeChannel *chan = new nsDateTimeChannel();
|
||||
|
|
|
@ -127,6 +127,7 @@ NS_IMETHODIMP
|
|||
nsFingerHandler::NewProxiedChannel(nsIURI* url, nsIProxyInfo* proxyInfo,
|
||||
nsIChannel* *result)
|
||||
{
|
||||
NS_ENSURE_ARG_POINTER(url);
|
||||
nsresult rv;
|
||||
|
||||
nsFingerChannel *chan = new nsFingerChannel();
|
||||
|
|
|
@ -940,6 +940,7 @@ nsGnomeVFSProtocolHandler::NewURI(const nsACString &aSpec,
|
|||
NS_IMETHODIMP
|
||||
nsGnomeVFSProtocolHandler::NewChannel(nsIURI *aURI, nsIChannel **aResult)
|
||||
{
|
||||
NS_ENSURE_ARG_POINTER(aURI);
|
||||
nsresult rv;
|
||||
|
||||
nsCAutoString spec;
|
||||
|
|
|
@ -345,6 +345,7 @@ NS_IMETHODIMP nsSmtpService::NewURI(const nsACString &aSpec,
|
|||
|
||||
NS_IMETHODIMP nsSmtpService::NewChannel(nsIURI *aURI, nsIChannel **_retval)
|
||||
{
|
||||
NS_ENSURE_ARG_POINTER(aURI);
|
||||
// create an empty pipe for use with the input stream channel.
|
||||
nsCOMPtr<nsIInputStream> pipeIn;
|
||||
nsCOMPtr<nsIOutputStream> pipeOut;
|
||||
|
|
|
@ -562,6 +562,7 @@ NS_IMETHODIMP nsMailboxService::NewURI(const nsACString &aSpec,
|
|||
|
||||
NS_IMETHODIMP nsMailboxService::NewChannel(nsIURI *aURI, nsIChannel **_retval)
|
||||
{
|
||||
NS_ENSURE_ARG_POINTER(aURI);
|
||||
nsresult rv = NS_OK;
|
||||
nsMailboxProtocol * protocol = new nsMailboxProtocol(aURI);
|
||||
if (protocol)
|
||||
|
|
|
@ -415,6 +415,7 @@ NS_IMETHODIMP nsPop3Service::NewURI(const nsACString &aSpec,
|
|||
|
||||
NS_IMETHODIMP nsPop3Service::NewChannel(nsIURI *aURI, nsIChannel **_retval)
|
||||
{
|
||||
NS_ENSURE_ARG_POINTER(aURI);
|
||||
nsresult rv = NS_OK;
|
||||
nsPop3Protocol * protocol = new nsPop3Protocol(aURI);
|
||||
if (protocol)
|
||||
|
|
|
@ -24,7 +24,7 @@
|
|||
* Scott MacGregor <mscott@netscape.com>
|
||||
* Pierre Phaneuf <pp@ludusdesign.com>
|
||||
* Håkan Waara <hwaara@chello.se>
|
||||
* David Bienvenu < bienvenu@nventure.com>
|
||||
* David Bienvenu <bienvenu@nventure.com>
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either of the GNU General Public License Version 2 or later (the "GPL"),
|
||||
|
@ -1416,11 +1416,12 @@ NS_IMETHODIMP nsNntpService::NewURI(const nsACString &aSpec,
|
|||
|
||||
NS_IMETHODIMP nsNntpService::NewChannel(nsIURI *aURI, nsIChannel **_retval)
|
||||
{
|
||||
NS_ENSURE_ARG_POINTER(aURI);
|
||||
nsresult rv = NS_OK;
|
||||
nsCOMPtr <nsINNTPProtocol> nntpProtocol;
|
||||
rv = GetProtocolForUri(aURI, nsnull, getter_AddRefs(nntpProtocol));
|
||||
if (NS_SUCCEEDED(rv))
|
||||
rv = nntpProtocol->Initialize(aURI, nsnull);
|
||||
rv = nntpProtocol->Initialize(aURI, nsnull);
|
||||
if (NS_FAILED(rv)) return rv;
|
||||
|
||||
return CallQueryInterface(nntpProtocol, _retval);
|
||||
|
|
|
@ -106,6 +106,7 @@ NS_IMETHODIMP nsIconProtocolHandler::NewURI(const nsACString &aSpec,
|
|||
|
||||
NS_IMETHODIMP nsIconProtocolHandler::NewChannel(nsIURI* url, nsIChannel* *result)
|
||||
{
|
||||
NS_ENSURE_ARG_POINTER(url);
|
||||
nsIconChannel* channel = new nsIconChannel;
|
||||
if (!channel)
|
||||
return NS_ERROR_OUT_OF_MEMORY;
|
||||
|
|
|
@ -49,6 +49,7 @@ static const char kBlankPage[] = "<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01
|
|||
NS_IMETHODIMP
|
||||
nsAboutBlank::NewChannel(nsIURI *aURI, nsIChannel **result)
|
||||
{
|
||||
NS_ENSURE_ARG_POINTER(aURI);
|
||||
nsresult rv;
|
||||
nsIChannel* channel;
|
||||
|
||||
|
|
|
@ -60,6 +60,7 @@ NS_IMPL_ISUPPORTS1(nsAboutBloat, nsIAboutModule)
|
|||
NS_IMETHODIMP
|
||||
nsAboutBloat::NewChannel(nsIURI *aURI, nsIChannel **result)
|
||||
{
|
||||
NS_ENSURE_ARG_POINTER(aURI);
|
||||
nsresult rv;
|
||||
nsCAutoString path;
|
||||
rv = aURI->GetPath(path);
|
||||
|
|
|
@ -75,6 +75,7 @@ NS_IMPL_ISUPPORTS2(nsAboutCache, nsIAboutModule, nsICacheVisitor)
|
|||
NS_IMETHODIMP
|
||||
nsAboutCache::NewChannel(nsIURI *aURI, nsIChannel **result)
|
||||
{
|
||||
NS_ENSURE_ARG_POINTER(aURI);
|
||||
nsresult rv;
|
||||
PRUint32 bytesWritten;
|
||||
|
||||
|
|
|
@ -60,6 +60,7 @@ NS_IMPL_ISUPPORTS2(nsAboutCacheEntry,
|
|||
NS_IMETHODIMP
|
||||
nsAboutCacheEntry::NewChannel(nsIURI *uri, nsIChannel **result)
|
||||
{
|
||||
NS_ENSURE_ARG_POINTER(uri);
|
||||
nsresult rv;
|
||||
|
||||
nsCOMPtr<nsIInputStream> stream;
|
||||
|
|
|
@ -136,6 +136,7 @@ nsAboutProtocolHandler::NewURI(const nsACString &aSpec,
|
|||
NS_IMETHODIMP
|
||||
nsAboutProtocolHandler::NewChannel(nsIURI* uri, nsIChannel* *result)
|
||||
{
|
||||
NS_ENSURE_ARG_POINTER(uri);
|
||||
// about:what you ask?
|
||||
nsresult rv;
|
||||
nsCAutoString contractID;
|
||||
|
|
|
@ -76,7 +76,7 @@ static const int kRedirTotal = NS_ARRAY_LENGTH(kRedirMap);
|
|||
NS_IMETHODIMP
|
||||
nsAboutRedirector::NewChannel(nsIURI *aURI, nsIChannel **result)
|
||||
{
|
||||
NS_ASSERTION(aURI, "must not be null");
|
||||
NS_ENSURE_ARG_POINTER(aURI);
|
||||
NS_ASSERTION(result, "must not be null");
|
||||
|
||||
nsresult rv;
|
||||
|
|
|
@ -117,6 +117,7 @@ nsDataHandler::NewURI(const nsACString &aSpec,
|
|||
NS_IMETHODIMP
|
||||
nsDataHandler::NewChannel(nsIURI* uri, nsIChannel* *result)
|
||||
{
|
||||
NS_ENSURE_ARG_POINTER(uri);
|
||||
nsDataChannel* channel = new nsDataChannel(uri);
|
||||
if (!channel)
|
||||
return NS_ERROR_OUT_OF_MEMORY;
|
||||
|
|
|
@ -213,6 +213,7 @@ nsFtpProtocolHandler::NewChannel(nsIURI* url, nsIChannel* *result)
|
|||
NS_IMETHODIMP
|
||||
nsFtpProtocolHandler::NewProxiedChannel(nsIURI* url, nsIProxyInfo* proxyInfo, nsIChannel* *result)
|
||||
{
|
||||
NS_ENSURE_ARG_POINTER(url);
|
||||
nsFTPChannel *channel = new nsFTPChannel();
|
||||
if (!channel)
|
||||
return NS_ERROR_OUT_OF_MEMORY;
|
||||
|
|
|
@ -100,6 +100,7 @@ NS_IMETHODIMP
|
|||
nsGopherHandler::NewProxiedChannel(nsIURI *uri, nsIProxyInfo *proxyInfo,
|
||||
nsIChannel **result)
|
||||
{
|
||||
NS_ENSURE_ARG_POINTER(uri);
|
||||
nsGopherChannel *chan = new nsGopherChannel(uri, proxyInfo);
|
||||
if (!chan)
|
||||
return NS_ERROR_OUT_OF_MEMORY;
|
||||
|
|
|
@ -1,202 +0,0 @@
|
|||
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
||||
/* ***** BEGIN LICENSE BLOCK *****
|
||||
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
||||
*
|
||||
* The contents of this file are subject to the Mozilla Public License Version
|
||||
* 1.1 (the "License"); you may not use this file except in compliance with
|
||||
* the License. You may obtain a copy of the License at
|
||||
* http://www.mozilla.org/MPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
* for the specific language governing rights and limitations under the
|
||||
* License.
|
||||
*
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is
|
||||
* Netscape Communications Corporation.
|
||||
* Portions created by the Initial Developer are Copyright (C) 1998
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
* of those above. If you wish to allow use of your version of this file only
|
||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
* use your version of this file under the terms of the MPL, indicate your
|
||||
* decision by deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this file under
|
||||
* the terms of any one of the MPL, the GPL or the LGPL.
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
|
||||
#include "nsKeywordProtocolHandler.h"
|
||||
#include "nsIURL.h"
|
||||
#include "nsIIOService.h"
|
||||
#include "nsCRT.h"
|
||||
#include "nsIComponentManager.h"
|
||||
#include "nsIServiceManager.h"
|
||||
#include "nsEscape.h"
|
||||
#include "nsIPrefService.h"
|
||||
#include "nsIPrefBranch.h"
|
||||
#include "nsXPIDLString.h"
|
||||
#include "nsReadableUtils.h"
|
||||
#include "nsNetUtil.h"
|
||||
|
||||
static NS_DEFINE_CID(kSimpleURICID, NS_SIMPLEURI_CID);
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
nsKeywordProtocolHandler::nsKeywordProtocolHandler() {
|
||||
}
|
||||
|
||||
nsKeywordProtocolHandler::~nsKeywordProtocolHandler() {
|
||||
}
|
||||
|
||||
NS_IMPL_ISUPPORTS1(nsKeywordProtocolHandler, nsIProtocolHandler)
|
||||
|
||||
NS_METHOD
|
||||
nsKeywordProtocolHandler::Create(nsISupports *aOuter, REFNSIID aIID, void **aResult) {
|
||||
if (aOuter)
|
||||
return NS_ERROR_NO_AGGREGATION;
|
||||
|
||||
nsKeywordProtocolHandler* ph = new nsKeywordProtocolHandler();
|
||||
if (ph == nsnull)
|
||||
return NS_ERROR_OUT_OF_MEMORY;
|
||||
NS_ADDREF(ph);
|
||||
nsresult rv = ph->QueryInterface(aIID, aResult);
|
||||
NS_RELEASE(ph);
|
||||
return rv;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// nsIProtocolHandler methods:
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsKeywordProtocolHandler::GetScheme(nsACString &result) {
|
||||
result.AssignLiteral("keyword");
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsKeywordProtocolHandler::GetDefaultPort(PRInt32 *result) {
|
||||
*result = -1;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsKeywordProtocolHandler::GetProtocolFlags(PRUint32 *result) {
|
||||
*result = URI_NORELATIVE | URI_NOAUTH;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
// digests a spec _without_ the preceeding "keyword:" scheme.
|
||||
static char *
|
||||
MangleKeywordIntoHTTPURL(const char *aSpec, const char *aHTTPURL) {
|
||||
char * unescaped = nsCRT::strdup(aSpec);
|
||||
if(unescaped == nsnull)
|
||||
return nsnull;
|
||||
|
||||
// XXX this doesn't play nicely w/ i18n URLs
|
||||
nsUnescape(unescaped);
|
||||
|
||||
// build up a request to the keyword server.
|
||||
nsCAutoString query;
|
||||
|
||||
// pull out the "go" action word, or '?', if any
|
||||
char one = unescaped[0], two = unescaped[1];
|
||||
if (one == '?') { // "?blah"
|
||||
query = unescaped+1;
|
||||
} else if ( (one == 'g' || one == 'G') //
|
||||
&& //
|
||||
(two == 'o' || two == 'O') // "g[G]o[O] blah"
|
||||
&& //
|
||||
(unescaped[2] == ' ') ) { //
|
||||
|
||||
query = unescaped+3;
|
||||
} else {
|
||||
query = unescaped;
|
||||
}
|
||||
|
||||
nsMemory::Free(unescaped);
|
||||
|
||||
query.Trim(" "); // pull leading/trailing spaces.
|
||||
|
||||
// encode
|
||||
char * encQuery = nsEscape(query.get(), url_Path);
|
||||
if (!encQuery) return nsnull;
|
||||
query = encQuery;
|
||||
nsMemory::Free(encQuery);
|
||||
|
||||
// prepend the query with the keyword url
|
||||
// XXX this url should come from somewhere else
|
||||
query.Insert(aHTTPURL, 0);
|
||||
|
||||
return ToNewCString(query);
|
||||
}
|
||||
|
||||
// digests a spec of the form "keyword:blah"
|
||||
NS_IMETHODIMP
|
||||
nsKeywordProtocolHandler::NewURI(const nsACString &aSpec,
|
||||
const char *aCharset, // ignore charset info
|
||||
nsIURI *aBaseURI,
|
||||
nsIURI **result)
|
||||
{
|
||||
nsIURI* uri;
|
||||
nsresult rv = CallCreateInstance(kSimpleURICID, &uri);
|
||||
if (NS_FAILED(rv)) return rv;
|
||||
|
||||
rv = uri->SetSpec(aSpec);
|
||||
if (NS_FAILED(rv)) {
|
||||
NS_RELEASE(uri);
|
||||
return rv;
|
||||
}
|
||||
|
||||
*result = uri;
|
||||
return rv;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsKeywordProtocolHandler::NewChannel(nsIURI* uri, nsIChannel* *result)
|
||||
{
|
||||
nsresult rv;
|
||||
nsCOMPtr<nsIPrefBranch> prefs = do_GetService(NS_PREFSERVICE_CONTRACTID, &rv);
|
||||
if (NS_FAILED(rv)) return rv;
|
||||
|
||||
nsXPIDLCString url;
|
||||
rv = prefs->GetCharPref("keyword.URL", getter_Copies(url));
|
||||
// if we can't find a keyword.URL keywords won't work.
|
||||
if (url.IsEmpty())
|
||||
return NS_ERROR_FAILURE;
|
||||
|
||||
nsCAutoString path;
|
||||
rv = uri->GetPath(path);
|
||||
if (NS_FAILED(rv)) return rv;
|
||||
|
||||
char *httpSpec = MangleKeywordIntoHTTPURL(path.get(), url.get());
|
||||
if (!httpSpec) return NS_ERROR_OUT_OF_MEMORY;
|
||||
|
||||
// now we have an HTTP url, give the user an HTTP channel
|
||||
nsCOMPtr<nsIIOService> serv(do_GetIOService(&rv));
|
||||
if (NS_SUCCEEDED(rv))
|
||||
rv = serv->NewChannel(nsDependentCString(httpSpec), nsnull, nsnull, result);
|
||||
|
||||
nsMemory::Free(httpSpec);
|
||||
return rv;
|
||||
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsKeywordProtocolHandler::AllowPort(PRInt32 port, const char *scheme, PRBool *_retval)
|
||||
{
|
||||
// don't override anything.
|
||||
*_retval = PR_FALSE;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
|
@ -236,6 +236,7 @@ nsResProtocolHandler::NewURI(const nsACString &aSpec,
|
|||
NS_IMETHODIMP
|
||||
nsResProtocolHandler::NewChannel(nsIURI* uri, nsIChannel* *result)
|
||||
{
|
||||
NS_ENSURE_ARG_POINTER(uri);
|
||||
nsresult rv;
|
||||
nsCAutoString spec;
|
||||
|
||||
|
|
|
@ -115,6 +115,7 @@ nsViewSourceHandler::NewURI(const nsACString &aSpec,
|
|||
NS_IMETHODIMP
|
||||
nsViewSourceHandler::NewChannel(nsIURI* uri, nsIChannel* *result)
|
||||
{
|
||||
NS_ENSURE_ARG_POINTER(uri);
|
||||
nsViewSourceChannel *channel = new nsViewSourceChannel();
|
||||
if (!channel)
|
||||
return NS_ERROR_OUT_OF_MEMORY;
|
||||
|
|
Загрузка…
Ссылка в новой задаче