<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[206323] trunk/Source/WebCore</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/206323">206323</a></dd>
<dt>Author</dt> <dd>achristensen@apple.com</dd>
<dt>Date</dt> <dd>2016-09-23 12:57:57 -0700 (Fri, 23 Sep 2016)</dd>
</dl>

<h3>Log Message</h3>
<pre>Remove URLParser serialized template
https://bugs.webkit.org/show_bug.cgi?id=162501

Reviewed by Brady Eidson.

No change in behavior.  
This optimization conflicts with another optimization I'm doing.
We currently have the ParsedURLString tag, where we tell the parser to assume this URL is valid and canonicalized.
I'm going to instead make URLParser assume all URLs are valid and canonicalized until it finds that it is not, 
in which case it will canonicalize it if possible.

* platform/URL.cpp:
(WebCore::URL::URL):
* platform/URLParser.cpp:
(WebCore::incrementIteratorSkippingTabAndNewLine):
(WebCore::isWindowsDriveLetter):
(WebCore::checkWindowsDriveLetter):
(WebCore::shouldCopyFileURL):
(WebCore::utf8PercentEncode):
(WebCore::utf8QueryEncode):
(WebCore::URLParser::parse):
(WebCore::URLParser::parseAuthority):
(WebCore::URLParser::parsePort):
(WebCore::URLParser::parseHostAndPort):
(WebCore::URLParser::parseSerializedURL): Deleted.
* platform/URLParser.h:
(WebCore::URLParser::parse):</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreplatformURLcpp">trunk/Source/WebCore/platform/URL.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformURLParsercpp">trunk/Source/WebCore/platform/URLParser.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformURLParserh">trunk/Source/WebCore/platform/URLParser.h</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (206322 => 206323)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2016-09-23 19:40:53 UTC (rev 206322)
+++ trunk/Source/WebCore/ChangeLog        2016-09-23 19:57:57 UTC (rev 206323)
</span><span class="lines">@@ -1,3 +1,33 @@
</span><ins>+2016-09-23  Alex Christensen  &lt;achristensen@webkit.org&gt;
+
+        Remove URLParser serialized template
+        https://bugs.webkit.org/show_bug.cgi?id=162501
+
+        Reviewed by Brady Eidson.
+
+        No change in behavior.  
+        This optimization conflicts with another optimization I'm doing.
+        We currently have the ParsedURLString tag, where we tell the parser to assume this URL is valid and canonicalized.
+        I'm going to instead make URLParser assume all URLs are valid and canonicalized until it finds that it is not, 
+        in which case it will canonicalize it if possible.
+
+        * platform/URL.cpp:
+        (WebCore::URL::URL):
+        * platform/URLParser.cpp:
+        (WebCore::incrementIteratorSkippingTabAndNewLine):
+        (WebCore::isWindowsDriveLetter):
+        (WebCore::checkWindowsDriveLetter):
+        (WebCore::shouldCopyFileURL):
+        (WebCore::utf8PercentEncode):
+        (WebCore::utf8QueryEncode):
+        (WebCore::URLParser::parse):
+        (WebCore::URLParser::parseAuthority):
+        (WebCore::URLParser::parsePort):
+        (WebCore::URLParser::parseHostAndPort):
+        (WebCore::URLParser::parseSerializedURL): Deleted.
+        * platform/URLParser.h:
+        (WebCore::URLParser::parse):
+
</ins><span class="cx"> 2016-09-23  Jer Noble  &lt;jer.noble@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Allow Seeking from the now playing controls
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformURLcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/URL.cpp (206322 => 206323)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/URL.cpp        2016-09-23 19:40:53 UTC (rev 206322)
+++ trunk/Source/WebCore/platform/URL.cpp        2016-09-23 19:57:57 UTC (rev 206323)
</span><span class="lines">@@ -442,7 +442,7 @@
</span><span class="cx"> {
</span><span class="cx">     if (URLParser::enabled()) {
</span><span class="cx">         URLParser parser;
</span><del>-        *this = parser.parseSerializedURL(url);
</del><ins>+        *this = parser.parse(url);
</ins><span class="cx">     } else
</span><span class="cx">         parse(url);
</span><span class="cx"> #if OS(WINDOWS)
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformURLParsercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/URLParser.cpp (206322 => 206323)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/URLParser.cpp        2016-09-23 19:40:53 UTC (rev 206322)
+++ trunk/Source/WebCore/platform/URLParser.cpp        2016-09-23 19:57:57 UTC (rev 206323)
</span><span class="lines">@@ -403,20 +403,20 @@
</span><span class="cx"> template&lt;typename CharacterType&gt; inline static bool isValidSchemeCharacter(CharacterType character) { return character &lt;= 'z' &amp;&amp; characterClassTable[character] &amp; Scheme; }
</span><span class="cx"> static bool shouldPercentEncodeQueryByte(uint8_t byte) { return characterClassTable[byte] &amp; QueryPercent; }
</span><span class="cx"> 
</span><del>-template&lt;bool serialized, typename CharacterType&gt;
</del><ins>+template&lt;typename CharacterType&gt;
</ins><span class="cx"> void incrementIteratorSkippingTabAndNewLine(CodePointIterator&lt;CharacterType&gt;&amp; iterator)
</span><span class="cx"> {
</span><span class="cx">     ++iterator;
</span><del>-    while (!serialized &amp;&amp; !iterator.atEnd() &amp;&amp; isTabOrNewline(*iterator))
</del><ins>+    while (!iterator.atEnd() &amp;&amp; isTabOrNewline(*iterator))
</ins><span class="cx">         ++iterator;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-template&lt;bool serialized, typename CharacterType&gt;
</del><ins>+template&lt;typename CharacterType&gt;
</ins><span class="cx"> inline static bool isWindowsDriveLetter(CodePointIterator&lt;CharacterType&gt; iterator)
</span><span class="cx"> {
</span><span class="cx">     if (iterator.atEnd() || !isASCIIAlpha(*iterator))
</span><span class="cx">         return false;
</span><del>-    incrementIteratorSkippingTabAndNewLine&lt;serialized&gt;(iterator);
</del><ins>+    incrementIteratorSkippingTabAndNewLine(iterator);
</ins><span class="cx">     if (iterator.atEnd())
</span><span class="cx">         return false;
</span><span class="cx">     return *iterator == ':' || *iterator == '|';
</span><span class="lines">@@ -429,31 +429,31 @@
</span><span class="cx">     return isASCIIAlpha(buffer[index]) &amp;&amp; (buffer[index + 1] == ':' || buffer[index + 1] == '|');
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-template&lt;bool serialized, typename CharacterType&gt;
</del><ins>+template&lt;typename CharacterType&gt;
</ins><span class="cx"> inline static void checkWindowsDriveLetter(CodePointIterator&lt;CharacterType&gt;&amp; iterator, Vector&lt;LChar&gt;&amp; asciiBuffer)
</span><span class="cx"> {
</span><del>-    if (isWindowsDriveLetter&lt;serialized&gt;(iterator)) {
</del><ins>+    if (isWindowsDriveLetter(iterator)) {
</ins><span class="cx">         asciiBuffer.reserveCapacity(asciiBuffer.size() + 2);
</span><span class="cx">         asciiBuffer.uncheckedAppend(*iterator);
</span><del>-        incrementIteratorSkippingTabAndNewLine&lt;serialized&gt;(iterator);
</del><ins>+        incrementIteratorSkippingTabAndNewLine(iterator);
</ins><span class="cx">         ASSERT(!iterator.atEnd());
</span><span class="cx">         ASSERT(*iterator == ':' || *iterator == '|');
</span><span class="cx">         asciiBuffer.uncheckedAppend(':');
</span><del>-        incrementIteratorSkippingTabAndNewLine&lt;serialized&gt;(iterator);
</del><ins>+        incrementIteratorSkippingTabAndNewLine(iterator);
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-template&lt;bool serialized, typename CharacterType&gt;
</del><ins>+template&lt;typename CharacterType&gt;
</ins><span class="cx"> inline static bool shouldCopyFileURL(CodePointIterator&lt;CharacterType&gt; iterator)
</span><span class="cx"> {
</span><del>-    if (!isWindowsDriveLetter&lt;serialized&gt;(iterator))
</del><ins>+    if (!isWindowsDriveLetter(iterator))
</ins><span class="cx">         return true;
</span><span class="cx">     if (iterator.atEnd())
</span><span class="cx">         return false;
</span><del>-    incrementIteratorSkippingTabAndNewLine&lt;serialized&gt;(iterator);
</del><ins>+    incrementIteratorSkippingTabAndNewLine(iterator);
</ins><span class="cx">     if (iterator.atEnd())
</span><span class="cx">         return true;
</span><del>-    incrementIteratorSkippingTabAndNewLine&lt;serialized&gt;(iterator);
</del><ins>+    incrementIteratorSkippingTabAndNewLine(iterator);
</ins><span class="cx">     if (iterator.atEnd())
</span><span class="cx">         return true;
</span><span class="cx">     return !isSlashQuestionOrHash(*iterator);
</span><span class="lines">@@ -469,67 +469,53 @@
</span><span class="cx"> const char* replacementCharacterUTF8PercentEncoded = &quot;%EF%BF%BD&quot;;
</span><span class="cx"> const size_t replacementCharacterUTF8PercentEncodedLength = 9;
</span><span class="cx"> 
</span><del>-template&lt;bool serialized&gt;
</del><span class="cx"> inline static void utf8PercentEncode(UChar32 codePoint, Vector&lt;LChar&gt;&amp; destination, bool(*isInCodeSet)(UChar32))
</span><span class="cx"> {
</span><del>-    if (serialized) {
-        ASSERT_WITH_SECURITY_IMPLICATION(isASCII(codePoint));
-        ASSERT_WITH_SECURITY_IMPLICATION(!isInCodeSet(codePoint));
-        destination.append(codePoint);
-    } else {
-        if (isASCII(codePoint)) {
-            if (isInCodeSet(codePoint))
-                percentEncodeByte(codePoint, destination);
-            else
-                destination.append(codePoint);
-            return;
-        }
-        ASSERT_WITH_MESSAGE(isInCodeSet(codePoint), &quot;isInCodeSet should always return true for non-ASCII characters&quot;);
-        
-        if (!U_IS_UNICODE_CHAR(codePoint)) {
-            destination.append(replacementCharacterUTF8PercentEncoded, replacementCharacterUTF8PercentEncodedLength);
-            return;
-        }
-        
-        uint8_t buffer[U8_MAX_LENGTH];
-        int32_t offset = 0;
-        U8_APPEND_UNSAFE(buffer, offset, codePoint);
-        for (int32_t i = 0; i &lt; offset; ++i)
-            percentEncodeByte(buffer[i], destination);
</del><ins>+    if (isASCII(codePoint)) {
+        if (isInCodeSet(codePoint))
+            percentEncodeByte(codePoint, destination);
+        else
+            destination.append(codePoint);
+        return;
</ins><span class="cx">     }
</span><ins>+    ASSERT_WITH_MESSAGE(isInCodeSet(codePoint), &quot;isInCodeSet should always return true for non-ASCII characters&quot;);
+    
+    if (!U_IS_UNICODE_CHAR(codePoint)) {
+        destination.append(replacementCharacterUTF8PercentEncoded, replacementCharacterUTF8PercentEncodedLength);
+        return;
+    }
+    
+    uint8_t buffer[U8_MAX_LENGTH];
+    int32_t offset = 0;
+    U8_APPEND_UNSAFE(buffer, offset, codePoint);
+    for (int32_t i = 0; i &lt; offset; ++i)
+        percentEncodeByte(buffer[i], destination);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-template&lt;bool serialized&gt;
</del><span class="cx"> inline static void utf8QueryEncode(UChar32 codePoint, Vector&lt;LChar&gt;&amp; destination)
</span><span class="cx"> {
</span><del>-    if (serialized) {
-        ASSERT_WITH_SECURITY_IMPLICATION(isASCII(codePoint));
-        ASSERT_WITH_SECURITY_IMPLICATION(!shouldPercentEncodeQueryByte(codePoint));
-        destination.append(codePoint);
-    } else {
-        if (isASCII(codePoint)) {
-            if (shouldPercentEncodeQueryByte(codePoint))
-                percentEncodeByte(codePoint, destination);
-            else
-                destination.append(codePoint);
-            return;
-        }
-        
-        if (!U_IS_UNICODE_CHAR(codePoint)) {
-            destination.append(replacementCharacterUTF8PercentEncoded, replacementCharacterUTF8PercentEncodedLength);
-            return;
-        }
</del><ins>+    if (isASCII(codePoint)) {
+        if (shouldPercentEncodeQueryByte(codePoint))
+            percentEncodeByte(codePoint, destination);
+        else
+            destination.append(codePoint);
+        return;
+    }
+    
+    if (!U_IS_UNICODE_CHAR(codePoint)) {
+        destination.append(replacementCharacterUTF8PercentEncoded, replacementCharacterUTF8PercentEncodedLength);
+        return;
+    }
</ins><span class="cx"> 
</span><del>-        uint8_t buffer[U8_MAX_LENGTH];
-        int32_t offset = 0;
-        U8_APPEND_UNSAFE(buffer, offset, codePoint);
-        for (int32_t i = 0; i &lt; offset; ++i) {
-            auto byte = buffer[i];
-            if (shouldPercentEncodeQueryByte(byte))
-                percentEncodeByte(byte, destination);
-            else
-                destination.append(byte);
-        }
</del><ins>+    uint8_t buffer[U8_MAX_LENGTH];
+    int32_t offset = 0;
+    U8_APPEND_UNSAFE(buffer, offset, codePoint);
+    for (int32_t i = 0; i &lt; offset; ++i) {
+        auto byte = buffer[i];
+        if (shouldPercentEncodeQueryByte(byte))
+            percentEncodeByte(byte, destination);
+        else
+            destination.append(byte);
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx">     
</span><span class="lines">@@ -933,21 +919,12 @@
</span><span class="cx"> 
</span><span class="cx"> URL URLParser::parse(const String&amp; input, const URL&amp; base, const TextEncoding&amp; encoding)
</span><span class="cx"> {
</span><del>-    const bool serialized = false;
</del><span class="cx">     if (input.is8Bit())
</span><del>-        return parse&lt;serialized&gt;(input.characters8(), input.length(), base, encoding);
-    return parse&lt;serialized&gt;(input.characters16(), input.length(), base, encoding);
</del><ins>+        return parse(input.characters8(), input.length(), base, encoding);
+    return parse(input.characters16(), input.length(), base, encoding);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-URL URLParser::parseSerializedURL(const String&amp; input)
-{
-    const bool serialized = true;
-    if (input.is8Bit())
-        return parse&lt;serialized&gt;(input.characters8(), input.length(), { }, UTF8Encoding());
-    return parse&lt;serialized&gt;(input.characters16(), input.length(), { }, UTF8Encoding());
-}
-
-template&lt;bool serialized, typename CharacterType&gt;
</del><ins>+template&lt;typename CharacterType&gt;
</ins><span class="cx"> URL URLParser::parse(const CharacterType* input, const unsigned length, const URL&amp; base, const TextEncoding&amp; encoding)
</span><span class="cx"> {
</span><span class="cx">     LOG(URLParser, &quot;Parsing URL &lt;%s&gt; base &lt;%s&gt;&quot;, String(input, length).utf8().data(), base.string().utf8().data());
</span><span class="lines">@@ -995,7 +972,7 @@
</span><span class="cx"> 
</span><span class="cx">     State state = State::SchemeStart;
</span><span class="cx">     while (!c.atEnd()) {
</span><del>-        if (!serialized &amp;&amp; isTabOrNewline(*c)) {
</del><ins>+        if (isTabOrNewline(*c)) {
</ins><span class="cx">             ++c;
</span><span class="cx">             continue;
</span><span class="cx">         }
</span><span class="lines">@@ -1005,7 +982,7 @@
</span><span class="cx">             LOG_STATE(&quot;SchemeStart&quot;);
</span><span class="cx">             if (isASCIIAlpha(*c)) {
</span><span class="cx">                 m_asciiBuffer.uncheckedAppend(toASCIILower(*c));
</span><del>-                incrementIteratorSkippingTabAndNewLine&lt;serialized&gt;(c);
</del><ins>+                incrementIteratorSkippingTabAndNewLine(c);
</ins><span class="cx">                 if (c.atEnd()) {
</span><span class="cx">                     m_asciiBuffer.clear();
</span><span class="cx">                     state = State::NoScheme;
</span><span class="lines">@@ -1039,7 +1016,7 @@
</span><span class="cx">                         state = State::SpecialAuthoritySlashes;
</span><span class="cx">                 } else {
</span><span class="cx">                     auto maybeSlash = c;
</span><del>-                    incrementIteratorSkippingTabAndNewLine&lt;serialized&gt;(maybeSlash);
</del><ins>+                    incrementIteratorSkippingTabAndNewLine(maybeSlash);
</ins><span class="cx">                     if (!maybeSlash.atEnd() &amp;&amp; *maybeSlash == '/') {
</span><span class="cx">                         m_asciiBuffer.append('/');
</span><span class="cx">                         m_url.m_userStart = m_asciiBuffer.size();
</span><span class="lines">@@ -1065,7 +1042,7 @@
</span><span class="cx">                 c = beginAfterControlAndSpace;
</span><span class="cx">                 break;
</span><span class="cx">             }
</span><del>-            incrementIteratorSkippingTabAndNewLine&lt;serialized&gt;(c);
</del><ins>+            incrementIteratorSkippingTabAndNewLine(c);
</ins><span class="cx">             if (c.atEnd()) {
</span><span class="cx">                 m_asciiBuffer.clear();
</span><span class="cx">                 state = State::NoScheme;
</span><span class="lines">@@ -1095,7 +1072,7 @@
</span><span class="cx">             LOG_STATE(&quot;SpecialRelativeOrAuthority&quot;);
</span><span class="cx">             if (*c == '/') {
</span><span class="cx">                 m_asciiBuffer.append('/');
</span><del>-                incrementIteratorSkippingTabAndNewLine&lt;serialized&gt;(c);
</del><ins>+                incrementIteratorSkippingTabAndNewLine(c);
</ins><span class="cx">                 if (c.atEnd())
</span><span class="cx">                     return failure(input, length);
</span><span class="cx">                 if (*c == '/') {
</span><span class="lines">@@ -1170,7 +1147,7 @@
</span><span class="cx">             LOG_STATE(&quot;SpecialAuthoritySlashes&quot;);
</span><span class="cx">             m_asciiBuffer.append(&quot;//&quot;, 2);
</span><span class="cx">             if (*c == '/' || *c == '\\') {
</span><del>-                incrementIteratorSkippingTabAndNewLine&lt;serialized&gt;(c);
</del><ins>+                incrementIteratorSkippingTabAndNewLine(c);
</ins><span class="cx">                 if (!c.atEnd() &amp;&amp; (*c == '/' || *c == '\\'))
</span><span class="cx">                     ++c;
</span><span class="cx">             }
</span><span class="lines">@@ -1197,9 +1174,9 @@
</span><span class="cx">                             lastAt = findLastAt;
</span><span class="cx">                         ++findLastAt;
</span><span class="cx">                     }
</span><del>-                    parseAuthority&lt;serialized&gt;(CodePointIterator&lt;CharacterType&gt;(authorityOrHostBegin, lastAt));
</del><ins>+                    parseAuthority(CodePointIterator&lt;CharacterType&gt;(authorityOrHostBegin, lastAt));
</ins><span class="cx">                     c = lastAt;
</span><del>-                    incrementIteratorSkippingTabAndNewLine&lt;serialized&gt;(c);
</del><ins>+                    incrementIteratorSkippingTabAndNewLine(c);
</ins><span class="cx">                     authorityOrHostBegin = c;
</span><span class="cx">                     state = State::Host;
</span><span class="cx">                     m_hostHasPercentOrNonASCII = false;
</span><span class="lines">@@ -1209,7 +1186,7 @@
</span><span class="cx">                 if (isSlash || *c == '?' || *c == '#') {
</span><span class="cx">                     m_url.m_userEnd = m_asciiBuffer.size();
</span><span class="cx">                     m_url.m_passwordEnd = m_url.m_userEnd;
</span><del>-                    if (!parseHostAndPort&lt;serialized&gt;(CodePointIterator&lt;CharacterType&gt;(authorityOrHostBegin, c)))
</del><ins>+                    if (!parseHostAndPort(CodePointIterator&lt;CharacterType&gt;(authorityOrHostBegin, c)))
</ins><span class="cx">                         return failure(input, length);
</span><span class="cx">                     if (!isSlash) {
</span><span class="cx">                         m_asciiBuffer.append('/');
</span><span class="lines">@@ -1226,7 +1203,7 @@
</span><span class="cx">         case State::Host:
</span><span class="cx">             LOG_STATE(&quot;Host&quot;);
</span><span class="cx">             if (*c == '/' || *c == '?' || *c == '#') {
</span><del>-                if (!parseHostAndPort&lt;serialized&gt;(CodePointIterator&lt;CharacterType&gt;(authorityOrHostBegin, c)))
</del><ins>+                if (!parseHostAndPort(CodePointIterator&lt;CharacterType&gt;(authorityOrHostBegin, c)))
</ins><span class="cx">                     return failure(input, length);
</span><span class="cx">                 state = State::Path;
</span><span class="cx">                 break;
</span><span class="lines">@@ -1274,7 +1251,7 @@
</span><span class="cx">                 ++c;
</span><span class="cx">                 break;
</span><span class="cx">             default:
</span><del>-                if (base.isValid() &amp;&amp; base.protocolIs(&quot;file&quot;) &amp;&amp; shouldCopyFileURL&lt;serialized&gt;(c))
</del><ins>+                if (base.isValid() &amp;&amp; base.protocolIs(&quot;file&quot;) &amp;&amp; shouldCopyFileURL(c))
</ins><span class="cx">                     copyURLPartsUntil(base, URLPart::PathAfterLastSlash);
</span><span class="cx">                 else {
</span><span class="cx">                     m_asciiBuffer.append(&quot;///&quot;, 3);
</span><span class="lines">@@ -1284,7 +1261,7 @@
</span><span class="cx">                     m_url.m_hostEnd = m_url.m_userStart;
</span><span class="cx">                     m_url.m_portEnd = m_url.m_userStart;
</span><span class="cx">                     m_url.m_pathAfterLastSlash = m_url.m_userStart + 1;
</span><del>-                    checkWindowsDriveLetter&lt;serialized&gt;(c, m_asciiBuffer);
</del><ins>+                    checkWindowsDriveLetter(c, m_asciiBuffer);
</ins><span class="cx">                 }
</span><span class="cx">                 state = State::Path;
</span><span class="cx">                 break;
</span><span class="lines">@@ -1309,8 +1286,8 @@
</span><span class="cx">                 String basePath = base.path();
</span><span class="cx">                 if (basePath.length() &gt;= 2) {
</span><span class="cx">                     bool windowsQuirk = basePath.is8Bit()
</span><del>-                        ? isWindowsDriveLetter&lt;serialized&gt;(CodePointIterator&lt;LChar&gt;(basePath.characters8(), basePath.characters8() + basePath.length()))
-                        : isWindowsDriveLetter&lt;serialized&gt;(CodePointIterator&lt;UChar&gt;(basePath.characters16(), basePath.characters16() + basePath.length()));
</del><ins>+                        ? isWindowsDriveLetter(CodePointIterator&lt;LChar&gt;(basePath.characters8(), basePath.characters8() + basePath.length()))
+                        : isWindowsDriveLetter(CodePointIterator&lt;UChar&gt;(basePath.characters16(), basePath.characters16() + basePath.length()));
</ins><span class="cx">                     if (windowsQuirk) {
</span><span class="cx">                         m_asciiBuffer.append(basePath[0]);
</span><span class="cx">                         m_asciiBuffer.append(basePath[1]);
</span><span class="lines">@@ -1324,7 +1301,7 @@
</span><span class="cx">             m_url.m_hostEnd = m_url.m_userStart;
</span><span class="cx">             m_url.m_portEnd = m_url.m_userStart;
</span><span class="cx">             m_url.m_pathAfterLastSlash = m_url.m_userStart + 1;
</span><del>-            checkWindowsDriveLetter&lt;serialized&gt;(c, m_asciiBuffer);
</del><ins>+            checkWindowsDriveLetter(c, m_asciiBuffer);
</ins><span class="cx">             state = State::Path;
</span><span class="cx">             break;
</span><span class="cx">         case State::FileHost:
</span><span class="lines">@@ -1356,7 +1333,7 @@
</span><span class="cx">                     state = State::Path;
</span><span class="cx">                     break;
</span><span class="cx">                 }
</span><del>-                if (!parseHostAndPort&lt;serialized&gt;(CodePointIterator&lt;CharacterType&gt;(authorityOrHostBegin, c)))
</del><ins>+                if (!parseHostAndPort(CodePointIterator&lt;CharacterType&gt;(authorityOrHostBegin, c)))
</ins><span class="cx">                     return failure(input, length);
</span><span class="cx">                 
</span><span class="cx">                 if (StringView(m_asciiBuffer.data() + m_url.m_passwordEnd, m_asciiBuffer.size() - m_url.m_passwordEnd) == &quot;localhost&quot;)  {
</span><span class="lines">@@ -1418,7 +1395,7 @@
</span><span class="cx">                 ++c;
</span><span class="cx">                 break;
</span><span class="cx">             }
</span><del>-            utf8PercentEncode&lt;serialized&gt;(*c, m_asciiBuffer, isInDefaultEncodeSet);
</del><ins>+            utf8PercentEncode(*c, m_asciiBuffer, isInDefaultEncodeSet);
</ins><span class="cx">             ++c;
</span><span class="cx">             break;
</span><span class="cx">         case State::CannotBeABaseURLPath:
</span><span class="lines">@@ -1435,7 +1412,7 @@
</span><span class="cx">                 m_url.m_pathAfterLastSlash = m_asciiBuffer.size();
</span><span class="cx">                 ++c;
</span><span class="cx">             } else {
</span><del>-                utf8PercentEncode&lt;serialized&gt;(*c, m_asciiBuffer, isInSimpleEncodeSet);
</del><ins>+                utf8PercentEncode(*c, m_asciiBuffer, isInSimpleEncodeSet);
</ins><span class="cx">                 ++c;
</span><span class="cx">             }
</span><span class="cx">             break;
</span><span class="lines">@@ -1449,7 +1426,7 @@
</span><span class="cx">                 break;
</span><span class="cx">             }
</span><span class="cx">             if (isUTF8Encoding)
</span><del>-                utf8QueryEncode&lt;serialized&gt;(*c, m_asciiBuffer);
</del><ins>+                utf8QueryEncode(*c, m_asciiBuffer);
</ins><span class="cx">             else
</span><span class="cx">                 appendCodePoint(queryBuffer, *c);
</span><span class="cx">             ++c;
</span><span class="lines">@@ -1533,7 +1510,7 @@
</span><span class="cx">         if (authorityOrHostBegin.atEnd()) {
</span><span class="cx">             m_url.m_hostEnd = m_url.m_userEnd;
</span><span class="cx">             m_url.m_portEnd = m_url.m_userEnd;
</span><del>-        } else if (!parseHostAndPort&lt;serialized&gt;(authorityOrHostBegin))
</del><ins>+        } else if (!parseHostAndPort(authorityOrHostBegin))
</ins><span class="cx">             return failure(input, length);
</span><span class="cx">         m_asciiBuffer.append('/');
</span><span class="cx">         m_url.m_pathEnd = m_url.m_portEnd + 1;
</span><span class="lines">@@ -1543,7 +1520,7 @@
</span><span class="cx">         break;
</span><span class="cx">     case State::Host:
</span><span class="cx">         LOG_FINAL_STATE(&quot;Host&quot;);
</span><del>-        if (!parseHostAndPort&lt;serialized&gt;(authorityOrHostBegin))
</del><ins>+        if (!parseHostAndPort(authorityOrHostBegin))
</ins><span class="cx">             return failure(input, length);
</span><span class="cx">         m_asciiBuffer.append('/');
</span><span class="cx">         m_url.m_pathEnd = m_url.m_portEnd + 1;
</span><span class="lines">@@ -1597,7 +1574,7 @@
</span><span class="cx">             break;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        if (!parseHostAndPort&lt;serialized&gt;(CodePointIterator&lt;CharacterType&gt;(authorityOrHostBegin, c)))
</del><ins>+        if (!parseHostAndPort(CodePointIterator&lt;CharacterType&gt;(authorityOrHostBegin, c)))
</ins><span class="cx">             return failure(input, length);
</span><span class="cx"> 
</span><span class="cx">         if (StringView(m_asciiBuffer.data() + m_url.m_passwordEnd, m_asciiBuffer.size() - m_url.m_passwordEnd) == &quot;localhost&quot;)  {
</span><span class="lines">@@ -1654,7 +1631,7 @@
</span><span class="cx">     return m_url;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-template&lt;bool serialized, typename CharacterType&gt;
</del><ins>+template&lt;typename CharacterType&gt;
</ins><span class="cx"> void URLParser::parseAuthority(CodePointIterator&lt;CharacterType&gt; iterator)
</span><span class="cx"> {
</span><span class="cx">     if (iterator.atEnd()) {
</span><span class="lines">@@ -1675,10 +1652,10 @@
</span><span class="cx">             m_asciiBuffer.append(':');
</span><span class="cx">             break;
</span><span class="cx">         }
</span><del>-        utf8PercentEncode&lt;serialized&gt;(*iterator, m_asciiBuffer, isInUserInfoEncodeSet);
</del><ins>+        utf8PercentEncode(*iterator, m_asciiBuffer, isInUserInfoEncodeSet);
</ins><span class="cx">     }
</span><span class="cx">     for (; !iterator.atEnd(); ++iterator)
</span><del>-        utf8PercentEncode&lt;serialized&gt;(*iterator, m_asciiBuffer, isInUserInfoEncodeSet);
</del><ins>+        utf8PercentEncode(*iterator, m_asciiBuffer, isInUserInfoEncodeSet);
</ins><span class="cx">     m_url.m_passwordEnd = m_asciiBuffer.size();
</span><span class="cx">     if (!m_url.m_userEnd)
</span><span class="cx">         m_url.m_userEnd = m_url.m_passwordEnd;
</span><span class="lines">@@ -2056,7 +2033,7 @@
</span><span class="cx">     return false;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-template&lt;bool serialized, typename CharacterType&gt;
</del><ins>+template&lt;typename CharacterType&gt;
</ins><span class="cx"> bool URLParser::parsePort(CodePointIterator&lt;CharacterType&gt;&amp; iterator)
</span><span class="cx"> {
</span><span class="cx">     uint32_t port = 0;
</span><span class="lines">@@ -2066,7 +2043,7 @@
</span><span class="cx">     }
</span><span class="cx">     m_asciiBuffer.append(':');
</span><span class="cx">     for (; !iterator.atEnd(); ++iterator) {
</span><del>-        if (!serialized &amp;&amp; isTabOrNewline(*iterator))
</del><ins>+        if (isTabOrNewline(*iterator))
</ins><span class="cx">             continue;
</span><span class="cx">         if (isASCIIDigit(*iterator)) {
</span><span class="cx">             port = port * 10 + *iterator - '0';
</span><span class="lines">@@ -2086,7 +2063,7 @@
</span><span class="cx">     return true;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-template&lt;bool serialized, typename CharacterType&gt;
</del><ins>+template&lt;typename CharacterType&gt;
</ins><span class="cx"> bool URLParser::parseHostAndPort(CodePointIterator&lt;CharacterType&gt; iterator)
</span><span class="cx"> {
</span><span class="cx">     if (iterator.atEnd())
</span><span class="lines">@@ -2103,7 +2080,7 @@
</span><span class="cx">                 ++ipv6End;
</span><span class="cx">                 if (!ipv6End.atEnd() &amp;&amp; *ipv6End == ':') {
</span><span class="cx">                     ++ipv6End;
</span><del>-                    return parsePort&lt;serialized&gt;(ipv6End);
</del><ins>+                    return parsePort(ipv6End);
</ins><span class="cx">                 }
</span><span class="cx">                 m_url.m_portEnd = m_asciiBuffer.size();
</span><span class="cx">                 return true;
</span><span class="lines">@@ -2112,11 +2089,10 @@
</span><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx">     
</span><del>-    ASSERT(!serialized || !m_hostHasPercentOrNonASCII);
</del><span class="cx">     if (!m_hostHasPercentOrNonASCII) {
</span><span class="cx">         auto hostIterator = iterator;
</span><span class="cx">         for (; !iterator.atEnd(); ++iterator) {
</span><del>-            if (!serialized &amp;&amp; isTabOrNewline(*iterator))
</del><ins>+            if (isTabOrNewline(*iterator))
</ins><span class="cx">                 continue;
</span><span class="cx">             if (*iterator == ':')
</span><span class="cx">                 break;
</span><span class="lines">@@ -2131,20 +2107,17 @@
</span><span class="cx">                 return true;
</span><span class="cx">             }
</span><span class="cx">             ++iterator;
</span><del>-            return parsePort&lt;serialized&gt;(iterator);
</del><ins>+            return parsePort(iterator);
</ins><span class="cx">         }
</span><span class="cx">         for (; hostIterator != iterator; ++hostIterator) {
</span><del>-            if (serialized) {
-                ASSERT(!isASCIIUpper(*hostIterator));
-                m_asciiBuffer.append(*hostIterator);
-            } else if (!isTabOrNewline(*hostIterator))
</del><ins>+            if (!isTabOrNewline(*hostIterator))
</ins><span class="cx">                 m_asciiBuffer.append(toASCIILower(*hostIterator));
</span><span class="cx">         }
</span><span class="cx">         m_url.m_hostEnd = m_asciiBuffer.size();
</span><span class="cx">         if (!hostIterator.atEnd()) {
</span><span class="cx">             ASSERT(*hostIterator == ':');
</span><del>-            incrementIteratorSkippingTabAndNewLine&lt;serialized&gt;(hostIterator);
-            return parsePort&lt;serialized&gt;(hostIterator);
</del><ins>+            incrementIteratorSkippingTabAndNewLine(hostIterator);
+            return parsePort(hostIterator);
</ins><span class="cx">         }
</span><span class="cx">         m_url.m_portEnd = m_asciiBuffer.size();
</span><span class="cx">         return true;
</span><span class="lines">@@ -2152,7 +2125,7 @@
</span><span class="cx">     
</span><span class="cx">     Vector&lt;LChar, defaultInlineBufferSize&gt; utf8Encoded;
</span><span class="cx">     for (; !iterator.atEnd(); ++iterator) {
</span><del>-        if (!serialized &amp;&amp; isTabOrNewline(*iterator))
</del><ins>+        if (isTabOrNewline(*iterator))
</ins><span class="cx">             continue;
</span><span class="cx">         if (*iterator == ':')
</span><span class="cx">             break;
</span><span class="lines">@@ -2180,7 +2153,7 @@
</span><span class="cx">             return true;
</span><span class="cx">         }
</span><span class="cx">         ++iterator;
</span><del>-        return parsePort&lt;serialized&gt;(iterator);
</del><ins>+        return parsePort(iterator);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     m_asciiBuffer.append(asciiDomainCharacters, asciiDomainValue.size());
</span><span class="lines">@@ -2187,8 +2160,8 @@
</span><span class="cx">     m_url.m_hostEnd = m_asciiBuffer.size();
</span><span class="cx">     if (!iterator.atEnd()) {
</span><span class="cx">         ASSERT(*iterator == ':');
</span><del>-        incrementIteratorSkippingTabAndNewLine&lt;serialized&gt;(iterator);
-        return parsePort&lt;serialized&gt;(iterator);
</del><ins>+        incrementIteratorSkippingTabAndNewLine(iterator);
+        return parsePort(iterator);
</ins><span class="cx">     }
</span><span class="cx">     m_url.m_portEnd = m_asciiBuffer.size();
</span><span class="cx">     return true;
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformURLParserh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/URLParser.h (206322 => 206323)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/URLParser.h        2016-09-23 19:40:53 UTC (rev 206322)
+++ trunk/Source/WebCore/platform/URLParser.h        2016-09-23 19:57:57 UTC (rev 206323)
</span><span class="lines">@@ -37,7 +37,6 @@
</span><span class="cx"> class URLParser {
</span><span class="cx"> public:
</span><span class="cx">     WEBCORE_EXPORT URL parse(const String&amp;, const URL&amp; = { }, const TextEncoding&amp; = UTF8Encoding());
</span><del>-    WEBCORE_EXPORT URL parseSerializedURL(const String&amp;);
</del><span class="cx"> 
</span><span class="cx">     WEBCORE_EXPORT static bool allValuesEqual(const URL&amp;, const URL&amp;);
</span><span class="cx">     WEBCORE_EXPORT static bool internalValuesConsistent(const URL&amp;);
</span><span class="lines">@@ -56,10 +55,10 @@
</span><span class="cx">     bool m_urlIsSpecial { false };
</span><span class="cx">     bool m_hostHasPercentOrNonASCII { false };
</span><span class="cx"> 
</span><del>-    template&lt;bool serialized, typename CharacterType&gt; URL parse(const CharacterType*, const unsigned length, const URL&amp;, const TextEncoding&amp;);
-    template&lt;bool serialized, typename CharacterType&gt; void parseAuthority(CodePointIterator&lt;CharacterType&gt;);
-    template&lt;bool serialized, typename CharacterType&gt; bool parseHostAndPort(CodePointIterator&lt;CharacterType&gt;);
-    template&lt;bool serialized, typename CharacterType&gt; bool parsePort(CodePointIterator&lt;CharacterType&gt;&amp;);
</del><ins>+    template&lt;typename CharacterType&gt; URL parse(const CharacterType*, const unsigned length, const URL&amp;, const TextEncoding&amp;);
+    template&lt;typename CharacterType&gt; void parseAuthority(CodePointIterator&lt;CharacterType&gt;);
+    template&lt;typename CharacterType&gt; bool parseHostAndPort(CodePointIterator&lt;CharacterType&gt;);
+    template&lt;typename CharacterType&gt; bool parsePort(CodePointIterator&lt;CharacterType&gt;&amp;);
</ins><span class="cx">     template&lt;typename CharacterType&gt; URL failure(const CharacterType*, unsigned length);
</span><span class="cx"> 
</span><span class="cx">     enum class URLPart;
</span></span></pre>
</div>
</div>

</body>
</html>