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