diff options
Diffstat (limited to 'image/decoders/icon/nsIconProtocolHandler.cpp')
-rw-r--r-- | image/decoders/icon/nsIconProtocolHandler.cpp | 126 |
1 files changed, 126 insertions, 0 deletions
diff --git a/image/decoders/icon/nsIconProtocolHandler.cpp b/image/decoders/icon/nsIconProtocolHandler.cpp new file mode 100644 index 000000000..03aaa2a14 --- /dev/null +++ b/image/decoders/icon/nsIconProtocolHandler.cpp @@ -0,0 +1,126 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 4 -*- + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#include "nsIconProtocolHandler.h" + +#include "nsIconChannel.h" +#include "nsIconURI.h" +#include "nsIURL.h" +#include "nsCRT.h" +#include "nsCOMPtr.h" +#include "nsIComponentManager.h" +#include "nsIServiceManager.h" +#include "nsNetCID.h" + +/////////////////////////////////////////////////////////////////////////////// + +nsIconProtocolHandler::nsIconProtocolHandler() +{ } + +nsIconProtocolHandler::~nsIconProtocolHandler() +{ } + +NS_IMPL_ISUPPORTS(nsIconProtocolHandler, nsIProtocolHandler, + nsISupportsWeakReference) + + +/////////////////////////////////////////////////////////////////////////////// +// nsIProtocolHandler methods: + +NS_IMETHODIMP +nsIconProtocolHandler::GetScheme(nsACString& result) +{ + result = "moz-icon"; + return NS_OK; +} + +NS_IMETHODIMP +nsIconProtocolHandler::GetDefaultPort(int32_t* result) +{ + *result = 0; + return NS_OK; +} + +NS_IMETHODIMP +nsIconProtocolHandler::AllowPort(int32_t port, + const char* scheme, + bool* _retval) +{ + // don't override anything. + *_retval = false; + return NS_OK; +} + +NS_IMETHODIMP +nsIconProtocolHandler::GetProtocolFlags(uint32_t* result) +{ + *result = URI_NORELATIVE | URI_NOAUTH | URI_IS_UI_RESOURCE | + URI_IS_LOCAL_RESOURCE; + return NS_OK; +} + +NS_IMETHODIMP +nsIconProtocolHandler::NewURI(const nsACString& aSpec, + const char* aOriginCharset, // ignored + nsIURI* aBaseURI, + nsIURI** result) +{ + nsCOMPtr<nsIMozIconURI> uri = new nsMozIconURI(); + if (!uri) return NS_ERROR_OUT_OF_MEMORY; + + nsresult rv = uri->SetSpec(aSpec); + if (NS_FAILED(rv)) return rv; + + nsCOMPtr<nsIURL> iconURL; + uri->GetIconURL(getter_AddRefs(iconURL)); + if (iconURL) { + uri = new nsNestedMozIconURI(); + rv = uri->SetSpec(aSpec); + if (NS_FAILED(rv)) { + return rv; + } + } + + NS_ADDREF(*result = uri); + return NS_OK; +} + +NS_IMETHODIMP +nsIconProtocolHandler::NewChannel2(nsIURI* url, + nsILoadInfo* aLoadInfo, + nsIChannel** result) +{ + NS_ENSURE_ARG_POINTER(url); + nsIconChannel* channel = new nsIconChannel; + if (!channel) { + return NS_ERROR_OUT_OF_MEMORY; + } + NS_ADDREF(channel); + + nsresult rv = channel->Init(url); + if (NS_FAILED(rv)) { + NS_RELEASE(channel); + return rv; + } + + // set the loadInfo on the new channel + rv = channel->SetLoadInfo(aLoadInfo); + if (NS_FAILED(rv)) { + NS_RELEASE(channel); + return rv; + } + + *result = channel; + return NS_OK; +} + +NS_IMETHODIMP +nsIconProtocolHandler::NewChannel(nsIURI* url, nsIChannel** result) +{ + return NewChannel2(url, nullptr, result); +} + +//////////////////////////////////////////////////////////////////////////////// |