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 import org.chromium.build.annotations.MainDex; 11 12 /** 13 * A java wrapper for Parsed, GURL's internal parsed URI representation. 14 */ 15 @MainDex 16 @JNINamespace("url") 17 /* package */ class Parsed { 18 /* package */ final int mSchemeBegin; 19 /* package */ final int mSchemeLength; 20 /* package */ final int mUsernameBegin; 21 /* package */ final int mUsernameLength; 22 /* package */ final int mPasswordBegin; 23 /* package */ final int mPasswordLength; 24 /* package */ final int mHostBegin; 25 /* package */ final int mHostLength; 26 /* package */ final int mPortBegin; 27 /* package */ final int mPortLength; 28 /* package */ final int mPathBegin; 29 /* package */ final int mPathLength; 30 /* package */ final int mQueryBegin; 31 /* package */ final int mQueryLength; 32 /* package */ final int mRefBegin; 33 /* package */ final int mRefLength; 34 private final Parsed mInnerUrl; 35 private final boolean mPotentiallyDanglingMarkup; 36 createEmpty()37 /* package */ static Parsed createEmpty() { 38 return new Parsed(0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, false, null); 39 } 40 41 @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)42 private Parsed(int schemeBegin, int schemeLength, int usernameBegin, int usernameLength, 43 int passwordBegin, int passwordLength, int hostBegin, int hostLength, int portBegin, 44 int portLength, int pathBegin, int pathLength, int queryBegin, int queryLength, 45 int refBegin, int refLength, boolean potentiallyDanglingMarkup, Parsed innerUrl) { 46 mSchemeBegin = schemeBegin; 47 mSchemeLength = schemeLength; 48 mUsernameBegin = usernameBegin; 49 mUsernameLength = usernameLength; 50 mPasswordBegin = passwordBegin; 51 mPasswordLength = passwordLength; 52 mHostBegin = hostBegin; 53 mHostLength = hostLength; 54 mPortBegin = portBegin; 55 mPortLength = portLength; 56 mPathBegin = pathBegin; 57 mPathLength = pathLength; 58 mQueryBegin = queryBegin; 59 mQueryLength = queryLength; 60 mRefBegin = refBegin; 61 mRefLength = refLength; 62 mPotentiallyDanglingMarkup = potentiallyDanglingMarkup; 63 mInnerUrl = innerUrl; 64 } 65 toNativeParsed()66 /* package */ long toNativeParsed() { 67 long inner = 0; 68 if (mInnerUrl != null) { 69 inner = mInnerUrl.toNativeParsed(); 70 } 71 return ParsedJni.get().createNative(mSchemeBegin, mSchemeLength, mUsernameBegin, 72 mUsernameLength, mPasswordBegin, mPasswordLength, mHostBegin, mHostLength, 73 mPortBegin, mPortLength, mPathBegin, mPathLength, mQueryBegin, mQueryLength, 74 mRefBegin, mRefLength, mPotentiallyDanglingMarkup, inner); 75 } 76 serialize()77 /* package */ String serialize() { 78 StringBuilder builder = new StringBuilder(); 79 builder.append(mSchemeBegin).append(GURL.SERIALIZER_DELIMITER); 80 builder.append(mSchemeLength).append(GURL.SERIALIZER_DELIMITER); 81 builder.append(mUsernameBegin).append(GURL.SERIALIZER_DELIMITER); 82 builder.append(mUsernameLength).append(GURL.SERIALIZER_DELIMITER); 83 builder.append(mPasswordBegin).append(GURL.SERIALIZER_DELIMITER); 84 builder.append(mPasswordLength).append(GURL.SERIALIZER_DELIMITER); 85 builder.append(mHostBegin).append(GURL.SERIALIZER_DELIMITER); 86 builder.append(mHostLength).append(GURL.SERIALIZER_DELIMITER); 87 builder.append(mPortBegin).append(GURL.SERIALIZER_DELIMITER); 88 builder.append(mPortLength).append(GURL.SERIALIZER_DELIMITER); 89 builder.append(mPathBegin).append(GURL.SERIALIZER_DELIMITER); 90 builder.append(mPathLength).append(GURL.SERIALIZER_DELIMITER); 91 builder.append(mQueryBegin).append(GURL.SERIALIZER_DELIMITER); 92 builder.append(mQueryLength).append(GURL.SERIALIZER_DELIMITER); 93 builder.append(mRefBegin).append(GURL.SERIALIZER_DELIMITER); 94 builder.append(mRefLength).append(GURL.SERIALIZER_DELIMITER); 95 builder.append(mPotentiallyDanglingMarkup).append(GURL.SERIALIZER_DELIMITER); 96 builder.append(mInnerUrl != null); 97 if (mInnerUrl != null) { 98 builder.append(GURL.SERIALIZER_DELIMITER).append(mInnerUrl.serialize()); 99 } 100 return builder.toString(); 101 } 102 deserialize(String[] tokens, int startIndex)103 /* package */ static Parsed deserialize(String[] tokens, int startIndex) { 104 int schemeBegin = Integer.parseInt(tokens[startIndex++]); 105 int schemeLength = Integer.parseInt(tokens[startIndex++]); 106 int usernameBegin = Integer.parseInt(tokens[startIndex++]); 107 int usernameLength = Integer.parseInt(tokens[startIndex++]); 108 int passwordBegin = Integer.parseInt(tokens[startIndex++]); 109 int passwordLength = Integer.parseInt(tokens[startIndex++]); 110 int hostBegin = Integer.parseInt(tokens[startIndex++]); 111 int hostLength = Integer.parseInt(tokens[startIndex++]); 112 int portBegin = Integer.parseInt(tokens[startIndex++]); 113 int portLength = Integer.parseInt(tokens[startIndex++]); 114 int pathBegin = Integer.parseInt(tokens[startIndex++]); 115 int pathLength = Integer.parseInt(tokens[startIndex++]); 116 int queryBegin = Integer.parseInt(tokens[startIndex++]); 117 int queryLength = Integer.parseInt(tokens[startIndex++]); 118 int refBegin = Integer.parseInt(tokens[startIndex++]); 119 int refLength = Integer.parseInt(tokens[startIndex++]); 120 boolean potentiallyDanglingMarkup = Boolean.parseBoolean(tokens[startIndex++]); 121 Parsed innerParsed = null; 122 if (Boolean.parseBoolean(tokens[startIndex++])) { 123 innerParsed = Parsed.deserialize(tokens, startIndex); 124 } 125 return new Parsed(schemeBegin, schemeLength, usernameBegin, usernameLength, passwordBegin, 126 passwordLength, hostBegin, hostLength, portBegin, portLength, pathBegin, pathLength, 127 queryBegin, queryLength, refBegin, refLength, potentiallyDanglingMarkup, 128 innerParsed); 129 } 130 131 @NativeMethods 132 interface Natives { 133 /** 134 * Create and return the pointer to a native Parsed. 135 */ 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)136 long createNative(int schemeBegin, int schemeLength, int usernameBegin, int usernameLength, 137 int passwordBegin, int passwordLength, int hostBegin, int hostLength, int portBegin, 138 int portLength, int pathBegin, int pathLength, int queryBegin, int queryLength, 139 int refBegin, int refLength, boolean potentiallyDanglingMarkup, long innerUrl); 140 } 141 } 142