xref: /aosp_15_r20/external/cronet/net/base/isolation_info.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker // Copyright 2020 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker 
5*6777b538SAndroid Build Coastguard Worker #include "net/base/isolation_info.h"
6*6777b538SAndroid Build Coastguard Worker 
7*6777b538SAndroid Build Coastguard Worker #include <cstddef>
8*6777b538SAndroid Build Coastguard Worker #include <optional>
9*6777b538SAndroid Build Coastguard Worker 
10*6777b538SAndroid Build Coastguard Worker #include "base/check_op.h"
11*6777b538SAndroid Build Coastguard Worker #include "base/unguessable_token.h"
12*6777b538SAndroid Build Coastguard Worker #include "net/base/features.h"
13*6777b538SAndroid Build Coastguard Worker #include "net/base/isolation_info.h"
14*6777b538SAndroid Build Coastguard Worker #include "net/base/isolation_info.pb.h"
15*6777b538SAndroid Build Coastguard Worker #include "net/base/network_anonymization_key.h"
16*6777b538SAndroid Build Coastguard Worker #include "net/base/proxy_server.h"
17*6777b538SAndroid Build Coastguard Worker 
18*6777b538SAndroid Build Coastguard Worker namespace net {
19*6777b538SAndroid Build Coastguard Worker 
20*6777b538SAndroid Build Coastguard Worker namespace {
21*6777b538SAndroid Build Coastguard Worker 
22*6777b538SAndroid Build Coastguard Worker // Checks that |origin| is consistent with |site_for_cookies|.
ValidateSameSite(const url::Origin & origin,const SiteForCookies & site_for_cookies)23*6777b538SAndroid Build Coastguard Worker bool ValidateSameSite(const url::Origin& origin,
24*6777b538SAndroid Build Coastguard Worker                       const SiteForCookies& site_for_cookies) {
25*6777b538SAndroid Build Coastguard Worker   // If not sending SameSite cookies, or sending them for a non-scheme, consider
26*6777b538SAndroid Build Coastguard Worker   // all origins consistent. Note that SiteForCookies should never be created
27*6777b538SAndroid Build Coastguard Worker   // for websocket schemes for valid navigations, since frames can't be
28*6777b538SAndroid Build Coastguard Worker   // navigated to those schemes.
29*6777b538SAndroid Build Coastguard Worker   if (site_for_cookies.IsNull() ||
30*6777b538SAndroid Build Coastguard Worker       (site_for_cookies.scheme() != url::kHttpScheme &&
31*6777b538SAndroid Build Coastguard Worker        site_for_cookies.scheme() != url::kHttpsScheme)) {
32*6777b538SAndroid Build Coastguard Worker     return true;
33*6777b538SAndroid Build Coastguard Worker   }
34*6777b538SAndroid Build Coastguard Worker 
35*6777b538SAndroid Build Coastguard Worker   // Shouldn't send cookies for opaque origins.
36*6777b538SAndroid Build Coastguard Worker   if (origin.opaque())
37*6777b538SAndroid Build Coastguard Worker     return false;
38*6777b538SAndroid Build Coastguard Worker 
39*6777b538SAndroid Build Coastguard Worker   // TODO(https://crbug.com/1060631): GetURL() is expensive. Maybe make a
40*6777b538SAndroid Build Coastguard Worker   // version of IsFirstParty that works on origins?
41*6777b538SAndroid Build Coastguard Worker   return site_for_cookies.IsFirstParty(origin.GetURL());
42*6777b538SAndroid Build Coastguard Worker }
43*6777b538SAndroid Build Coastguard Worker 
44*6777b538SAndroid Build Coastguard Worker // Checks if these values are consistent. See IsolationInfo::Create() for
45*6777b538SAndroid Build Coastguard Worker // descriptions of consistent sets of values. Also allows values used by the
46*6777b538SAndroid Build Coastguard Worker // 0-argument constructor.
IsConsistent(IsolationInfo::RequestType request_type,const std::optional<url::Origin> & top_frame_origin,const std::optional<url::Origin> & frame_origin,const SiteForCookies & site_for_cookies,const std::optional<base::UnguessableToken> & nonce)47*6777b538SAndroid Build Coastguard Worker bool IsConsistent(IsolationInfo::RequestType request_type,
48*6777b538SAndroid Build Coastguard Worker                   const std::optional<url::Origin>& top_frame_origin,
49*6777b538SAndroid Build Coastguard Worker                   const std::optional<url::Origin>& frame_origin,
50*6777b538SAndroid Build Coastguard Worker                   const SiteForCookies& site_for_cookies,
51*6777b538SAndroid Build Coastguard Worker                   const std::optional<base::UnguessableToken>& nonce) {
52*6777b538SAndroid Build Coastguard Worker   // Check for the default-constructed case.
53*6777b538SAndroid Build Coastguard Worker   if (!top_frame_origin) {
54*6777b538SAndroid Build Coastguard Worker     return request_type == IsolationInfo::RequestType::kOther &&
55*6777b538SAndroid Build Coastguard Worker            !frame_origin && !nonce && site_for_cookies.IsNull();
56*6777b538SAndroid Build Coastguard Worker   }
57*6777b538SAndroid Build Coastguard Worker 
58*6777b538SAndroid Build Coastguard Worker   // As long as there is a |top_frame_origin|, |site_for_cookies| must be
59*6777b538SAndroid Build Coastguard Worker   // consistent with the |top_frame_origin|.
60*6777b538SAndroid Build Coastguard Worker   if (!ValidateSameSite(*top_frame_origin, site_for_cookies))
61*6777b538SAndroid Build Coastguard Worker     return false;
62*6777b538SAndroid Build Coastguard Worker 
63*6777b538SAndroid Build Coastguard Worker   // Validate frame `frame_origin`
64*6777b538SAndroid Build Coastguard Worker   // IsolationInfo must have a `frame_origin` when frame origins are enabled
65*6777b538SAndroid Build Coastguard Worker   // and the IsolationInfo is not default-constructed.
66*6777b538SAndroid Build Coastguard Worker   if (!frame_origin) {
67*6777b538SAndroid Build Coastguard Worker     return false;
68*6777b538SAndroid Build Coastguard Worker   }
69*6777b538SAndroid Build Coastguard Worker   switch (request_type) {
70*6777b538SAndroid Build Coastguard Worker     case IsolationInfo::RequestType::kMainFrame:
71*6777b538SAndroid Build Coastguard Worker       // TODO(https://crbug.com/1056706): Check that |top_frame_origin| and
72*6777b538SAndroid Build Coastguard Worker       // |frame_origin| are the same, once the ViewSource code creates a
73*6777b538SAndroid Build Coastguard Worker       // consistent IsolationInfo object.
74*6777b538SAndroid Build Coastguard Worker       //
75*6777b538SAndroid Build Coastguard Worker       // TODO(https://crbug.com/1060631): Once CreatePartial() is removed,
76*6777b538SAndroid Build Coastguard Worker       // check if SiteForCookies is non-null if the scheme is HTTP or HTTPS.
77*6777b538SAndroid Build Coastguard Worker       break;
78*6777b538SAndroid Build Coastguard Worker     case IsolationInfo::RequestType::kSubFrame:
79*6777b538SAndroid Build Coastguard Worker       // For subframe navigations, the subframe's origin may not be consistent
80*6777b538SAndroid Build Coastguard Worker       // with the SiteForCookies, so SameSite cookies may be sent if there's a
81*6777b538SAndroid Build Coastguard Worker       // redirect to main frames site.
82*6777b538SAndroid Build Coastguard Worker       break;
83*6777b538SAndroid Build Coastguard Worker     case IsolationInfo::RequestType::kOther:
84*6777b538SAndroid Build Coastguard Worker       // SiteForCookies must consistent with the frame origin as well for
85*6777b538SAndroid Build Coastguard Worker       // subresources.
86*6777b538SAndroid Build Coastguard Worker       return ValidateSameSite(*frame_origin, site_for_cookies);
87*6777b538SAndroid Build Coastguard Worker   }
88*6777b538SAndroid Build Coastguard Worker   return true;
89*6777b538SAndroid Build Coastguard Worker }
90*6777b538SAndroid Build Coastguard Worker 
91*6777b538SAndroid Build Coastguard Worker }  // namespace
92*6777b538SAndroid Build Coastguard Worker 
IsolationInfo()93*6777b538SAndroid Build Coastguard Worker IsolationInfo::IsolationInfo()
94*6777b538SAndroid Build Coastguard Worker     : IsolationInfo(RequestType::kOther,
95*6777b538SAndroid Build Coastguard Worker                     /*top_frame_origin=*/std::nullopt,
96*6777b538SAndroid Build Coastguard Worker                     /*frame_origin=*/std::nullopt,
97*6777b538SAndroid Build Coastguard Worker                     SiteForCookies(),
98*6777b538SAndroid Build Coastguard Worker                     /*nonce=*/std::nullopt) {}
99*6777b538SAndroid Build Coastguard Worker 
100*6777b538SAndroid Build Coastguard Worker IsolationInfo::IsolationInfo(const IsolationInfo&) = default;
101*6777b538SAndroid Build Coastguard Worker IsolationInfo::IsolationInfo(IsolationInfo&&) = default;
102*6777b538SAndroid Build Coastguard Worker IsolationInfo::~IsolationInfo() = default;
103*6777b538SAndroid Build Coastguard Worker IsolationInfo& IsolationInfo::operator=(const IsolationInfo&) = default;
104*6777b538SAndroid Build Coastguard Worker IsolationInfo& IsolationInfo::operator=(IsolationInfo&&) = default;
105*6777b538SAndroid Build Coastguard Worker 
CreateForInternalRequest(const url::Origin & top_frame_origin)106*6777b538SAndroid Build Coastguard Worker IsolationInfo IsolationInfo::CreateForInternalRequest(
107*6777b538SAndroid Build Coastguard Worker     const url::Origin& top_frame_origin) {
108*6777b538SAndroid Build Coastguard Worker   return IsolationInfo(RequestType::kOther, top_frame_origin, top_frame_origin,
109*6777b538SAndroid Build Coastguard Worker                        SiteForCookies::FromOrigin(top_frame_origin),
110*6777b538SAndroid Build Coastguard Worker                        /*nonce=*/std::nullopt);
111*6777b538SAndroid Build Coastguard Worker }
112*6777b538SAndroid Build Coastguard Worker 
CreateTransient()113*6777b538SAndroid Build Coastguard Worker IsolationInfo IsolationInfo::CreateTransient() {
114*6777b538SAndroid Build Coastguard Worker   url::Origin opaque_origin;
115*6777b538SAndroid Build Coastguard Worker   return IsolationInfo(RequestType::kOther, opaque_origin, opaque_origin,
116*6777b538SAndroid Build Coastguard Worker                        SiteForCookies(), /*nonce=*/std::nullopt);
117*6777b538SAndroid Build Coastguard Worker }
118*6777b538SAndroid Build Coastguard Worker 
CreateTransientWithNonce(const base::UnguessableToken & nonce)119*6777b538SAndroid Build Coastguard Worker IsolationInfo IsolationInfo::CreateTransientWithNonce(
120*6777b538SAndroid Build Coastguard Worker     const base::UnguessableToken& nonce) {
121*6777b538SAndroid Build Coastguard Worker   url::Origin opaque_origin;
122*6777b538SAndroid Build Coastguard Worker   return IsolationInfo(RequestType::kOther, opaque_origin, opaque_origin,
123*6777b538SAndroid Build Coastguard Worker                        SiteForCookies(), nonce);
124*6777b538SAndroid Build Coastguard Worker }
125*6777b538SAndroid Build Coastguard Worker 
Deserialize(const std::string & serialized)126*6777b538SAndroid Build Coastguard Worker std::optional<IsolationInfo> IsolationInfo::Deserialize(
127*6777b538SAndroid Build Coastguard Worker     const std::string& serialized) {
128*6777b538SAndroid Build Coastguard Worker   proto::IsolationInfo proto;
129*6777b538SAndroid Build Coastguard Worker   if (!proto.ParseFromString(serialized))
130*6777b538SAndroid Build Coastguard Worker     return std::nullopt;
131*6777b538SAndroid Build Coastguard Worker 
132*6777b538SAndroid Build Coastguard Worker   std::optional<url::Origin> top_frame_origin;
133*6777b538SAndroid Build Coastguard Worker   if (proto.has_top_frame_origin())
134*6777b538SAndroid Build Coastguard Worker     top_frame_origin = url::Origin::Create(GURL(proto.top_frame_origin()));
135*6777b538SAndroid Build Coastguard Worker 
136*6777b538SAndroid Build Coastguard Worker   std::optional<url::Origin> frame_origin;
137*6777b538SAndroid Build Coastguard Worker   if (proto.has_frame_origin())
138*6777b538SAndroid Build Coastguard Worker     frame_origin = url::Origin::Create(GURL(proto.frame_origin()));
139*6777b538SAndroid Build Coastguard Worker 
140*6777b538SAndroid Build Coastguard Worker   return IsolationInfo::CreateIfConsistent(
141*6777b538SAndroid Build Coastguard Worker       static_cast<RequestType>(proto.request_type()),
142*6777b538SAndroid Build Coastguard Worker       std::move(top_frame_origin), std::move(frame_origin),
143*6777b538SAndroid Build Coastguard Worker       SiteForCookies::FromUrl(GURL(proto.site_for_cookies())),
144*6777b538SAndroid Build Coastguard Worker       /*nonce=*/std::nullopt);
145*6777b538SAndroid Build Coastguard Worker }
146*6777b538SAndroid Build Coastguard Worker 
Create(RequestType request_type,const url::Origin & top_frame_origin,const url::Origin & frame_origin,const SiteForCookies & site_for_cookies,const std::optional<base::UnguessableToken> & nonce)147*6777b538SAndroid Build Coastguard Worker IsolationInfo IsolationInfo::Create(
148*6777b538SAndroid Build Coastguard Worker     RequestType request_type,
149*6777b538SAndroid Build Coastguard Worker     const url::Origin& top_frame_origin,
150*6777b538SAndroid Build Coastguard Worker     const url::Origin& frame_origin,
151*6777b538SAndroid Build Coastguard Worker     const SiteForCookies& site_for_cookies,
152*6777b538SAndroid Build Coastguard Worker     const std::optional<base::UnguessableToken>& nonce) {
153*6777b538SAndroid Build Coastguard Worker   return IsolationInfo(request_type, top_frame_origin, frame_origin,
154*6777b538SAndroid Build Coastguard Worker                        site_for_cookies, nonce);
155*6777b538SAndroid Build Coastguard Worker }
156*6777b538SAndroid Build Coastguard Worker 
DoNotUseCreatePartialFromNak(const net::NetworkAnonymizationKey & network_anonymization_key)157*6777b538SAndroid Build Coastguard Worker IsolationInfo IsolationInfo::DoNotUseCreatePartialFromNak(
158*6777b538SAndroid Build Coastguard Worker     const net::NetworkAnonymizationKey& network_anonymization_key) {
159*6777b538SAndroid Build Coastguard Worker   if (!network_anonymization_key.IsFullyPopulated()) {
160*6777b538SAndroid Build Coastguard Worker     return IsolationInfo();
161*6777b538SAndroid Build Coastguard Worker   }
162*6777b538SAndroid Build Coastguard Worker 
163*6777b538SAndroid Build Coastguard Worker   url::Origin top_frame_origin =
164*6777b538SAndroid Build Coastguard Worker       network_anonymization_key.GetTopFrameSite()->site_as_origin_;
165*6777b538SAndroid Build Coastguard Worker 
166*6777b538SAndroid Build Coastguard Worker   std::optional<url::Origin> frame_origin;
167*6777b538SAndroid Build Coastguard Worker   if (network_anonymization_key.IsCrossSite()) {
168*6777b538SAndroid Build Coastguard Worker     // If we know that the origin is cross site to the top level site, create an
169*6777b538SAndroid Build Coastguard Worker     // empty origin to use as the frame origin for the isolation info. This
170*6777b538SAndroid Build Coastguard Worker     // should be cross site with the top level origin.
171*6777b538SAndroid Build Coastguard Worker     frame_origin = url::Origin();
172*6777b538SAndroid Build Coastguard Worker   } else {
173*6777b538SAndroid Build Coastguard Worker     // If we don't know that it's cross site to the top level site, use the top
174*6777b538SAndroid Build Coastguard Worker     // frame site to set the frame origin.
175*6777b538SAndroid Build Coastguard Worker     frame_origin = top_frame_origin;
176*6777b538SAndroid Build Coastguard Worker   }
177*6777b538SAndroid Build Coastguard Worker 
178*6777b538SAndroid Build Coastguard Worker   const std::optional<base::UnguessableToken>& nonce =
179*6777b538SAndroid Build Coastguard Worker       network_anonymization_key.GetNonce();
180*6777b538SAndroid Build Coastguard Worker 
181*6777b538SAndroid Build Coastguard Worker   auto isolation_info = IsolationInfo::Create(
182*6777b538SAndroid Build Coastguard Worker       IsolationInfo::RequestType::kOther, top_frame_origin,
183*6777b538SAndroid Build Coastguard Worker       frame_origin.value(), SiteForCookies(), nonce);
184*6777b538SAndroid Build Coastguard Worker   // TODO(crbug/1343856): DCHECK isolation info is fully populated.
185*6777b538SAndroid Build Coastguard Worker   return isolation_info;
186*6777b538SAndroid Build Coastguard Worker }
187*6777b538SAndroid Build Coastguard Worker 
CreateIfConsistent(RequestType request_type,const std::optional<url::Origin> & top_frame_origin,const std::optional<url::Origin> & frame_origin,const SiteForCookies & site_for_cookies,const std::optional<base::UnguessableToken> & nonce)188*6777b538SAndroid Build Coastguard Worker std::optional<IsolationInfo> IsolationInfo::CreateIfConsistent(
189*6777b538SAndroid Build Coastguard Worker     RequestType request_type,
190*6777b538SAndroid Build Coastguard Worker     const std::optional<url::Origin>& top_frame_origin,
191*6777b538SAndroid Build Coastguard Worker     const std::optional<url::Origin>& frame_origin,
192*6777b538SAndroid Build Coastguard Worker     const SiteForCookies& site_for_cookies,
193*6777b538SAndroid Build Coastguard Worker     const std::optional<base::UnguessableToken>& nonce) {
194*6777b538SAndroid Build Coastguard Worker   if (!IsConsistent(request_type, top_frame_origin, frame_origin,
195*6777b538SAndroid Build Coastguard Worker                     site_for_cookies, nonce)) {
196*6777b538SAndroid Build Coastguard Worker     return std::nullopt;
197*6777b538SAndroid Build Coastguard Worker   }
198*6777b538SAndroid Build Coastguard Worker   return IsolationInfo(request_type, top_frame_origin, frame_origin,
199*6777b538SAndroid Build Coastguard Worker                        site_for_cookies, nonce);
200*6777b538SAndroid Build Coastguard Worker }
201*6777b538SAndroid Build Coastguard Worker 
CreateForRedirect(const url::Origin & new_origin) const202*6777b538SAndroid Build Coastguard Worker IsolationInfo IsolationInfo::CreateForRedirect(
203*6777b538SAndroid Build Coastguard Worker     const url::Origin& new_origin) const {
204*6777b538SAndroid Build Coastguard Worker   if (request_type_ == RequestType::kOther)
205*6777b538SAndroid Build Coastguard Worker     return *this;
206*6777b538SAndroid Build Coastguard Worker 
207*6777b538SAndroid Build Coastguard Worker   if (request_type_ == RequestType::kSubFrame) {
208*6777b538SAndroid Build Coastguard Worker     return IsolationInfo(request_type_, top_frame_origin_, new_origin,
209*6777b538SAndroid Build Coastguard Worker                          site_for_cookies_, nonce_);
210*6777b538SAndroid Build Coastguard Worker   }
211*6777b538SAndroid Build Coastguard Worker 
212*6777b538SAndroid Build Coastguard Worker   DCHECK_EQ(RequestType::kMainFrame, request_type_);
213*6777b538SAndroid Build Coastguard Worker   return IsolationInfo(request_type_, new_origin, new_origin,
214*6777b538SAndroid Build Coastguard Worker                        SiteForCookies::FromOrigin(new_origin), nonce_);
215*6777b538SAndroid Build Coastguard Worker }
216*6777b538SAndroid Build Coastguard Worker 
frame_origin() const217*6777b538SAndroid Build Coastguard Worker const std::optional<url::Origin>& IsolationInfo::frame_origin() const {
218*6777b538SAndroid Build Coastguard Worker   return frame_origin_;
219*6777b538SAndroid Build Coastguard Worker }
220*6777b538SAndroid Build Coastguard Worker 
frame_origin_for_testing() const221*6777b538SAndroid Build Coastguard Worker const std::optional<url::Origin>& IsolationInfo::frame_origin_for_testing()
222*6777b538SAndroid Build Coastguard Worker     const {
223*6777b538SAndroid Build Coastguard Worker   return frame_origin_;
224*6777b538SAndroid Build Coastguard Worker }
225*6777b538SAndroid Build Coastguard Worker 
IsEqualForTesting(const IsolationInfo & other) const226*6777b538SAndroid Build Coastguard Worker bool IsolationInfo::IsEqualForTesting(const IsolationInfo& other) const {
227*6777b538SAndroid Build Coastguard Worker   return (request_type_ == other.request_type_ &&
228*6777b538SAndroid Build Coastguard Worker           top_frame_origin_ == other.top_frame_origin_ &&
229*6777b538SAndroid Build Coastguard Worker           frame_origin_ == other.frame_origin_ &&
230*6777b538SAndroid Build Coastguard Worker           network_isolation_key_ == other.network_isolation_key_ &&
231*6777b538SAndroid Build Coastguard Worker           network_anonymization_key_ == other.network_anonymization_key_ &&
232*6777b538SAndroid Build Coastguard Worker           nonce_ == other.nonce_ &&
233*6777b538SAndroid Build Coastguard Worker           site_for_cookies_.IsEquivalent(other.site_for_cookies_));
234*6777b538SAndroid Build Coastguard Worker }
235*6777b538SAndroid Build Coastguard Worker 
Serialize() const236*6777b538SAndroid Build Coastguard Worker std::string IsolationInfo::Serialize() const {
237*6777b538SAndroid Build Coastguard Worker   if (network_isolation_key().IsTransient())
238*6777b538SAndroid Build Coastguard Worker     return "";
239*6777b538SAndroid Build Coastguard Worker 
240*6777b538SAndroid Build Coastguard Worker   proto::IsolationInfo info;
241*6777b538SAndroid Build Coastguard Worker 
242*6777b538SAndroid Build Coastguard Worker   info.set_request_type(static_cast<int32_t>(request_type_));
243*6777b538SAndroid Build Coastguard Worker 
244*6777b538SAndroid Build Coastguard Worker   if (top_frame_origin_)
245*6777b538SAndroid Build Coastguard Worker     info.set_top_frame_origin(top_frame_origin_->Serialize());
246*6777b538SAndroid Build Coastguard Worker 
247*6777b538SAndroid Build Coastguard Worker   if (frame_origin_)
248*6777b538SAndroid Build Coastguard Worker     info.set_frame_origin(frame_origin_->Serialize());
249*6777b538SAndroid Build Coastguard Worker 
250*6777b538SAndroid Build Coastguard Worker   info.set_site_for_cookies(site_for_cookies_.RepresentativeUrl().spec());
251*6777b538SAndroid Build Coastguard Worker 
252*6777b538SAndroid Build Coastguard Worker   return info.SerializeAsString();
253*6777b538SAndroid Build Coastguard Worker }
254*6777b538SAndroid Build Coastguard Worker 
DebugString() const255*6777b538SAndroid Build Coastguard Worker std::string IsolationInfo::DebugString() const {
256*6777b538SAndroid Build Coastguard Worker   std::string s;
257*6777b538SAndroid Build Coastguard Worker   s += "request_type: ";
258*6777b538SAndroid Build Coastguard Worker   switch (request_type_) {
259*6777b538SAndroid Build Coastguard Worker     case IsolationInfo::RequestType::kMainFrame:
260*6777b538SAndroid Build Coastguard Worker       s += "kMainFrame";
261*6777b538SAndroid Build Coastguard Worker       break;
262*6777b538SAndroid Build Coastguard Worker     case IsolationInfo::RequestType::kSubFrame:
263*6777b538SAndroid Build Coastguard Worker       s += "kSubFrame";
264*6777b538SAndroid Build Coastguard Worker       break;
265*6777b538SAndroid Build Coastguard Worker     case IsolationInfo::RequestType::kOther:
266*6777b538SAndroid Build Coastguard Worker       s += "kOther";
267*6777b538SAndroid Build Coastguard Worker       break;
268*6777b538SAndroid Build Coastguard Worker   }
269*6777b538SAndroid Build Coastguard Worker 
270*6777b538SAndroid Build Coastguard Worker   s += "; top_frame_origin: ";
271*6777b538SAndroid Build Coastguard Worker   if (top_frame_origin_) {
272*6777b538SAndroid Build Coastguard Worker     s += top_frame_origin_.value().GetDebugString(true);
273*6777b538SAndroid Build Coastguard Worker   } else {
274*6777b538SAndroid Build Coastguard Worker     s += "(none)";
275*6777b538SAndroid Build Coastguard Worker   }
276*6777b538SAndroid Build Coastguard Worker 
277*6777b538SAndroid Build Coastguard Worker   s += "; frame_origin: ";
278*6777b538SAndroid Build Coastguard Worker   if (frame_origin_) {
279*6777b538SAndroid Build Coastguard Worker     s += frame_origin_.value().GetDebugString(true);
280*6777b538SAndroid Build Coastguard Worker   } else {
281*6777b538SAndroid Build Coastguard Worker     s += "(none)";
282*6777b538SAndroid Build Coastguard Worker   }
283*6777b538SAndroid Build Coastguard Worker 
284*6777b538SAndroid Build Coastguard Worker   s += "; network_anonymization_key: ";
285*6777b538SAndroid Build Coastguard Worker   s += network_anonymization_key_.ToDebugString();
286*6777b538SAndroid Build Coastguard Worker 
287*6777b538SAndroid Build Coastguard Worker   s += "; network_isolation_key: ";
288*6777b538SAndroid Build Coastguard Worker   s += network_isolation_key_.ToDebugString();
289*6777b538SAndroid Build Coastguard Worker 
290*6777b538SAndroid Build Coastguard Worker   s += "; nonce: ";
291*6777b538SAndroid Build Coastguard Worker   if (nonce_) {
292*6777b538SAndroid Build Coastguard Worker     s += nonce_.value().ToString();
293*6777b538SAndroid Build Coastguard Worker   } else {
294*6777b538SAndroid Build Coastguard Worker     s += "(none)";
295*6777b538SAndroid Build Coastguard Worker   }
296*6777b538SAndroid Build Coastguard Worker 
297*6777b538SAndroid Build Coastguard Worker   s += "; site_for_cookies: ";
298*6777b538SAndroid Build Coastguard Worker   s += site_for_cookies_.ToDebugString();
299*6777b538SAndroid Build Coastguard Worker 
300*6777b538SAndroid Build Coastguard Worker   return s;
301*6777b538SAndroid Build Coastguard Worker }
302*6777b538SAndroid Build Coastguard Worker 
303*6777b538SAndroid Build Coastguard Worker NetworkAnonymizationKey
CreateNetworkAnonymizationKeyForIsolationInfo(const std::optional<url::Origin> & top_frame_origin,const std::optional<url::Origin> & frame_origin,const std::optional<base::UnguessableToken> & nonce) const304*6777b538SAndroid Build Coastguard Worker IsolationInfo::CreateNetworkAnonymizationKeyForIsolationInfo(
305*6777b538SAndroid Build Coastguard Worker     const std::optional<url::Origin>& top_frame_origin,
306*6777b538SAndroid Build Coastguard Worker     const std::optional<url::Origin>& frame_origin,
307*6777b538SAndroid Build Coastguard Worker     const std::optional<base::UnguessableToken>& nonce) const {
308*6777b538SAndroid Build Coastguard Worker   if (!top_frame_origin) {
309*6777b538SAndroid Build Coastguard Worker     return NetworkAnonymizationKey();
310*6777b538SAndroid Build Coastguard Worker   }
311*6777b538SAndroid Build Coastguard Worker   SchemefulSite top_frame_site(*top_frame_origin);
312*6777b538SAndroid Build Coastguard Worker   SchemefulSite frame_site(*frame_origin);
313*6777b538SAndroid Build Coastguard Worker 
314*6777b538SAndroid Build Coastguard Worker   return NetworkAnonymizationKey::CreateFromFrameSite(top_frame_site,
315*6777b538SAndroid Build Coastguard Worker                                                       frame_site, nonce);
316*6777b538SAndroid Build Coastguard Worker }
317*6777b538SAndroid Build Coastguard Worker 
IsolationInfo(RequestType request_type,const std::optional<url::Origin> & top_frame_origin,const std::optional<url::Origin> & frame_origin,const SiteForCookies & site_for_cookies,const std::optional<base::UnguessableToken> & nonce)318*6777b538SAndroid Build Coastguard Worker IsolationInfo::IsolationInfo(RequestType request_type,
319*6777b538SAndroid Build Coastguard Worker                              const std::optional<url::Origin>& top_frame_origin,
320*6777b538SAndroid Build Coastguard Worker                              const std::optional<url::Origin>& frame_origin,
321*6777b538SAndroid Build Coastguard Worker                              const SiteForCookies& site_for_cookies,
322*6777b538SAndroid Build Coastguard Worker                              const std::optional<base::UnguessableToken>& nonce)
323*6777b538SAndroid Build Coastguard Worker     : request_type_(request_type),
324*6777b538SAndroid Build Coastguard Worker       top_frame_origin_(top_frame_origin),
325*6777b538SAndroid Build Coastguard Worker       frame_origin_(frame_origin),
326*6777b538SAndroid Build Coastguard Worker       network_isolation_key_(
327*6777b538SAndroid Build Coastguard Worker           !top_frame_origin
328*6777b538SAndroid Build Coastguard Worker               ? NetworkIsolationKey()
329*6777b538SAndroid Build Coastguard Worker               : NetworkIsolationKey(SchemefulSite(*top_frame_origin),
330*6777b538SAndroid Build Coastguard Worker                                     SchemefulSite(*frame_origin),
331*6777b538SAndroid Build Coastguard Worker                                     nonce)),
332*6777b538SAndroid Build Coastguard Worker       network_anonymization_key_(
333*6777b538SAndroid Build Coastguard Worker           CreateNetworkAnonymizationKeyForIsolationInfo(top_frame_origin,
334*6777b538SAndroid Build Coastguard Worker                                                         frame_origin,
335*6777b538SAndroid Build Coastguard Worker                                                         nonce)),
336*6777b538SAndroid Build Coastguard Worker       site_for_cookies_(site_for_cookies),
337*6777b538SAndroid Build Coastguard Worker       nonce_(nonce) {
338*6777b538SAndroid Build Coastguard Worker   DCHECK(IsConsistent(request_type_, top_frame_origin_, frame_origin_,
339*6777b538SAndroid Build Coastguard Worker                       site_for_cookies_, nonce));
340*6777b538SAndroid Build Coastguard Worker }
341*6777b538SAndroid Build Coastguard Worker 
342*6777b538SAndroid Build Coastguard Worker }  // namespace net
343