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
|
NS_IMETHODIMP
|
||||||
nsWyciwygProtocolHandler::NewChannel(nsIURI* url, nsIChannel* *result)
|
nsWyciwygProtocolHandler::NewChannel(nsIURI* url, nsIChannel* *result)
|
||||||
{
|
{
|
||||||
|
NS_ENSURE_ARG_POINTER(url);
|
||||||
nsresult rv;
|
nsresult rv;
|
||||||
|
|
||||||
nsWyciwygChannel* channel = new nsWyciwygChannel();
|
nsWyciwygChannel* channel = new nsWyciwygChannel();
|
||||||
|
|
|
@ -118,6 +118,7 @@ NS_IMETHODIMP
|
||||||
nsLDAPProtocolHandler::NewChannel(nsIURI* uri,
|
nsLDAPProtocolHandler::NewChannel(nsIURI* uri,
|
||||||
nsIChannel* *result)
|
nsIChannel* *result)
|
||||||
{
|
{
|
||||||
|
NS_ENSURE_ARG_POINTER(uri);
|
||||||
nsresult rv;
|
nsresult rv;
|
||||||
nsLDAPChannel *channel;
|
nsLDAPChannel *channel;
|
||||||
|
|
||||||
|
|
|
@ -245,6 +245,7 @@ NS_IMETHODIMP GeckoProtocolHandlerImpl::NewURI(const nsACString & aSpec, const c
|
||||||
/* nsIChannel newChannel (in nsIURI aURI); */
|
/* nsIChannel newChannel (in nsIURI aURI); */
|
||||||
NS_IMETHODIMP GeckoProtocolHandlerImpl::NewChannel(nsIURI *aURI, nsIChannel **_retval)
|
NS_IMETHODIMP GeckoProtocolHandlerImpl::NewChannel(nsIURI *aURI, nsIChannel **_retval)
|
||||||
{
|
{
|
||||||
|
NS_ENSURE_ARG_POINTER(aURI);
|
||||||
GeckoProtocolChannel *channel = new GeckoProtocolChannel;
|
GeckoProtocolChannel *channel = new GeckoProtocolChannel;
|
||||||
if (!channel)
|
if (!channel)
|
||||||
{
|
{
|
||||||
|
|
|
@ -125,6 +125,7 @@ NS_IMETHODIMP
|
||||||
nsDateTimeHandler::NewProxiedChannel(nsIURI* url, nsIProxyInfo* proxyInfo,
|
nsDateTimeHandler::NewProxiedChannel(nsIURI* url, nsIProxyInfo* proxyInfo,
|
||||||
nsIChannel* *result)
|
nsIChannel* *result)
|
||||||
{
|
{
|
||||||
|
NS_ENSURE_ARG_POINTER(url);
|
||||||
nsresult rv;
|
nsresult rv;
|
||||||
|
|
||||||
nsDateTimeChannel *chan = new nsDateTimeChannel();
|
nsDateTimeChannel *chan = new nsDateTimeChannel();
|
||||||
|
|
|
@ -127,6 +127,7 @@ NS_IMETHODIMP
|
||||||
nsFingerHandler::NewProxiedChannel(nsIURI* url, nsIProxyInfo* proxyInfo,
|
nsFingerHandler::NewProxiedChannel(nsIURI* url, nsIProxyInfo* proxyInfo,
|
||||||
nsIChannel* *result)
|
nsIChannel* *result)
|
||||||
{
|
{
|
||||||
|
NS_ENSURE_ARG_POINTER(url);
|
||||||
nsresult rv;
|
nsresult rv;
|
||||||
|
|
||||||
nsFingerChannel *chan = new nsFingerChannel();
|
nsFingerChannel *chan = new nsFingerChannel();
|
||||||
|
|
|
@ -940,6 +940,7 @@ nsGnomeVFSProtocolHandler::NewURI(const nsACString &aSpec,
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
nsGnomeVFSProtocolHandler::NewChannel(nsIURI *aURI, nsIChannel **aResult)
|
nsGnomeVFSProtocolHandler::NewChannel(nsIURI *aURI, nsIChannel **aResult)
|
||||||
{
|
{
|
||||||
|
NS_ENSURE_ARG_POINTER(aURI);
|
||||||
nsresult rv;
|
nsresult rv;
|
||||||
|
|
||||||
nsCAutoString spec;
|
nsCAutoString spec;
|
||||||
|
|
|
@ -345,6 +345,7 @@ NS_IMETHODIMP nsSmtpService::NewURI(const nsACString &aSpec,
|
||||||
|
|
||||||
NS_IMETHODIMP nsSmtpService::NewChannel(nsIURI *aURI, nsIChannel **_retval)
|
NS_IMETHODIMP nsSmtpService::NewChannel(nsIURI *aURI, nsIChannel **_retval)
|
||||||
{
|
{
|
||||||
|
NS_ENSURE_ARG_POINTER(aURI);
|
||||||
// create an empty pipe for use with the input stream channel.
|
// create an empty pipe for use with the input stream channel.
|
||||||
nsCOMPtr<nsIInputStream> pipeIn;
|
nsCOMPtr<nsIInputStream> pipeIn;
|
||||||
nsCOMPtr<nsIOutputStream> pipeOut;
|
nsCOMPtr<nsIOutputStream> pipeOut;
|
||||||
|
|
|
@ -562,6 +562,7 @@ NS_IMETHODIMP nsMailboxService::NewURI(const nsACString &aSpec,
|
||||||
|
|
||||||
NS_IMETHODIMP nsMailboxService::NewChannel(nsIURI *aURI, nsIChannel **_retval)
|
NS_IMETHODIMP nsMailboxService::NewChannel(nsIURI *aURI, nsIChannel **_retval)
|
||||||
{
|
{
|
||||||
|
NS_ENSURE_ARG_POINTER(aURI);
|
||||||
nsresult rv = NS_OK;
|
nsresult rv = NS_OK;
|
||||||
nsMailboxProtocol * protocol = new nsMailboxProtocol(aURI);
|
nsMailboxProtocol * protocol = new nsMailboxProtocol(aURI);
|
||||||
if (protocol)
|
if (protocol)
|
||||||
|
|
|
@ -415,6 +415,7 @@ NS_IMETHODIMP nsPop3Service::NewURI(const nsACString &aSpec,
|
||||||
|
|
||||||
NS_IMETHODIMP nsPop3Service::NewChannel(nsIURI *aURI, nsIChannel **_retval)
|
NS_IMETHODIMP nsPop3Service::NewChannel(nsIURI *aURI, nsIChannel **_retval)
|
||||||
{
|
{
|
||||||
|
NS_ENSURE_ARG_POINTER(aURI);
|
||||||
nsresult rv = NS_OK;
|
nsresult rv = NS_OK;
|
||||||
nsPop3Protocol * protocol = new nsPop3Protocol(aURI);
|
nsPop3Protocol * protocol = new nsPop3Protocol(aURI);
|
||||||
if (protocol)
|
if (protocol)
|
||||||
|
|
|
@ -1416,6 +1416,7 @@ NS_IMETHODIMP nsNntpService::NewURI(const nsACString &aSpec,
|
||||||
|
|
||||||
NS_IMETHODIMP nsNntpService::NewChannel(nsIURI *aURI, nsIChannel **_retval)
|
NS_IMETHODIMP nsNntpService::NewChannel(nsIURI *aURI, nsIChannel **_retval)
|
||||||
{
|
{
|
||||||
|
NS_ENSURE_ARG_POINTER(aURI);
|
||||||
nsresult rv = NS_OK;
|
nsresult rv = NS_OK;
|
||||||
nsCOMPtr <nsINNTPProtocol> nntpProtocol;
|
nsCOMPtr <nsINNTPProtocol> nntpProtocol;
|
||||||
rv = GetProtocolForUri(aURI, nsnull, getter_AddRefs(nntpProtocol));
|
rv = GetProtocolForUri(aURI, nsnull, getter_AddRefs(nntpProtocol));
|
||||||
|
|
|
@ -106,6 +106,7 @@ NS_IMETHODIMP nsIconProtocolHandler::NewURI(const nsACString &aSpec,
|
||||||
|
|
||||||
NS_IMETHODIMP nsIconProtocolHandler::NewChannel(nsIURI* url, nsIChannel* *result)
|
NS_IMETHODIMP nsIconProtocolHandler::NewChannel(nsIURI* url, nsIChannel* *result)
|
||||||
{
|
{
|
||||||
|
NS_ENSURE_ARG_POINTER(url);
|
||||||
nsIconChannel* channel = new nsIconChannel;
|
nsIconChannel* channel = new nsIconChannel;
|
||||||
if (!channel)
|
if (!channel)
|
||||||
return NS_ERROR_OUT_OF_MEMORY;
|
return NS_ERROR_OUT_OF_MEMORY;
|
||||||
|
|
|
@ -49,6 +49,7 @@ static const char kBlankPage[] = "<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
nsAboutBlank::NewChannel(nsIURI *aURI, nsIChannel **result)
|
nsAboutBlank::NewChannel(nsIURI *aURI, nsIChannel **result)
|
||||||
{
|
{
|
||||||
|
NS_ENSURE_ARG_POINTER(aURI);
|
||||||
nsresult rv;
|
nsresult rv;
|
||||||
nsIChannel* channel;
|
nsIChannel* channel;
|
||||||
|
|
||||||
|
|
|
@ -60,6 +60,7 @@ NS_IMPL_ISUPPORTS1(nsAboutBloat, nsIAboutModule)
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
nsAboutBloat::NewChannel(nsIURI *aURI, nsIChannel **result)
|
nsAboutBloat::NewChannel(nsIURI *aURI, nsIChannel **result)
|
||||||
{
|
{
|
||||||
|
NS_ENSURE_ARG_POINTER(aURI);
|
||||||
nsresult rv;
|
nsresult rv;
|
||||||
nsCAutoString path;
|
nsCAutoString path;
|
||||||
rv = aURI->GetPath(path);
|
rv = aURI->GetPath(path);
|
||||||
|
|
|
@ -75,6 +75,7 @@ NS_IMPL_ISUPPORTS2(nsAboutCache, nsIAboutModule, nsICacheVisitor)
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
nsAboutCache::NewChannel(nsIURI *aURI, nsIChannel **result)
|
nsAboutCache::NewChannel(nsIURI *aURI, nsIChannel **result)
|
||||||
{
|
{
|
||||||
|
NS_ENSURE_ARG_POINTER(aURI);
|
||||||
nsresult rv;
|
nsresult rv;
|
||||||
PRUint32 bytesWritten;
|
PRUint32 bytesWritten;
|
||||||
|
|
||||||
|
|
|
@ -60,6 +60,7 @@ NS_IMPL_ISUPPORTS2(nsAboutCacheEntry,
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
nsAboutCacheEntry::NewChannel(nsIURI *uri, nsIChannel **result)
|
nsAboutCacheEntry::NewChannel(nsIURI *uri, nsIChannel **result)
|
||||||
{
|
{
|
||||||
|
NS_ENSURE_ARG_POINTER(uri);
|
||||||
nsresult rv;
|
nsresult rv;
|
||||||
|
|
||||||
nsCOMPtr<nsIInputStream> stream;
|
nsCOMPtr<nsIInputStream> stream;
|
||||||
|
|
|
@ -136,6 +136,7 @@ nsAboutProtocolHandler::NewURI(const nsACString &aSpec,
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
nsAboutProtocolHandler::NewChannel(nsIURI* uri, nsIChannel* *result)
|
nsAboutProtocolHandler::NewChannel(nsIURI* uri, nsIChannel* *result)
|
||||||
{
|
{
|
||||||
|
NS_ENSURE_ARG_POINTER(uri);
|
||||||
// about:what you ask?
|
// about:what you ask?
|
||||||
nsresult rv;
|
nsresult rv;
|
||||||
nsCAutoString contractID;
|
nsCAutoString contractID;
|
||||||
|
|
|
@ -76,7 +76,7 @@ static const int kRedirTotal = NS_ARRAY_LENGTH(kRedirMap);
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
nsAboutRedirector::NewChannel(nsIURI *aURI, nsIChannel **result)
|
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");
|
NS_ASSERTION(result, "must not be null");
|
||||||
|
|
||||||
nsresult rv;
|
nsresult rv;
|
||||||
|
|
|
@ -117,6 +117,7 @@ nsDataHandler::NewURI(const nsACString &aSpec,
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
nsDataHandler::NewChannel(nsIURI* uri, nsIChannel* *result)
|
nsDataHandler::NewChannel(nsIURI* uri, nsIChannel* *result)
|
||||||
{
|
{
|
||||||
|
NS_ENSURE_ARG_POINTER(uri);
|
||||||
nsDataChannel* channel = new nsDataChannel(uri);
|
nsDataChannel* channel = new nsDataChannel(uri);
|
||||||
if (!channel)
|
if (!channel)
|
||||||
return NS_ERROR_OUT_OF_MEMORY;
|
return NS_ERROR_OUT_OF_MEMORY;
|
||||||
|
|
|
@ -213,6 +213,7 @@ nsFtpProtocolHandler::NewChannel(nsIURI* url, nsIChannel* *result)
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
nsFtpProtocolHandler::NewProxiedChannel(nsIURI* url, nsIProxyInfo* proxyInfo, nsIChannel* *result)
|
nsFtpProtocolHandler::NewProxiedChannel(nsIURI* url, nsIProxyInfo* proxyInfo, nsIChannel* *result)
|
||||||
{
|
{
|
||||||
|
NS_ENSURE_ARG_POINTER(url);
|
||||||
nsFTPChannel *channel = new nsFTPChannel();
|
nsFTPChannel *channel = new nsFTPChannel();
|
||||||
if (!channel)
|
if (!channel)
|
||||||
return NS_ERROR_OUT_OF_MEMORY;
|
return NS_ERROR_OUT_OF_MEMORY;
|
||||||
|
|
|
@ -100,6 +100,7 @@ NS_IMETHODIMP
|
||||||
nsGopherHandler::NewProxiedChannel(nsIURI *uri, nsIProxyInfo *proxyInfo,
|
nsGopherHandler::NewProxiedChannel(nsIURI *uri, nsIProxyInfo *proxyInfo,
|
||||||
nsIChannel **result)
|
nsIChannel **result)
|
||||||
{
|
{
|
||||||
|
NS_ENSURE_ARG_POINTER(uri);
|
||||||
nsGopherChannel *chan = new nsGopherChannel(uri, proxyInfo);
|
nsGopherChannel *chan = new nsGopherChannel(uri, proxyInfo);
|
||||||
if (!chan)
|
if (!chan)
|
||||||
return NS_ERROR_OUT_OF_MEMORY;
|
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
|
NS_IMETHODIMP
|
||||||
nsResProtocolHandler::NewChannel(nsIURI* uri, nsIChannel* *result)
|
nsResProtocolHandler::NewChannel(nsIURI* uri, nsIChannel* *result)
|
||||||
{
|
{
|
||||||
|
NS_ENSURE_ARG_POINTER(uri);
|
||||||
nsresult rv;
|
nsresult rv;
|
||||||
nsCAutoString spec;
|
nsCAutoString spec;
|
||||||
|
|
||||||
|
|
|
@ -115,6 +115,7 @@ nsViewSourceHandler::NewURI(const nsACString &aSpec,
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
nsViewSourceHandler::NewChannel(nsIURI* uri, nsIChannel* *result)
|
nsViewSourceHandler::NewChannel(nsIURI* uri, nsIChannel* *result)
|
||||||
{
|
{
|
||||||
|
NS_ENSURE_ARG_POINTER(uri);
|
||||||
nsViewSourceChannel *channel = new nsViewSourceChannel();
|
nsViewSourceChannel *channel = new nsViewSourceChannel();
|
||||||
if (!channel)
|
if (!channel)
|
||||||
return NS_ERROR_OUT_OF_MEMORY;
|
return NS_ERROR_OUT_OF_MEMORY;
|
||||||
|
|
Загрузка…
Ссылка в новой задаче