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 /** A java wrapper for Parsed, GURL's internal parsed URI representation. */ 12 @JNINamespace("url") 13 /* package */ class Parsed { 14 /* package */ final int mSchemeBegin; 15 /* package */ final int mSchemeLength; 16 /* package */ final int mUsernameBegin; 17 /* package */ final int mUsernameLength; 18 /* package */ final int mPasswordBegin; 19 /* package */ final int mPasswordLength; 20 /* package */ final int mHostBegin; 21 /* package */ final int mHostLength; 22 /* package */ final int mPortBegin; 23 /* package */ final int mPortLength; 24 /* package */ final int mPathBegin; 25 /* package */ final int mPathLength; 26 /* package */ final int mQueryBegin; 27 /* package */ final int mQueryLength; 28 /* package */ final int mRefBegin; 29 /* package */ final int mRefLength; 30 private final Parsed mInnerUrl; 31 private final boolean mPotentiallyDanglingMarkup; 32 createEmpty()33 /* package */ static Parsed createEmpty() { 34 return new Parsed(0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, false, null); 35 } 36 37 @CalledByNative Parsed( int schemeBegin, int schemeLength, int usernameBegin, int usernameLength, int passwordBegin, int passwordLength, int hostBegin, int hostLength, int portBegin, int portLength, int pathBegin, int pathLength, int queryBegin, int queryLength, int refBegin, int refLength, boolean potentiallyDanglingMarkup, Parsed innerUrl)38 private Parsed( 39 int schemeBegin, 40 int schemeLength, 41 int usernameBegin, 42 int usernameLength, 43 int passwordBegin, 44 int passwordLength, 45 int hostBegin, 46 int hostLength, 47 int portBegin, 48 int portLength, 49 int pathBegin, 50 int pathLength, 51 int queryBegin, 52 int queryLength, 53 int refBegin, 54 int refLength, 55 boolean potentiallyDanglingMarkup, 56 Parsed innerUrl) { 57 mSchemeBegin = schemeBegin; 58 mSchemeLength = schemeLength; 59 mUsernameBegin = usernameBegin; 60 mUsernameLength = usernameLength; 61 mPasswordBegin = passwordBegin; 62 mPasswordLength = passwordLength; 63 mHostBegin = hostBegin; 64 mHostLength = hostLength; 65 mPortBegin = portBegin; 66 mPortLength = portLength; 67 mPathBegin = pathBegin; 68 mPathLength = pathLength; 69 mQueryBegin = queryBegin; 70 mQueryLength = queryLength; 71 mRefBegin = refBegin; 72 mRefLength = refLength; 73 mPotentiallyDanglingMarkup = potentiallyDanglingMarkup; 74 mInnerUrl = innerUrl; 75 } 76 toNativeParsed()77 /* package */ long toNativeParsed() { 78 long inner = 0; 79 if (mInnerUrl != null) { 80 inner = mInnerUrl.toNativeParsed(); 81 } 82 return ParsedJni.get() 83 .createNative( 84 mSchemeBegin, 85 mSchemeLength, 86 mUsernameBegin, 87 mUsernameLength, 88 mPasswordBegin, 89 mPasswordLength, 90 mHostBegin, 91 mHostLength, 92 mPortBegin, 93 mPortLength, 94 mPathBegin, 95 mPathLength, 96 mQueryBegin, 97 mQueryLength, 98 mRefBegin, 99 mRefLength, 100 mPotentiallyDanglingMarkup, 101 inner); 102 } 103 serialize()104 /* package */ String serialize() { 105 StringBuilder builder = new StringBuilder(); 106 builder.append(mSchemeBegin).append(GURL.SERIALIZER_DELIMITER); 107 builder.append(mSchemeLength).append(GURL.SERIALIZER_DELIMITER); 108 builder.append(mUsernameBegin).append(GURL.SERIALIZER_DELIMITER); 109 builder.append(mUsernameLength).append(GURL.SERIALIZER_DELIMITER); 110 builder.append(mPasswordBegin).append(GURL.SERIALIZER_DELIMITER); 111 builder.append(mPasswordLength).append(GURL.SERIALIZER_DELIMITER); 112 builder.append(mHostBegin).append(GURL.SERIALIZER_DELIMITER); 113 builder.append(mHostLength).append(GURL.SERIALIZER_DELIMITER); 114 builder.append(mPortBegin).append(GURL.SERIALIZER_DELIMITER); 115 builder.append(mPortLength).append(GURL.SERIALIZER_DELIMITER); 116 builder.append(mPathBegin).append(GURL.SERIALIZER_DELIMITER); 117 builder.append(mPathLength).append(GURL.SERIALIZER_DELIMITER); 118 builder.append(mQueryBegin).append(GURL.SERIALIZER_DELIMITER); 119 builder.append(mQueryLength).append(GURL.SERIALIZER_DELIMITER); 120 builder.append(mRefBegin).append(GURL.SERIALIZER_DELIMITER); 121 builder.append(mRefLength).append(GURL.SERIALIZER_DELIMITER); 122 builder.append(mPotentiallyDanglingMarkup).append(GURL.SERIALIZER_DELIMITER); 123 builder.append(mInnerUrl != null); 124 if (mInnerUrl != null) { 125 builder.append(GURL.SERIALIZER_DELIMITER).append(mInnerUrl.serialize()); 126 } 127 return builder.toString(); 128 } 129 deserialize(String[] tokens, int startIndex)130 /* package */ static Parsed deserialize(String[] tokens, int startIndex) { 131 int schemeBegin = Integer.parseInt(tokens[startIndex++]); 132 int schemeLength = Integer.parseInt(tokens[startIndex++]); 133 int usernameBegin = Integer.parseInt(tokens[startIndex++]); 134 int usernameLength = Integer.parseInt(tokens[startIndex++]); 135 int passwordBegin = Integer.parseInt(tokens[startIndex++]); 136 int passwordLength = Integer.parseInt(tokens[startIndex++]); 137 int hostBegin = Integer.parseInt(tokens[startIndex++]); 138 int hostLength = Integer.parseInt(tokens[startIndex++]); 139 int portBegin = Integer.parseInt(tokens[startIndex++]); 140 int portLength = Integer.parseInt(tokens[startIndex++]); 141 int pathBegin = Integer.parseInt(tokens[startIndex++]); 142 int pathLength = Integer.parseInt(tokens[startIndex++]); 143 int queryBegin = Integer.parseInt(tokens[startIndex++]); 144 int queryLength = Integer.parseInt(tokens[startIndex++]); 145 int refBegin = Integer.parseInt(tokens[startIndex++]); 146 int refLength = Integer.parseInt(tokens[startIndex++]); 147 boolean potentiallyDanglingMarkup = Boolean.parseBoolean(tokens[startIndex++]); 148 Parsed innerParsed = null; 149 if (Boolean.parseBoolean(tokens[startIndex++])) { 150 innerParsed = Parsed.deserialize(tokens, startIndex); 151 } 152 return new Parsed( 153 schemeBegin, 154 schemeLength, 155 usernameBegin, 156 usernameLength, 157 passwordBegin, 158 passwordLength, 159 hostBegin, 160 hostLength, 161 portBegin, 162 portLength, 163 pathBegin, 164 pathLength, 165 queryBegin, 166 queryLength, 167 refBegin, 168 refLength, 169 potentiallyDanglingMarkup, 170 innerParsed); 171 } 172 173 @NativeMethods 174 interface Natives { 175 /** Create and return the pointer to a native Parsed. */ createNative( int schemeBegin, int schemeLength, int usernameBegin, int usernameLength, int passwordBegin, int passwordLength, int hostBegin, int hostLength, int portBegin, int portLength, int pathBegin, int pathLength, int queryBegin, int queryLength, int refBegin, int refLength, boolean potentiallyDanglingMarkup, long innerUrl)176 long createNative( 177 int schemeBegin, 178 int schemeLength, 179 int usernameBegin, 180 int usernameLength, 181 int passwordBegin, 182 int passwordLength, 183 int hostBegin, 184 int hostLength, 185 int portBegin, 186 int portLength, 187 int pathBegin, 188 int pathLength, 189 int queryBegin, 190 int queryLength, 191 int refBegin, 192 int refLength, 193 boolean potentiallyDanglingMarkup, 194 long innerUrl); 195 } 196 } 197