summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTamas Zakor <ztamas@inf.u-szeged.hu>2021-02-09 07:32:37 +0100
committerAllan Sandfeld Jensen <allan.jensen@qt.io>2021-10-04 10:20:24 +0200
commit0eece207151219e9766c031faeaf2099fc74c65e (patch)
treee8c7a4013b78ffc66a06f599686dd4311aceb427
parent99ffecb5ee074eda8223a9cc35ac35c038cd9b79 (diff)
downloadqtwebengine-chromium-0eece207151219e9766c031faeaf2099fc74c65e.tar.gz
Add first_party_url for net::SiteForCookies
This change brings back the behavior when the site for cookies was stored as an URL before Chromium 81. QtWebEngine implementation relies on that becuase it uses SiteForCookies to provide first party url in some cases. The site for cookies url was replaced by net::SiteForCookies in change https://chromium-review.googlesource.com/c/chromium/src/+/1925189 Task-number: QTBUG-90231 Change-Id: Ie1e4be21535a646699b031c3a2ebdb0a19617fc7 Reviewed-by: Florian Bruhin <qt-project.org@the-compiler.org> Reviewed-by: Kirill Burtsev <kirill.burtsev@qt.io> Reviewed-by: Peter Varga <pvarga@inf.u-szeged.hu>
-rw-r--r--chromium/content/browser/renderer_host/render_frame_host_impl.cc3
-rw-r--r--chromium/content/renderer/render_frame_impl.cc4
-rw-r--r--chromium/net/cookies/site_for_cookies.cc16
-rw-r--r--chromium/net/cookies/site_for_cookies.h5
-rw-r--r--chromium/services/network/public/cpp/net_ipc_param_traits.cc13
-rw-r--r--chromium/services/network/public/cpp/site_for_cookies_mojom_traits.cc7
-rw-r--r--chromium/services/network/public/cpp/site_for_cookies_mojom_traits.h5
-rw-r--r--chromium/services/network/public/mojom/site_for_cookies.mojom1
-rw-r--r--chromium/third_party/blink/renderer/platform/weborigin/security_origin.cc13
-rw-r--r--chromium/third_party/blink/renderer/platform/weborigin/security_origin.h5
-rw-r--r--chromium/url/origin.cc16
-rw-r--r--chromium/url/origin.h6
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.