| 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..7a1e7edc957424ef17f35d9a0d9a5a43ba13adc0 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 = protocol.toAtomicString();
|
| + 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 {
|
|
|