mirror of
https://repo.dactyloidae.xyz/Dactyloidae/UXP.git
synced 2026-09-29 20:07:30 +09:00
Issue #2641 - Update Fetch to adhere to the updated spec (pass refpolicy)
Resolves #2641
This commit is contained in:
parent
f6f046930d
commit
7d978ccd71
16 changed files with 244 additions and 91 deletions
|
|
@ -8868,10 +8868,8 @@ nsContentUtils::SetFetchReferrerURIWithPolicy(nsIPrincipal* aPrincipal,
|
||||||
referrerURI = principalURI;
|
referrerURI = principalURI;
|
||||||
}
|
}
|
||||||
|
|
||||||
net::ReferrerPolicy referrerPolicy = aReferrerPolicy;
|
net::ReferrerPolicy referrerPolicy = (aReferrerPolicy != net::RP_Unset) ?
|
||||||
if (referrerPolicy == net::RP_Default) {
|
aReferrerPolicy : net::RP_Default;
|
||||||
referrerPolicy = aDoc->GetReferrerPolicy();
|
|
||||||
}
|
|
||||||
return aChannel->SetReferrerWithPolicy(referrerURI, referrerPolicy);
|
return aChannel->SetReferrerWithPolicy(referrerURI, referrerPolicy);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
5
dom/cache/DBSchema.cpp
vendored
5
dom/cache/DBSchema.cpp
vendored
|
|
@ -196,7 +196,10 @@ static_assert(int(ReferrerPolicy::_empty) == 0 &&
|
||||||
int(ReferrerPolicy::Origin) == 3 &&
|
int(ReferrerPolicy::Origin) == 3 &&
|
||||||
int(ReferrerPolicy::Origin_when_cross_origin) == 4 &&
|
int(ReferrerPolicy::Origin_when_cross_origin) == 4 &&
|
||||||
int(ReferrerPolicy::Unsafe_url) == 5 &&
|
int(ReferrerPolicy::Unsafe_url) == 5 &&
|
||||||
int(ReferrerPolicy::EndGuard_) == 6,
|
int(ReferrerPolicy::Same_origin) == 6 &&
|
||||||
|
int(ReferrerPolicy::Strict_origin) == 7 &&
|
||||||
|
int(ReferrerPolicy::Strict_origin_when_cross_origin) == 8 &&
|
||||||
|
int(ReferrerPolicy::EndGuard_) == 9,
|
||||||
"ReferrerPolicy values are as expected");
|
"ReferrerPolicy values are as expected");
|
||||||
static_assert(int(RequestMode::Same_origin) == 0 &&
|
static_assert(int(RequestMode::Same_origin) == 0 &&
|
||||||
int(RequestMode::No_cors) == 1 &&
|
int(RequestMode::No_cors) == 1 &&
|
||||||
|
|
|
||||||
|
|
@ -33,6 +33,7 @@
|
||||||
#include "mozilla/Unused.h"
|
#include "mozilla/Unused.h"
|
||||||
|
|
||||||
#include "Fetch.h"
|
#include "Fetch.h"
|
||||||
|
#include "FetchUtil.h"
|
||||||
#include "InternalRequest.h"
|
#include "InternalRequest.h"
|
||||||
#include "InternalResponse.h"
|
#include "InternalResponse.h"
|
||||||
|
|
||||||
|
|
@ -263,62 +264,30 @@ FetchDriver::HttpFetch()
|
||||||
// Set the same headers.
|
// Set the same headers.
|
||||||
SetRequestHeaders(httpChan);
|
SetRequestHeaders(httpChan);
|
||||||
|
|
||||||
// Step 2. Set the referrer.
|
|
||||||
nsAutoString referrer;
|
|
||||||
mRequest->GetReferrer(referrer);
|
|
||||||
|
|
||||||
// The Referrer Policy in Request can be used to override a referrer policy
|
|
||||||
// associated with an environment settings object.
|
|
||||||
// If there's no Referrer Policy in the request, it should be inherited
|
|
||||||
// from environment.
|
|
||||||
ReferrerPolicy referrerPolicy = mRequest->ReferrerPolicy_();
|
|
||||||
net::ReferrerPolicy net_referrerPolicy = mRequest->GetEnvironmentReferrerPolicy();
|
net::ReferrerPolicy net_referrerPolicy = mRequest->GetEnvironmentReferrerPolicy();
|
||||||
switch (referrerPolicy) {
|
// Step 6 of
|
||||||
case ReferrerPolicy::_empty:
|
// https://fetch.spec.whatwg.org/#main-fetch
|
||||||
break;
|
// If request's referrer policy is the empty string and request's client is
|
||||||
case ReferrerPolicy::No_referrer:
|
// non-null, then set request's referrer policy to request's client's
|
||||||
net_referrerPolicy = net::RP_No_Referrer;
|
// associated referrer policy.
|
||||||
break;
|
// Basically, "client" is not in our implementation, we use
|
||||||
case ReferrerPolicy::No_referrer_when_downgrade:
|
// EnvironmentReferrerPolicy of the worker or document context
|
||||||
net_referrerPolicy = net::RP_No_Referrer_When_Downgrade;
|
if (mRequest->ReferrerPolicy_() == ReferrerPolicy::_empty) {
|
||||||
break;
|
mRequest->SetReferrerPolicy(net_referrerPolicy);
|
||||||
case ReferrerPolicy::Origin:
|
}
|
||||||
net_referrerPolicy = net::RP_Origin;
|
// Step 7 of
|
||||||
break;
|
// https://fetch.spec.whatwg.org/#main-fetch
|
||||||
case ReferrerPolicy::Origin_when_cross_origin:
|
// If request’s referrer policy is the empty string,
|
||||||
net_referrerPolicy = net::RP_Origin_When_Crossorigin;
|
// then set request’s referrer policy to "no-referrer-when-downgrade".
|
||||||
break;
|
if (mRequest->ReferrerPolicy_() == ReferrerPolicy::_empty) {
|
||||||
case ReferrerPolicy::Unsafe_url:
|
mRequest->SetReferrerPolicy(net::RP_No_Referrer_When_Downgrade);
|
||||||
net_referrerPolicy = net::RP_Unsafe_URL;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
MOZ_ASSERT_UNREACHABLE("Invalid ReferrerPolicy enum value?");
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
if (referrer.EqualsLiteral(kFETCH_CLIENT_REFERRER_STR)) {
|
|
||||||
rv = nsContentUtils::SetFetchReferrerURIWithPolicy(mPrincipal,
|
|
||||||
mDocument,
|
|
||||||
httpChan,
|
|
||||||
net_referrerPolicy);
|
|
||||||
NS_ENSURE_SUCCESS(rv, rv);
|
|
||||||
} else if (referrer.IsEmpty()) {
|
|
||||||
rv = httpChan->SetReferrerWithPolicy(nullptr, net::RP_No_Referrer);
|
|
||||||
NS_ENSURE_SUCCESS(rv, rv);
|
|
||||||
} else {
|
|
||||||
// From "Determine request's Referrer" step 3
|
|
||||||
// "If request's referrer is a URL, let referrerSource be request's
|
|
||||||
// referrer."
|
|
||||||
nsCOMPtr<nsIURI> referrerURI;
|
|
||||||
rv = NS_NewURI(getter_AddRefs(referrerURI), referrer, nullptr, nullptr);
|
|
||||||
NS_ENSURE_SUCCESS(rv, rv);
|
|
||||||
|
|
||||||
rv =
|
rv = FetchUtil::SetRequestReferrer(mPrincipal,
|
||||||
httpChan->SetReferrerWithPolicy(referrerURI,
|
mDocument,
|
||||||
referrerPolicy == ReferrerPolicy::_empty ?
|
httpChan,
|
||||||
mRequest->GetEnvironmentReferrerPolicy() :
|
mRequest);
|
||||||
net_referrerPolicy);
|
NS_ENSURE_SUCCESS(rv, rv);
|
||||||
NS_ENSURE_SUCCESS(rv, rv);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Bug 1120722 - Authorization will be handled later.
|
// Bug 1120722 - Authorization will be handled later.
|
||||||
// Auth may require prompting, we don't support it yet.
|
// Auth may require prompting, we don't support it yet.
|
||||||
|
|
@ -865,29 +834,15 @@ FetchDriver::AsyncOnChannelRedirect(nsIChannel* aOldChannel,
|
||||||
net::ReferrerPolicy net_referrerPolicy =
|
net::ReferrerPolicy net_referrerPolicy =
|
||||||
nsContentUtils::GetReferrerPolicyFromHeader(tRPHeaderValue);
|
nsContentUtils::GetReferrerPolicyFromHeader(tRPHeaderValue);
|
||||||
if (net_referrerPolicy != net::RP_Unset) {
|
if (net_referrerPolicy != net::RP_Unset) {
|
||||||
ReferrerPolicy referrerPolicy = mRequest->ReferrerPolicy_();
|
mRequest->SetReferrerPolicy(net_referrerPolicy);
|
||||||
switch (net_referrerPolicy) {
|
// Should update channel's referrer policy
|
||||||
case net::RP_No_Referrer:
|
if (httpChannel) {
|
||||||
referrerPolicy = ReferrerPolicy::No_referrer;
|
rv = FetchUtil::SetRequestReferrer(mPrincipal,
|
||||||
break;
|
mDocument,
|
||||||
case net::RP_No_Referrer_When_Downgrade:
|
httpChannel,
|
||||||
referrerPolicy = ReferrerPolicy::No_referrer_when_downgrade;
|
mRequest);
|
||||||
break;
|
NS_ENSURE_SUCCESS(rv, rv);
|
||||||
case net::RP_Origin:
|
|
||||||
referrerPolicy = ReferrerPolicy::Origin;
|
|
||||||
break;
|
|
||||||
case net::RP_Origin_When_Crossorigin:
|
|
||||||
referrerPolicy = ReferrerPolicy::Origin_when_cross_origin;
|
|
||||||
break;
|
|
||||||
case net::RP_Unsafe_URL:
|
|
||||||
referrerPolicy = ReferrerPolicy::Unsafe_url;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
MOZ_ASSERT_UNREACHABLE("Invalid ReferrerPolicy value");
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
mRequest->SetReferrerPolicy(referrerPolicy);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -4,8 +4,10 @@
|
||||||
#include "nsIUnicodeDecoder.h"
|
#include "nsIUnicodeDecoder.h"
|
||||||
#include "nsNetUtil.h"
|
#include "nsNetUtil.h"
|
||||||
#include "nsString.h"
|
#include "nsString.h"
|
||||||
|
#include "nsIDocument.h"
|
||||||
|
|
||||||
#include "mozilla/dom/EncodingUtils.h"
|
#include "mozilla/dom/EncodingUtils.h"
|
||||||
|
#include "mozilla/dom/InternalRequest.h"
|
||||||
|
|
||||||
namespace mozilla {
|
namespace mozilla {
|
||||||
namespace dom {
|
namespace dom {
|
||||||
|
|
@ -111,5 +113,59 @@ FetchUtil::ExtractHeader(nsACString::const_iterator& aStart,
|
||||||
return PushOverLine(aStart, aEnd);
|
return PushOverLine(aStart, aEnd);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// static
|
||||||
|
nsresult
|
||||||
|
FetchUtil::SetRequestReferrer(nsIPrincipal* aPrincipal,
|
||||||
|
nsIDocument* aDoc,
|
||||||
|
nsIHttpChannel* aChannel,
|
||||||
|
InternalRequest* aRequest) {
|
||||||
|
MOZ_ASSERT(NS_IsMainThread());
|
||||||
|
|
||||||
|
nsAutoString referrer;
|
||||||
|
aRequest->GetReferrer(referrer);
|
||||||
|
net::ReferrerPolicy policy = aRequest->GetReferrerPolicy();
|
||||||
|
|
||||||
|
nsresult rv = NS_OK;
|
||||||
|
if (referrer.IsEmpty()) {
|
||||||
|
// This is the case request’s referrer is "no-referrer"
|
||||||
|
rv = aChannel->SetReferrerWithPolicy(nullptr, net::RP_No_Referrer);
|
||||||
|
NS_ENSURE_SUCCESS(rv, rv);
|
||||||
|
} else if (referrer.EqualsLiteral(kFETCH_CLIENT_REFERRER_STR)) {
|
||||||
|
rv = nsContentUtils::SetFetchReferrerURIWithPolicy(aPrincipal,
|
||||||
|
aDoc,
|
||||||
|
aChannel,
|
||||||
|
policy);
|
||||||
|
NS_ENSURE_SUCCESS(rv, rv);
|
||||||
|
} else {
|
||||||
|
// From "Determine request's Referrer" step 3
|
||||||
|
// "If request's referrer is a URL, let referrerSource be request's
|
||||||
|
// referrer."
|
||||||
|
nsCOMPtr<nsIURI> referrerURI;
|
||||||
|
rv = NS_NewURI(getter_AddRefs(referrerURI), referrer, nullptr, nullptr);
|
||||||
|
NS_ENSURE_SUCCESS(rv, rv);
|
||||||
|
|
||||||
|
rv = aChannel->SetReferrerWithPolicy(referrerURI, policy);
|
||||||
|
NS_ENSURE_SUCCESS(rv, rv);
|
||||||
|
}
|
||||||
|
|
||||||
|
nsCOMPtr<nsIURI> referrerURI;
|
||||||
|
aChannel->GetReferrer(getter_AddRefs(referrerURI));
|
||||||
|
|
||||||
|
// Step 8 https://fetch.spec.whatwg.org/#main-fetch
|
||||||
|
// If request’s referrer is not "no-referrer", set request’s referrer to
|
||||||
|
// the result of invoking determine request’s referrer.
|
||||||
|
if (referrerURI) {
|
||||||
|
nsAutoCString spec;
|
||||||
|
rv = referrerURI->GetSpec(spec);
|
||||||
|
NS_ENSURE_SUCCESS(rv, rv);
|
||||||
|
|
||||||
|
aRequest->SetReferrer(NS_ConvertUTF8toUTF16(spec));
|
||||||
|
} else {
|
||||||
|
aRequest->SetReferrer(EmptyString());
|
||||||
|
}
|
||||||
|
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace dom
|
} // namespace dom
|
||||||
} // namespace mozilla
|
} // namespace mozilla
|
||||||
|
|
|
||||||
|
|
@ -8,9 +8,15 @@
|
||||||
#include "mozilla/dom/File.h"
|
#include "mozilla/dom/File.h"
|
||||||
#include "mozilla/dom/FormData.h"
|
#include "mozilla/dom/FormData.h"
|
||||||
|
|
||||||
|
class nsIPrincipal;
|
||||||
|
class nsIDocument;
|
||||||
|
class nsIHttpChannel;
|
||||||
|
|
||||||
namespace mozilla {
|
namespace mozilla {
|
||||||
namespace dom {
|
namespace dom {
|
||||||
|
|
||||||
|
class InternalRequest;
|
||||||
|
|
||||||
class FetchUtil final
|
class FetchUtil final
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
|
|
@ -35,6 +41,13 @@ public:
|
||||||
nsCString& aHeaderName,
|
nsCString& aHeaderName,
|
||||||
nsCString& aHeaderValue,
|
nsCString& aHeaderValue,
|
||||||
bool* aWasEmptyHeader);
|
bool* aWasEmptyHeader);
|
||||||
|
|
||||||
|
static nsresult
|
||||||
|
SetRequestReferrer(nsIPrincipal* aPrincipal,
|
||||||
|
nsIDocument* aDoc,
|
||||||
|
nsIHttpChannel* aChannel,
|
||||||
|
InternalRequest* aRequest);
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace dom
|
} // namespace dom
|
||||||
|
|
|
||||||
|
|
@ -232,6 +232,72 @@ public:
|
||||||
mReferrerPolicy = aReferrerPolicy;
|
mReferrerPolicy = aReferrerPolicy;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
SetReferrerPolicy(net::ReferrerPolicy aReferrerPolicy)
|
||||||
|
{
|
||||||
|
switch (aReferrerPolicy) {
|
||||||
|
case net::RP_Unset:
|
||||||
|
mReferrerPolicy = ReferrerPolicy::_empty;
|
||||||
|
break;
|
||||||
|
case net::RP_No_Referrer:
|
||||||
|
mReferrerPolicy = ReferrerPolicy::No_referrer;
|
||||||
|
break;
|
||||||
|
case net::RP_No_Referrer_When_Downgrade:
|
||||||
|
mReferrerPolicy = ReferrerPolicy::No_referrer_when_downgrade;
|
||||||
|
break;
|
||||||
|
case net::RP_Origin:
|
||||||
|
mReferrerPolicy = ReferrerPolicy::Origin;
|
||||||
|
break;
|
||||||
|
case net::RP_Origin_When_Crossorigin:
|
||||||
|
mReferrerPolicy = ReferrerPolicy::Origin_when_cross_origin;
|
||||||
|
break;
|
||||||
|
case net::RP_Unsafe_URL:
|
||||||
|
mReferrerPolicy = ReferrerPolicy::Unsafe_url;
|
||||||
|
break;
|
||||||
|
case net::RP_Same_Origin:
|
||||||
|
mReferrerPolicy = ReferrerPolicy::Same_origin;
|
||||||
|
break;
|
||||||
|
case net::RP_Strict_Origin:
|
||||||
|
mReferrerPolicy = ReferrerPolicy::Strict_origin;
|
||||||
|
break;
|
||||||
|
case net::RP_Strict_Origin_When_Cross_Origin:
|
||||||
|
mReferrerPolicy = ReferrerPolicy::Strict_origin_when_cross_origin;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
MOZ_ASSERT_UNREACHABLE("Invalid ReferrerPolicy value");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
net::ReferrerPolicy
|
||||||
|
GetReferrerPolicy()
|
||||||
|
{
|
||||||
|
switch (mReferrerPolicy) {
|
||||||
|
case ReferrerPolicy::_empty:
|
||||||
|
return net::RP_Unset;
|
||||||
|
case ReferrerPolicy::No_referrer:
|
||||||
|
return net::RP_No_Referrer;
|
||||||
|
case ReferrerPolicy::No_referrer_when_downgrade:
|
||||||
|
return net::RP_No_Referrer_When_Downgrade;
|
||||||
|
case ReferrerPolicy::Origin:
|
||||||
|
return net::RP_Origin;
|
||||||
|
case ReferrerPolicy::Origin_when_cross_origin:
|
||||||
|
return net::RP_Origin_When_Crossorigin;
|
||||||
|
case ReferrerPolicy::Unsafe_url:
|
||||||
|
return net::RP_Unsafe_URL;
|
||||||
|
case ReferrerPolicy::Strict_origin:
|
||||||
|
return net::RP_Strict_Origin;
|
||||||
|
case ReferrerPolicy::Same_origin:
|
||||||
|
return net::RP_Same_Origin;
|
||||||
|
case ReferrerPolicy::Strict_origin_when_cross_origin:
|
||||||
|
return net::RP_Strict_Origin_When_Cross_Origin;
|
||||||
|
default:
|
||||||
|
MOZ_ASSERT_UNREACHABLE("Invalid ReferrerPolicy enum value?");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return net::RP_Unset;
|
||||||
|
}
|
||||||
|
|
||||||
net::ReferrerPolicy
|
net::ReferrerPolicy
|
||||||
GetEnvironmentReferrerPolicy() const
|
GetEnvironmentReferrerPolicy() const
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -73,4 +73,8 @@ enum RequestMode { "same-origin", "no-cors", "cors", "navigate" };
|
||||||
enum RequestCredentials { "omit", "same-origin", "include" };
|
enum RequestCredentials { "omit", "same-origin", "include" };
|
||||||
enum RequestCache { "default", "no-store", "reload", "no-cache", "force-cache", "only-if-cached" };
|
enum RequestCache { "default", "no-store", "reload", "no-cache", "force-cache", "only-if-cached" };
|
||||||
enum RequestRedirect { "follow", "error", "manual" };
|
enum RequestRedirect { "follow", "error", "manual" };
|
||||||
enum ReferrerPolicy { "", "no-referrer", "no-referrer-when-downgrade", "origin", "origin-when-cross-origin", "unsafe-url" };
|
enum ReferrerPolicy {
|
||||||
|
"", "no-referrer", "no-referrer-when-downgrade", "origin",
|
||||||
|
"origin-when-cross-origin", "unsafe-url", "same-origin", "strict-origin",
|
||||||
|
"strict-origin-when-cross-origin"
|
||||||
|
};
|
||||||
|
|
|
||||||
|
|
@ -209,8 +209,10 @@ ChannelFromScriptURL(nsIPrincipal* principal,
|
||||||
NS_ENSURE_SUCCESS(rv, rv);
|
NS_ENSURE_SUCCESS(rv, rv);
|
||||||
|
|
||||||
if (nsCOMPtr<nsIHttpChannel> httpChannel = do_QueryInterface(channel)) {
|
if (nsCOMPtr<nsIHttpChannel> httpChannel = do_QueryInterface(channel)) {
|
||||||
|
mozilla::net::ReferrerPolicy referrerPolicy = parentDoc ?
|
||||||
|
parentDoc->GetReferrerPolicy() : mozilla::net::RP_Default;
|
||||||
rv = nsContentUtils::SetFetchReferrerURIWithPolicy(principal, parentDoc,
|
rv = nsContentUtils::SetFetchReferrerURIWithPolicy(principal, parentDoc,
|
||||||
httpChannel, mozilla::net::RP_Default);
|
httpChannel, referrerPolicy);
|
||||||
if (NS_WARN_IF(NS_FAILED(rv))) {
|
if (NS_WARN_IF(NS_FAILED(rv))) {
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1345,12 +1345,19 @@ public:
|
||||||
httpChannel->GetRequestHeader(NS_LITERAL_CSTRING("Referer"), referrer);
|
httpChannel->GetRequestHeader(NS_LITERAL_CSTRING("Referer"), referrer);
|
||||||
if (!referrer.IsEmpty()) {
|
if (!referrer.IsEmpty()) {
|
||||||
mReferrer = referrer;
|
mReferrer = referrer;
|
||||||
|
} else {
|
||||||
|
// If there's no referrer Header, means the header was omitted for
|
||||||
|
// security/privacy reason.
|
||||||
|
mReferrer = EmptyCString();
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t referrerPolicy = 0;
|
uint32_t referrerPolicy = 0;
|
||||||
rv = httpChannel->GetReferrerPolicy(&referrerPolicy);
|
rv = httpChannel->GetReferrerPolicy(&referrerPolicy);
|
||||||
NS_ENSURE_SUCCESS(rv, rv);
|
NS_ENSURE_SUCCESS(rv, rv);
|
||||||
switch (referrerPolicy) {
|
switch (referrerPolicy) {
|
||||||
|
case nsIHttpChannel::REFERRER_POLICY_UNSET:
|
||||||
|
mReferrerPolicy = ReferrerPolicy::_empty;
|
||||||
|
break;
|
||||||
case nsIHttpChannel::REFERRER_POLICY_NO_REFERRER:
|
case nsIHttpChannel::REFERRER_POLICY_NO_REFERRER:
|
||||||
mReferrerPolicy = ReferrerPolicy::No_referrer;
|
mReferrerPolicy = ReferrerPolicy::No_referrer;
|
||||||
break;
|
break;
|
||||||
|
|
@ -1366,6 +1373,15 @@ public:
|
||||||
case nsIHttpChannel::REFERRER_POLICY_UNSAFE_URL:
|
case nsIHttpChannel::REFERRER_POLICY_UNSAFE_URL:
|
||||||
mReferrerPolicy = ReferrerPolicy::Unsafe_url;
|
mReferrerPolicy = ReferrerPolicy::Unsafe_url;
|
||||||
break;
|
break;
|
||||||
|
case nsIHttpChannel::REFERRER_POLICY_SAME_ORIGIN:
|
||||||
|
mReferrerPolicy = ReferrerPolicy::Same_origin;
|
||||||
|
break;
|
||||||
|
case nsIHttpChannel::REFERRER_POLICY_STRICT_ORIGIN_WHEN_XORIGIN:
|
||||||
|
mReferrerPolicy = ReferrerPolicy::Strict_origin_when_cross_origin;
|
||||||
|
break;
|
||||||
|
case nsIHttpChannel::REFERRER_POLICY_STRICT_ORIGIN:
|
||||||
|
mReferrerPolicy = ReferrerPolicy::Strict_origin;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
MOZ_ASSERT_UNREACHABLE("Invalid Referrer Policy enum value?");
|
MOZ_ASSERT_UNREACHABLE("Invalid Referrer Policy enum value?");
|
||||||
break;
|
break;
|
||||||
|
|
|
||||||
|
|
@ -2434,9 +2434,10 @@ XMLHttpRequestMainThread::InitiateFetch(nsIInputStream* aUploadStream,
|
||||||
if (!IsSystemXHR()) {
|
if (!IsSystemXHR()) {
|
||||||
nsCOMPtr<nsPIDOMWindowInner> owner = GetOwner();
|
nsCOMPtr<nsPIDOMWindowInner> owner = GetOwner();
|
||||||
nsCOMPtr<nsIDocument> doc = owner ? owner->GetExtantDoc() : nullptr;
|
nsCOMPtr<nsIDocument> doc = owner ? owner->GetExtantDoc() : nullptr;
|
||||||
|
mozilla::net::ReferrerPolicy referrerPolicy = doc ?
|
||||||
|
doc->GetReferrerPolicy() : mozilla::net::RP_Default;
|
||||||
nsContentUtils::SetFetchReferrerURIWithPolicy(mPrincipal, doc,
|
nsContentUtils::SetFetchReferrerURIWithPolicy(mPrincipal, doc,
|
||||||
httpChannel,
|
httpChannel, referrerPolicy);
|
||||||
mozilla::net::RP_Default);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Some extensions override the http protocol handler and provide their own
|
// Some extensions override the http protocol handler and provide their own
|
||||||
|
|
|
||||||
|
|
@ -1316,7 +1316,7 @@ HttpBaseChannel::SetReferrerWithPolicy(nsIURI *referrer,
|
||||||
if(NS_FAILED(rv)) {
|
if(NS_FAILED(rv)) {
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
mReferrerPolicy = REFERRER_POLICY_NO_REFERRER_WHEN_DOWNGRADE;
|
mReferrerPolicy = referrerPolicy;
|
||||||
|
|
||||||
if (!referrer) {
|
if (!referrer) {
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
|
|
@ -1324,7 +1324,6 @@ HttpBaseChannel::SetReferrerWithPolicy(nsIURI *referrer,
|
||||||
|
|
||||||
// Don't send referrer at all when the meta referrer setting is "no-referrer"
|
// Don't send referrer at all when the meta referrer setting is "no-referrer"
|
||||||
if (referrerPolicy == REFERRER_POLICY_NO_REFERRER) {
|
if (referrerPolicy == REFERRER_POLICY_NO_REFERRER) {
|
||||||
mReferrerPolicy = REFERRER_POLICY_NO_REFERRER;
|
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1597,7 +1596,6 @@ HttpBaseChannel::SetReferrerWithPolicy(nsIURI *referrer,
|
||||||
if (NS_FAILED(rv)) return rv;
|
if (NS_FAILED(rv)) return rv;
|
||||||
|
|
||||||
mReferrer = clone;
|
mReferrer = clone;
|
||||||
mReferrerPolicy = referrerPolicy;
|
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1681,8 +1681,13 @@ NS_IMETHODIMP
|
||||||
HttpChannelChild::OnRedirectVerifyCallback(nsresult result)
|
HttpChannelChild::OnRedirectVerifyCallback(nsresult result)
|
||||||
{
|
{
|
||||||
LOG(("HttpChannelChild::OnRedirectVerifyCallback [this=%p]\n", this));
|
LOG(("HttpChannelChild::OnRedirectVerifyCallback [this=%p]\n", this));
|
||||||
OptionalURIParams redirectURI;
|
|
||||||
nsresult rv;
|
nsresult rv;
|
||||||
|
OptionalURIParams redirectURI;
|
||||||
|
|
||||||
|
uint32_t referrerPolicy = REFERRER_POLICY_NO_REFERRER_WHEN_DOWNGRADE;
|
||||||
|
OptionalURIParams referrerURI;
|
||||||
|
SerializeURI(nullptr, referrerURI);
|
||||||
|
|
||||||
nsCOMPtr<nsIHttpChannel> newHttpChannel =
|
nsCOMPtr<nsIHttpChannel> newHttpChannel =
|
||||||
do_QueryInterface(mRedirectChannelChild);
|
do_QueryInterface(mRedirectChannelChild);
|
||||||
|
|
||||||
|
|
@ -1700,6 +1705,12 @@ HttpChannelChild::OnRedirectVerifyCallback(nsresult result)
|
||||||
if (newHttpChannel) {
|
if (newHttpChannel) {
|
||||||
// Must not be called until after redirect observers called.
|
// Must not be called until after redirect observers called.
|
||||||
newHttpChannel->SetOriginalURI(mOriginalURI);
|
newHttpChannel->SetOriginalURI(mOriginalURI);
|
||||||
|
|
||||||
|
newHttpChannel->GetReferrerPolicy(&referrerPolicy);
|
||||||
|
nsCOMPtr<nsIURI> newChannelReferrerURI;
|
||||||
|
newHttpChannel->GetReferrer(getter_AddRefs(newChannelReferrerURI));
|
||||||
|
|
||||||
|
SerializeURI(newChannelReferrerURI, referrerURI);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mRedirectingForSubsequentSynthesizedResponse) {
|
if (mRedirectingForSubsequentSynthesizedResponse) {
|
||||||
|
|
@ -1770,8 +1781,9 @@ HttpChannelChild::OnRedirectVerifyCallback(nsresult result)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mIPCOpen)
|
if (mIPCOpen)
|
||||||
SendRedirect2Verify(result, *headerTuples, loadFlags, redirectURI,
|
SendRedirect2Verify(result, *headerTuples, loadFlags, referrerPolicy,
|
||||||
corsPreflightArgs, chooseAppcache);
|
referrerURI, redirectURI, corsPreflightArgs,
|
||||||
|
chooseAppcache);
|
||||||
|
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
@ -2147,6 +2159,25 @@ HttpChannelChild::ContinueAsyncOpen()
|
||||||
// HttpChannelChild::nsIHttpChannel
|
// HttpChannelChild::nsIHttpChannel
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
HttpChannelChild::SetReferrerWithPolicy(nsIURI *referrer,
|
||||||
|
uint32_t referrerPolicy)
|
||||||
|
{
|
||||||
|
ENSURE_CALLED_BEFORE_CONNECT();
|
||||||
|
|
||||||
|
// remove old referrer if any, loop backwards
|
||||||
|
for (int i = mClientSetRequestHeaders.Length() - 1; i >= 0; --i) {
|
||||||
|
if (NS_LITERAL_CSTRING("Referer").Equals(mClientSetRequestHeaders[i].mHeader)) {
|
||||||
|
mClientSetRequestHeaders.RemoveElementAt(i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
nsresult rv = HttpBaseChannel::SetReferrerWithPolicy(referrer, referrerPolicy);
|
||||||
|
if (NS_FAILED(rv))
|
||||||
|
return rv;
|
||||||
|
return NS_OK;
|
||||||
|
|
||||||
|
}
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
HttpChannelChild::SetRequestHeader(const nsACString& aHeader,
|
HttpChannelChild::SetRequestHeader(const nsACString& aHeader,
|
||||||
const nsACString& aValue,
|
const nsACString& aValue,
|
||||||
|
|
|
||||||
|
|
@ -77,6 +77,7 @@ public:
|
||||||
NS_IMETHOD AsyncOpen2(nsIStreamListener *aListener) override;
|
NS_IMETHOD AsyncOpen2(nsIStreamListener *aListener) override;
|
||||||
|
|
||||||
// HttpBaseChannel::nsIHttpChannel
|
// HttpBaseChannel::nsIHttpChannel
|
||||||
|
NS_IMETHOD SetReferrerWithPolicy(nsIURI *referrer, uint32_t referrerPolicy) override;
|
||||||
NS_IMETHOD SetRequestHeader(const nsACString& aHeader,
|
NS_IMETHOD SetRequestHeader(const nsACString& aHeader,
|
||||||
const nsACString& aValue,
|
const nsACString& aValue,
|
||||||
bool aMerge) override;
|
bool aMerge) override;
|
||||||
|
|
|
||||||
|
|
@ -733,6 +733,8 @@ bool
|
||||||
HttpChannelParent::RecvRedirect2Verify(const nsresult& result,
|
HttpChannelParent::RecvRedirect2Verify(const nsresult& result,
|
||||||
const RequestHeaderTuples& changedHeaders,
|
const RequestHeaderTuples& changedHeaders,
|
||||||
const uint32_t& loadFlags,
|
const uint32_t& loadFlags,
|
||||||
|
const uint32_t& referrerPolicy,
|
||||||
|
const OptionalURIParams& aReferrerURI,
|
||||||
const OptionalURIParams& aAPIRedirectURI,
|
const OptionalURIParams& aAPIRedirectURI,
|
||||||
const OptionalCorsPreflightArgs& aCorsPreflightArgs,
|
const OptionalCorsPreflightArgs& aCorsPreflightArgs,
|
||||||
const bool& aChooseAppcache)
|
const bool& aChooseAppcache)
|
||||||
|
|
@ -773,6 +775,9 @@ HttpChannelParent::RecvRedirect2Verify(const nsresult& result,
|
||||||
newInternalChannel->SetCorsPreflightParameters(args.unsafeHeaders());
|
newInternalChannel->SetCorsPreflightParameters(args.unsafeHeaders());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
nsCOMPtr<nsIURI> referrerUri = DeserializeURI(aReferrerURI);
|
||||||
|
newHttpChannel->SetReferrerWithPolicy(referrerUri, referrerPolicy);
|
||||||
|
|
||||||
nsCOMPtr<nsIApplicationCacheChannel> appCacheChannel =
|
nsCOMPtr<nsIApplicationCacheChannel> appCacheChannel =
|
||||||
do_QueryInterface(newHttpChannel);
|
do_QueryInterface(newHttpChannel);
|
||||||
if (appCacheChannel) {
|
if (appCacheChannel) {
|
||||||
|
|
|
||||||
|
|
@ -159,6 +159,8 @@ protected:
|
||||||
virtual bool RecvRedirect2Verify(const nsresult& result,
|
virtual bool RecvRedirect2Verify(const nsresult& result,
|
||||||
const RequestHeaderTuples& changedHeaders,
|
const RequestHeaderTuples& changedHeaders,
|
||||||
const uint32_t& loadFlags,
|
const uint32_t& loadFlags,
|
||||||
|
const uint32_t& referrerPolicy,
|
||||||
|
const OptionalURIParams& aReferrerURI,
|
||||||
const OptionalURIParams& apiRedirectUri,
|
const OptionalURIParams& apiRedirectUri,
|
||||||
const OptionalCorsPreflightArgs& aCorsPreflightArgs,
|
const OptionalCorsPreflightArgs& aCorsPreflightArgs,
|
||||||
const bool& aChooseAppcache) override;
|
const bool& aChooseAppcache) override;
|
||||||
|
|
|
||||||
|
|
@ -44,7 +44,9 @@ parent:
|
||||||
|
|
||||||
// Reports approval/veto of redirect by child process redirect observers
|
// Reports approval/veto of redirect by child process redirect observers
|
||||||
async Redirect2Verify(nsresult result, RequestHeaderTuples changedHeaders,
|
async Redirect2Verify(nsresult result, RequestHeaderTuples changedHeaders,
|
||||||
uint32_t loadFlags, OptionalURIParams apiRedirectTo,
|
uint32_t loadFlags, uint32_t referrerPolicy,
|
||||||
|
OptionalURIParams referrerUri,
|
||||||
|
OptionalURIParams apiRedirectTo,
|
||||||
OptionalCorsPreflightArgs corsPreflightArgs,
|
OptionalCorsPreflightArgs corsPreflightArgs,
|
||||||
bool chooseAppcache);
|
bool chooseAppcache);
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue