Upstreaming browser/ui/uikit_ui_util from iOS.
[chromium-blink-merge.git] / url / origin.cc
blob9d0c4f08de0165e3a201408f22c8778d5b4acf4e
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"
7 #include <string.h>
9 #include "base/logging.h"
10 #include "base/strings/string_number_conversions.h"
11 #include "url/gurl.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"
17 namespace url {
19 Origin::Origin() : unique_(true) {
22 Origin::Origin(const GURL& url) : unique_(true) {
23 if (!url.is_valid() || (!url.IsStandard() && !url.SchemeIsBlob()))
24 return;
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()));
34 } else {
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();
46 Origin::~Origin() {
49 // static
50 Origin Origin::UnsafelyCreateOriginWithoutNormalization(
51 base::StringPiece scheme,
52 base::StringPiece host,
53 uint16 port) {
54 return Origin(scheme, host, port);
57 std::string Origin::Serialize() const {
58 if (unique())
59 return "null";
61 if (scheme() == kFileScheme)
62 return "file://";
64 return tuple_.Serialize();
67 bool Origin::IsSameOriginWith(const Origin& other) const {
68 if (unique_ || other.unique_)
69 return false;
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();
82 } // namespace url