diff options
author | FranklinDM <mrmineshafter17@gmail.com> | 2022-05-04 14:55:57 +0800 |
---|---|---|
committer | Moonchild <moonchild@palemoon.org> | 2023-03-12 20:19:03 +0100 |
commit | 9f009467d86fec76c9d909b5283121a35d220f19 (patch) | |
tree | 6018ea3ee92a158c5460d3f3e0d8bf7befb96187 /modules | |
parent | d3d61f478cac6f7b85744c5c6498914c02542db7 (diff) | |
download | uxp-9f009467d86fec76c9d909b5283121a35d220f19.tar.gz |
No issue - Make content-type on JAR channels behave the same as HTTP channels
This ensures that the content type is also determined when opening JAR channels both synchronously and asynchronously. Current m-c modifies only the async portion, while the mentioned commit below modifies only the sync portion. This commit does it for both.
Partially based on 425677ada7380f7c592dd01ddfbc9631ab2038a0 and bug 1757604.
Diffstat (limited to 'modules')
-rw-r--r-- | modules/libjar/nsJARChannel.cpp | 79 | ||||
-rw-r--r-- | modules/libjar/nsJARChannel.h | 5 |
2 files changed, 48 insertions, 36 deletions
diff --git a/modules/libjar/nsJARChannel.cpp b/modules/libjar/nsJARChannel.cpp index ddcbfae2c7..195cd4b716 100644 --- a/modules/libjar/nsJARChannel.cpp +++ b/modules/libjar/nsJARChannel.cpp @@ -577,48 +577,47 @@ nsJARChannel::GetSecurityInfo(nsISupports **aSecurityInfo) return NS_OK; } +bool nsJARChannel::GetContentTypeGuess(nsACString& aResult) const { + const char *ext = nullptr, *fileName = mJarEntry.get(); + int32_t len = mJarEntry.Length(); + + // check if we're displaying a directory + // mJarEntry will be empty if we're trying to display + // the topmost directory in a zip, e.g. jar:foo.zip!/ + if (ENTRY_IS_DIRECTORY(mJarEntry)) { + aResult.AssignLiteral(APPLICATION_HTTP_INDEX_FORMAT); + return true; + } + + // Not a directory, take a guess by its extension + for (int32_t i = len - 1; i >= 0; i--) { + if (fileName[i] == '.') { + ext = &fileName[i + 1]; + break; + } + } + if (!ext) { + return false; + } + nsIMIMEService* mimeServ = gJarHandler->MimeService(); + if (!mimeServ) { + return false; + } + mimeServ->GetTypeFromExtension(nsDependentCString(ext), aResult); + return !aResult.IsEmpty(); +} + NS_IMETHODIMP -nsJARChannel::GetContentType(nsACString &result) +nsJARChannel::GetContentType(nsACString &aResult) { // If the Jar file has not been open yet, // We return application/x-unknown-content-type if (!mOpened) { - result.Assign(UNKNOWN_CONTENT_TYPE); + aResult.Assign(UNKNOWN_CONTENT_TYPE); return NS_OK; } - if (mContentType.IsEmpty()) { - - // - // generate content type and set it - // - const char *ext = nullptr, *fileName = mJarEntry.get(); - int32_t len = mJarEntry.Length(); - - // check if we're displaying a directory - // mJarEntry will be empty if we're trying to display - // the topmost directory in a zip, e.g. jar:foo.zip!/ - if (ENTRY_IS_DIRECTORY(mJarEntry)) { - mContentType.AssignLiteral(APPLICATION_HTTP_INDEX_FORMAT); - } - else { - // not a directory, take a guess by its extension - for (int32_t i = len-1; i >= 0; i--) { - if (fileName[i] == '.') { - ext = &fileName[i + 1]; - break; - } - } - if (ext) { - nsIMIMEService *mimeServ = gJarHandler->MimeService(); - if (mimeServ) - mimeServ->GetTypeFromExtension(nsDependentCString(ext), mContentType); - } - if (mContentType.IsEmpty()) - mContentType.AssignLiteral(UNKNOWN_CONTENT_TYPE); - } - } - result = mContentType; + aResult = mContentType; return NS_OK; } @@ -636,8 +635,8 @@ nsJARChannel::SetContentType(const nsACString &aContentType) NS_IMETHODIMP nsJARChannel::GetContentCharset(nsACString &aContentCharset) { - // If someone gives us a charset hint we should just use that charset. - // So we don't care when this is being called. + // We behave like HTTP channels (treat this as a hint if called before open, + // and override the charset if called after open). aContentCharset = mContentCharset; return NS_OK; } @@ -730,6 +729,10 @@ nsJARChannel::Open(nsIInputStream **stream) input.forget(stream); mOpened = true; + // Compute the content type now. + if (!GetContentTypeGuess(mContentType)) { + mContentType.Assign(UNKNOWN_CONTENT_TYPE); + } // local files are always considered safe mIsUnsafe = false; return NS_OK; @@ -827,6 +830,10 @@ nsJARChannel::AsyncOpen(nsIStreamListener *listener, nsISupports *ctx) mLoadGroup->AddRequest(this, nullptr); mOpened = true; + // Compute the content type now. + if (!GetContentTypeGuess(mContentType)) { + mContentType.Assign(UNKNOWN_CONTENT_TYPE); + } return NS_OK; } diff --git a/modules/libjar/nsJARChannel.h b/modules/libjar/nsJARChannel.h index 5328d586ab..20afbcb2fc 100644 --- a/modules/libjar/nsJARChannel.h +++ b/modules/libjar/nsJARChannel.h @@ -59,6 +59,11 @@ private: nsresult OpenLocalFile(); void NotifyError(nsresult aError); void FireOnProgress(uint64_t aProgress); + + // Returns false if we don't know the content type of this channel, in which + // case we should use the content-type hint. + bool GetContentTypeGuess(nsACString&) const; + virtual void OnDownloadComplete(mozilla::net::MemoryDownloader* aDownloader, nsIRequest* aRequest, nsISupports* aCtxt, |