Bug 1543321 - Implement nsContentUtils::GetThreadSafeUTFOrigin, r=valentin

Differential Revision: https://phabricator.services.mozilla.com/D26862

--HG--
extra : moz-landing-system : lando
This commit is contained in:
Andrea Marchesini 2019-04-10 08:05:18 +00:00
Родитель 595caf7d7c
Коммит 4db529bed9
2 изменённых файлов: 88 добавлений и 0 удалений

Просмотреть файл

@ -5873,6 +5873,7 @@ nsresult nsContentUtils::GetASCIIOrigin(nsIPrincipal* aPrincipal,
/* static */
nsresult nsContentUtils::GetASCIIOrigin(nsIURI* aURI, nsACString& aOrigin) {
MOZ_ASSERT(aURI, "missing uri");
MOZ_ASSERT(NS_IsMainThread());
bool isBlobURL = false;
nsresult rv = aURI->SchemeIs(BLOBURI_SCHEME, &isBlobURL);
@ -5923,6 +5924,69 @@ nsresult nsContentUtils::GetASCIIOrigin(nsIURI* aURI, nsACString& aOrigin) {
return NS_OK;
}
/* static */
nsresult nsContentUtils::GetThreadSafeASCIIOrigin(nsIURI* aURI,
nsACString& aOrigin) {
MOZ_ASSERT(aURI, "missing uri");
bool isBlobURL = false;
nsresult rv = aURI->SchemeIs(BLOBURI_SCHEME, &isBlobURL);
NS_ENSURE_SUCCESS(rv, rv);
// For Blob URI, the path is the URL of the owning page.
if (isBlobURL) {
nsAutoCString path;
rv = aURI->GetPathQueryRef(path);
NS_ENSURE_SUCCESS(rv, rv);
nsCOMPtr<nsIURI> uri;
nsresult rv = NS_NewURIOnAnyThread(getter_AddRefs(uri), path);
if (rv == NS_ERROR_UNKNOWN_PROTOCOL) {
return NS_ERROR_UNKNOWN_PROTOCOL;
}
if (NS_FAILED(rv)) {
aOrigin.AssignLiteral("null");
return NS_OK;
}
return GetThreadSafeASCIIOrigin(uri, aOrigin);
}
aOrigin.Truncate();
// This is not supported yet.
nsCOMPtr<nsINestedURI> nestedURI(do_QueryInterface(aURI));
if (nestedURI) {
return NS_ERROR_UNKNOWN_PROTOCOL;
}
nsAutoCString host;
rv = aURI->GetAsciiHost(host);
if (NS_SUCCEEDED(rv) && !host.IsEmpty()) {
nsAutoCString userPass;
aURI->GetUserPass(userPass);
nsCOMPtr<nsIURI> uri = aURI;
nsAutoCString prePath;
if (!userPass.IsEmpty()) {
rv = NS_MutateURI(uri).SetUserPass(EmptyCString()).Finalize(uri);
NS_ENSURE_SUCCESS(rv, rv);
}
rv = uri->GetPrePath(prePath);
NS_ENSURE_SUCCESS(rv, rv);
aOrigin = prePath;
} else {
aOrigin.AssignLiteral("null");
}
return NS_OK;
}
/* static */
nsresult nsContentUtils::GetUTFOrigin(nsIPrincipal* aPrincipal,
nsAString& aOrigin) {
@ -5941,6 +6005,7 @@ nsresult nsContentUtils::GetUTFOrigin(nsIPrincipal* aPrincipal,
/* static */
nsresult nsContentUtils::GetUTFOrigin(nsIURI* aURI, nsAString& aOrigin) {
MOZ_ASSERT(aURI, "missing uri");
MOZ_ASSERT(NS_IsMainThread());
nsresult rv;
#if defined(MOZ_THUNDERBIRD) || defined(MOZ_SUITE)
@ -5964,6 +6029,24 @@ nsresult nsContentUtils::GetUTFOrigin(nsIURI* aURI, nsAString& aOrigin) {
return NS_OK;
}
/* static */
nsresult nsContentUtils::GetThreadSafeUTFOrigin(nsIURI* aURI,
nsAString& aOrigin) {
#if defined(MOZ_THUNDERBIRD) || defined(MOZ_SUITE)
return NS_ERROR_UNKNOWN_PROTOCOL;
#endif
MOZ_ASSERT(aURI, "missing uri");
nsresult rv;
nsAutoCString asciiOrigin;
rv = GetThreadSafeASCIIOrigin(aURI, asciiOrigin);
NS_ENSURE_SUCCESS(rv, rv);
aOrigin = NS_ConvertUTF8toUTF16(asciiOrigin);
return NS_OK;
}
/* static */
bool nsContentUtils::CheckMayLoad(nsIPrincipal* aPrincipal,
nsIChannel* aChannel,

Просмотреть файл

@ -2132,14 +2132,19 @@ class nsContentUtils {
* suitable for, for example, header values. The UTF versions return strings
* containing international characters.
*
* The thread-safe versions return NS_ERROR_UNKNOWN_PROTOCOL if the
* operation cannot be completed on the current thread.
*
* @pre aPrincipal/aOrigin must not be null.
*
* @note this should be used for HTML5 origin determination.
*/
static nsresult GetASCIIOrigin(nsIPrincipal* aPrincipal, nsACString& aOrigin);
static nsresult GetASCIIOrigin(nsIURI* aURI, nsACString& aOrigin);
static nsresult GetThreadSafeASCIIOrigin(nsIURI* aURI, nsACString& aOrigin);
static nsresult GetUTFOrigin(nsIPrincipal* aPrincipal, nsAString& aOrigin);
static nsresult GetUTFOrigin(nsIURI* aURI, nsAString& aOrigin);
static nsresult GetThreadSafeUTFOrigin(nsIURI* aURI, nsAString& aOrigin);
/**
* This method creates and dispatches "command" event, which implements