diff options
12 files changed, 82 insertions, 12 deletions
diff --git a/chromium/content/browser/renderer_host/render_frame_host_impl.cc b/chromium/content/browser/renderer_host/render_frame_host_impl.cc index 3c3950ace28..c48863fc9c2 100644 --- a/chromium/content/browser/renderer_host/render_frame_host_impl.cc +++ b/chromium/content/browser/renderer_host/render_frame_host_impl.cc @@ -3288,7 +3288,8 @@ net::IsolationInfo RenderFrameHostImpl::ComputeIsolationInfoInternal( url::Origin top_frame_origin = ComputeTopFrameOrigin(frame_origin); net::SchemefulSite top_frame_site = net::SchemefulSite(top_frame_origin); - net::SiteForCookies candidate_site_for_cookies(top_frame_site); + net::SiteForCookies candidate_site_for_cookies = + net::SiteForCookies::FromOrigin(top_frame_origin); std::set<net::SchemefulSite> party_context; diff --git a/chromium/content/renderer/render_frame_impl.cc b/chromium/content/renderer/render_frame_impl.cc index 6d909758a18..d0a4b0e7b13 100644 --- a/chromium/content/renderer/render_frame_impl.cc +++ b/chromium/content/renderer/render_frame_impl.cc @@ -2526,6 +2526,10 @@ void RenderFrameImpl::CommitNavigation( AssertNavigationCommits assert_navigation_commits( this, kMayReplaceInitialEmptyDocument); + if (commit_params->origin_to_commit) { + commit_params->origin_to_commit->SetFullURL(frame_->GetDocumentLoader()->OriginalUrl()); + } + SetOldPageLifecycleStateFromNewPageCommitIfNeeded( commit_params->old_page_info.get()); diff --git a/chromium/net/cookies/site_for_cookies.cc b/chromium/net/cookies/site_for_cookies.cc index 977a0b7c7af..afb5a881e35 100644 --- a/chromium/net/cookies/site_for_cookies.cc +++ b/chromium/net/cookies/site_for_cookies.cc @@ -31,8 +31,10 @@ SiteForCookies& SiteForCookies::operator=(SiteForCookies&& site_for_cookies) = // static bool SiteForCookies::FromWire(const SchemefulSite& site, bool schemefully_same, + GURL first_party_url, SiteForCookies* out) { SiteForCookies candidate(site); + candidate.first_party_url_ = first_party_url; if (site != candidate.site_) return false; @@ -44,7 +46,12 @@ bool SiteForCookies::FromWire(const SchemefulSite& site, // static SiteForCookies SiteForCookies::FromOrigin(const url::Origin& origin) { - return SiteForCookies(SchemefulSite(origin)); + SiteForCookies site_for_cookies = SiteForCookies(SchemefulSite(origin)); + if (!origin.GetFullURL().is_empty()) + site_for_cookies.first_party_url_ = origin.GetFullURL(); + else + site_for_cookies.first_party_url_ = origin.GetURL(); + return site_for_cookies; } // static @@ -204,4 +211,11 @@ void SiteForCookies::MarkIfCrossScheme(const SchemefulSite& other) { schemefully_same_ = false; } +GURL SiteForCookies::first_party_url() const { + if (first_party_url_.is_empty()) + return RepresentativeUrl(); + + return first_party_url_; +} + } // namespace net diff --git a/chromium/net/cookies/site_for_cookies.h b/chromium/net/cookies/site_for_cookies.h index d0379b23522..63acabccabd 100644 --- a/chromium/net/cookies/site_for_cookies.h +++ b/chromium/net/cookies/site_for_cookies.h @@ -59,6 +59,7 @@ class NET_EXPORT SiteForCookies { // did not lie, merely that they are well-formed. static bool FromWire(const SchemefulSite& site, bool schemefully_same, + GURL first_party_url, SiteForCookies* out); // If the origin is opaque, returns SiteForCookies that matches nothing. @@ -156,6 +157,8 @@ class NET_EXPORT SiteForCookies { return site_.site_as_origin_.host(); } + GURL first_party_url() const; + // Used for serialization/deserialization. This value is irrelevant if // site().opaque() is true. bool schemefully_same() const { return schemefully_same_; } @@ -204,6 +207,8 @@ class NET_EXPORT SiteForCookies { // irrelevant (For tests this value can also be modified by // SetSchemefullySameForTesting()). bool schemefully_same_ = false; + + GURL first_party_url_; }; } // namespace net diff --git a/chromium/services/network/public/cpp/net_ipc_param_traits.cc b/chromium/services/network/public/cpp/net_ipc_param_traits.cc index c65f02d1185..d89202efb98 100644 --- a/chromium/services/network/public/cpp/net_ipc_param_traits.cc +++ b/chromium/services/network/public/cpp/net_ipc_param_traits.cc @@ -529,17 +529,20 @@ void ParamTraits<net::SiteForCookies>::Write(base::Pickle* m, const param_type& p) { WriteParam(m, p.site()); WriteParam(m, p.schemefully_same()); + WriteParam(m, p.first_party_url().spec()); } bool ParamTraits<net::SiteForCookies>::Read(const base::Pickle* m, base::PickleIterator* iter, param_type* r) { net::SchemefulSite site; + std::string first_party_url; bool schemefully_same; - if (!ReadParam(m, iter, &site) || !ReadParam(m, iter, &schemefully_same)) + if (!ReadParam(m, iter, &site) || !ReadParam(m, iter, &schemefully_same) || + !ReadParam(m, iter, &first_party_url)) return false; - return net::SiteForCookies::FromWire(site, schemefully_same, r); + return net::SiteForCookies::FromWire(site, schemefully_same, GURL(first_party_url), r); } void ParamTraits<net::SiteForCookies>::Log(const param_type& p, @@ -558,6 +561,7 @@ void ParamTraits<url::Origin>::Write(base::Pickle* m, const url::Origin& p) { WriteParam(m, p.GetTupleOrPrecursorTupleIfOpaque().host()); WriteParam(m, p.GetTupleOrPrecursorTupleIfOpaque().port()); WriteParam(m, p.GetNonceForSerialization()); + WriteParam(m, p.GetFullURL().spec()); } bool ParamTraits<url::Origin>::Read(const base::Pickle* m, @@ -566,9 +570,11 @@ bool ParamTraits<url::Origin>::Read(const base::Pickle* m, std::string scheme; std::string host; uint16_t port; + std::string full_url; absl::optional<base::UnguessableToken> nonce_if_opaque; if (!ReadParam(m, iter, &scheme) || !ReadParam(m, iter, &host) || - !ReadParam(m, iter, &port) || !ReadParam(m, iter, &nonce_if_opaque)) { + !ReadParam(m, iter, &port) || !ReadParam(m, iter, &nonce_if_opaque) + || !ReadParam(m, iter, &full_url)) { return false; } @@ -582,6 +588,7 @@ bool ParamTraits<url::Origin>::Read(const base::Pickle* m, return false; *p = std::move(creation_result.value()); + p->SetFullURL(GURL(full_url)); return true; } diff --git a/chromium/services/network/public/cpp/site_for_cookies_mojom_traits.cc b/chromium/services/network/public/cpp/site_for_cookies_mojom_traits.cc index 48968f3e5ea..bf3ac45f8b2 100644 --- a/chromium/services/network/public/cpp/site_for_cookies_mojom_traits.cc +++ b/chromium/services/network/public/cpp/site_for_cookies_mojom_traits.cc @@ -12,12 +12,17 @@ bool StructTraits<network::mojom::SiteForCookiesDataView, net::SiteForCookies>:: Read(network::mojom::SiteForCookiesDataView data, net::SiteForCookies* out) { net::SchemefulSite site; + std::string first_party_url; if (!data.ReadSite(&site)) { return false; } + if (!data.ReadFirstPartyUrl(&first_party_url)) { + return false; + } + bool result = - net::SiteForCookies::FromWire(site, data.schemefully_same(), out); + net::SiteForCookies::FromWire(site, data.schemefully_same(), GURL(first_party_url), out); if (!result) { network::debug::SetDeserializationCrashKeyString("site_for_cookie"); } diff --git a/chromium/services/network/public/cpp/site_for_cookies_mojom_traits.h b/chromium/services/network/public/cpp/site_for_cookies_mojom_traits.h index 4e3fccddee5..9e21f030888 100644 --- a/chromium/services/network/public/cpp/site_for_cookies_mojom_traits.h +++ b/chromium/services/network/public/cpp/site_for_cookies_mojom_traits.h @@ -24,6 +24,11 @@ struct COMPONENT_EXPORT(NETWORK_CPP_COOKIES) return input.schemefully_same(); } + static std::string first_party_url( + const net::SiteForCookies& input) { + return input.first_party_url().spec(); + } + static bool Read(network::mojom::SiteForCookiesDataView data, net::SiteForCookies* out); }; diff --git a/chromium/services/network/public/mojom/site_for_cookies.mojom b/chromium/services/network/public/mojom/site_for_cookies.mojom index 1cee8c51b7c..f93b4caf7bc 100644 --- a/chromium/services/network/public/mojom/site_for_cookies.mojom +++ b/chromium/services/network/public/mojom/site_for_cookies.mojom @@ -12,4 +12,5 @@ struct SiteForCookies { // net::SiteForCookies. SchemefulSite site; bool schemefully_same; + string first_party_url; }; diff --git a/chromium/third_party/blink/renderer/platform/weborigin/security_origin.cc b/chromium/third_party/blink/renderer/platform/weborigin/security_origin.cc index 4a4d3e133b8..eb51ce46282 100644 --- a/chromium/third_party/blink/renderer/platform/weborigin/security_origin.cc +++ b/chromium/third_party/blink/renderer/platform/weborigin/security_origin.cc @@ -152,14 +152,15 @@ SecurityOrigin::SecurityOrigin(const KURL& url) // an origin with an effective port of 0. (url.HasPort() || !url.IsValid() || !url.IsHierarchical()) ? url.Port() - : DefaultPortForProtocol(url.Protocol())) {} + : DefaultPortForProtocol(url.Protocol())) { + full_url_ = url.Copy(); +} SecurityOrigin::SecurityOrigin(const String& protocol, const String& host, uint16_t port) : protocol_(protocol), host_(host), domain_(host_), port_(port) { DCHECK(!IsOpaque()); - // NOTE(juvaldma)(Chromium 67.0.3396.47) // // If DefaultPortForProtocol and IsDefaultPortForProtocol were appropriately @@ -205,7 +206,8 @@ SecurityOrigin::SecurityOrigin(const SecurityOrigin* other, agent_cluster_id_(other->agent_cluster_id_), precursor_origin_(other->precursor_origin_ ? other->precursor_origin_->IsolatedCopy() - : nullptr) {} + : nullptr), + full_url_(other->full_url_.Copy()) {} SecurityOrigin::SecurityOrigin(const SecurityOrigin* other, ConstructSameThreadCopy) @@ -223,7 +225,8 @@ SecurityOrigin::SecurityOrigin(const SecurityOrigin* other, other->is_opaque_origin_potentially_trustworthy_), cross_agent_cluster_access_(other->cross_agent_cluster_access_), agent_cluster_id_(other->agent_cluster_id_), - precursor_origin_(other->precursor_origin_) {} + precursor_origin_(other->precursor_origin_), + full_url_(other->full_url_.Copy()) {} scoped_refptr<SecurityOrigin> SecurityOrigin::CreateWithReferenceOrigin( const KURL& url, @@ -293,6 +296,7 @@ scoped_refptr<SecurityOrigin> SecurityOrigin::CreateFromUrlOrigin( url::Origin::Nonce(*nonce_if_opaque), tuple_origin.get())); } CHECK(tuple_origin); + tuple_origin->full_url_ = KURL(origin.GetFullURL()); return tuple_origin; } @@ -309,6 +313,7 @@ url::Origin SecurityOrigin::ToUrlOrigin() const { } url::Origin result = url::Origin::CreateFromNormalizedTuple( std::move(scheme), std::move(host), port); + result.SetFullURL(full_url_); CHECK(!result.opaque()); return result; } diff --git a/chromium/third_party/blink/renderer/platform/weborigin/security_origin.h b/chromium/third_party/blink/renderer/platform/weborigin/security_origin.h index bdb02e52815..ecf73684675 100644 --- a/chromium/third_party/blink/renderer/platform/weborigin/security_origin.h +++ b/chromium/third_party/blink/renderer/platform/weborigin/security_origin.h @@ -35,6 +35,7 @@ #include "base/gtest_prod_util.h" #include "base/macros.h" #include "third_party/blink/renderer/platform/platform_export.h" +#include "third_party/blink/renderer/platform/weborigin/kurl.h" #include "third_party/blink/renderer/platform/wtf/allocator/allocator.h" #include "third_party/blink/renderer/platform/wtf/text/wtf_string.h" #include "third_party/blink/renderer/platform/wtf/thread_safe_ref_counted.h" @@ -421,7 +422,7 @@ class PLATFORM_EXPORT SecurityOrigin : public RefCounted<SecurityOrigin> { const String host_ = g_empty_string; String domain_ = g_empty_string; uint16_t port_ = 0; - const absl::Optional<url::Origin::Nonce> nonce_if_opaque_; + const absl::optional<url::Origin::Nonce> nonce_if_opaque_; bool universal_access_ = false; bool domain_was_set_in_dom_ = false; bool can_load_local_resources_ = false; @@ -437,6 +438,8 @@ class PLATFORM_EXPORT SecurityOrigin : public RefCounted<SecurityOrigin> { // origin is derived. const scoped_refptr<const SecurityOrigin> precursor_origin_; + KURL full_url_; + DISALLOW_COPY_AND_ASSIGN(SecurityOrigin); }; diff --git a/chromium/url/origin.cc b/chromium/url/origin.cc index 0fda176b48c..dd8fd5ae0b1 100644 --- a/chromium/url/origin.cc +++ b/chromium/url/origin.cc @@ -56,7 +56,10 @@ Origin Origin::Create(const GURL& url) { if (!tuple.IsValid()) return Origin(); - return Origin(std::move(tuple)); + + Origin origin = Origin(std::move(tuple)); + origin.full_url_ = url; + return origin; } Origin Origin::Resolve(const GURL& url, const Origin& base_origin) { @@ -150,6 +153,17 @@ GURL Origin::GetURL() const { return tuple_.GetURL(); } +GURL Origin::GetFullURL() const { + if (opaque()) + return GURL(); + + return full_url_; +} + +void Origin::SetFullURL(const GURL &url) { + full_url_ = url; +} + absl::optional<base::UnguessableToken> Origin::GetNonceForSerialization() const { // TODO(nasko): Consider not making a copy here, but return a reference to diff --git a/chromium/url/origin.h b/chromium/url/origin.h index 17cadf356b9..222f1d290f1 100644 --- a/chromium/url/origin.h +++ b/chromium/url/origin.h @@ -20,6 +20,7 @@ #include "ipc/ipc_param_traits.h" #include "third_party/abseil-cpp/absl/types/optional.h" #include "third_party/perfetto/include/perfetto/tracing/traced_value_forward.h" +#include "url/gurl.h" #include "url/scheme_host_port.h" #include "url/third_party/mozilla/url_parse.h" #include "url/url_canon.h" @@ -259,6 +260,9 @@ class COMPONENT_EXPORT(URL) Origin { // URL (e.g. with a path component). GURL GetURL() const; + GURL GetFullURL() const; + void SetFullURL(const GURL &url); + // Same as GURL::DomainIs. If |this| origin is opaque, then returns false. bool DomainIs(base::StringPiece canonical_domain) const; @@ -422,6 +426,8 @@ class COMPONENT_EXPORT(URL) Origin { // nonce is preserved when an opaque origin is copied or moved. An Origin // is considered opaque if and only if |nonce_| holds a value. absl::optional<Nonce> nonce_; + + GURL full_url_; }; // Pretty-printers for logging. These expose the internal state of the nonce. |