• 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.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