fune/ipc/glue/URIUtils.cpp
Tim Huang d7220a241a Bug 1706615 - Part 1: Add a UnstrippedURI into the LoadInfo. r=valentin,necko-reviewers
This patch adds a UnstrippedURI into the LoadInfo. This attribute
represents the channel's URI has been stripped if this attributes is not
a nullptr.

Having this attribute allows us to be able to revert the query stripping
in the case where the loading channel is in the content blocking allow
list in the parent process.

In addition, this patch removes the main thread assertion in URIUtils
given that we've made the URL construction thread-safe. This will allow
us to be able to use nsIURI directly in ParentLoadInfoForwarderArgs.

Differential Revision: https://phabricator.services.mozilla.com/D116108
2021-06-02 19:46:19 +00:00

140 lines
3.5 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 "URIUtils.h"
#include "mozilla/ArrayUtils.h"
#include "mozilla/Assertions.h"
#include "mozilla/dom/BlobURL.h"
#include "mozilla/net/DefaultURI.h"
#include "mozilla/net/SubstitutingURL.h"
#include "mozilla/NullPrincipalURI.h"
#include "nsAboutProtocolHandler.h"
#include "nsComponentManagerUtils.h"
#include "nsDebug.h"
#include "nsID.h"
#include "nsJARURI.h"
#include "nsIIconURI.h"
#include "nsJSProtocolHandler.h"
#include "nsNetCID.h"
#include "nsSimpleNestedURI.h"
#include "nsThreadUtils.h"
#include "nsIURIMutator.h"
using namespace mozilla::ipc;
using mozilla::ArrayLength;
namespace {
NS_DEFINE_CID(kSimpleURIMutatorCID, NS_SIMPLEURIMUTATOR_CID);
NS_DEFINE_CID(kStandardURLMutatorCID, NS_STANDARDURLMUTATOR_CID);
NS_DEFINE_CID(kJARURIMutatorCID, NS_JARURIMUTATOR_CID);
NS_DEFINE_CID(kIconURIMutatorCID, NS_MOZICONURIMUTATOR_CID);
} // namespace
namespace mozilla {
namespace ipc {
void SerializeURI(nsIURI* aURI, URIParams& aParams) {
MOZ_ASSERT(aURI);
aURI->Serialize(aParams);
if (aParams.type() == URIParams::T__None) {
MOZ_CRASH("Serialize failed!");
}
}
void SerializeURI(nsIURI* aURI, Maybe<URIParams>& aParams) {
if (aURI) {
URIParams params;
SerializeURI(aURI, params);
aParams = Some(std::move(params));
} else {
aParams = Nothing();
}
}
already_AddRefed<nsIURI> DeserializeURI(const URIParams& aParams) {
nsCOMPtr<nsIURIMutator> mutator;
switch (aParams.type()) {
case URIParams::TSimpleURIParams:
mutator = do_CreateInstance(kSimpleURIMutatorCID);
break;
case URIParams::TStandardURLParams:
if (aParams.get_StandardURLParams().isSubstituting()) {
mutator = new net::SubstitutingURL::Mutator();
} else {
mutator = do_CreateInstance(kStandardURLMutatorCID);
}
break;
case URIParams::TJARURIParams:
mutator = do_CreateInstance(kJARURIMutatorCID);
break;
case URIParams::TJSURIParams:
mutator = new nsJSURI::Mutator();
break;
case URIParams::TIconURIParams:
mutator = do_CreateInstance(kIconURIMutatorCID);
break;
case URIParams::TNullPrincipalURIParams:
mutator = new NullPrincipalURI::Mutator();
break;
case URIParams::TSimpleNestedURIParams:
mutator = new net::nsSimpleNestedURI::Mutator();
break;
case URIParams::THostObjectURIParams:
mutator = new mozilla::dom::BlobURL::Mutator();
break;
case URIParams::TDefaultURIParams:
mutator = new mozilla::net::DefaultURI::Mutator();
break;
case URIParams::TNestedAboutURIParams:
mutator = new net::nsNestedAboutURI::Mutator();
break;
default:
MOZ_CRASH("Unknown params!");
}
MOZ_ASSERT(mutator);
nsresult rv = mutator->Deserialize(aParams);
if (NS_FAILED(rv)) {
MOZ_ASSERT(false, "Deserialize failed!");
return nullptr;
}
nsCOMPtr<nsIURI> uri;
DebugOnly<nsresult> rv2 = mutator->Finalize(getter_AddRefs(uri));
MOZ_ASSERT(uri);
MOZ_ASSERT(NS_SUCCEEDED(rv2));
return uri.forget();
}
already_AddRefed<nsIURI> DeserializeURI(const Maybe<URIParams>& aParams) {
nsCOMPtr<nsIURI> uri;
if (aParams.isSome()) {
uri = DeserializeURI(aParams.ref());
}
return uri.forget();
}
} // namespace ipc
} // namespace mozilla