| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2008, 2009 Google Inc. All rights reserved. | 2 * Copyright (C) 2008, 2009 Google Inc. All rights reserved. |
| 3 * | 3 * |
| 4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
| 5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
| 6 * met: | 6 * met: |
| 7 * | 7 * |
| 8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
| 9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
| 10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
| (...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 127 , m_protocolInHTTPFamily(false) | 127 , m_protocolInHTTPFamily(false) |
| 128 , m_parsed(parsed) | 128 , m_parsed(parsed) |
| 129 , m_utf8IsASCII(true) | 129 , m_utf8IsASCII(true) |
| 130 , m_stringIsValid(false) | 130 , m_stringIsValid(false) |
| 131 { | 131 { |
| 132 } | 132 } |
| 133 | 133 |
| 134 // Setters for the data. Using the ASCII version when you know the | 134 // Setters for the data. Using the ASCII version when you know the |
| 135 // data is ASCII will be slightly more efficient. The UTF-8 version | 135 // data is ASCII will be slightly more efficient. The UTF-8 version |
| 136 // will always be correct if the caller is unsure. | 136 // will always be correct if the caller is unsure. |
| 137 void KURLGooglePrivate::setUtf8(const char* data, int dataLength) | 137 void KURLGooglePrivate::setUtf8(const CString& str) |
| 138 { | 138 { |
| 139 const char* data = str.data(); |
| 140 unsigned dataLength = str.length(); |
| 141 |
| 139 // The m_utf8IsASCII must always be correct since the DeprecatedString | 142 // The m_utf8IsASCII must always be correct since the DeprecatedString |
| 140 // getter must create it with the proper constructor. This test can be | 143 // getter must create it with the proper constructor. This test can be |
| 141 // removed when DeprecatedString is gone, but it still might be a | 144 // removed when DeprecatedString is gone, but it still might be a |
| 142 // performance win. | 145 // performance win. |
| 143 m_utf8IsASCII = true; | 146 m_utf8IsASCII = true; |
| 144 for (int i = 0; i < dataLength; i++) { | 147 for (unsigned i = 0; i < dataLength; i++) { |
| 145 if (static_cast<unsigned char>(data[i]) >= 0x80) { | 148 if (static_cast<unsigned char>(data[i]) >= 0x80) { |
| 146 m_utf8IsASCII = false; | 149 m_utf8IsASCII = false; |
| 147 break; | 150 break; |
| 148 } | 151 } |
| 149 } | 152 } |
| 150 | 153 |
| 151 m_utf8 = CString(data, dataLength); | 154 m_utf8 = str; |
| 152 m_stringIsValid = false; | 155 m_stringIsValid = false; |
| 153 initProtocolInHTTPFamily(); | 156 initProtocolInHTTPFamily(); |
| 154 } | 157 } |
| 155 | 158 |
| 156 void KURLGooglePrivate::setAscii(const char* data, int dataLength) | 159 void KURLGooglePrivate::setAscii(const CString& str) |
| 157 { | 160 { |
| 158 m_utf8 = CString(data, dataLength); | 161 m_utf8 = str; |
| 159 m_utf8IsASCII = true; | 162 m_utf8IsASCII = true; |
| 160 m_stringIsValid = false; | 163 m_stringIsValid = false; |
| 161 initProtocolInHTTPFamily(); | 164 initProtocolInHTTPFamily(); |
| 162 } | 165 } |
| 163 | 166 |
| 164 void KURLGooglePrivate::init(const KURL& base, | 167 void KURLGooglePrivate::init(const KURL& base, |
| 165 const String& relative, | 168 const String& relative, |
| 166 const TextEncoding* queryEncoding) | 169 const TextEncoding* queryEncoding) |
| 167 { | 170 { |
| 168 init(base, relative.characters(), relative.length(), queryEncoding); | 171 init(base, relative.characters(), relative.length(), queryEncoding); |
| (...skipping 27 matching lines...) Expand all Loading... |
| 196 // changed the string, we can avoid an extra allocation by using assignment. | 199 // changed the string, we can avoid an extra allocation by using assignment. |
| 197 // | 200 // |
| 198 // When KURL encounters an error such that the URL is invalid and empty | 201 // When KURL encounters an error such that the URL is invalid and empty |
| 199 // (for example, resolving a relative URL on a non-hierarchical base), it | 202 // (for example, resolving a relative URL on a non-hierarchical base), it |
| 200 // will produce an isNull URL, and calling setUtf8 will produce an empty | 203 // will produce an isNull URL, and calling setUtf8 will produce an empty |
| 201 // non-null URL. This is unlikely to affect anything, but we preserve this | 204 // non-null URL. This is unlikely to affect anything, but we preserve this |
| 202 // just in case. | 205 // just in case. |
| 203 if (m_isValid || output.length()) { | 206 if (m_isValid || output.length()) { |
| 204 // Without ref, the whole url is guaranteed to be ASCII-only. | 207 // Without ref, the whole url is guaranteed to be ASCII-only. |
| 205 if (m_parsed.ref.is_nonempty()) | 208 if (m_parsed.ref.is_nonempty()) |
| 206 setUtf8(output.data(), output.length()); | 209 setUtf8(CString(output.data(), output.length())); |
| 207 else | 210 else |
| 208 setAscii(output.data(), output.length()); | 211 setAscii(CString(output.data(), output.length())); |
| 209 } else { | 212 } else { |
| 210 // WebCore expects resolved URLs to be empty rather than NULL. | 213 // WebCore expects resolved URLs to be empty rather than NULL. |
| 211 setUtf8("", 0); | 214 setUtf8(CString("", 0)); |
| 212 } | 215 } |
| 213 } | 216 } |
| 214 | 217 |
| 215 // Note: code mostly duplicated above. See FIXMEs and comments there. | 218 // Note: code mostly duplicated above. See FIXMEs and comments there. |
| 216 void KURLGooglePrivate::init(const KURL& base, const UChar* rel, int relLength, | 219 void KURLGooglePrivate::init(const KURL& base, const UChar* rel, int relLength, |
| 217 const TextEncoding* queryEncoding) | 220 const TextEncoding* queryEncoding) |
| 218 { | 221 { |
| 219 KURLCharsetConverter charsetConverterObject(queryEncoding); | 222 KURLCharsetConverter charsetConverterObject(queryEncoding); |
| 220 KURLCharsetConverter* charsetConverter = | 223 KURLCharsetConverter* charsetConverter = |
| 221 (!queryEncoding || isUnicodeEncoding(queryEncoding)) ? 0 : | 224 (!queryEncoding || isUnicodeEncoding(queryEncoding)) ? 0 : |
| 222 &charsetConverterObject; | 225 &charsetConverterObject; |
| 223 | 226 |
| 224 url_canon::RawCanonOutputT<char> output; | 227 url_canon::RawCanonOutputT<char> output; |
| 225 const CString& baseStr = base.m_url.utf8String(); | 228 const CString& baseStr = base.m_url.utf8String(); |
| 226 m_isValid = url_util::ResolveRelative(baseStr.data(), baseStr.length(), | 229 m_isValid = url_util::ResolveRelative(baseStr.data(), baseStr.length(), |
| 227 base.m_url.m_parsed, rel, relLength, | 230 base.m_url.m_parsed, rel, relLength, |
| 228 charsetConverter, | 231 charsetConverter, |
| 229 &output, &m_parsed); | 232 &output, &m_parsed); |
| 230 | 233 |
| 231 | 234 |
| 232 if (m_isValid || output.length()) { | 235 if (m_isValid || output.length()) { |
| 233 if (m_parsed.ref.is_nonempty()) | 236 if (m_parsed.ref.is_nonempty()) |
| 234 setUtf8(output.data(), output.length()); | 237 setUtf8(CString(output.data(), output.length())); |
| 235 else | 238 else |
| 236 setAscii(output.data(), output.length()); | 239 setAscii(CString(output.data(), output.length())); |
| 237 } else | 240 } else |
| 238 setUtf8("", 0); | 241 setUtf8(CString("", 0)); |
| 239 } | 242 } |
| 240 | 243 |
| 241 void KURLGooglePrivate::initProtocolInHTTPFamily() | 244 void KURLGooglePrivate::initProtocolInHTTPFamily() |
| 242 { | 245 { |
| 243 if (!m_isValid) { | 246 if (!m_isValid) { |
| 244 m_protocolInHTTPFamily = false; | 247 m_protocolInHTTPFamily = false; |
| 245 return; | 248 return; |
| 246 } | 249 } |
| 247 | 250 |
| 248 const char* scheme = m_utf8.data() + m_parsed.scheme.begin; | 251 const char* scheme = m_utf8.data() + m_parsed.scheme.begin; |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 289 void KURLGooglePrivate::replaceComponents(const Replacements& replacements) | 292 void KURLGooglePrivate::replaceComponents(const Replacements& replacements) |
| 290 { | 293 { |
| 291 url_canon::RawCanonOutputT<char> output; | 294 url_canon::RawCanonOutputT<char> output; |
| 292 url_parse::Parsed newParsed; | 295 url_parse::Parsed newParsed; |
| 293 | 296 |
| 294 m_isValid = url_util::ReplaceComponents(utf8String().data(), | 297 m_isValid = url_util::ReplaceComponents(utf8String().data(), |
| 295 utf8String().length(), m_parsed, rep
lacements, 0, &output, &newParsed); | 298 utf8String().length(), m_parsed, rep
lacements, 0, &output, &newParsed); |
| 296 | 299 |
| 297 m_parsed = newParsed; | 300 m_parsed = newParsed; |
| 298 if (m_parsed.ref.is_nonempty()) | 301 if (m_parsed.ref.is_nonempty()) |
| 299 setUtf8(output.data(), output.length()); | 302 setUtf8(CString(output.data(), output.length())); |
| 300 else | 303 else |
| 301 setAscii(output.data(), output.length()); | 304 setAscii(CString(output.data(), output.length())); |
| 302 } | 305 } |
| 303 | 306 |
| 304 const String& KURLGooglePrivate::string() const | 307 const String& KURLGooglePrivate::string() const |
| 305 { | 308 { |
| 306 if (!m_stringIsValid) { | 309 if (!m_stringIsValid) { |
| 307 // Must special case the NULL case, since constructing the | 310 // Must special case the NULL case, since constructing the |
| 308 // string like we do below will generate an empty rather than | 311 // string like we do below will generate an empty rather than |
| 309 // a NULL string. | 312 // a NULL string. |
| 310 if (m_utf8.isNull()) | 313 if (m_utf8.isNull()) |
| 311 m_string = String(); | 314 m_string = String(); |
| (...skipping 14 matching lines...) Expand all Loading... |
| 326 KURL::KURL(const char *url) | 329 KURL::KURL(const char *url) |
| 327 { | 330 { |
| 328 // FIXME The Mac code checks for beginning with a slash and converting to a | 331 // FIXME The Mac code checks for beginning with a slash and converting to a |
| 329 // file: URL. We will want to add this as well once we can compile on a | 332 // file: URL. We will want to add this as well once we can compile on a |
| 330 // system like that. | 333 // system like that. |
| 331 m_url.init(KURL(), url, strlen(url), 0); | 334 m_url.init(KURL(), url, strlen(url), 0); |
| 332 | 335 |
| 333 // The one-argument constructors should never generate a NULL string. | 336 // The one-argument constructors should never generate a NULL string. |
| 334 // This is a funny quirk of KURL.cpp (probably a bug) which we preserve. | 337 // This is a funny quirk of KURL.cpp (probably a bug) which we preserve. |
| 335 if (m_url.utf8String().isNull()) | 338 if (m_url.utf8String().isNull()) |
| 336 m_url.setAscii("", 0); | 339 m_url.setAscii(CString("", 0)); |
| 337 } | 340 } |
| 338 | 341 |
| 339 // Initializes with a string representing an absolute URL. No encoding | 342 // Initializes with a string representing an absolute URL. No encoding |
| 340 // information is specified. This generally happens when a KURL is converted | 343 // information is specified. This generally happens when a KURL is converted |
| 341 // to a string and then converted back. In this case, the URL is already | 344 // to a string and then converted back. In this case, the URL is already |
| 342 // canonical and in proper escaped form so needs no encoding. We treat it was | 345 // canonical and in proper escaped form so needs no encoding. We treat it was |
| 343 // UTF-8 just in case. | 346 // UTF-8 just in case. |
| 344 KURL::KURL(const String& url) | 347 KURL::KURL(const String& url) |
| 345 { | 348 { |
| 346 if (!url.isNull()) | 349 if (!url.isNull()) |
| (...skipping 16 matching lines...) Expand all Loading... |
| 363 | 366 |
| 364 // Constructs a new URL given a base URL and a possibly relative input URL. | 367 // Constructs a new URL given a base URL and a possibly relative input URL. |
| 365 // Any query portion of the relative URL will be encoded in the given encoding. | 368 // Any query portion of the relative URL will be encoded in the given encoding. |
| 366 KURL::KURL(const KURL& base, | 369 KURL::KURL(const KURL& base, |
| 367 const String& relative, | 370 const String& relative, |
| 368 const TextEncoding& encoding) | 371 const TextEncoding& encoding) |
| 369 { | 372 { |
| 370 m_url.init(base, relative, &encoding.encodingForFormSubmission()); | 373 m_url.init(base, relative, &encoding.encodingForFormSubmission()); |
| 371 } | 374 } |
| 372 | 375 |
| 373 KURL::KURL(const char* canonicalSpec, int canonicalSpecLen, | 376 KURL::KURL(const CString& canonicalSpec, |
| 374 const url_parse::Parsed& parsed, bool isValid) | 377 const url_parse::Parsed& parsed, bool isValid) |
| 375 : m_url(parsed, isValid) | 378 : m_url(parsed, isValid) |
| 376 { | 379 { |
| 377 // We know the reference fragment is the only part that can be UTF-8, so | 380 // We know the reference fragment is the only part that can be UTF-8, so |
| 378 // we know it's ASCII when there is no ref. | 381 // we know it's ASCII when there is no ref. |
| 379 if (parsed.ref.is_nonempty()) | 382 if (parsed.ref.is_nonempty()) |
| 380 m_url.setUtf8(canonicalSpec, canonicalSpecLen); | 383 m_url.setUtf8(canonicalSpec); |
| 381 else | 384 else |
| 382 m_url.setAscii(canonicalSpec, canonicalSpecLen); | 385 m_url.setAscii(canonicalSpec); |
| 383 } | 386 } |
| 384 | 387 |
| 385 #if PLATFORM(CF) | 388 #if PLATFORM(CF) |
| 386 KURL::KURL(CFURLRef) | 389 KURL::KURL(CFURLRef) |
| 387 { | 390 { |
| 388 notImplemented(); | 391 notImplemented(); |
| 389 invalidate(); | 392 invalidate(); |
| 390 } | 393 } |
| 391 | 394 |
| 392 CFURLRef KURL::createCFURL() const | 395 CFURLRef KURL::createCFURL() const |
| (...skipping 543 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 936 } | 939 } |
| 937 | 940 |
| 938 inline bool KURL::protocolIs(const String& string, const char* protocol) | 941 inline bool KURL::protocolIs(const String& string, const char* protocol) |
| 939 { | 942 { |
| 940 return WebCore::protocolIs(string, protocol); | 943 return WebCore::protocolIs(string, protocol); |
| 941 } | 944 } |
| 942 | 945 |
| 943 } // namespace WebCore | 946 } // namespace WebCore |
| 944 | 947 |
| 945 #endif // USE(GOOGLEURL) | 948 #endif // USE(GOOGLEURL) |
| OLD | NEW |