Issue #2641 - Update Fetch to adhere to the updated spec (pass refpolicy)

Resolves #2641
This commit is contained in:
Moonchild 2024-10-20 11:23:30 +02:00 • committed by roytam1
commit 7d978ccd71
16 changed files with 244 additions and 91 deletions

View file

@ -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);
} }

View file

@ -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 &&

View file

@ -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);
} }
} }

View file

@ -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

View file

@ -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

View file

@ -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
{ {

View file

@ -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"
};

View file

@ -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;
} }

View file

@ -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;

View file

@ -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

View file

@ -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;
} }

View file

@ -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,

View file

@ -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;

View file

@ -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) {

View file

@ -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;

View file

@ -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);