Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(176)

Side by Side Diff: third_party/WebKit/Source/platform/weborigin/KURL.cpp

Issue 2463703002: Optimize KURL protocols (Closed)
Patch Set: 16 bit test Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2004, 2007, 2008, 2011, 2012 Apple Inc. All rights reserved. 2 * Copyright (C) 2004, 2007, 2008, 2011, 2012 Apple Inc. All rights reserved.
3 * Copyright (C) 2012 Research In Motion Limited. All rights reserved. 3 * Copyright (C) 2012 Research In Motion Limited. All rights reserved.
4 * Copyright (C) 2008, 2009, 2011 Google Inc. All rights reserved. 4 * Copyright (C) 2008, 2009, 2011 Google Inc. All rights reserved.
5 * 5 *
6 * Redistribution and use in source and binary forms, with or without 6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions 7 * modification, are permitted provided that the following conditions
8 * are met: 8 * are met:
9 * 1. Redistributions of source code must retain the above copyright 9 * 1. 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 222 matching lines...) Expand 10 before | Expand all | Expand 10 after
233 init(base, relative, &encoding.encodingForFormSubmission()); 233 init(base, relative, &encoding.encodingForFormSubmission());
234 } 234 }
235 235
236 KURL::KURL(const AtomicString& canonicalString, 236 KURL::KURL(const AtomicString& canonicalString,
237 const url::Parsed& parsed, 237 const url::Parsed& parsed,
238 bool isValid) 238 bool isValid)
239 : m_isValid(isValid), 239 : m_isValid(isValid),
240 m_protocolIsInHTTPFamily(false), 240 m_protocolIsInHTTPFamily(false),
241 m_parsed(parsed), 241 m_parsed(parsed),
242 m_string(canonicalString) { 242 m_string(canonicalString) {
243 initProtocolIsInHTTPFamily(); 243 initProtocolMetadata();
244 initInnerURL(); 244 initInnerURL();
245 } 245 }
246 246
247 KURL::KURL(WTF::HashTableDeletedValueType) 247 KURL::KURL(WTF::HashTableDeletedValueType)
248 : m_isValid(false), 248 : m_isValid(false),
249 m_protocolIsInHTTPFamily(false), 249 m_protocolIsInHTTPFamily(false),
250 m_string(WTF::HashTableDeletedValue) {} 250 m_string(WTF::HashTableDeletedValue) {}
251 251
252 KURL::KURL(const KURL& other) 252 KURL::KURL(const KURL& other)
253 : m_isValid(other.m_isValid), 253 : m_isValid(other.m_isValid),
254 m_protocolIsInHTTPFamily(other.m_protocolIsInHTTPFamily), 254 m_protocolIsInHTTPFamily(other.m_protocolIsInHTTPFamily),
255 m_protocol(other.m_protocol),
255 m_parsed(other.m_parsed), 256 m_parsed(other.m_parsed),
256 m_string(other.m_string) { 257 m_string(other.m_string) {
257 if (other.m_innerURL.get()) 258 if (other.m_innerURL.get())
258 m_innerURL = wrapUnique(new KURL(other.m_innerURL->copy())); 259 m_innerURL = wrapUnique(new KURL(other.m_innerURL->copy()));
259 } 260 }
260 261
261 KURL::~KURL() {} 262 KURL::~KURL() {}
262 263
263 KURL& KURL::operator=(const KURL& other) { 264 KURL& KURL::operator=(const KURL& other) {
264 m_isValid = other.m_isValid; 265 m_isValid = other.m_isValid;
265 m_protocolIsInHTTPFamily = other.m_protocolIsInHTTPFamily; 266 m_protocolIsInHTTPFamily = other.m_protocolIsInHTTPFamily;
267 m_protocol = other.m_protocol;
266 m_parsed = other.m_parsed; 268 m_parsed = other.m_parsed;
267 m_string = other.m_string; 269 m_string = other.m_string;
268 if (other.m_innerURL) 270 if (other.m_innerURL)
269 m_innerURL = wrapUnique(new KURL(other.m_innerURL->copy())); 271 m_innerURL = wrapUnique(new KURL(other.m_innerURL->copy()));
270 else 272 else
271 m_innerURL.reset(); 273 m_innerURL.reset();
272 return *this; 274 return *this;
273 } 275 }
274 276
275 KURL KURL::copy() const { 277 KURL KURL::copy() const {
276 KURL result; 278 KURL result;
277 result.m_isValid = m_isValid; 279 result.m_isValid = m_isValid;
278 result.m_protocolIsInHTTPFamily = m_protocolIsInHTTPFamily; 280 result.m_protocolIsInHTTPFamily = m_protocolIsInHTTPFamily;
281 result.m_protocol = m_protocol.isolatedCopy();
279 result.m_parsed = m_parsed; 282 result.m_parsed = m_parsed;
280 result.m_string = m_string.isolatedCopy(); 283 result.m_string = m_string.isolatedCopy();
281 if (m_innerURL) 284 if (m_innerURL)
282 result.m_innerURL = wrapUnique(new KURL(m_innerURL->copy())); 285 result.m_innerURL = wrapUnique(new KURL(m_innerURL->copy()));
283 return result; 286 return result;
284 } 287 }
285 288
286 bool KURL::isNull() const { 289 bool KURL::isNull() const {
287 return m_string.isNull(); 290 return m_string.isNull();
288 } 291 }
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
328 url::ExtractFileName(m_string.characters16(), path, &file); 331 url::ExtractFileName(m_string.characters16(), path, &file);
329 332
330 // Bug: https://bugs.webkit.org/show_bug.cgi?id=21015 this function returns 333 // Bug: https://bugs.webkit.org/show_bug.cgi?id=21015 this function returns
331 // a null string when the path is empty, which we duplicate here. 334 // a null string when the path is empty, which we duplicate here.
332 if (!file.is_nonempty()) 335 if (!file.is_nonempty())
333 return String(); 336 return String();
334 return componentString(file); 337 return componentString(file);
335 } 338 }
336 339
337 String KURL::protocol() const { 340 String KURL::protocol() const {
338 return componentString(m_parsed.scheme); 341 return m_protocol;
339 } 342 }
340 343
341 String KURL::host() const { 344 String KURL::host() const {
342 return componentString(m_parsed.host); 345 return componentString(m_parsed.host);
343 } 346 }
344 347
345 // Returns 0 when there is no port. 348 // Returns 0 when there is no port.
346 // 349 //
347 // We treat URL's with out-of-range port numbers as invalid URLs, and they will 350 // We treat URL's with out-of-range port numbers as invalid URLs, and they will
348 // be rejected by the canonicalizer. KURL.cpp will allow them in parsing, but 351 // be rejected by the canonicalizer. KURL.cpp will allow them in parsing, but
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
425 if (!url::CanonicalizeScheme(newProtocolUTF8.data(), 428 if (!url::CanonicalizeScheme(newProtocolUTF8.data(),
426 url::Component(0, newProtocolUTF8.length()), 429 url::Component(0, newProtocolUTF8.length()),
427 &canonProtocol, &protocolComponent) || 430 &canonProtocol, &protocolComponent) ||
428 !protocolComponent.is_nonempty()) 431 !protocolComponent.is_nonempty())
429 return false; 432 return false;
430 433
431 url::Replacements<char> replacements; 434 url::Replacements<char> replacements;
432 replacements.SetScheme(charactersOrEmpty(newProtocolUTF8), 435 replacements.SetScheme(charactersOrEmpty(newProtocolUTF8),
433 url::Component(0, newProtocolUTF8.length())); 436 url::Component(0, newProtocolUTF8.length()));
434 replaceComponents(replacements); 437 replaceComponents(replacements);
438 initProtocolMetadata();
435 439
436 // isValid could be false but we still return true here. This is because 440 // isValid could be false but we still return true here. This is because
437 // WebCore or JS scripts can build up a URL by setting individual 441 // WebCore or JS scripts can build up a URL by setting individual
438 // components, and a JS exception is based on the return value of this 442 // components, and a JS exception is based on the return value of this
439 // function. We want to throw the exception and stop the script only when 443 // function. We want to throw the exception and stop the script only when
440 // its trying to set a bad protocol, and not when it maybe just hasn't 444 // its trying to set a bad protocol, and not when it maybe just hasn't
441 // finished building up its final scheme. 445 // finished building up its final scheme.
442 return true; 446 return true;
443 } 447 }
444 448
(...skipping 270 matching lines...) Expand 10 before | Expand all | Expand 10 after
715 } 719 }
716 720
717 void KURL::init(const KURL& base, 721 void KURL::init(const KURL& base,
718 const String& relative, 722 const String& relative,
719 const WTF::TextEncoding* queryEncoding) { 723 const WTF::TextEncoding* queryEncoding) {
720 if (!relative.isNull() && relative.is8Bit()) { 724 if (!relative.isNull() && relative.is8Bit()) {
721 StringUTF8Adaptor relativeUTF8(relative); 725 StringUTF8Adaptor relativeUTF8(relative);
722 init(base, relativeUTF8.data(), relativeUTF8.length(), queryEncoding); 726 init(base, relativeUTF8.data(), relativeUTF8.length(), queryEncoding);
723 } else 727 } else
724 init(base, relative.characters16(), relative.length(), queryEncoding); 728 init(base, relative.characters16(), relative.length(), queryEncoding);
725 initProtocolIsInHTTPFamily(); 729 initProtocolMetadata();
726 initInnerURL(); 730 initInnerURL();
727 DCHECK_EQ(protocol(), protocol().lower()); 731 DCHECK_EQ(protocol(), protocol().lower());
728 } 732 }
729 733
730 template <typename CHAR> 734 template <typename CHAR>
731 void KURL::init(const KURL& base, 735 void KURL::init(const KURL& base,
732 const CHAR* relative, 736 const CHAR* relative,
733 int relativeLength, 737 int relativeLength,
734 const WTF::TextEncoding* queryEncoding) { 738 const WTF::TextEncoding* queryEncoding) {
735 // As a performance optimization, we do not use the charset converter 739 // As a performance optimization, we do not use the charset converter
(...skipping 29 matching lines...) Expand all
765 } 769 }
766 if (url::Parsed* innerParsed = m_parsed.inner_parsed()) 770 if (url::Parsed* innerParsed = m_parsed.inner_parsed())
767 m_innerURL = wrapUnique(new KURL( 771 m_innerURL = wrapUnique(new KURL(
768 ParsedURLString, 772 ParsedURLString,
769 m_string.substring(innerParsed->scheme.begin, 773 m_string.substring(innerParsed->scheme.begin,
770 innerParsed->Length() - innerParsed->scheme.begin))); 774 innerParsed->Length() - innerParsed->scheme.begin)));
771 else 775 else
772 m_innerURL.reset(); 776 m_innerURL.reset();
773 } 777 }
774 778
775 template <typename CHAR> 779 void KURL::initProtocolMetadata() {
776 bool internalProtocolIs(const url::Component& scheme,
777 const CHAR* spec,
778 const char* protocol) {
779 const CHAR* begin = spec + scheme.begin;
780 const CHAR* end = begin + scheme.len;
781
782 while (begin != end && *protocol) {
783 ASSERT(toASCIILower(*protocol) == *protocol);
784 if (toASCIILower(*begin++) != *protocol++)
785 return false;
786 }
787
788 // Both strings are equal (ignoring case) if and only if all of the characters
789 // were equal, and the end of both has been reached.
790 return begin == end && !*protocol;
791 }
792
793 template <typename CHAR>
794 bool checkIfProtocolIsInHTTPFamily(const url::Component& scheme,
795 const CHAR* spec) {
796 if (scheme.len == 4)
797 return internalProtocolIs(scheme, spec, "http");
798 if (scheme.len == 5)
799 return internalProtocolIs(scheme, spec, "https");
800 if (scheme.len == 7)
801 return internalProtocolIs(scheme, spec, "http-so");
802 if (scheme.len == 8)
803 return internalProtocolIs(scheme, spec, "https-so");
804 return false;
805 }
806
807 void KURL::initProtocolIsInHTTPFamily() {
808 if (!m_isValid) { 780 if (!m_isValid) {
809 m_protocolIsInHTTPFamily = false; 781 m_protocolIsInHTTPFamily = false;
810 return; 782 return;
811 } 783 }
812 784
813 ASSERT(!m_string.isNull()); 785 ASSERT(!m_string.isNull());
814 m_protocolIsInHTTPFamily = 786 m_protocol = componentString(m_parsed.scheme);
815 m_string.is8Bit() ? checkIfProtocolIsInHTTPFamily(m_parsed.scheme, 787 if (!m_protocol.isEmpty())
816 m_string.characters8()) 788 m_protocol = (m_protocol);
esprehn 2016/11/04 23:48:32 what does this do? assigning m_protocol to itself
Charlie Harrison 2016/11/04 23:58:35 Oops. That should be m_protocol = AtomicString(m_p
817 : checkIfProtocolIsInHTTPFamily( 789
818 m_parsed.scheme, m_string.characters16()); 790 // TODO(csharrison): Add "http" and "https" to the AtomicString table at init
791 // time so that the normal case here is just a pointer comparison.
792 m_protocolIsInHTTPFamily = m_protocol == "http" || m_protocol == "https" ||
793 m_protocol == "http-so" ||
794 m_protocol == "https-so";
819 } 795 }
820 796
821 bool KURL::protocolIs(const char* protocol) const { 797 bool KURL::protocolIs(const char* protocol) const {
822 assertProtocolIsGood(protocol); 798 assertProtocolIsGood(protocol);
823 799
824 // JavaScript URLs are "valid" and should be executed even if KURL decides 800 // JavaScript URLs are "valid" and should be executed even if KURL decides
825 // they are invalid. The free function protocolIsJavaScript() should be used 801 // they are invalid. The free function protocolIsJavaScript() should be used
826 // instead. 802 // instead.
827 // FIXME: Chromium code needs to be fixed for this assert to be enabled. 803 // FIXME: Chromium code needs to be fixed for this assert to be enabled.
828 // ASSERT(strcmp(protocol, "javascript")); 804 // ASSERT(strcmp(protocol, "javascript"));
829 805
830 if (m_string.isNull() || m_parsed.scheme.len <= 0) 806 if (m_string.isNull() || m_protocol.isNull() || m_parsed.scheme.len <= 0)
831 return *protocol == '\0'; 807 return *protocol == '\0';
832 808 return m_protocol == protocol;
833 return m_string.is8Bit()
834 ? internalProtocolIs(m_parsed.scheme, m_string.characters8(),
835 protocol)
836 : internalProtocolIs(m_parsed.scheme, m_string.characters16(),
837 protocol);
838 } 809 }
839 810
840 String KURL::stringForInvalidComponent() const { 811 String KURL::stringForInvalidComponent() const {
841 if (m_string.isNull()) 812 if (m_string.isNull())
842 return String(); 813 return String();
843 return emptyString(); 814 return emptyString();
844 } 815 }
845 816
846 String KURL::componentString(const url::Component& component) const { 817 String KURL::componentString(const url::Component& component) const {
847 if (!m_isValid || component.len <= 0) 818 if (!m_isValid || component.len <= 0)
(...skipping 21 matching lines...) Expand all
869 m_parsed = newParsed; 840 m_parsed = newParsed;
870 m_string = AtomicString::fromUTF8(output.data(), output.length()); 841 m_string = AtomicString::fromUTF8(output.data(), output.length());
871 } 842 }
872 843
873 bool KURL::isSafeToSendToAnotherThread() const { 844 bool KURL::isSafeToSendToAnotherThread() const {
874 return m_string.isSafeToSendToAnotherThread() && 845 return m_string.isSafeToSendToAnotherThread() &&
875 (!m_innerURL || m_innerURL->isSafeToSendToAnotherThread()); 846 (!m_innerURL || m_innerURL->isSafeToSendToAnotherThread());
876 } 847 }
877 848
878 } // namespace blink 849 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698