<!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>[150688] trunk/Source/WebKit/mac</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/150688">150688</a></dd>
<dt>Author</dt> <dd>mitz@apple.com</dd>
<dt>Date</dt> <dd>2013-05-25 10:57:19 -0700 (Sat, 25 May 2013)</dd>
</dl>

<h3>Log Message</h3>
<pre>&lt;rdar://problem/13924889&gt; -webView:didPerformClientRedirectFromURL:toURL:inFrame: should be given the redirecting URL as the “from” URL
https://bugs.webkit.org/show_bug.cgi?id=116733

Reviewed by Adele Peterson.

By the time the history controller calls updateGlobalHistoryRedirectLinks(), the document
loader already reflects the destination URL. In order to be able to provide the immediate
source URL to the delegate, we make WebFrame track a URL and provisional URL, updating them
in response to FrameLoader callbacks in exactly the same way WebFrameProxy maintains its
m_url and m_provisionalURL member variables.

* WebCoreSupport/WebFrameLoaderClient.mm:
(WebFrameLoaderClient::dispatchDidReceiveServerRedirectForProvisionalLoad): Update
provisionalURL.
(WebFrameLoaderClient::dispatchDidChangeLocationWithinPage): Update url.
(WebFrameLoaderClient::dispatchDidPushStateWithinPage): Ditto.
(WebFrameLoaderClient::dispatchDidReplaceStateWithinPage): Ditto.
(WebFrameLoaderClient::dispatchDidPopStateWithinPage): Ditto.
(WebFrameLoaderClient::dispatchDidStartProvisionalLoad): Update provisionalURL.
(WebFrameLoaderClient::dispatchDidCommitLoad): Update URL and provisionalURL.
(WebFrameLoaderClient::dispatchDidFailProvisionalLoad): Clear provisionalURL.
(WebFrameLoaderClient::dispatchDidFailLoad): Added an assertion.
(WebFrameLoaderClient::dispatchDidFinishLoad): Ditto.
(WebFrameLoaderClient::updateGlobalHistoryRedirectLinks): Pass the last committed URL as the
source, rather than clientRedirectSourceForHistory().
* WebView/WebFrameInternal.h: Added url and provisionalURL ivars to WebFramePrivate.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebKitmacChangeLog">trunk/Source/WebKit/mac/ChangeLog</a></li>
<li><a href="#trunkSourceWebKitmacWebCoreSupportWebFrameLoaderClientmm">trunk/Source/WebKit/mac/WebCoreSupport/WebFrameLoaderClient.mm</a></li>
<li><a href="#trunkSourceWebKitmacWebViewWebFrameInternalh">trunk/Source/WebKit/mac/WebView/WebFrameInternal.h</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebKitmacChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/mac/ChangeLog (150687 => 150688)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/mac/ChangeLog        2013-05-25 12:02:35 UTC (rev 150687)
+++ trunk/Source/WebKit/mac/ChangeLog        2013-05-25 17:57:19 UTC (rev 150688)
</span><span class="lines">@@ -1,3 +1,32 @@
</span><ins>+2013-05-25  Dan Bernstein  &lt;mitz@apple.com&gt;
+
+        &lt;rdar://problem/13924889&gt; -webView:didPerformClientRedirectFromURL:toURL:inFrame: should be given the redirecting URL as the “from” URL
+        https://bugs.webkit.org/show_bug.cgi?id=116733
+
+        Reviewed by Adele Peterson.
+
+        By the time the history controller calls updateGlobalHistoryRedirectLinks(), the document
+        loader already reflects the destination URL. In order to be able to provide the immediate
+        source URL to the delegate, we make WebFrame track a URL and provisional URL, updating them
+        in response to FrameLoader callbacks in exactly the same way WebFrameProxy maintains its
+        m_url and m_provisionalURL member variables.
+
+        * WebCoreSupport/WebFrameLoaderClient.mm:
+        (WebFrameLoaderClient::dispatchDidReceiveServerRedirectForProvisionalLoad): Update
+        provisionalURL.
+        (WebFrameLoaderClient::dispatchDidChangeLocationWithinPage): Update url.
+        (WebFrameLoaderClient::dispatchDidPushStateWithinPage): Ditto.
+        (WebFrameLoaderClient::dispatchDidReplaceStateWithinPage): Ditto.
+        (WebFrameLoaderClient::dispatchDidPopStateWithinPage): Ditto.
+        (WebFrameLoaderClient::dispatchDidStartProvisionalLoad): Update provisionalURL.
+        (WebFrameLoaderClient::dispatchDidCommitLoad): Update URL and provisionalURL.
+        (WebFrameLoaderClient::dispatchDidFailProvisionalLoad): Clear provisionalURL.
+        (WebFrameLoaderClient::dispatchDidFailLoad): Added an assertion.
+        (WebFrameLoaderClient::dispatchDidFinishLoad): Ditto.
+        (WebFrameLoaderClient::updateGlobalHistoryRedirectLinks): Pass the last committed URL as the
+        source, rather than clientRedirectSourceForHistory().
+        * WebView/WebFrameInternal.h: Added url and provisionalURL ivars to WebFramePrivate.
+
</ins><span class="cx"> 2013-05-24  Anders Carlsson  &lt;andersca@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Remove using namespace std from Mac WebKit1
</span></span></pre></div>
<a id="trunkSourceWebKitmacWebCoreSupportWebFrameLoaderClientmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/mac/WebCoreSupport/WebFrameLoaderClient.mm (150687 => 150688)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/mac/WebCoreSupport/WebFrameLoaderClient.mm        2013-05-25 12:02:35 UTC (rev 150687)
+++ trunk/Source/WebKit/mac/WebCoreSupport/WebFrameLoaderClient.mm        2013-05-25 17:57:19 UTC (rev 150688)
</span><span class="lines">@@ -514,6 +514,8 @@
</span><span class="cx"> 
</span><span class="cx"> void WebFrameLoaderClient::dispatchDidReceiveServerRedirectForProvisionalLoad()
</span><span class="cx"> {
</span><ins>+    m_webFrame-&gt;_private-&gt;provisionalURL = core(m_webFrame.get())-&gt;loader()-&gt;provisionalDocumentLoader()-&gt;url().string();
+
</ins><span class="cx">     WebView *webView = getWebView(m_webFrame.get());
</span><span class="cx">     WebFrameLoadDelegateImplementationCache* implementations = WebViewGetFrameLoadDelegateImplementations(webView);
</span><span class="cx">     if (implementations-&gt;didReceiveServerRedirectForProvisionalLoadForFrameFunc)
</span><span class="lines">@@ -540,6 +542,8 @@
</span><span class="cx"> 
</span><span class="cx"> void WebFrameLoaderClient::dispatchDidChangeLocationWithinPage()
</span><span class="cx"> {
</span><ins>+    m_webFrame-&gt;_private-&gt;url = core(m_webFrame.get())-&gt;document()-&gt;url().string();
+
</ins><span class="cx">     WebView *webView = getWebView(m_webFrame.get());
</span><span class="cx">     WebFrameLoadDelegateImplementationCache* implementations = WebViewGetFrameLoadDelegateImplementations(webView);
</span><span class="cx">     if (implementations-&gt;didChangeLocationWithinPageForFrameFunc)
</span><span class="lines">@@ -548,6 +552,8 @@
</span><span class="cx"> 
</span><span class="cx"> void WebFrameLoaderClient::dispatchDidPushStateWithinPage()
</span><span class="cx"> {
</span><ins>+    m_webFrame-&gt;_private-&gt;url = core(m_webFrame.get())-&gt;document()-&gt;url().string();
+
</ins><span class="cx">     WebView *webView = getWebView(m_webFrame.get());
</span><span class="cx">     WebFrameLoadDelegateImplementationCache* implementations = WebViewGetFrameLoadDelegateImplementations(webView);
</span><span class="cx">     if (implementations-&gt;didPushStateWithinPageForFrameFunc)
</span><span class="lines">@@ -556,6 +562,8 @@
</span><span class="cx"> 
</span><span class="cx"> void WebFrameLoaderClient::dispatchDidReplaceStateWithinPage()
</span><span class="cx"> {
</span><ins>+    m_webFrame-&gt;_private-&gt;url = core(m_webFrame.get())-&gt;document()-&gt;url().string();
+
</ins><span class="cx">     WebView *webView = getWebView(m_webFrame.get());
</span><span class="cx">     WebFrameLoadDelegateImplementationCache* implementations = WebViewGetFrameLoadDelegateImplementations(webView);
</span><span class="cx">     if (implementations-&gt;didReplaceStateWithinPageForFrameFunc)
</span><span class="lines">@@ -564,6 +572,8 @@
</span><span class="cx"> 
</span><span class="cx"> void WebFrameLoaderClient::dispatchDidPopStateWithinPage()
</span><span class="cx"> {
</span><ins>+    m_webFrame-&gt;_private-&gt;url = core(m_webFrame.get())-&gt;document()-&gt;url().string();
+
</ins><span class="cx">     WebView *webView = getWebView(m_webFrame.get());
</span><span class="cx">     WebFrameLoadDelegateImplementationCache* implementations = WebViewGetFrameLoadDelegateImplementations(webView);
</span><span class="cx">     if (implementations-&gt;didPopStateWithinPageForFrameFunc)
</span><span class="lines">@@ -589,7 +599,10 @@
</span><span class="cx"> 
</span><span class="cx"> void WebFrameLoaderClient::dispatchDidStartProvisionalLoad()
</span><span class="cx"> {
</span><del>-    WebView *webView = getWebView(m_webFrame.get());   
</del><ins>+    ASSERT(!m_webFrame-&gt;_private-&gt;provisionalURL);
+    m_webFrame-&gt;_private-&gt;provisionalURL = core(m_webFrame.get())-&gt;loader()-&gt;provisionalDocumentLoader()-&gt;url().string();
+
+    WebView *webView = getWebView(m_webFrame.get());
</ins><span class="cx">     [webView _didStartProvisionalLoadForFrame:m_webFrame.get()];
</span><span class="cx"> 
</span><span class="cx">     WebFrameLoadDelegateImplementationCache* implementations = WebViewGetFrameLoadDelegateImplementations(webView);
</span><span class="lines">@@ -619,6 +632,9 @@
</span><span class="cx">     WebView *webView = getWebView(m_webFrame.get());   
</span><span class="cx">     [webView _didCommitLoadForFrame:m_webFrame.get()];
</span><span class="cx"> 
</span><ins>+    m_webFrame-&gt;_private-&gt;url = m_webFrame-&gt;_private-&gt;provisionalURL;
+    m_webFrame-&gt;_private-&gt;provisionalURL = nullptr;
+
</ins><span class="cx">     WebFrameLoadDelegateImplementationCache* implementations = WebViewGetFrameLoadDelegateImplementations(webView);
</span><span class="cx">     if (implementations-&gt;didCommitLoadForFrameFunc)
</span><span class="cx">         CallFrameLoadDelegate(implementations-&gt;didCommitLoadForFrameFunc, webView, @selector(webView:didCommitLoadForFrame:), m_webFrame.get());
</span><span class="lines">@@ -626,7 +642,9 @@
</span><span class="cx"> 
</span><span class="cx"> void WebFrameLoaderClient::dispatchDidFailProvisionalLoad(const ResourceError&amp; error)
</span><span class="cx"> {
</span><del>-    WebView *webView = getWebView(m_webFrame.get());   
</del><ins>+    m_webFrame-&gt;_private-&gt;provisionalURL = nullptr;
+
+    WebView *webView = getWebView(m_webFrame.get());
</ins><span class="cx">     [webView _didFailProvisionalLoadWithError:error forFrame:m_webFrame.get()];
</span><span class="cx"> 
</span><span class="cx">     WebFrameLoadDelegateImplementationCache* implementations = WebViewGetFrameLoadDelegateImplementations(webView);
</span><span class="lines">@@ -638,7 +656,9 @@
</span><span class="cx"> 
</span><span class="cx"> void WebFrameLoaderClient::dispatchDidFailLoad(const ResourceError&amp; error)
</span><span class="cx"> {
</span><del>-    WebView *webView = getWebView(m_webFrame.get());   
</del><ins>+    ASSERT(!m_webFrame-&gt;_private-&gt;provisionalURL);
+
+    WebView *webView = getWebView(m_webFrame.get());
</ins><span class="cx">     [webView _didFailLoadWithError:error forFrame:m_webFrame.get()];
</span><span class="cx"> 
</span><span class="cx">     WebFrameLoadDelegateImplementationCache* implementations = WebViewGetFrameLoadDelegateImplementations(webView);
</span><span class="lines">@@ -658,7 +678,9 @@
</span><span class="cx"> 
</span><span class="cx"> void WebFrameLoaderClient::dispatchDidFinishLoad()
</span><span class="cx"> {
</span><del>-    WebView *webView = getWebView(m_webFrame.get());   
</del><ins>+    ASSERT(!m_webFrame-&gt;_private-&gt;provisionalURL);
+
+    WebView *webView = getWebView(m_webFrame.get());
</ins><span class="cx">     [webView _didFinishLoadForFrame:m_webFrame.get()];
</span><span class="cx"> 
</span><span class="cx">     WebFrameLoadDelegateImplementationCache* implementations = WebViewGetFrameLoadDelegateImplementations(webView);
</span><span class="lines">@@ -921,7 +943,7 @@
</span><span class="cx">         if (implementations) {
</span><span class="cx">             if (implementations-&gt;clientRedirectFunc) {
</span><span class="cx">                 CallHistoryDelegate(implementations-&gt;clientRedirectFunc, view, @selector(webView:didPerformClientRedirectFromURL:toURL:inFrame:), 
</span><del>-                    loader-&gt;clientRedirectSourceForHistory(), loader-&gt;clientRedirectDestinationForHistory(), m_webFrame.get());
</del><ins>+                    m_webFrame-&gt;_private-&gt;url.get(), loader-&gt;clientRedirectDestinationForHistory(), m_webFrame.get());
</ins><span class="cx">             }
</span><span class="cx">         } else if (WebHistoryItem *item = [[WebHistory optionalSharedHistory] _itemForURLString:loader-&gt;clientRedirectSourceForHistory()])
</span><span class="cx">             core(item)-&gt;addRedirectURL(loader-&gt;clientRedirectDestinationForHistory());
</span></span></pre></div>
<a id="trunkSourceWebKitmacWebViewWebFrameInternalh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/mac/WebView/WebFrameInternal.h (150687 => 150688)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/mac/WebView/WebFrameInternal.h        2013-05-25 12:02:35 UTC (rev 150687)
+++ trunk/Source/WebKit/mac/WebView/WebFrameInternal.h        2013-05-25 17:57:19 UTC (rev 150688)
</span><span class="lines">@@ -82,6 +82,8 @@
</span><span class="cx">     id internalLoadDelegate;
</span><span class="cx">     BOOL shouldCreateRenderers;
</span><span class="cx">     BOOL includedInWebKitStatistics;
</span><ins>+    RetainPtr&lt;NSString&gt; url;
+    RetainPtr&lt;NSString&gt; provisionalURL;
</ins><span class="cx"> }
</span><span class="cx"> @end
</span><span class="cx"> 
</span></span></pre>
</div>
</div>

</body>
</html>