Index: url/origin.cc |
diff --git a/url/origin.cc b/url/origin.cc |
index 53600b1dc96f6c5b2736cb2eb0988b3b34fb715b..28359b8da17e0346fe5273fc793506d1d0b34a4b 100644 |
--- a/url/origin.cc |
+++ b/url/origin.cc |
@@ -8,6 +8,8 @@ |
#include <string.h> |
#include "base/logging.h" |
+// TODO(dcheng): Use crypto's rand util. |
+#include "base/rand_util.h" |
#include "base/strings/string_number_conversions.h" |
#include "url/gurl.h" |
#include "url/url_canon.h" |
@@ -34,11 +36,15 @@ GURL AddSuboriginToUrl(const GURL& url, const std::string& suborigin) { |
} // namespace |
-Origin::Origin() : unique_(true), suborigin_(std::string()) {} |
+Origin::Origin() : unique_(true) { |
+ base::RandBytes(unique_origin_id_, sizeof(unique_origin_id_)); |
+} |
-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())) { |
+ base::RandBytes(unique_origin_id_, sizeof(unique_origin_id_)); |
return; |
+ } |
if (url.SchemeIsFileSystem()) { |
tuple_ = SchemeHostPort(*url.inner_url()); |
@@ -78,6 +84,8 @@ Origin::Origin(const GURL& url) : unique_(true), suborigin_(std::string()) { |
} |
unique_ = tuple_.IsInvalid(); |
+ if (unique_) |
+ base::RandBytes(unique_origin_id_, sizeof(unique_origin_id_)); |
} |
Origin::Origin(base::StringPiece scheme, |
@@ -85,10 +93,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 +106,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_) |
+ base::RandBytes(unique_origin_id_, sizeof(unique_origin_id_)); |
+ else |
+ suborigin_ = std::move(suborigin); |
Mike West
2017/02/24 07:58:50
I wonder if suborigins should have an effect on th
|
} |
Origin::~Origin() { |
@@ -158,8 +170,12 @@ 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_ |
+ ? memcmp(unique_origin_id_, other.unique_origin_id_, |
+ sizeof(unique_origin_id_)) == 0 |
+ : false; |
+ } |
return tuple_.Equals(other.tuple_) && suborigin_ == other.suborigin_; |
} |