| Index: url/origin.cc
|
| diff --git a/url/origin.cc b/url/origin.cc
|
| index 53600b1dc96f6c5b2736cb2eb0988b3b34fb715b..f620c9713cf54407dc1ae2584da65bb02674306c 100644
|
| --- a/url/origin.cc
|
| +++ b/url/origin.cc
|
| @@ -7,6 +7,9 @@
|
| #include <stdint.h>
|
| #include <string.h>
|
|
|
| +#include <tuple>
|
| +#include <utility>
|
| +
|
| #include "base/logging.h"
|
| #include "base/strings/string_number_conversions.h"
|
| #include "url/gurl.h"
|
| @@ -34,12 +37,16 @@ GURL AddSuboriginToUrl(const GURL& url, const std::string& suborigin) {
|
|
|
| } // namespace
|
|
|
| -Origin::Origin() : unique_(true), suborigin_(std::string()) {}
|
| +Origin::Origin()
|
| + : unique_(true), unique_id_(base::UnguessableToken::Create()) {}
|
|
|
| -Origin::Origin(const GURL& url) : unique_(true), suborigin_(std::string()) {
|
| - if (!url.is_valid() || (!url.IsStandard() && !url.SchemeIsBlob()))
|
| +Origin::Origin(const GURL& url) : unique_(true) {
|
| + if (!url.is_valid() || (!url.IsStandard() && !url.SchemeIsBlob())) {
|
| + unique_id_ = base::UnguessableToken::Create();
|
| return;
|
| + }
|
|
|
| + std::string suborigin;
|
| if (url.SchemeIsFileSystem()) {
|
| tuple_ = SchemeHostPort(*url.inner_url());
|
| } else if (url.SchemeIsBlob()) {
|
| @@ -72,12 +79,16 @@ Origin::Origin(const GURL& url) : unique_(true), suborigin_(std::string()) {
|
| if (invalid_suborigin || tuple_.IsInvalid())
|
| return;
|
|
|
| - suborigin_ = host.substr(0, suborigin_end);
|
| + suborigin = host.substr(0, suborigin_end);
|
| } else {
|
| tuple_ = SchemeHostPort(url);
|
| }
|
|
|
| unique_ = tuple_.IsInvalid();
|
| + if (unique_)
|
| + unique_id_ = base::UnguessableToken::Create();
|
| + else
|
| + suborigin_ = std::move(suborigin);
|
| }
|
|
|
| Origin::Origin(base::StringPiece scheme,
|
| @@ -85,10 +96,11 @@ Origin::Origin(base::StringPiece scheme,
|
| uint16_t port,
|
| base::StringPiece suborigin,
|
| SchemeHostPort::ConstructPolicy policy)
|
| - : tuple_(scheme.as_string(), host.as_string(), port, policy) {
|
| - unique_ = tuple_.IsInvalid();
|
| - suborigin_ = suborigin.as_string();
|
| -}
|
| + : Origin(scheme.as_string(),
|
| + host.as_string(),
|
| + port,
|
| + suborigin.as_string(),
|
| + policy) {}
|
|
|
| Origin::Origin(std::string scheme,
|
| std::string host,
|
| @@ -97,7 +109,10 @@ Origin::Origin(std::string scheme,
|
| SchemeHostPort::ConstructPolicy policy)
|
| : tuple_(std::move(scheme), std::move(host), port, policy) {
|
| unique_ = tuple_.IsInvalid();
|
| - suborigin_ = std::move(suborigin);
|
| + if (unique_)
|
| + unique_id_ = base::UnguessableToken::Create();
|
| + else
|
| + suborigin_ = std::move(suborigin);
|
| }
|
|
|
| Origin::~Origin() {
|
| @@ -158,8 +173,9 @@ GURL Origin::GetURL() const {
|
| }
|
|
|
| bool Origin::IsSameOriginWith(const Origin& other) const {
|
| - if (unique_ || other.unique_)
|
| - return false;
|
| + if (unique_ || other.unique_) {
|
| + return unique_ && other.unique_ ? unique_id_ == other.unique_id_ : false;
|
| + }
|
|
|
| return tuple_.Equals(other.tuple_) && suborigin_ == other.suborigin_;
|
| }
|
| @@ -173,7 +189,9 @@ bool Origin::DomainIs(base::StringPiece lower_ascii_domain) const {
|
| }
|
|
|
| bool Origin::operator<(const Origin& other) const {
|
| - return tuple_ < other.tuple_;
|
| + // TODO(dcheng): Doesn't this need to account for suborigins?
|
| + return std::tie(tuple_, unique_id_) <
|
| + std::tie(other.tuple_, other.unique_id_);
|
| }
|
|
|
| std::ostream& operator<<(std::ostream& out, const url::Origin& origin) {
|
|
|