diff --git a/moli-fetch/src/lib.rs b/moli-fetch/src/lib.rs index 8f3543cda1..18bc414c6b 100644 --- a/moli-fetch/src/lib.rs +++ b/moli-fetch/src/lib.rs @@ -68,8 +68,9 @@ pub use network_fetch_result::{ NetworkResponseObservation, }; pub use referrer_policy::{ - DEFAULT_REFERRER_POLICY, normalize_referrer_policy, origin_referrer_url, referrer_header_value, - referrer_value, response_referrer_policy_from_headers, sanitized_referrer_url, + DEFAULT_REFERRER_POLICY, effective_referrer_policy, normalize_referrer_policy, + origin_referrer_url, referrer_header_value, referrer_value, + response_referrer_policy_from_headers, sanitized_referrer_url, }; pub use request::{ BrowserNavigationRequestKind, BrowserRequestMetadata, FetchPriorityHint, Request, RequestAuth, diff --git a/moli-fetch/src/referrer_policy.rs b/moli-fetch/src/referrer_policy.rs index 7b6ad8b292..664328009a 100644 --- a/moli-fetch/src/referrer_policy.rs +++ b/moli-fetch/src/referrer_policy.rs @@ -3,6 +3,17 @@ use url::Url; pub const DEFAULT_REFERRER_POLICY: &str = "strict-origin-when-cross-origin"; +/// An empty request policy inherits the document policy before using the default. +pub fn effective_referrer_policy<'a>( + request_policy: Option<&'a str>, + document_policy: Option<&'a str>, +) -> &'a str { + request_policy + .filter(|policy| !policy.is_empty()) + .or_else(|| document_policy.filter(|policy| !policy.is_empty())) + .unwrap_or(DEFAULT_REFERRER_POLICY) +} + const VALID_REFERRER_POLICIES: &[&str] = &[ "no-referrer", "no-referrer-when-downgrade", @@ -73,10 +84,7 @@ pub fn referrer_value( return None; } - let policy = referrer_policy - .filter(|policy| !policy.is_empty()) - .or_else(|| document_referrer_policy.filter(|policy| !policy.is_empty())) - .unwrap_or(DEFAULT_REFERRER_POLICY); + let policy = effective_referrer_policy(referrer_policy, document_referrer_policy); let same_origin = same_origin(referrer_url, request_url); let downgrade = is_downgrade_request(referrer_url, request_url); @@ -342,3 +350,20 @@ mod empty_policy_tests { } } } + +#[cfg(test)] +mod inheritance_tests { + use super::{DEFAULT_REFERRER_POLICY, effective_referrer_policy}; + #[test] + fn effective_policy_uses_request_then_document_then_default() { + for (request, document, expected) in [ + (None, None, DEFAULT_REFERRER_POLICY), + (Some(""), Some(""), DEFAULT_REFERRER_POLICY), + (None, Some("no-referrer"), "no-referrer"), + (Some(""), Some("origin"), "origin"), + (Some("same-origin"), Some("origin"), "same-origin"), + ] { + assert_eq!(effective_referrer_policy(request, document), expected); + } + } +}