mirror of
https://github.com/roytam1/palemoon27.git
synced 2026-05-26 05:37:11 +00:00
f7d677cddd
- Bug 1168263 - Exclude perspective transforms from the transform used to convert from screen coordinates to an APZC's coordinate space. r=kats (dab02eb359) - Bug 1225950 - Remove unnecessary parameter from SetNeedsComposite. r=mchang (0fb6099bd5) - Bug 1225950 - Make mNeedsComposite a counter rather than a boolean. r=mchang (4d46dba314) - Bug 1225950 - Force a composite if we have requested one but haven't gotten a vsync in a while. r=mchang (06f0d4553e) - Bug 1221697 - Add a telemetry probe for time-to-composite. r=kats (c333e2ea87) - Bug 1213120 - Ensure we don't try to use an uninitialized map. r=BenWa (99069b78fe) - Bug 1228133 - Guard against a race condition that could result in an illegal pointer access. r=BenWa (65e1393908) - update, mostly shadow warnings (5ca9c8ec0c) - Bug 1119106 - Increase the radio button rendering bottom margin on 10.10 so that the button hits its frame more accurately. r=smichaud (2b55533095) - Bug 1221451: Don't pass nil when an argument is required. r=spohl (7adfcf2543) - Bug 1153579 - Fix -Wpointer-bool-conversion warning by removing null check of an array address. r=mstange (8c7ad82e8f) - Bug 1204620 - Don't prepend 'image.' to CUIDraw image names on 10.11. r=stefanh (9a4794ecd4) - Bug 1181289 - Specify size: small when drawing small scrollbars with CoreUI. r=smichaud (e75bff6036) - Bug 1138359 - Make the margins of native-themed Cocoa buttons aware of writing mode. r=smontagu (49afef0f00) - Bug 1220358 - Fix -Wunreachable-code warnings in widget/cocoa. r=spohl (720c720afc) - fixup widget/ios from EventMessage change (no bug, NPOTB) (ab33d61f95) - Bug 1217818 - Add support for the mHandledByAPZ flag on touch events as well. r=botond (d4658c671a) - Bug 1209772 - 'mozregression was installed. please re-run your command.' when running ./mach mozregression. r=ahal (5febef290b) - Bug 1204787 - Add |mach power|. r=glandium. (5a0d84f480) - Bug 1214924 - Add "WindowServer" and "kernel" processes to |mach power|'s output. r=BenWa. (89c3a515f7) - Bug 1197694 - fflush() rapl output so it always appears immediately. r=erahm. (052568f395) - Bug 1194560 (follow-up) - Only build rapl on Linux if the arch is x86 or x86-64. r=glandium. (0101937ffa) - Bug 1198137 - Add some summary stats to tool/power/rapl's output. r=erahm. (53052f366b) - Bug 1198137 (follow-up) - Add a missing #include to unbreak Mac OS builds on a CLOSED TREE. r=me (27862d34ff) - Bug 1203834 - Fix's rapl's handling of unsupported power domains. r=glandium. (facb022467) - Bug 1203811 - Clarify two error messages in tools/power/rapl. r=heycam. (07a6bb847e) - Bug 1201811 (part 1) - Don't use integer arithmetic when summing totals in rapl. r=erahm. (57a1de1376) - Bug 1201811 (part 2) - Don't print distribution stats if there was only 1 sample. r=erahm. (e5c085a4df) - Bug 1222887 - Suppress -Wunreachable-code warning in tools/power. r=njn (4fbbbe81e1) - Bug 1222352 - Resource Timing - nextHopProtocol does not work in e10s r=nwgh (57029cf33d) - Bug 1211636 - use ToInteger64 in PopulateFromSuffix. r=bholley (d67e5fe9d1) - Bug 961049 - Part 2: Remove Utilities.h; r=baku (3c09679a40) - Bug 961049 - Part 3: Move PersistenceType serializer from indexedDB to quota module; r=baku (021478905a) - Bug 1186809 (part 1) - Replace nsBaseHashtable::EnumerateRead() calls in dom/quota/ with iterators. r=janv. (8933726851) - Bug 1186809 (part 2) - Replace nsBaseHashtable::EnumerateRead() calls in dom/quota/ with iterators. r=janv. (cb7c6f27dc) - Bug 1186809 (part 3) - Replace nsBaseHashtable::EnumerateRead() calls in dom/quota/ with iterators. r=janv. (1ded98347c) - Bug 1187151 (part 1) - Replace nsBaseHashtable::Enumerate() calls in dom/base/ with iterators. r=khuey. (a409e8590e) - Bug 1187151 (part 2) - Replace nsBaseHashtable::Enumerate() calls in dom/base/ with iterators. r=janv. (bd4fe93dfc) - Bug 1187151 (part 3) - Replace nsBaseHashtable::Enumerate() calls in dom/ with iterators. r=khuey. (de0f2dda26) - Bug 1187151 (part 4) - Replace nsBaseHashtable::Enumerate() calls in dom/ with iterators. r=khuey. (e72d744118) - Bug 1187151 (part 5) - Replace nsBaseHashtable::Enumerate() calls in dom/ with iterators. r=khuey. (18eddd5225) - Bug 1187151 (part 6) - Replace nsBaseHashtable::Enumerate() calls in dom/ with iterators. r=khuey. (36fb6272e1) - Bug 1187151 (part 7) - Replace nsBaseHashtable::Enumerate() calls in dom/ with iterators. r=khuey. (594438d35f) - Bug 1187151 (part 8) - Replace nsBaseHashtable::Enumerate() calls in dom/ with iterators. r=khuey. (d8de2742d8) - Bug 1187151 (part 9) - Replace nsBaseHashtable::Enumerate() calls in dom/ with iterators. r=khuey. (d2b4a29111) - missing namespace (0b0453cc40) - Bug 1187701 - add_task function for mochitest chrome and plain; r=jmaher (1c31a40c7c) - Bug 1223831 - SpecialPowers API to create files in an e10s-compatible way. r=jmaher,baku (a04646cb50) - Bug 1178526 - Create docshell with packageId from TabContext. r=sicking. (c89edfc7ab) - Bug 1217694 - Signed package should come from the moz-package-origin specified in its manifest. r=valentin (705aeae07a) - Bug 1225422 - Update the PrivilegedPackageRoot certificate. r=keeler (2a90eed63c) - Bug 1204301 - HttpChannelParent needs to be able to GetInterface to an nsIPrompt. r=billm. (4937a2fbbe)
401 lines
11 KiB
C++
401 lines
11 KiB
C++
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
|
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
|
|
/* 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 "mozilla/chrome/RegistryMessageUtils.h"
|
|
#include "mozilla/dom/ContentParent.h"
|
|
#include "mozilla/unused.h"
|
|
|
|
#include "SubstitutingProtocolHandler.h"
|
|
#include "nsIChannel.h"
|
|
#include "nsIIOService.h"
|
|
#include "nsIFile.h"
|
|
#include "nsNetCID.h"
|
|
#include "nsNetUtil.h"
|
|
#include "nsURLHelper.h"
|
|
#include "nsEscape.h"
|
|
|
|
using mozilla::dom::ContentParent;
|
|
|
|
namespace mozilla {
|
|
|
|
// Log module for Substituting Protocol logging. We keep the pre-existing module
|
|
// name of "nsResProtocol" to avoid disruption.
|
|
static LazyLogModule gResLog("nsResProtocol");
|
|
|
|
static NS_DEFINE_CID(kSubstitutingURLCID, NS_SUBSTITUTINGURL_CID);
|
|
|
|
//---------------------------------------------------------------------------------
|
|
// SubstitutingURL : overrides nsStandardURL::GetFile to provide nsIFile resolution
|
|
//---------------------------------------------------------------------------------
|
|
|
|
nsresult
|
|
SubstitutingURL::EnsureFile()
|
|
{
|
|
nsAutoCString ourScheme;
|
|
nsresult rv = GetScheme(ourScheme);
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
|
|
|
// Get the handler associated with this scheme. It would be nice to just
|
|
// pass this in when constructing SubstitutingURLs, but we need a generic
|
|
// factory constructor.
|
|
nsCOMPtr<nsIIOService> io = do_GetIOService(&rv);
|
|
nsCOMPtr<nsIProtocolHandler> handler;
|
|
rv = io->GetProtocolHandler(ourScheme.get(), getter_AddRefs(handler));
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
|
nsCOMPtr<nsISubstitutingProtocolHandler> substHandler = do_QueryInterface(handler);
|
|
MOZ_ASSERT(substHandler);
|
|
|
|
nsAutoCString spec;
|
|
rv = substHandler->ResolveURI(this, spec);
|
|
if (NS_FAILED(rv))
|
|
return rv;
|
|
|
|
nsAutoCString scheme;
|
|
rv = net_ExtractURLScheme(spec, nullptr, nullptr, &scheme);
|
|
if (NS_FAILED(rv))
|
|
return rv;
|
|
|
|
// Bug 585869:
|
|
// In most cases, the scheme is jar if it's not file.
|
|
// Regardless, net_GetFileFromURLSpec should be avoided
|
|
// when the scheme isn't file.
|
|
if (!scheme.EqualsLiteral("file"))
|
|
return NS_ERROR_NO_INTERFACE;
|
|
|
|
return net_GetFileFromURLSpec(spec, getter_AddRefs(mFile));
|
|
}
|
|
|
|
/* virtual */ nsStandardURL*
|
|
SubstitutingURL::StartClone()
|
|
{
|
|
SubstitutingURL *clone = new SubstitutingURL();
|
|
return clone;
|
|
}
|
|
|
|
NS_IMETHODIMP
|
|
SubstitutingURL::GetClassIDNoAlloc(nsCID *aClassIDNoAlloc)
|
|
{
|
|
*aClassIDNoAlloc = kSubstitutingURLCID;
|
|
return NS_OK;
|
|
}
|
|
|
|
SubstitutingProtocolHandler::SubstitutingProtocolHandler(const char* aScheme, uint32_t aFlags,
|
|
bool aEnforceFileOrJar)
|
|
: mScheme(aScheme)
|
|
, mSubstitutions(16)
|
|
, mEnforceFileOrJar(aEnforceFileOrJar)
|
|
{
|
|
mFlags.emplace(aFlags);
|
|
ConstructInternal();
|
|
}
|
|
|
|
SubstitutingProtocolHandler::SubstitutingProtocolHandler(const char* aScheme)
|
|
: mScheme(aScheme)
|
|
, mSubstitutions(16)
|
|
, mEnforceFileOrJar(true)
|
|
{
|
|
ConstructInternal();
|
|
}
|
|
|
|
void
|
|
SubstitutingProtocolHandler::ConstructInternal()
|
|
{
|
|
nsresult rv;
|
|
mIOService = do_GetIOService(&rv);
|
|
MOZ_RELEASE_ASSERT(NS_SUCCEEDED(rv) && mIOService);
|
|
}
|
|
|
|
//
|
|
// IPC marshalling.
|
|
//
|
|
|
|
struct EnumerateSubstitutionArg
|
|
{
|
|
EnumerateSubstitutionArg(nsCString& aScheme, nsTArray<SubstitutionMapping>& aMappings)
|
|
: mScheme(aScheme), mMappings(aMappings) {}
|
|
nsCString& mScheme;
|
|
nsTArray<SubstitutionMapping>& mMappings;
|
|
};
|
|
|
|
static PLDHashOperator
|
|
EnumerateSubstitution(const nsACString& aKey,
|
|
nsIURI* aURI,
|
|
void* aArg)
|
|
{
|
|
auto arg = static_cast<EnumerateSubstitutionArg*>(aArg);
|
|
SerializedURI uri;
|
|
if (aURI) {
|
|
aURI->GetSpec(uri.spec);
|
|
aURI->GetOriginCharset(uri.charset);
|
|
}
|
|
|
|
SubstitutionMapping substitution = { arg->mScheme, nsCString(aKey), uri };
|
|
arg->mMappings.AppendElement(substitution);
|
|
return (PLDHashOperator)PL_DHASH_NEXT;
|
|
}
|
|
|
|
void
|
|
SubstitutingProtocolHandler::CollectSubstitutions(InfallibleTArray<SubstitutionMapping>& aMappings)
|
|
{
|
|
EnumerateSubstitutionArg arg(mScheme, aMappings);
|
|
mSubstitutions.EnumerateRead(&EnumerateSubstitution, &arg);
|
|
}
|
|
|
|
void
|
|
SubstitutingProtocolHandler::SendSubstitution(const nsACString& aRoot, nsIURI* aBaseURI)
|
|
{
|
|
if (GeckoProcessType_Content == XRE_GetProcessType()) {
|
|
return;
|
|
}
|
|
|
|
nsTArray<ContentParent*> parents;
|
|
ContentParent::GetAll(parents);
|
|
if (!parents.Length()) {
|
|
return;
|
|
}
|
|
|
|
SubstitutionMapping mapping;
|
|
mapping.scheme = mScheme;
|
|
mapping.path = aRoot;
|
|
if (aBaseURI) {
|
|
aBaseURI->GetSpec(mapping.resolvedURI.spec);
|
|
aBaseURI->GetOriginCharset(mapping.resolvedURI.charset);
|
|
}
|
|
|
|
for (uint32_t i = 0; i < parents.Length(); i++) {
|
|
Unused << parents[i]->SendRegisterChromeItem(mapping);
|
|
}
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
// nsIProtocolHandler
|
|
//----------------------------------------------------------------------------
|
|
|
|
nsresult
|
|
SubstitutingProtocolHandler::GetScheme(nsACString &result)
|
|
{
|
|
result = mScheme;
|
|
return NS_OK;
|
|
}
|
|
|
|
nsresult
|
|
SubstitutingProtocolHandler::GetDefaultPort(int32_t *result)
|
|
{
|
|
*result = -1;
|
|
return NS_OK;
|
|
}
|
|
|
|
nsresult
|
|
SubstitutingProtocolHandler::GetProtocolFlags(uint32_t *result)
|
|
{
|
|
if (mFlags.isNothing()) {
|
|
NS_WARNING("Trying to get protocol flags the wrong way - use nsIProtocolHandlerWithDynamicFlags instead");
|
|
return NS_ERROR_NOT_AVAILABLE;
|
|
}
|
|
|
|
*result = mFlags.ref();
|
|
return NS_OK;
|
|
}
|
|
|
|
nsresult
|
|
SubstitutingProtocolHandler::NewURI(const nsACString &aSpec,
|
|
const char *aCharset,
|
|
nsIURI *aBaseURI,
|
|
nsIURI **result)
|
|
{
|
|
nsresult rv;
|
|
|
|
RefPtr<SubstitutingURL> url = new SubstitutingURL();
|
|
if (!url)
|
|
return NS_ERROR_OUT_OF_MEMORY;
|
|
|
|
// unescape any %2f and %2e to make sure nsStandardURL coalesces them.
|
|
// Later net_GetFileFromURLSpec() will do a full unescape and we want to
|
|
// treat them the same way the file system will. (bugs 380994, 394075)
|
|
nsAutoCString spec;
|
|
const char *src = aSpec.BeginReading();
|
|
const char *end = aSpec.EndReading();
|
|
const char *last = src;
|
|
|
|
spec.SetCapacity(aSpec.Length()+1);
|
|
for ( ; src < end; ++src) {
|
|
if (*src == '%' && (src < end-2) && *(src+1) == '2') {
|
|
char ch = '\0';
|
|
if (*(src+2) == 'f' || *(src+2) == 'F') {
|
|
ch = '/';
|
|
} else if (*(src+2) == 'e' || *(src+2) == 'E') {
|
|
ch = '.';
|
|
}
|
|
|
|
if (ch) {
|
|
if (last < src) {
|
|
spec.Append(last, src-last);
|
|
}
|
|
spec.Append(ch);
|
|
src += 2;
|
|
last = src+1; // src will be incremented by the loop
|
|
}
|
|
}
|
|
}
|
|
if (last < src)
|
|
spec.Append(last, src-last);
|
|
|
|
rv = url->Init(nsIStandardURL::URLTYPE_STANDARD, -1, spec, aCharset, aBaseURI);
|
|
if (NS_SUCCEEDED(rv)) {
|
|
url.forget(result);
|
|
}
|
|
return rv;
|
|
}
|
|
|
|
nsresult
|
|
SubstitutingProtocolHandler::NewChannel2(nsIURI* uri,
|
|
nsILoadInfo* aLoadInfo,
|
|
nsIChannel** result)
|
|
{
|
|
NS_ENSURE_ARG_POINTER(uri);
|
|
nsAutoCString spec;
|
|
nsresult rv = ResolveURI(uri, spec);
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
|
|
|
nsCOMPtr<nsIURI> newURI;
|
|
rv = NS_NewURI(getter_AddRefs(newURI), spec);
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
|
|
|
rv = NS_NewChannelInternal(result, newURI, aLoadInfo);
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
|
|
|
nsLoadFlags loadFlags = 0;
|
|
(*result)->GetLoadFlags(&loadFlags);
|
|
(*result)->SetLoadFlags(loadFlags & ~nsIChannel::LOAD_REPLACE);
|
|
return (*result)->SetOriginalURI(uri);
|
|
}
|
|
|
|
nsresult
|
|
SubstitutingProtocolHandler::NewChannel(nsIURI* uri, nsIChannel* *result)
|
|
{
|
|
return NewChannel2(uri, nullptr, result);
|
|
}
|
|
|
|
nsresult
|
|
SubstitutingProtocolHandler::AllowPort(int32_t port, const char *scheme, bool *_retval)
|
|
{
|
|
// don't override anything.
|
|
*_retval = false;
|
|
return NS_OK;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
// nsISubstitutingProtocolHandler
|
|
//----------------------------------------------------------------------------
|
|
|
|
nsresult
|
|
SubstitutingProtocolHandler::SetSubstitution(const nsACString& root, nsIURI *baseURI)
|
|
{
|
|
if (!baseURI) {
|
|
mSubstitutions.Remove(root);
|
|
SendSubstitution(root, baseURI);
|
|
return NS_OK;
|
|
}
|
|
|
|
// If baseURI isn't a same-scheme URI, we can set the substitution immediately.
|
|
nsAutoCString scheme;
|
|
nsresult rv = baseURI->GetScheme(scheme);
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
|
if (!scheme.Equals(mScheme)) {
|
|
if (mEnforceFileOrJar && !scheme.EqualsLiteral("file") && !scheme.EqualsLiteral("jar")) {
|
|
NS_WARNING("Refusing to create substituting URI to non-file:// target");
|
|
return NS_ERROR_INVALID_ARG;
|
|
}
|
|
|
|
mSubstitutions.Put(root, baseURI);
|
|
SendSubstitution(root, baseURI);
|
|
return NS_OK;
|
|
}
|
|
|
|
// baseURI is a same-type substituting URI, let's resolve it first.
|
|
nsAutoCString newBase;
|
|
rv = ResolveURI(baseURI, newBase);
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
|
|
|
nsCOMPtr<nsIURI> newBaseURI;
|
|
rv = mIOService->NewURI(newBase, nullptr, nullptr, getter_AddRefs(newBaseURI));
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
|
|
|
mSubstitutions.Put(root, newBaseURI);
|
|
SendSubstitution(root, newBaseURI);
|
|
return NS_OK;
|
|
}
|
|
|
|
nsresult
|
|
SubstitutingProtocolHandler::GetSubstitution(const nsACString& root, nsIURI **result)
|
|
{
|
|
NS_ENSURE_ARG_POINTER(result);
|
|
|
|
if (mSubstitutions.Get(root, result))
|
|
return NS_OK;
|
|
|
|
return GetSubstitutionInternal(root, result);
|
|
}
|
|
|
|
nsresult
|
|
SubstitutingProtocolHandler::HasSubstitution(const nsACString& root, bool *result)
|
|
{
|
|
NS_ENSURE_ARG_POINTER(result);
|
|
*result = HasSubstitution(root);
|
|
return NS_OK;
|
|
}
|
|
|
|
nsresult
|
|
SubstitutingProtocolHandler::ResolveURI(nsIURI *uri, nsACString &result)
|
|
{
|
|
nsresult rv;
|
|
|
|
nsAutoCString host;
|
|
nsAutoCString path;
|
|
|
|
rv = uri->GetAsciiHost(host);
|
|
if (NS_FAILED(rv)) return rv;
|
|
|
|
rv = uri->GetPath(path);
|
|
if (NS_FAILED(rv)) return rv;
|
|
|
|
if (ResolveSpecialCases(host, path, result)) {
|
|
return NS_OK;
|
|
}
|
|
|
|
// Unescape the path so we can perform some checks on it.
|
|
nsAutoCString unescapedPath(path);
|
|
NS_UnescapeURL(unescapedPath);
|
|
|
|
// Don't misinterpret the filepath as an absolute URI.
|
|
if (unescapedPath.FindChar(':') != -1)
|
|
return NS_ERROR_MALFORMED_URI;
|
|
|
|
if (unescapedPath.FindChar('\\') != -1)
|
|
return NS_ERROR_MALFORMED_URI;
|
|
|
|
const char *p = path.get() + 1; // path always starts with a slash
|
|
NS_ASSERTION(*(p-1) == '/', "Path did not begin with a slash!");
|
|
|
|
if (*p == '/')
|
|
return NS_ERROR_MALFORMED_URI;
|
|
|
|
nsCOMPtr<nsIURI> baseURI;
|
|
rv = GetSubstitution(host, getter_AddRefs(baseURI));
|
|
if (NS_FAILED(rv)) return rv;
|
|
|
|
rv = baseURI->Resolve(nsDependentCString(p, path.Length()-1), result);
|
|
|
|
if (MOZ_LOG_TEST(gResLog, LogLevel::Debug)) {
|
|
nsAutoCString spec;
|
|
uri->GetAsciiSpec(spec);
|
|
MOZ_LOG(gResLog, LogLevel::Debug, ("%s\n -> %s\n", spec.get(), PromiseFlatCString(result).get()));
|
|
}
|
|
return rv;
|
|
}
|
|
|
|
} // namespace mozilla
|