• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2019 The Chromium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 package org.chromium.url;
6 
7 import org.chromium.base.annotations.CalledByNative;
8 import org.chromium.base.annotations.JNINamespace;
9 import org.chromium.base.annotations.NativeMethods;
10 
11 /** An origin is either a (scheme, host, port) tuple or is opaque. */
12 @JNINamespace("url")
13 public class Origin {
14     private final String mScheme;
15     private final String mHost;
16     private final short mPort;
17 
18     private final boolean mIsOpaque;
19 
20     // Serialization of the Unguessable Token. Do not use directly.
21     private final long mTokenHighBits;
22     private final long mTokenLowBits;
23 
24     /**
25      * Constructs an opaque origin.
26      */
createOpaqueOrigin()27     public static Origin createOpaqueOrigin() {
28         return OriginJni.get().createOpaque();
29     }
30 
31     /**
32      * See origin.h for many warnings about this method.
33      *
34      * Constructs an Origin from a GURL.
35      */
create(GURL gurl)36     public static Origin create(GURL gurl) {
37         return OriginJni.get().createFromGURL(gurl);
38     }
39 
40     /**
41      * Parses a mojo Origin into a Java analogue of the c++ Origin class.
42      *
43      * `org.chromium.url.internal.mojom.Origin`s, are provided by Mojo-generated code but not
44      * intended for direct use (see crbug.com/1156866).
45      *
46      * @return A Java equivalent of the c++ Origin represented by the provided mojo Origin.
47      */
Origin(org.chromium.url.internal.mojom.Origin mojoOrigin)48     public Origin(org.chromium.url.internal.mojom.Origin mojoOrigin) {
49         mScheme = mojoOrigin.scheme;
50         mHost = mojoOrigin.host;
51         mPort = mojoOrigin.port;
52         if (mojoOrigin.nonceIfOpaque != null) {
53             mIsOpaque = true;
54             mTokenHighBits = mojoOrigin.nonceIfOpaque.high;
55             mTokenLowBits = mojoOrigin.nonceIfOpaque.low;
56         } else {
57             mIsOpaque = false;
58             mTokenHighBits = 0;
59             mTokenLowBits = 0;
60         }
61     }
62 
63     @CalledByNative
Origin(String scheme, String host, short port, boolean isOpaque, long tokenHighBits, long tokenLowBits)64     private Origin(String scheme, String host, short port, boolean isOpaque, long tokenHighBits,
65             long tokenLowBits) {
66         mScheme = scheme;
67         mHost = host;
68         mPort = port;
69         mIsOpaque = isOpaque;
70         mTokenHighBits = tokenHighBits;
71         mTokenLowBits = tokenLowBits;
72     }
73 
74     /** @return The scheme of the origin. Returns an empty string for an opaque origin. */
getScheme()75     public String getScheme() {
76         return !isOpaque() ? mScheme : "";
77     }
78 
79     /** @return The host of the origin. Returns an empty string for an opaque origin. */
getHost()80     public String getHost() {
81         return !isOpaque() ? mHost : "";
82     }
83 
84     /** @return The port of the origin. Returns 0 for an opaque origin. */
getPort()85     public int getPort() {
86         return !isOpaque() ? Short.toUnsignedInt(mPort) : 0;
87     }
88 
89     /** @return Whether the origin is opaque. */
isOpaque()90     public boolean isOpaque() {
91         return mIsOpaque;
92     }
93 
94     @CalledByNative
toNativeOrigin()95     private long toNativeOrigin() {
96         return OriginJni.get().createNative(
97                 mScheme, mHost, mPort, mIsOpaque, mTokenHighBits, mTokenLowBits);
98     }
99 
100     @NativeMethods
101     interface Natives {
102         /** Constructs a new Opaque origin. */
createOpaque()103         Origin createOpaque();
104 
105         /** Constructs an Origin from a GURL. */
createFromGURL(GURL gurl)106         Origin createFromGURL(GURL gurl);
107 
108         /**
109          * Reconstructs the native Origin for this Java Origin, returning its native pointer.
110          */
createNative(String scheme, String host, short port, boolean isOpaque, long tokenHighBits, long tokenLowBits)111         long createNative(String scheme, String host, short port, boolean isOpaque,
112                 long tokenHighBits, long tokenLowBits);
113     }
114 }
115