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