• 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.jni_zero.CalledByNative;
8 import org.jni_zero.JNINamespace;
9 import org.jni_zero.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     /** Constructs an opaque origin. */
createOpaqueOrigin()25     public static Origin createOpaqueOrigin() {
26         return OriginJni.get().createOpaque();
27     }
28 
29     /**
30      * See origin.h for many warnings about this method.
31      *
32      * Constructs an Origin from a GURL.
33      */
create(GURL gurl)34     public static Origin create(GURL gurl) {
35         return OriginJni.get().createFromGURL(gurl);
36     }
37 
38     /**
39      * Parses a mojo Origin into a Java analogue of the c++ Origin class.
40      *
41      * `org.chromium.url.internal.mojom.Origin`s, are provided by Mojo-generated code but not
42      * intended for direct use (see crbug.com/1156866).
43      *
44      * @return A Java equivalent of the c++ Origin represented by the provided mojo Origin.
45      */
Origin(org.chromium.url.internal.mojom.Origin mojoOrigin)46     public Origin(org.chromium.url.internal.mojom.Origin mojoOrigin) {
47         mScheme = mojoOrigin.scheme;
48         mHost = mojoOrigin.host;
49         mPort = mojoOrigin.port;
50         if (mojoOrigin.nonceIfOpaque != null) {
51             mIsOpaque = true;
52             mTokenHighBits = mojoOrigin.nonceIfOpaque.high;
53             mTokenLowBits = mojoOrigin.nonceIfOpaque.low;
54         } else {
55             mIsOpaque = false;
56             mTokenHighBits = 0;
57             mTokenLowBits = 0;
58         }
59     }
60 
61     @CalledByNative
Origin( String scheme, String host, short port, boolean isOpaque, long tokenHighBits, long tokenLowBits)62     private Origin(
63             String scheme,
64             String host,
65             short port,
66             boolean isOpaque,
67             long tokenHighBits,
68             long tokenLowBits) {
69         mScheme = scheme;
70         mHost = host;
71         mPort = port;
72         mIsOpaque = isOpaque;
73         mTokenHighBits = tokenHighBits;
74         mTokenLowBits = tokenLowBits;
75     }
76 
77     /** @return The scheme of the origin. Returns an empty string for an opaque origin. */
getScheme()78     public String getScheme() {
79         return !isOpaque() ? mScheme : "";
80     }
81 
82     /** @return The host of the origin. Returns an empty string for an opaque origin. */
getHost()83     public String getHost() {
84         return !isOpaque() ? mHost : "";
85     }
86 
87     /** @return The port of the origin. Returns 0 for an opaque origin. */
getPort()88     public int getPort() {
89         return !isOpaque() ? Short.toUnsignedInt(mPort) : 0;
90     }
91 
92     /** @return Whether the origin is opaque. */
isOpaque()93     public boolean isOpaque() {
94         return mIsOpaque;
95     }
96 
97     @CalledByNative
toNativeOrigin()98     private long toNativeOrigin() {
99         return OriginJni.get()
100                 .createNative(mScheme, mHost, mPort, mIsOpaque, mTokenHighBits, mTokenLowBits);
101     }
102 
103     @NativeMethods
104     interface Natives {
105         /** Constructs a new Opaque origin. */
createOpaque()106         Origin createOpaque();
107 
108         /** Constructs an Origin from a GURL. */
createFromGURL(GURL gurl)109         Origin createFromGURL(GURL gurl);
110 
111         /** Reconstructs the native Origin for this Java Origin, returning its native pointer. */
createNative( String scheme, String host, short port, boolean isOpaque, long tokenHighBits, long tokenLowBits)112         long createNative(
113                 String scheme,
114                 String host,
115                 short port,
116                 boolean isOpaque,
117                 long tokenHighBits,
118                 long tokenLowBits);
119     }
120 }
121