summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTamas Zakor <ztamas@inf.u-szeged.hu>2021-02-09 07:32:37 +0100
committerPeter Varga <pvarga@inf.u-szeged.hu>2021-04-15 10:54:50 +0000
commit6764c29f7c5aaf9ecbe6532f9e2b845604c926a5 (patch)
treef389bd71703e74ad70eb1c15704bf31775270e86
parent94be4331d0b76b7204eed46e3e6bcf44f8078352 (diff)
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>
-rw-r--r--chromium/content/renderer/render_frame_impl.cc4
-rw-r--r--chromium/net/cookies/site_for_cookies.cc17
-rw-r--r--chromium/net/cookies/site_for_cookies.h5
-rw-r--r--chromium/services/network/public/cpp/net_ipc_param_traits.cc9
-rw-r--r--chromium/services/network/public/cpp/site_for_cookies_mojom_traits.cc9
-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.cc11
-rw-r--r--chromium/third_party/blink/renderer/platform/weborigin/security_origin.h3
-rw-r--r--chromium/url/origin.cc16
-rw-r--r--chromium/url/origin.h6
11 files changed, 76 insertions, 10 deletions
diff --git a/chromium/content/renderer/render_frame_impl.cc b/chromium/content/renderer/render_frame_impl.cc
index 55f4dc3b4df..461ffbca0a4 100644
--- a/chromium/content/renderer/render_frame_impl.cc
+++ b/chromium/content/renderer/render_frame_impl.cc
@@ -3222,6 +3222,10 @@ void RenderFrameImpl::CommitNavigation(
return;
}
+ if (commit_params->origin_to_commit) {
+ commit_params->origin_to_commit->SetFullURL(GetOriginalRequestURL(frame_->GetDocumentLoader()));
+ }
+
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 759b4e7a372..2dae84f7038 100644
--- a/chromium/net/cookies/site_for_cookies.cc
+++ b/chromium/net/cookies/site_for_cookies.cc
@@ -37,6 +37,7 @@ SiteForCookies& SiteForCookies::operator=(SiteForCookies&& site_for_cookies) =
bool SiteForCookies::FromWire(const std::string& scheme,
const std::string& registrable_domain,
bool schemefully_same,
+ GURL first_party_url,
SiteForCookies* out) {
// Make sure scheme meets precondition of methods like
// GURL::SchemeIsCryptographic.
@@ -45,6 +46,8 @@ bool SiteForCookies::FromWire(const std::string& scheme,
// registrable_domain_ should also be canonicalized.
SiteForCookies candidate(scheme, registrable_domain);
+ candidate.first_party_url_ = first_party_url;
+
if (registrable_domain != candidate.registrable_domain_)
return false;
@@ -60,7 +63,12 @@ SiteForCookies SiteForCookies::FromOrigin(const url::Origin& origin) {
if (origin.opaque())
return SiteForCookies();
- return SiteForCookies(origin.scheme(), origin.host());
+ SiteForCookies site_for_cookies = SiteForCookies(origin.scheme(), origin.host());
+ 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
@@ -191,4 +199,11 @@ bool SiteForCookies::IsSchemelesslyFirstParty(const GURL& url) const {
return registrable_domain_ == other_registrable_domain;
}
+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 0de33fabeba..be8a29f0523 100644
--- a/chromium/net/cookies/site_for_cookies.h
+++ b/chromium/net/cookies/site_for_cookies.h
@@ -52,6 +52,7 @@ class NET_EXPORT SiteForCookies {
static bool FromWire(const std::string& scheme,
const std::string& registrable_domain,
bool schemefully_same,
+ GURL first_party_url,
SiteForCookies* out);
// If the origin is opaque, returns SiteForCookies that matches nothing.
@@ -112,6 +113,8 @@ class NET_EXPORT SiteForCookies {
const std::string& registrable_domain() const { return registrable_domain_; }
+ GURL first_party_url() const;
+
// Used for serialization/deserialization. This value is irrelevant if
// IsNull() is true.
bool schemefully_same() const { return schemefully_same_; }
@@ -162,6 +165,8 @@ class NET_EXPORT SiteForCookies {
// irrelevant (For tests this value can also be modified by
// SetSchemefullySameForTesting()).
bool schemefully_same_;
+
+ 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 bb2f1be0aa0..47fe554b445 100644
--- a/chromium/services/network/public/cpp/net_ipc_param_traits.cc
+++ b/chromium/services/network/public/cpp/net_ipc_param_traits.cc
@@ -572,20 +572,23 @@ void ParamTraits<net::SiteForCookies>::Write(base::Pickle* m,
WriteParam(m, p.scheme());
WriteParam(m, p.registrable_domain());
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) {
- std::string scheme, registrable_domain;
+ std::string scheme, registrable_domain, first_party_url;
bool schemefully_same;
if (!ReadParam(m, iter, &scheme) ||
!ReadParam(m, iter, &registrable_domain) ||
- !ReadParam(m, iter, &schemefully_same))
+ !ReadParam(m, iter, &schemefully_same) ||
+ !ReadParam(m, iter, &first_party_url))
return false;
return net::SiteForCookies::FromWire(scheme, registrable_domain,
- schemefully_same, r);
+ schemefully_same,
+ GURL(first_party_url), r);
}
void ParamTraits<net::SiteForCookies>::Log(const param_type& p,
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 282d0ef1e08..3490ac7d8c7 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
@@ -11,7 +11,7 @@ namespace mojo {
bool StructTraits<network::mojom::SiteForCookiesDataView, net::SiteForCookies>::
Read(network::mojom::SiteForCookiesDataView data,
net::SiteForCookies* out) {
- std::string scheme, registrable_domain;
+ std::string scheme, registrable_domain, first_party_url;
if (!data.ReadScheme(&scheme)) {
return false;
}
@@ -19,8 +19,13 @@ bool StructTraits<network::mojom::SiteForCookiesDataView, net::SiteForCookies>::
return false;
}
+ if (!data.ReadFirstPartyUrl(&first_party_url)) {
+ return false;
+ }
+
bool result = net::SiteForCookies::FromWire(scheme, registrable_domain,
- data.schemefully_same(), out);
+ 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 2663f74a784..bc0cf10e7b1 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
@@ -29,6 +29,11 @@ struct COMPONENT_EXPORT(NETWORK_CPP_BASE)
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 2de2d571e57..240184693d4 100644
--- a/chromium/services/network/public/mojom/site_for_cookies.mojom
+++ b/chromium/services/network/public/mojom/site_for_cookies.mojom
@@ -11,4 +11,5 @@ struct SiteForCookies {
string scheme;
string registrable_domain;
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 9183e5e39c4..9091b066b84 100644
--- a/chromium/third_party/blink/renderer/platform/weborigin/security_origin.cc
+++ b/chromium/third_party/blink/renderer/platform/weborigin/security_origin.cc
@@ -143,7 +143,8 @@ SecurityOrigin::SecurityOrigin(const KURL& url)
domain_(host_),
port_(IsDefaultPortForProtocol(url.Port(), protocol_) ? kInvalidPort
: url.Port()),
- effective_port_(port_ ? port_ : DefaultPortForProtocol(protocol_)) {
+ effective_port_(port_ ? port_ : DefaultPortForProtocol(protocol_)),
+ full_url_(url.Copy()) {
DCHECK(!ShouldTreatAsOpaqueOrigin(url));
// NOTE(juvaldma)(Chromium 67.0.3396.47)
@@ -193,7 +194,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)
@@ -212,7 +214,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,
@@ -281,6 +284,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;
}
@@ -297,6 +301,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 9e950cf9e76..c0494d8eafd 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"
@@ -424,6 +425,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 95eb291b177..26a146513c0 100644
--- a/chromium/url/origin.cc
+++ b/chromium/url/origin.cc
@@ -54,7 +54,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) {
@@ -152,6 +155,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;
+}
+
base::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 389b0d1348f..51dec712657 100644
--- a/chromium/url/origin.h
+++ b/chromium/url/origin.h
@@ -20,6 +20,7 @@
#include "base/unguessable_token.h"
#include "build/build_config.h"
#include "ipc/ipc_param_traits.h"
+#include "url/gurl.h"
#include "url/scheme_host_port.h"
#include "url/third_party/mozilla/url_parse.h"
#include "url/url_canon.h"
@@ -260,6 +261,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;
@@ -414,6 +418,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.
base::Optional<Nonce> nonce_;
+
+ GURL full_url_;
};
// Pretty-printers for logging. These expose the internal state of the nonce.