Bug 1608587 [wpt PR 21137] - Update wpt metadata, a=testonly
[gecko.git] / modules / libjar / nsJARProtocolHandler.cpp
blob815542bb4293b9bb2e1dc18b24feac0fe1e28e08
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* This Source Code Form is subject to the terms of the Mozilla Public
3 * License, v. 2.0. If a copy of the MPL was not distributed with this
4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
6 #include "mozilla/ClearOnShutdown.h"
7 #include "nsAutoPtr.h"
8 #include "nsJARProtocolHandler.h"
9 #include "nsCRT.h"
10 #include "nsJARURI.h"
11 #include "nsJARChannel.h"
12 #include "nsString.h"
13 #include "nsNetCID.h"
14 #include "nsIMIMEService.h"
15 #include "nsMimeTypes.h"
16 #include "nsThreadUtils.h"
18 static NS_DEFINE_CID(kZipReaderCacheCID, NS_ZIPREADERCACHE_CID);
20 #define NS_JAR_CACHE_SIZE 32
22 //-----------------------------------------------------------------------------
24 StaticRefPtr<nsJARProtocolHandler> gJarHandler;
26 nsJARProtocolHandler::nsJARProtocolHandler() { MOZ_ASSERT(NS_IsMainThread()); }
28 nsJARProtocolHandler::~nsJARProtocolHandler() {}
30 nsresult nsJARProtocolHandler::Init() {
31 nsresult rv;
33 mJARCache = do_CreateInstance(kZipReaderCacheCID, &rv);
34 if (NS_FAILED(rv)) return rv;
36 rv = mJARCache->Init(NS_JAR_CACHE_SIZE);
37 return rv;
40 nsIMIMEService* nsJARProtocolHandler::MimeService() {
41 if (!mMimeService) mMimeService = do_GetService("@mozilla.org/mime;1");
43 return mMimeService.get();
46 NS_IMPL_ISUPPORTS(nsJARProtocolHandler, nsIProtocolHandler,
47 nsISupportsWeakReference)
49 already_AddRefed<nsJARProtocolHandler> nsJARProtocolHandler::GetSingleton() {
50 if (!gJarHandler) {
51 gJarHandler = new nsJARProtocolHandler();
52 if (NS_SUCCEEDED(gJarHandler->Init())) {
53 ClearOnShutdown(&gJarHandler);
54 } else {
55 gJarHandler = nullptr;
58 return do_AddRef(gJarHandler);
61 ////////////////////////////////////////////////////////////////////////////////
62 // nsIProtocolHandler methods:
64 NS_IMETHODIMP
65 nsJARProtocolHandler::GetScheme(nsACString& result) {
66 result.AssignLiteral("jar");
67 return NS_OK;
70 NS_IMETHODIMP
71 nsJARProtocolHandler::GetDefaultPort(int32_t* result) {
72 *result = -1; // no port for JAR: URLs
73 return NS_OK;
76 NS_IMETHODIMP
77 nsJARProtocolHandler::GetProtocolFlags(uint32_t* result) {
78 // URI_LOADABLE_BY_ANYONE, since it's our inner URI that will matter
79 // anyway.
80 *result = URI_NORELATIVE | URI_NOAUTH | URI_LOADABLE_BY_ANYONE;
81 /* Although jar uris have their own concept of relative urls
82 it is very different from the standard behaviour, so we
83 have to say norelative here! */
84 return NS_OK;
87 NS_IMETHODIMP
88 nsJARProtocolHandler::NewChannel(nsIURI* uri, nsILoadInfo* aLoadInfo,
89 nsIChannel** result) {
90 nsJARChannel* chan = new nsJARChannel();
91 if (!chan) return NS_ERROR_OUT_OF_MEMORY;
92 NS_ADDREF(chan);
94 nsresult rv = chan->Init(uri);
95 if (NS_FAILED(rv)) {
96 NS_RELEASE(chan);
97 return rv;
100 // set the loadInfo on the new channel
101 rv = chan->SetLoadInfo(aLoadInfo);
102 if (NS_FAILED(rv)) {
103 NS_RELEASE(chan);
104 return rv;
107 *result = chan;
108 return NS_OK;
111 NS_IMETHODIMP
112 nsJARProtocolHandler::AllowPort(int32_t port, const char* scheme,
113 bool* _retval) {
114 // don't override anything.
115 *_retval = false;
116 return NS_OK;
119 ////////////////////////////////////////////////////////////////////////////////