1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "url/origin.h"
9 #include "base/logging.h"
10 #include "base/strings/string_number_conversions.h"
12 #include "url/url_canon.h"
13 #include "url/url_canon_stdstring.h"
14 #include "url/url_constants.h"
15 #include "url/url_util.h"
19 Origin::Origin() : unique_(true) {
22 Origin::Origin(const GURL
& url
) : unique_(true) {
23 if (!url
.is_valid() || (!url
.IsStandard() && !url
.SchemeIsBlob()))
26 if (url
.SchemeIsFileSystem()) {
27 tuple_
= SchemeHostPort(*url
.inner_url());
28 } else if (url
.SchemeIsBlob()) {
29 // If we're dealing with a 'blob:' URL, https://url.spec.whatwg.org/#origin
30 // defines the origin as the origin of the URL which results from parsing
31 // the "path", which boils down to everything after the scheme. GURL's
32 // 'GetContent()' gives us exactly that.
33 tuple_
= SchemeHostPort(GURL(url
.GetContent()));
35 tuple_
= SchemeHostPort(url
);
38 unique_
= tuple_
.IsInvalid();
41 Origin::Origin(base::StringPiece scheme
, base::StringPiece host
, uint16 port
)
42 : tuple_(scheme
, host
, port
) {
43 unique_
= tuple_
.IsInvalid();
50 Origin
Origin::UnsafelyCreateOriginWithoutNormalization(
51 base::StringPiece scheme
,
52 base::StringPiece host
,
54 return Origin(scheme
, host
, port
);
57 std::string
Origin::Serialize() const {
61 if (scheme() == kFileScheme
)
64 return tuple_
.Serialize();
67 bool Origin::IsSameOriginWith(const Origin
& other
) const {
68 if (unique_
|| other
.unique_
)
71 return tuple_
.Equals(other
.tuple_
);
74 bool Origin::operator<(const Origin
& other
) const {
75 return tuple_
< other
.tuple_
;
78 std::ostream
& operator<<(std::ostream
& out
, const url::Origin
& origin
) {
79 return out
<< origin
.Serialize();