| Index: components/sessions/ios/ios_serialized_navigation_driver.cc
|
| diff --git a/components/sessions/ios/ios_serialized_navigation_driver.cc b/components/sessions/ios/ios_serialized_navigation_driver.cc
|
| index f6324ab35fb00a1e3413c2ea6a0362798f418380..3c1ec1ec88896c47f043d6a36384ba7c68047571 100644
|
| --- a/components/sessions/ios/ios_serialized_navigation_driver.cc
|
| +++ b/components/sessions/ios/ios_serialized_navigation_driver.cc
|
| @@ -32,6 +32,41 @@ int IOSSerializedNavigationDriver::GetDefaultReferrerPolicy() const {
|
| return web::ReferrerPolicyDefault;
|
| }
|
|
|
| +bool IOSSerializedNavigationDriver::MapReferrerPolicyToOldValues(
|
| + int referrer_policy,
|
| + int* mapped_referrer_policy) const {
|
| + // "always" and "default" are the same value in all versions.
|
| + if (referrer_policy == web::ReferrerPolicyAlways ||
|
| + referrer_policy == web::ReferrerPolicyDefault) {
|
| + *mapped_referrer_policy = referrer_policy;
|
| + return true;
|
| + }
|
| +
|
| + // "origin" exists in the old encoding.
|
| + if (referrer_policy == web::ReferrerPolicyOrigin) {
|
| + *mapped_referrer_policy = 3;
|
| + return true;
|
| + }
|
| +
|
| + // Everything else is mapped to never.
|
| + *mapped_referrer_policy = 2;
|
| + return false;
|
| +}
|
| +
|
| +bool IOSSerializedNavigationDriver::MapReferrerPolicyToNewValues(
|
| + int referrer_policy,
|
| + int* mapped_referrer_policy) const {
|
| + // "always" and "default" are the same value in all versions.
|
| + if (referrer_policy == 0 || referrer_policy == 1) {
|
| + *mapped_referrer_policy = referrer_policy;
|
| + return true;
|
| + }
|
| +
|
| + // Since we don't know what encoding was used, we map the rest to "never".
|
| + *mapped_referrer_policy = web::ReferrerPolicyNever;
|
| + return false;
|
| +}
|
| +
|
| std::string
|
| IOSSerializedNavigationDriver::GetSanitizedPageStateForPickle(
|
| const SerializedNavigationEntry* navigation) const {
|
| @@ -48,13 +83,20 @@ void IOSSerializedNavigationDriver::Sanitize(
|
| !referrer.url.SchemeIsHTTPOrHTTPS()) {
|
| referrer.url = GURL();
|
| } else {
|
| + if (referrer.policy < 0 || referrer.policy > web::ReferrerPolicyLast) {
|
| + NOTREACHED();
|
| + referrer.policy = web::ReferrerPolicyNever;
|
| + }
|
| + bool is_downgrade = referrer.url.SchemeIsSecure() &&
|
| + !navigation->virtual_url_.SchemeIsSecure();
|
| switch (referrer.policy) {
|
| case web::ReferrerPolicyDefault:
|
| - if (referrer.url.SchemeIsSecure() &&
|
| - !navigation->virtual_url_.SchemeIsSecure()) {
|
| + if (is_downgrade)
|
| referrer.url = GURL();
|
| - }
|
| break;
|
| + case web::ReferrerPolicyNoReferrerWhenDowngrade:
|
| + if (is_downgrade)
|
| + referrer.url = GURL();
|
| case web::ReferrerPolicyAlways:
|
| break;
|
| case web::ReferrerPolicyNever:
|
| @@ -63,8 +105,9 @@ void IOSSerializedNavigationDriver::Sanitize(
|
| case web::ReferrerPolicyOrigin:
|
| referrer.url = referrer.url.GetOrigin();
|
| break;
|
| - default:
|
| - NOTREACHED();
|
| + case web::ReferrerPolicyOriginWhenCrossOrigin:
|
| + if (navigation->virtual_url_.GetOrigin() != referrer.url.GetOrigin())
|
| + referrer.url = referrer.url.GetOrigin();
|
| break;
|
| }
|
| }
|
|
|