OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2004, 2007, 2008, 2009 Apple Inc. All rights reserved. | 2 * Copyright (C) 2004, 2007, 2008, 2009 Apple Inc. All rights reserved. |
3 * Copyright (C) 2008, 2009, 2011 Google Inc. All rights reserved. | 3 * Copyright (C) 2008, 2009, 2011 Google Inc. All rights reserved. |
4 * | 4 * |
5 * Redistribution and use in source and binary forms, with or without | 5 * Redistribution and use in source and binary forms, with or without |
6 * modification, are permitted provided that the following conditions are | 6 * modification, are permitted provided that the following conditions are |
7 * met: | 7 * met: |
8 * | 8 * |
9 * * Redistributions of source code must retain the above copyright | 9 * * Redistributions of source code must retain the above copyright |
10 * notice, this list of conditions and the following disclaimer. | 10 * notice, this list of conditions and the following disclaimer. |
(...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
167 , m_utf8IsASCII(true) | 167 , m_utf8IsASCII(true) |
168 , m_stringIsValid(false) | 168 , m_stringIsValid(false) |
169 { | 169 { |
170 } | 170 } |
171 | 171 |
172 KURLGooglePrivate::KURLGooglePrivate(WTF::HashTableDeletedValueType) | 172 KURLGooglePrivate::KURLGooglePrivate(WTF::HashTableDeletedValueType) |
173 : m_string(WTF::HashTableDeletedValue) | 173 : m_string(WTF::HashTableDeletedValue) |
174 { | 174 { |
175 } | 175 } |
176 | 176 |
| 177 KURLGooglePrivate::KURLGooglePrivate(const KURLGooglePrivate& o) |
| 178 : m_isValid(o.m_isValid) |
| 179 , m_protocolIsInHTTPFamily(o.m_protocolIsInHTTPFamily) |
| 180 , m_parsed(o.m_parsed) |
| 181 , m_utf8(o.m_utf8) |
| 182 , m_utf8IsASCII(o.m_utf8IsASCII) |
| 183 , m_stringIsValid(o.m_stringIsValid) |
| 184 , m_string(o.m_string) |
| 185 { |
| 186 if (o.m_innerURL.get()) |
| 187 m_innerURL = adoptPtr(new KURL(o.m_innerURL->copy())); |
| 188 } |
| 189 |
| 190 KURLGooglePrivate& KURLGooglePrivate::operator=(const KURLGooglePrivate& o) |
| 191 { |
| 192 m_isValid = o.m_isValid; |
| 193 m_protocolIsInHTTPFamily = o.m_protocolIsInHTTPFamily; |
| 194 m_parsed = o.m_parsed; |
| 195 m_utf8 = o.m_utf8; |
| 196 m_utf8IsASCII = o.m_utf8IsASCII; |
| 197 m_stringIsValid = o.m_stringIsValid; |
| 198 m_string = o.m_string; |
| 199 if (o.m_innerURL.get()) |
| 200 m_innerURL = adoptPtr(new KURL(o.m_innerURL->copy())); |
| 201 else |
| 202 m_innerURL.clear(); |
| 203 return *this; |
| 204 } |
| 205 |
177 // Setters for the data. Using the ASCII version when you know the | 206 // Setters for the data. Using the ASCII version when you know the |
178 // data is ASCII will be slightly more efficient. The UTF-8 version | 207 // data is ASCII will be slightly more efficient. The UTF-8 version |
179 // will always be correct if the caller is unsure. | 208 // will always be correct if the caller is unsure. |
180 void KURLGooglePrivate::setUtf8(const CString& str) | 209 void KURLGooglePrivate::setUtf8(const CString& str) |
181 { | 210 { |
182 const char* data = str.data(); | 211 const char* data = str.data(); |
183 unsigned dataLength = str.length(); | 212 unsigned dataLength = str.length(); |
184 | 213 |
185 // The m_utf8IsASCII must always be correct since the DeprecatedString | 214 // The m_utf8IsASCII must always be correct since the DeprecatedString |
186 // getter must create it with the proper constructor. This test can be | 215 // getter must create it with the proper constructor. This test can be |
187 // removed when DeprecatedString is gone, but it still might be a | 216 // removed when DeprecatedString is gone, but it still might be a |
188 // performance win. | 217 // performance win. |
189 m_utf8IsASCII = true; | 218 m_utf8IsASCII = true; |
190 for (unsigned i = 0; i < dataLength; i++) { | 219 for (unsigned i = 0; i < dataLength; i++) { |
191 if (static_cast<unsigned char>(data[i]) >= 0x80) { | 220 if (static_cast<unsigned char>(data[i]) >= 0x80) { |
192 m_utf8IsASCII = false; | 221 m_utf8IsASCII = false; |
193 break; | 222 break; |
194 } | 223 } |
195 } | 224 } |
196 | 225 |
197 m_utf8 = str; | 226 m_utf8 = str; |
198 m_stringIsValid = false; | 227 m_stringIsValid = false; |
199 initProtocolIsInHTTPFamily(); | 228 initProtocolIsInHTTPFamily(); |
| 229 initInnerURL(); |
200 } | 230 } |
201 | 231 |
202 void KURLGooglePrivate::setAscii(const CString& str) | 232 void KURLGooglePrivate::setAscii(const CString& str) |
203 { | 233 { |
204 m_utf8 = str; | 234 m_utf8 = str; |
205 m_utf8IsASCII = true; | 235 m_utf8IsASCII = true; |
206 m_stringIsValid = false; | 236 m_stringIsValid = false; |
207 initProtocolIsInHTTPFamily(); | 237 initProtocolIsInHTTPFamily(); |
| 238 initInnerURL(); |
208 } | 239 } |
209 | 240 |
210 void KURLGooglePrivate::init(const KURL& base, | 241 void KURLGooglePrivate::init(const KURL& base, |
211 const String& relative, | 242 const String& relative, |
212 const TextEncoding* queryEncoding) | 243 const TextEncoding* queryEncoding) |
213 { | 244 { |
214 init(base, relative.characters(), relative.length(), queryEncoding); | 245 init(base, relative.characters(), relative.length(), queryEncoding); |
215 } | 246 } |
216 | 247 |
217 template <typename CHAR> | 248 template <typename CHAR> |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
251 if (m_parsed.ref.is_nonempty()) | 282 if (m_parsed.ref.is_nonempty()) |
252 setUtf8(CString(output.data(), output.length())); | 283 setUtf8(CString(output.data(), output.length())); |
253 else | 284 else |
254 setAscii(CString(output.data(), output.length())); | 285 setAscii(CString(output.data(), output.length())); |
255 } else { | 286 } else { |
256 // WebCore expects resolved URLs to be empty rather than null. | 287 // WebCore expects resolved URLs to be empty rather than null. |
257 setUtf8(CString("", 0)); | 288 setUtf8(CString("", 0)); |
258 } | 289 } |
259 } | 290 } |
260 | 291 |
| 292 void KURLGooglePrivate::initInnerURL() { |
| 293 if (!m_isValid) { |
| 294 m_innerURL.clear(); |
| 295 return; |
| 296 } |
| 297 url_parse::Parsed* innerParsed = m_parsed.inner_parsed(); |
| 298 if (innerParsed) |
| 299 m_innerURL = adoptPtr(new KURL( |
| 300 ParsedURLString, |
| 301 String(m_utf8.data() + innerParsed->scheme.begin, innerParsed->Lengt
h() - innerParsed->scheme.begin))); |
| 302 else |
| 303 m_innerURL.clear(); |
| 304 } |
| 305 |
261 void KURLGooglePrivate::initProtocolIsInHTTPFamily() | 306 void KURLGooglePrivate::initProtocolIsInHTTPFamily() |
262 { | 307 { |
263 if (!m_isValid) { | 308 if (!m_isValid) { |
264 m_protocolIsInHTTPFamily = false; | 309 m_protocolIsInHTTPFamily = false; |
265 return; | 310 return; |
266 } | 311 } |
267 | 312 |
268 const char* scheme = m_utf8.data() + m_parsed.scheme.begin; | 313 const char* scheme = m_utf8.data() + m_parsed.scheme.begin; |
269 if (m_parsed.scheme.len == 4) | 314 if (m_parsed.scheme.len == 4) |
270 m_protocolIsInHTTPFamily = lowerCaseEqualsASCII(scheme, scheme + 4, "htt
p"); | 315 m_protocolIsInHTTPFamily = lowerCaseEqualsASCII(scheme, scheme + 4, "htt
p"); |
271 else if (m_parsed.scheme.len == 5) | 316 else if (m_parsed.scheme.len == 5) |
272 m_protocolIsInHTTPFamily = lowerCaseEqualsASCII(scheme, scheme + 5, "htt
ps"); | 317 m_protocolIsInHTTPFamily = lowerCaseEqualsASCII(scheme, scheme + 5, "htt
ps"); |
273 else | 318 else |
274 m_protocolIsInHTTPFamily = false; | 319 m_protocolIsInHTTPFamily = false; |
275 } | 320 } |
276 | 321 |
277 void KURLGooglePrivate::copyTo(KURLGooglePrivate* dest) const | 322 void KURLGooglePrivate::copyTo(KURLGooglePrivate* dest) const |
278 { | 323 { |
279 dest->m_isValid = m_isValid; | 324 dest->m_isValid = m_isValid; |
280 dest->m_protocolIsInHTTPFamily = m_protocolIsInHTTPFamily; | 325 dest->m_protocolIsInHTTPFamily = m_protocolIsInHTTPFamily; |
281 dest->m_parsed = m_parsed; | 326 dest->m_parsed = m_parsed; |
282 | 327 |
283 // Don't copy the 16-bit string since that will be regenerated as needed. | 328 // Don't copy the 16-bit string since that will be regenerated as needed. |
284 dest->m_utf8 = CString(m_utf8.data(), m_utf8.length()); | 329 dest->m_utf8 = CString(m_utf8.data(), m_utf8.length()); |
285 dest->m_utf8IsASCII = m_utf8IsASCII; | 330 dest->m_utf8IsASCII = m_utf8IsASCII; |
286 dest->m_stringIsValid = false; | 331 dest->m_stringIsValid = false; |
287 dest->m_string = String(); // Clear the invalid string to avoid cross thread
ref counting. | 332 dest->m_string = String(); // Clear the invalid string to avoid cross thread
ref counting. |
| 333 if (m_innerURL) { |
| 334 dest->m_innerURL = adoptPtr(new KURL(m_innerURL->copy())); |
| 335 } |
| 336 else |
| 337 dest->m_innerURL.clear(); |
288 } | 338 } |
289 | 339 |
290 String KURLGooglePrivate::componentString(const url_parse::Component& comp) cons
t | 340 String KURLGooglePrivate::componentString(const url_parse::Component& comp) cons
t |
291 { | 341 { |
292 if (!m_isValid || comp.len <= 0) { | 342 if (!m_isValid || comp.len <= 0) { |
293 // KURL returns a null string if the URL is itself a null string, and an | 343 // KURL returns a null string if the URL is itself a null string, and an |
294 // empty string for other nonexistent entities. | 344 // empty string for other nonexistent entities. |
295 if (utf8String().isNull()) | 345 if (utf8String().isNull()) |
296 return String(); | 346 return String(); |
297 return String("", 0); | 347 return String("", 0); |
(...skipping 522 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
820 reinterpret_cast<const UChar*>(notEncodedString.characters()), | 870 reinterpret_cast<const UChar*>(notEncodedString.characters()), |
821 notEncodedString.length(), | 871 notEncodedString.length(), |
822 URLEncodedEntitiesForUnencodables); | 872 URLEncodedEntitiesForUnencodables); |
823 const char* input = utf8.data(); | 873 const char* input = utf8.data(); |
824 int inputLength = utf8.length(); | 874 int inputLength = utf8.length(); |
825 url_canon::RawCanonOutputT<char> buffer; | 875 url_canon::RawCanonOutputT<char> buffer; |
826 if (buffer.length() < inputLength * 3) | 876 if (buffer.length() < inputLength * 3) |
827 buffer.Resize(inputLength * 3); | 877 buffer.Resize(inputLength * 3); |
828 | 878 |
829 url_util::EncodeURIComponent(input, inputLength, &buffer); | 879 url_util::EncodeURIComponent(input, inputLength, &buffer); |
830 return String(buffer.data(), buffer.length()); | 880 String escaped(buffer.data(), buffer.length()); |
| 881 // Unescape '/'; it's safe and much prettier. |
| 882 escaped.replace("%2F", "/"); |
| 883 return escaped; |
831 } | 884 } |
832 | 885 |
833 bool KURL::isHierarchical() const | 886 bool KURL::isHierarchical() const |
834 { | 887 { |
835 if (!m_url.m_parsed.scheme.is_nonempty()) | 888 if (!m_url.m_parsed.scheme.is_nonempty()) |
836 return false; | 889 return false; |
837 return url_util::IsStandard( | 890 return url_util::IsStandard( |
838 &m_url.utf8String().data()[m_url.m_parsed.scheme.begin], | 891 &m_url.utf8String().data()[m_url.m_parsed.scheme.begin], |
839 m_url.m_parsed.scheme); | 892 m_url.m_parsed.scheme); |
840 } | 893 } |
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
943 | 996 |
944 if (a.port() != b.port()) | 997 if (a.port() != b.port()) |
945 return false; | 998 return false; |
946 | 999 |
947 return true; | 1000 return true; |
948 } | 1001 } |
949 | 1002 |
950 } // namespace WebCore | 1003 } // namespace WebCore |
951 | 1004 |
952 #endif // USE(GOOGLEURL) | 1005 #endif // USE(GOOGLEURL) |
OLD | NEW |