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