mirror of
https://repo.dactyloidae.xyz/Dactyloidae/UXP.git
synced 2026-09-30 12:27:29 +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
|
|
@ -33,6 +33,7 @@
|
|||
#include "mozilla/Unused.h"
|
||||
|
||||
#include "Fetch.h"
|
||||
#include "FetchUtil.h"
|
||||
#include "InternalRequest.h"
|
||||
#include "InternalResponse.h"
|
||||
|
||||
|
|
@ -263,62 +264,30 @@ FetchDriver::HttpFetch()
|
|||
// Set the same headers.
|
||||
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();
|
||||
switch (referrerPolicy) {
|
||||
case ReferrerPolicy::_empty:
|
||||
break;
|
||||
case ReferrerPolicy::No_referrer:
|
||||
net_referrerPolicy = net::RP_No_Referrer;
|
||||
break;
|
||||
case ReferrerPolicy::No_referrer_when_downgrade:
|
||||
net_referrerPolicy = net::RP_No_Referrer_When_Downgrade;
|
||||
break;
|
||||
case ReferrerPolicy::Origin:
|
||||
net_referrerPolicy = net::RP_Origin;
|
||||
break;
|
||||
case ReferrerPolicy::Origin_when_cross_origin:
|
||||
net_referrerPolicy = net::RP_Origin_When_Crossorigin;
|
||||
break;
|
||||
case ReferrerPolicy::Unsafe_url:
|
||||
net_referrerPolicy = net::RP_Unsafe_URL;
|
||||
break;
|
||||
default:
|
||||
MOZ_ASSERT_UNREACHABLE("Invalid ReferrerPolicy enum value?");
|
||||
break;
|
||||
// Step 6 of
|
||||
// https://fetch.spec.whatwg.org/#main-fetch
|
||||
// If request's referrer policy is the empty string and request's client is
|
||||
// non-null, then set request's referrer policy to request's client's
|
||||
// associated referrer policy.
|
||||
// Basically, "client" is not in our implementation, we use
|
||||
// EnvironmentReferrerPolicy of the worker or document context
|
||||
if (mRequest->ReferrerPolicy_() == ReferrerPolicy::_empty) {
|
||||
mRequest->SetReferrerPolicy(net_referrerPolicy);
|
||||
}
|
||||
// Step 7 of
|
||||
// https://fetch.spec.whatwg.org/#main-fetch
|
||||
// If request’s referrer policy is the empty string,
|
||||
// then set request’s referrer policy to "no-referrer-when-downgrade".
|
||||
if (mRequest->ReferrerPolicy_() == ReferrerPolicy::_empty) {
|
||||
mRequest->SetReferrerPolicy(net::RP_No_Referrer_When_Downgrade);
|
||||
}
|
||||
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 =
|
||||
httpChan->SetReferrerWithPolicy(referrerURI,
|
||||
referrerPolicy == ReferrerPolicy::_empty ?
|
||||
mRequest->GetEnvironmentReferrerPolicy() :
|
||||
net_referrerPolicy);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
}
|
||||
rv = FetchUtil::SetRequestReferrer(mPrincipal,
|
||||
mDocument,
|
||||
httpChan,
|
||||
mRequest);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
|
||||
// Bug 1120722 - Authorization will be handled later.
|
||||
// Auth may require prompting, we don't support it yet.
|
||||
|
|
@ -865,29 +834,15 @@ FetchDriver::AsyncOnChannelRedirect(nsIChannel* aOldChannel,
|
|||
net::ReferrerPolicy net_referrerPolicy =
|
||||
nsContentUtils::GetReferrerPolicyFromHeader(tRPHeaderValue);
|
||||
if (net_referrerPolicy != net::RP_Unset) {
|
||||
ReferrerPolicy referrerPolicy = mRequest->ReferrerPolicy_();
|
||||
switch (net_referrerPolicy) {
|
||||
case net::RP_No_Referrer:
|
||||
referrerPolicy = ReferrerPolicy::No_referrer;
|
||||
break;
|
||||
case net::RP_No_Referrer_When_Downgrade:
|
||||
referrerPolicy = ReferrerPolicy::No_referrer_when_downgrade;
|
||||
break;
|
||||
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(net_referrerPolicy);
|
||||
// Should update channel's referrer policy
|
||||
if (httpChannel) {
|
||||
rv = FetchUtil::SetRequestReferrer(mPrincipal,
|
||||
mDocument,
|
||||
httpChannel,
|
||||
mRequest);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
}
|
||||
|
||||
mRequest->SetReferrerPolicy(referrerPolicy);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -4,8 +4,10 @@
|
|||
#include "nsIUnicodeDecoder.h"
|
||||
#include "nsNetUtil.h"
|
||||
#include "nsString.h"
|
||||
#include "nsIDocument.h"
|
||||
|
||||
#include "mozilla/dom/EncodingUtils.h"
|
||||
#include "mozilla/dom/InternalRequest.h"
|
||||
|
||||
namespace mozilla {
|
||||
namespace dom {
|
||||
|
|
@ -111,5 +113,59 @@ FetchUtil::ExtractHeader(nsACString::const_iterator& aStart,
|
|||
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 mozilla
|
||||
|
|
|
|||
|
|
@ -8,9 +8,15 @@
|
|||
#include "mozilla/dom/File.h"
|
||||
#include "mozilla/dom/FormData.h"
|
||||
|
||||
class nsIPrincipal;
|
||||
class nsIDocument;
|
||||
class nsIHttpChannel;
|
||||
|
||||
namespace mozilla {
|
||||
namespace dom {
|
||||
|
||||
class InternalRequest;
|
||||
|
||||
class FetchUtil final
|
||||
{
|
||||
private:
|
||||
|
|
@ -35,6 +41,13 @@ public:
|
|||
nsCString& aHeaderName,
|
||||
nsCString& aHeaderValue,
|
||||
bool* aWasEmptyHeader);
|
||||
|
||||
static nsresult
|
||||
SetRequestReferrer(nsIPrincipal* aPrincipal,
|
||||
nsIDocument* aDoc,
|
||||
nsIHttpChannel* aChannel,
|
||||
InternalRequest* aRequest);
|
||||
|
||||
};
|
||||
|
||||
} // namespace dom
|
||||
|
|
|
|||
|
|
@ -232,6 +232,72 @@ public:
|
|||
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
|
||||
GetEnvironmentReferrerPolicy() const
|
||||
{
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue