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

Unified Diff: third_party/WebKit/Source/platform/weborigin/KURL.cpp

Issue 2463703002: Optimize KURL protocols (Closed)
Patch Set: add dchecks Created 4 years 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 side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/platform/weborigin/KURL.cpp
diff --git a/third_party/WebKit/Source/platform/weborigin/KURL.cpp b/third_party/WebKit/Source/platform/weborigin/KURL.cpp
index 2f4894fdd2922083ab18b9a0667803a2e0d9a49e..2c86b43ee5baf700460fcf7bd9627f488aaa5142 100644
--- a/third_party/WebKit/Source/platform/weborigin/KURL.cpp
+++ b/third_party/WebKit/Source/platform/weborigin/KURL.cpp
@@ -34,6 +34,7 @@
#include "wtf/StdLibExtras.h"
#include "wtf/text/CString.h"
#include "wtf/text/StringHash.h"
+#include "wtf/text/StringStatics.h"
#include "wtf/text/StringUTF8Adaptor.h"
#include "wtf/text/TextEncoding.h"
#include <algorithm>
@@ -48,6 +49,7 @@ static const int invalidPortNumber = 0xFFFF;
static void assertProtocolIsGood(const char* protocol) {
#if ENABLE(ASSERT)
+ DCHECK_NE(protocol, "");
const char* p = protocol;
while (*p) {
ASSERT(*p > ' ' && *p < 0x7F && !(*p >= 'A' && *p <= 'Z'));
@@ -241,7 +243,7 @@ KURL::KURL(const AtomicString& canonicalString,
m_protocolIsInHTTPFamily(false),
m_parsed(parsed),
m_string(canonicalString) {
- initProtocolIsInHTTPFamily();
+ initProtocolMetadata();
initInnerURL();
}
@@ -253,6 +255,7 @@ KURL::KURL(WTF::HashTableDeletedValueType)
KURL::KURL(const KURL& other)
: m_isValid(other.m_isValid),
m_protocolIsInHTTPFamily(other.m_protocolIsInHTTPFamily),
+ m_protocol(other.m_protocol),
m_parsed(other.m_parsed),
m_string(other.m_string) {
if (other.m_innerURL.get())
@@ -264,6 +267,7 @@ KURL::~KURL() {}
KURL& KURL::operator=(const KURL& other) {
m_isValid = other.m_isValid;
m_protocolIsInHTTPFamily = other.m_protocolIsInHTTPFamily;
+ m_protocol = other.m_protocol;
m_parsed = other.m_parsed;
m_string = other.m_string;
if (other.m_innerURL)
@@ -277,6 +281,7 @@ KURL KURL::copy() const {
KURL result;
result.m_isValid = m_isValid;
result.m_protocolIsInHTTPFamily = m_protocolIsInHTTPFamily;
+ result.m_protocol = m_protocol.isolatedCopy();
result.m_parsed = m_parsed;
result.m_string = m_string.isolatedCopy();
if (m_innerURL)
@@ -312,7 +317,7 @@ bool KURL::hasPath() const {
String KURL::lastPathComponent() const {
if (!m_isValid)
- return stringForInvalidComponent();
+ return stringViewForInvalidComponent().toString();
ASSERT(!m_string.isNull());
// When the output ends in a slash, WebCore has different expectations than
@@ -336,7 +341,8 @@ String KURL::lastPathComponent() const {
}
String KURL::protocol() const {
- return componentString(m_parsed.scheme);
+ DCHECK_EQ(componentString(m_parsed.scheme), m_protocol);
+ return m_protocol;
}
String KURL::host() const {
@@ -365,6 +371,9 @@ unsigned short KURL::port() const {
return static_cast<unsigned short>(port);
}
+// TODO(csharrison): Migrate pass() and user() to return a StringView. Most
+// consumers just need to know if the string is empty.
+
String KURL::pass() const {
// Bug: https://bugs.webkit.org/show_bug.cgi?id=21015 this function returns
// a null string when the password is empty, which we duplicate here.
@@ -767,9 +776,8 @@ void KURL::init(const KURL& base,
m_string = AtomicString::fromUTF8(output.data(), output.length());
}
- initProtocolIsInHTTPFamily();
+ initProtocolMetadata();
initInnerURL();
- DCHECK_EQ(protocol(), protocol().lower());
}
void KURL::initInnerURL() {
@@ -786,50 +794,26 @@ void KURL::initInnerURL() {
m_innerURL.reset();
}
-template <typename CHAR>
-bool internalProtocolIs(const url::Component& scheme,
- const CHAR* spec,
- const char* protocol) {
- const CHAR* begin = spec + scheme.begin;
- const CHAR* end = begin + scheme.len;
-
- while (begin != end && *protocol) {
- ASSERT(toASCIILower(*protocol) == *protocol);
- if (toASCIILower(*begin++) != *protocol++)
- return false;
- }
-
- // Both strings are equal (ignoring case) if and only if all of the characters
- // were equal, and the end of both has been reached.
- return begin == end && !*protocol;
-}
-
-template <typename CHAR>
-bool checkIfProtocolIsInHTTPFamily(const url::Component& scheme,
- const CHAR* spec) {
- if (scheme.len == 4)
- return internalProtocolIs(scheme, spec, "http");
- if (scheme.len == 5)
- return internalProtocolIs(scheme, spec, "https");
- if (scheme.len == 7)
- return internalProtocolIs(scheme, spec, "http-so");
- if (scheme.len == 8)
- return internalProtocolIs(scheme, spec, "https-so");
- return false;
-}
-
-void KURL::initProtocolIsInHTTPFamily() {
+void KURL::initProtocolMetadata() {
if (!m_isValid) {
m_protocolIsInHTTPFamily = false;
+ m_protocol = componentString(m_parsed.scheme);
return;
}
- ASSERT(!m_string.isNull());
- m_protocolIsInHTTPFamily =
- m_string.is8Bit() ? checkIfProtocolIsInHTTPFamily(m_parsed.scheme,
- m_string.characters8())
- : checkIfProtocolIsInHTTPFamily(
- m_parsed.scheme, m_string.characters16());
+ DCHECK(!m_string.isNull());
+ StringView protocol = componentStringView(m_parsed.scheme);
+ m_protocolIsInHTTPFamily = true;
+ if (protocol == WTF::httpsAtom) {
+ m_protocol = WTF::httpsAtom;
+ } else if (protocol == WTF::httpAtom) {
+ m_protocol = WTF::httpAtom;
+ } else {
+ m_protocol = AtomicString(protocol.toString());
+ m_protocolIsInHTTPFamily =
+ m_protocol == "http-so" || m_protocol == "https-so";
+ }
+ DCHECK_EQ(m_protocol, m_protocol.lower());
}
bool KURL::protocolIs(const char* protocol) const {
@@ -840,26 +824,16 @@ bool KURL::protocolIs(const char* protocol) const {
// instead.
// FIXME: Chromium code needs to be fixed for this assert to be enabled.
// ASSERT(strcmp(protocol, "javascript"));
-
- if (m_string.isNull() || m_parsed.scheme.len <= 0)
- return *protocol == '\0';
-
- return m_string.is8Bit()
- ? internalProtocolIs(m_parsed.scheme, m_string.characters8(),
- protocol)
- : internalProtocolIs(m_parsed.scheme, m_string.characters16(),
- protocol);
+ return m_protocol == protocol;
}
-String KURL::stringForInvalidComponent() const {
- if (m_string.isNull())
- return String();
- return emptyString();
+StringView KURL::stringViewForInvalidComponent() const {
+ return m_string.isNull() ? StringView() : StringView("", 0);
}
-String KURL::componentString(const url::Component& component) const {
+StringView KURL::componentStringView(const url::Component& component) const {
if (!m_isValid || component.len <= 0)
- return stringForInvalidComponent();
+ return stringViewForInvalidComponent();
// begin and len are in terms of bytes which do not match
// if string() is UTF-16 and input contains non-ASCII characters.
// However, the only part in urlString that can contain non-ASCII
@@ -868,7 +842,14 @@ String KURL::componentString(const url::Component& component) const {
// byte) will be longer than what's needed by 'mid'. However, mid
// truncates len to avoid go past the end of a string so that we can
// get away without doing anything here.
- return getString().substring(component.begin, component.len);
+
+ int maxLength = getString().length() - component.begin;
+ return StringView(getString(), component.begin,
+ component.len > maxLength ? maxLength : component.len);
+}
+
+String KURL::componentString(const url::Component& component) const {
+ return componentStringView(component).toString();
}
template <typename CHAR>
@@ -882,6 +863,7 @@ void KURL::replaceComponents(const url::Replacements<CHAR>& replacements) {
m_parsed = newParsed;
m_string = AtomicString::fromUTF8(output.data(), output.length());
+ initProtocolMetadata();
}
bool KURL::isSafeToSendToAnotherThread() const {
« no previous file with comments | « third_party/WebKit/Source/platform/weborigin/KURL.h ('k') | third_party/WebKit/Source/platform/weborigin/KURLTest.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698