<!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>[210561] trunk/Source/WebKit2</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/210561">210561</a></dd>
<dt>Author</dt> <dd>krollin@apple.com</dd>
<dt>Date</dt> <dd>2017-01-10 14:31:06 -0800 (Tue, 10 Jan 2017)</dd>
</dl>

<h3>Log Message</h3>
<pre>Record/replay: fix range used for fuzzy matching
https://bugs.webkit.org/show_bug.cgi?id=166041

Reviewed by Darin Adler and Alex Christensen.

Because of two bugs, the attempt to determine the range of URLs to
check as part of the process of fuzzy matching was failing. The intent
was to find the range of URLs that started with the same
&lt;scheme://host:port&gt; as a given URL. However, because of a reversed
test, the upper end of the range ended up being the &quot;end()&quot; iterator
of the entire collection of URLs. With that fixed, there was another
bug due to one URL being given as &lt;scheme://host:port&gt; and the other
given as &lt;scheme://host:port/&gt; (note the trailing slash). Both of
these issues are now fixed.

* NetworkProcess/capture/NetworkCaptureManager.cpp:
(WebKit::NetworkCapture::Manager::initialize):
(WebKit::NetworkCapture::Manager::findBestFuzzyMatch):
(WebKit::NetworkCapture::Manager::urlIdentifyingCommonDomain):
* NetworkProcess/capture/NetworkCaptureManager.h:
* NetworkProcess/capture/NetworkCaptureResource.cpp:
(WebKit::NetworkCapture::Resource::url):
(WebKit::NetworkCapture::Resource::urlIdentifyingCommonDomain):
(WebKit::NetworkCapture::Resource::baseURL): Deleted.
* NetworkProcess/capture/NetworkCaptureResource.h:</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebKit2ChangeLog">trunk/Source/WebKit2/ChangeLog</a></li>
<li><a href="#trunkSourceWebKit2NetworkProcesscaptureNetworkCaptureManagercpp">trunk/Source/WebKit2/NetworkProcess/capture/NetworkCaptureManager.cpp</a></li>
<li><a href="#trunkSourceWebKit2NetworkProcesscaptureNetworkCaptureManagerh">trunk/Source/WebKit2/NetworkProcess/capture/NetworkCaptureManager.h</a></li>
<li><a href="#trunkSourceWebKit2NetworkProcesscaptureNetworkCaptureResourcecpp">trunk/Source/WebKit2/NetworkProcess/capture/NetworkCaptureResource.cpp</a></li>
<li><a href="#trunkSourceWebKit2NetworkProcesscaptureNetworkCaptureResourceh">trunk/Source/WebKit2/NetworkProcess/capture/NetworkCaptureResource.h</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebKit2ChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/ChangeLog (210560 => 210561)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/ChangeLog        2017-01-10 22:26:56 UTC (rev 210560)
+++ trunk/Source/WebKit2/ChangeLog        2017-01-10 22:31:06 UTC (rev 210561)
</span><span class="lines">@@ -1,3 +1,31 @@
</span><ins>+2017-01-10  Keith Rollin  &lt;krollin@apple.com&gt;
+
+        Record/replay: fix range used for fuzzy matching
+        https://bugs.webkit.org/show_bug.cgi?id=166041
+
+        Reviewed by Darin Adler and Alex Christensen.
+
+        Because of two bugs, the attempt to determine the range of URLs to
+        check as part of the process of fuzzy matching was failing. The intent
+        was to find the range of URLs that started with the same
+        &lt;scheme://host:port&gt; as a given URL. However, because of a reversed
+        test, the upper end of the range ended up being the &quot;end()&quot; iterator
+        of the entire collection of URLs. With that fixed, there was another
+        bug due to one URL being given as &lt;scheme://host:port&gt; and the other
+        given as &lt;scheme://host:port/&gt; (note the trailing slash). Both of
+        these issues are now fixed.
+
+        * NetworkProcess/capture/NetworkCaptureManager.cpp:
+        (WebKit::NetworkCapture::Manager::initialize):
+        (WebKit::NetworkCapture::Manager::findBestFuzzyMatch):
+        (WebKit::NetworkCapture::Manager::urlIdentifyingCommonDomain):
+        * NetworkProcess/capture/NetworkCaptureManager.h:
+        * NetworkProcess/capture/NetworkCaptureResource.cpp:
+        (WebKit::NetworkCapture::Resource::url):
+        (WebKit::NetworkCapture::Resource::urlIdentifyingCommonDomain):
+        (WebKit::NetworkCapture::Resource::baseURL): Deleted.
+        * NetworkProcess/capture/NetworkCaptureResource.h:
+
</ins><span class="cx"> 2017-01-10  Wenson Hsieh  &lt;wenson_hsieh@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Implement &quot;proximity&quot; scroll snapping
</span></span></pre></div>
<a id="trunkSourceWebKit2NetworkProcesscaptureNetworkCaptureManagercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/NetworkProcess/capture/NetworkCaptureManager.cpp (210560 => 210561)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/NetworkProcess/capture/NetworkCaptureManager.cpp        2017-01-10 22:26:56 UTC (rev 210560)
+++ trunk/Source/WebKit2/NetworkProcess/capture/NetworkCaptureManager.cpp        2017-01-10 22:31:06 UTC (rev 210561)
</span><span class="lines">@@ -62,16 +62,19 @@
</span><span class="cx"> 
</span><span class="cx"> void Manager::initialize(const String&amp; recordReplayMode, const String&amp; recordReplayCacheLocation)
</span><span class="cx"> {
</span><del>-    DEBUG_LOG(&quot;Initializing&quot;);
-
-    if (equalIgnoringASCIICase(recordReplayMode, &quot;record&quot;))
</del><ins>+    if (equalIgnoringASCIICase(recordReplayMode, &quot;record&quot;)) {
+        DEBUG_LOG(&quot;Initializing: recording mode&quot;);
</ins><span class="cx">         m_recordReplayMode = Record;
</span><del>-    else if (equalIgnoringASCIICase(recordReplayMode, &quot;replay&quot;))
</del><ins>+    } else if (equalIgnoringASCIICase(recordReplayMode, &quot;replay&quot;)) {
+        DEBUG_LOG(&quot;Initializing: replay mode&quot;);
</ins><span class="cx">         m_recordReplayMode = Replay;
</span><del>-    else
</del><ins>+    } else {
+        DEBUG_LOG(&quot;Initializing: disabled&quot;);
</ins><span class="cx">         m_recordReplayMode = Disabled;
</span><ins>+    }
</ins><span class="cx"> 
</span><span class="cx">     m_recordReplayCacheLocation = WebCore::pathByAppendingComponent(recordReplayCacheLocation, kDirNameRecordReplay);
</span><ins>+    DEBUG_LOG(&quot;Cache location = &quot; STRING_SPECIFIER, DEBUG_STR(m_recordReplayCacheLocation));
</ins><span class="cx"> 
</span><span class="cx">     if (isRecording()) {
</span><span class="cx">         m_recordFileHandle = WebCore::FileHandle(reportRecordPath(), WebCore::OpenForWrite);
</span><span class="lines">@@ -79,12 +82,8 @@
</span><span class="cx">         m_recordFileHandle = WebCore::FileHandle(reportRecordPath(), WebCore::OpenForRead);
</span><span class="cx">         m_loadFileHandle = WebCore::FileHandle(reportLoadPath(), WebCore::OpenForWrite);
</span><span class="cx">         m_replayFileHandle = WebCore::FileHandle(reportReplayPath(), WebCore::OpenForWrite);
</span><ins>+        loadResources();
</ins><span class="cx">     }
</span><del>-
-    DEBUG_LOG(&quot;Cache location = &quot; STRING_SPECIFIER, DEBUG_STR(m_recordReplayCacheLocation));
-
-    if (isReplaying())
-        loadResources();
</del><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void Manager::terminate()
</span><span class="lines">@@ -134,17 +133,17 @@
</span><span class="cx"> Resource* Manager::findBestFuzzyMatch(const WebCore::ResourceRequest&amp; request)
</span><span class="cx"> {
</span><span class="cx">     const auto&amp; url = request.url();
</span><del>-    Resource* bestMatch = nullptr;
-    int bestScore = kMinMatch;
-    const auto&amp; baseURL = url.string().left(url.pathStart());
</del><ins>+    const auto&amp; urlIdentifyingCommonDomain = Manager::urlIdentifyingCommonDomain(url);
</ins><span class="cx"> 
</span><del>-    const auto&amp; lower = std::lower_bound(std::begin(m_cachedResources), std::end(m_cachedResources), baseURL, [](auto&amp; resource, const auto&amp; url) {
-        return WTF::codePointCompareLessThan(resource.baseURL().string(), url);
</del><ins>+    const auto&amp; lower = std::lower_bound(std::begin(m_cachedResources), std::end(m_cachedResources), urlIdentifyingCommonDomain, [](auto&amp; resource, const auto&amp; urlIdentifyingCommonDomain) {
+        return WTF::codePointCompareLessThan(resource.urlIdentifyingCommonDomain(), urlIdentifyingCommonDomain);
</ins><span class="cx">     });
</span><del>-    const auto&amp; upper = std::upper_bound(lower, std::end(m_cachedResources), baseURL, [](const auto&amp; url, auto&amp; resource) {
-        return WTF::codePointCompareLessThan(resource.baseURL().string(), url);
</del><ins>+    const auto&amp; upper = std::upper_bound(lower, std::end(m_cachedResources), urlIdentifyingCommonDomain, [](const auto&amp; urlIdentifyingCommonDomain, auto&amp; resource) {
+        return WTF::codePointCompareLessThan(urlIdentifyingCommonDomain, resource.urlIdentifyingCommonDomain());
</ins><span class="cx">     });
</span><span class="cx"> 
</span><ins>+    Resource* bestMatch = nullptr;
+    int bestScore = kMinMatch;
</ins><span class="cx">     const auto&amp; requestParameters = WebCore::URLParser::parseURLEncodedForm(url.query());
</span><span class="cx">     for (auto iResource = lower; iResource != upper; ++iResource) {
</span><span class="cx">         int thisScore = fuzzyMatchURLs(url, requestParameters, iResource-&gt;url(), iResource-&gt;queryParameters());
</span><span class="lines">@@ -419,6 +418,11 @@
</span><span class="cx">     return path;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+String Manager::urlIdentifyingCommonDomain(const WebCore::URL&amp; url)
+{
+    return url.protocolHostAndPort();
+}
+
</ins><span class="cx"> void Manager::logRecordedResource(const WebCore::ResourceRequest&amp; request)
</span><span class="cx"> {
</span><span class="cx">     // Log network resources as they are cached to disk.
</span></span></pre></div>
<a id="trunkSourceWebKit2NetworkProcesscaptureNetworkCaptureManagerh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/NetworkProcess/capture/NetworkCaptureManager.h (210560 => 210561)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/NetworkProcess/capture/NetworkCaptureManager.h        2017-01-10 22:26:56 UTC (rev 210560)
+++ trunk/Source/WebKit2/NetworkProcess/capture/NetworkCaptureManager.h        2017-01-10 22:31:06 UTC (rev 210561)
</span><span class="lines">@@ -83,6 +83,7 @@
</span><span class="cx">     WebCore::FileHandle openCacheFile(const String&amp;, WebCore::FileOpenMode);
</span><span class="cx"> 
</span><span class="cx">     String requestToPath(const WebCore::ResourceRequest&amp;);
</span><ins>+    static String urlIdentifyingCommonDomain(const WebCore::URL&amp;);
</ins><span class="cx"> 
</span><span class="cx"> private:
</span><span class="cx">     Manager() = default;
</span></span></pre></div>
<a id="trunkSourceWebKit2NetworkProcesscaptureNetworkCaptureResourcecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/NetworkProcess/capture/NetworkCaptureResource.cpp (210560 => 210561)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/NetworkProcess/capture/NetworkCaptureResource.cpp        2017-01-10 22:26:56 UTC (rev 210560)
+++ trunk/Source/WebKit2/NetworkProcess/capture/NetworkCaptureResource.cpp        2017-01-10 22:31:06 UTC (rev 210561)
</span><span class="lines">@@ -30,6 +30,7 @@
</span><span class="cx"> 
</span><span class="cx"> #include &quot;NetworkCaptureEvent.h&quot;
</span><span class="cx"> #include &quot;NetworkCaptureLogging.h&quot;
</span><ins>+#include &quot;NetworkCaptureManager.h&quot;
</ins><span class="cx"> #include &quot;NetworkCaptureRecorder.h&quot;
</span><span class="cx"> 
</span><span class="cx"> namespace WebKit {
</span><span class="lines">@@ -42,7 +43,7 @@
</span><span class="cx"> 
</span><span class="cx"> const WebCore::URL&amp; Resource::url()
</span><span class="cx"> {
</span><del>-    if (!m_url) {
</del><ins>+    if (!m_url.isValid()) {
</ins><span class="cx">         auto events = eventStream();
</span><span class="cx">         auto event = events.nextEvent();
</span><span class="cx">         if (!event)
</span><span class="lines">@@ -56,19 +57,15 @@
</span><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    return *m_url;
</del><ins>+    return m_url;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-const WebCore::URL&amp; Resource::baseURL()
</del><ins>+const String&amp; Resource::urlIdentifyingCommonDomain()
</ins><span class="cx"> {
</span><del>-    if (!m_baseURL) {
-        auto pathStart = url().pathStart();
-        auto baseURLStr = url().string().left(pathStart);
-        WebCore::URLParser parser(baseURLStr);
-        m_baseURL = parser.result();
-    }
</del><ins>+    if (m_urlIdentifyingCommonDomain.isNull())
+        m_urlIdentifyingCommonDomain = Manager::urlIdentifyingCommonDomain(url());
</ins><span class="cx"> 
</span><del>-    return *m_baseURL;
</del><ins>+    return m_urlIdentifyingCommonDomain;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> WebCore::URLParser::URLEncodedForm Resource::queryParameters()
</span></span></pre></div>
<a id="trunkSourceWebKit2NetworkProcesscaptureNetworkCaptureResourceh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/NetworkProcess/capture/NetworkCaptureResource.h (210560 => 210561)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/NetworkProcess/capture/NetworkCaptureResource.h        2017-01-10 22:26:56 UTC (rev 210560)
+++ trunk/Source/WebKit2/NetworkProcess/capture/NetworkCaptureResource.h        2017-01-10 22:31:06 UTC (rev 210561)
</span><span class="lines">@@ -56,14 +56,14 @@
</span><span class="cx">     Resource(const String&amp; eventFilePath);
</span><span class="cx"> 
</span><span class="cx">     const WebCore::URL&amp; url();
</span><del>-    const WebCore::URL&amp; baseURL();
</del><ins>+    const String&amp; urlIdentifyingCommonDomain();
</ins><span class="cx">     WebCore::URLParser::URLEncodedForm queryParameters();
</span><span class="cx">     EventStream eventStream();
</span><span class="cx"> 
</span><span class="cx"> private:
</span><span class="cx">     String m_eventFilePath;
</span><del>-    std::optional&lt;WebCore::URL&gt; m_url;
-    std::optional&lt;WebCore::URL&gt; m_baseURL;
</del><ins>+    WebCore::URL m_url;
+    String m_urlIdentifyingCommonDomain;
</ins><span class="cx">     std::optional&lt;WebCore::URLParser::URLEncodedForm&gt; m_queryParameters;
</span><span class="cx"> };
</span><span class="cx"> 
</span></span></pre>
</div>
</div>

</body>
</html>