<!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>[192747] trunk</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/192747">192747</a></dd>
<dt>Author</dt> <dd>achristensen@apple.com</dd>
<dt>Date</dt> <dd>2015-11-23 10:39:16 -0800 (Mon, 23 Nov 2015)</dd>
</dl>

<h3>Log Message</h3>
<pre>Fix crash in ~WebProcessPool when using Geolocation with useNetworkProcess=true
https://bugs.webkit.org/show_bug.cgi?id=151532

Reviewed by Benjamin Poulain.

Source/WebKit2:

* UIProcess/WebGeolocationManagerProxy.cpp:
(WebKit::WebGeolocationManagerProxy::processPoolDestroyed):
(WebKit::WebGeolocationManagerProxy::processDidClose):
When a WebProcessPool is destroyed, only call stopUpdating if m_updateRequesters.clear()
stopped the updating, like we do in WebGeolocationManagerProxy::removeRequester.
Otherwise, call setEnableHighAccuracy if needed, also like we do in WebGeolocationManagerProxy::removeRequester.

Tools:

* TestWebKitAPI/Tests/WebKit2/Geolocation.cpp:
(TestWebKitAPI::GeolocationTransitionToHighAccuracyStateTracker::eventsChanged):
(TestWebKitAPI::TEST):
(TestWebKitAPI::GeolocationTransitionToLowAccuracyStateTracker::eventsChanged):
(TestWebKitAPI::GeolocationTransitionToHighAccuracyStateTracker::GeolocationTransitionToHighAccuracyStateTracker): Deleted.
(TestWebKitAPI::GeolocationTransitionToLowAccuracyStateTracker::GeolocationTransitionToLowAccuracyStateTracker): Deleted.
Properly load about:blank in all WebViews to clean up.  Without this change, we had a 
Geolocation provider stopping after its state tracker was destroyed with its stack frame,
so it was calling a function on a test object that had gone out of scope.
Also, call WKContextSetUsesNetworkProcess(context, true) to show what crash this fixed,
but that will become the default soon and that call will be removed.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebKit2ChangeLog">trunk/Source/WebKit2/ChangeLog</a></li>
<li><a href="#trunkSourceWebKit2UIProcessWebGeolocationManagerProxycpp">trunk/Source/WebKit2/UIProcess/WebGeolocationManagerProxy.cpp</a></li>
<li><a href="#trunkToolsChangeLog">trunk/Tools/ChangeLog</a></li>
<li><a href="#trunkToolsTestWebKitAPITestsWebKit2Geolocationcpp">trunk/Tools/TestWebKitAPI/Tests/WebKit2/Geolocation.cpp</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebKit2ChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/ChangeLog (192746 => 192747)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/ChangeLog        2015-11-23 18:31:58 UTC (rev 192746)
+++ trunk/Source/WebKit2/ChangeLog        2015-11-23 18:39:16 UTC (rev 192747)
</span><span class="lines">@@ -1,3 +1,17 @@
</span><ins>+2015-11-23  Alex Christensen  &lt;achristensen@webkit.org&gt;
+
+        Fix crash in ~WebProcessPool when using Geolocation with useNetworkProcess=true
+        https://bugs.webkit.org/show_bug.cgi?id=151532
+
+        Reviewed by Benjamin Poulain.
+
+        * UIProcess/WebGeolocationManagerProxy.cpp:
+        (WebKit::WebGeolocationManagerProxy::processPoolDestroyed):
+        (WebKit::WebGeolocationManagerProxy::processDidClose):
+        When a WebProcessPool is destroyed, only call stopUpdating if m_updateRequesters.clear()
+        stopped the updating, like we do in WebGeolocationManagerProxy::removeRequester.
+        Otherwise, call setEnableHighAccuracy if needed, also like we do in WebGeolocationManagerProxy::removeRequester.
+
</ins><span class="cx"> 2015-11-23  Brian Burg  &lt;bburg@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Web Inspector: when inspecting the inspector, add the inspection level to the title bar
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessWebGeolocationManagerProxycpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/WebGeolocationManagerProxy.cpp (192746 => 192747)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/WebGeolocationManagerProxy.cpp        2015-11-23 18:31:58 UTC (rev 192746)
+++ trunk/Source/WebKit2/UIProcess/WebGeolocationManagerProxy.cpp        2015-11-23 18:39:16 UTC (rev 192747)
</span><span class="lines">@@ -57,8 +57,12 @@
</span><span class="cx"> 
</span><span class="cx"> void WebGeolocationManagerProxy::processPoolDestroyed()
</span><span class="cx"> {
</span><ins>+    bool wasUpdating = isUpdating();
</ins><span class="cx">     m_updateRequesters.clear();
</span><del>-    m_provider.stopUpdating(this);
</del><ins>+
+    ASSERT(!isUpdating());
+    if (wasUpdating)
+        m_provider.stopUpdating(this);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void WebGeolocationManagerProxy::processDidClose(WebProcessProxy* webProcessProxy)
</span></span></pre></div>
<a id="trunkToolsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Tools/ChangeLog (192746 => 192747)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/ChangeLog        2015-11-23 18:31:58 UTC (rev 192746)
+++ trunk/Tools/ChangeLog        2015-11-23 18:39:16 UTC (rev 192747)
</span><span class="lines">@@ -1,3 +1,22 @@
</span><ins>+2015-11-23  Alex Christensen  &lt;achristensen@webkit.org&gt;
+
+        Fix crash in ~WebProcessPool when using Geolocation with useNetworkProcess=true
+        https://bugs.webkit.org/show_bug.cgi?id=151532
+
+        Reviewed by Benjamin Poulain.
+
+        * TestWebKitAPI/Tests/WebKit2/Geolocation.cpp:
+        (TestWebKitAPI::GeolocationTransitionToHighAccuracyStateTracker::eventsChanged):
+        (TestWebKitAPI::TEST):
+        (TestWebKitAPI::GeolocationTransitionToLowAccuracyStateTracker::eventsChanged):
+        (TestWebKitAPI::GeolocationTransitionToHighAccuracyStateTracker::GeolocationTransitionToHighAccuracyStateTracker): Deleted.
+        (TestWebKitAPI::GeolocationTransitionToLowAccuracyStateTracker::GeolocationTransitionToLowAccuracyStateTracker): Deleted.
+        Properly load about:blank in all WebViews to clean up.  Without this change, we had a 
+        Geolocation provider stopping after its state tracker was destroyed with its stack frame,
+        so it was calling a function on a test object that had gone out of scope.
+        Also, call WKContextSetUsesNetworkProcess(context, true) to show what crash this fixed,
+        but that will become the default soon and that call will be removed.
+
</ins><span class="cx"> 2015-11-22  David Kilzer  &lt;ddkilzer@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         run-webkit-tests: http server for imported W3C tests doesn't work with --layout-tests-directory switch
</span></span></pre></div>
<a id="trunkToolsTestWebKitAPITestsWebKit2Geolocationcpp"></a>
<div class="modfile"><h4>Modified: trunk/Tools/TestWebKitAPI/Tests/WebKit2/Geolocation.cpp (192746 => 192747)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/TestWebKitAPI/Tests/WebKit2/Geolocation.cpp        2015-11-23 18:31:58 UTC (rev 192746)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKit2/Geolocation.cpp        2015-11-23 18:39:16 UTC (rev 192747)
</span><span class="lines">@@ -30,6 +30,7 @@
</span><span class="cx"> #include &quot;PlatformUtilities.h&quot;
</span><span class="cx"> #include &quot;PlatformWebView.h&quot;
</span><span class="cx"> #include &quot;Test.h&quot;
</span><ins>+#include &lt;WebKit/WKContextPrivate.h&gt;
</ins><span class="cx"> #include &lt;WebKit/WKRetainPtr.h&gt;
</span><span class="cx"> #include &lt;string.h&gt;
</span><span class="cx"> #include &lt;vector&gt;
</span><span class="lines">@@ -212,15 +213,10 @@
</span><span class="cx"> 
</span><span class="cx"> // Geolocation start without High Accuracy, then requires High Accuracy.
</span><span class="cx"> struct GeolocationTransitionToHighAccuracyStateTracker : GeolocationStateTracker {
</span><del>-    bool finishedFirstStep;
-    bool finished;
</del><ins>+    bool finishedFirstStep { false };
+    bool enabledHighAccuracy { false };
+    bool finished { false };
</ins><span class="cx"> 
</span><del>-    GeolocationTransitionToHighAccuracyStateTracker()
-        : finishedFirstStep(false)
-        , finished(false)
-    {
-    }
-
</del><span class="cx">     virtual void eventsChanged()
</span><span class="cx">     {
</span><span class="cx">         switch (events.size()) {
</span><span class="lines">@@ -233,11 +229,19 @@
</span><span class="cx">             break;
</span><span class="cx">         case 3:
</span><span class="cx">             EXPECT_EQ(GeolocationEvent::EnableHighAccuracy, events[2]);
</span><ins>+            enabledHighAccuracy = true;
+            break;
+        case 4:
+            EXPECT_EQ(GeolocationEvent::DisableHighAccuracy, events[3]);
+            break;
+        case 5:
+            EXPECT_EQ(GeolocationEvent::StopUpdating, events[4]);
</ins><span class="cx">             finished = true;
</span><span class="cx">             break;
</span><span class="cx">         default:
</span><span class="cx">             EXPECT_TRUE(false);
</span><span class="cx">             finishedFirstStep = true;
</span><ins>+            enabledHighAccuracy = true;
</ins><span class="cx">             finished = true;
</span><span class="cx">         }
</span><span class="cx">     }
</span><span class="lines">@@ -246,6 +250,7 @@
</span><span class="cx"> TEST(WebKit2, GeolocationTransitionToHighAccuracy)
</span><span class="cx"> {
</span><span class="cx">     WKRetainPtr&lt;WKContextRef&gt; context(AdoptWK, WKContextCreate());
</span><ins>+    WKContextSetUsesNetworkProcess(context.get(), true);
</ins><span class="cx"> 
</span><span class="cx">     GeolocationTransitionToHighAccuracyStateTracker stateTracker;
</span><span class="cx">     setupGeolocationProvider(context.get(), &amp;stateTracker);
</span><span class="lines">@@ -260,20 +265,21 @@
</span><span class="cx">     setupView(highAccuracyWebView);
</span><span class="cx">     WKRetainPtr&lt;WKURLRef&gt; highAccuracyURL(AdoptWK, Util::createURLForResource(&quot;geolocationWatchPositionWithHighAccuracy&quot;, &quot;html&quot;));
</span><span class="cx">     WKPageLoadURL(highAccuracyWebView.page(), highAccuracyURL.get());
</span><ins>+    Util::run(&amp;stateTracker.enabledHighAccuracy);
+    
+    WKRetainPtr&lt;WKURLRef&gt; resetUrl = adoptWK(WKURLCreateWithUTF8CString(&quot;about:blank&quot;));
+    WKPageLoadURL(highAccuracyWebView.page(), resetUrl.get());
+    Util::run(&amp;stateTracker.enabledHighAccuracy);
+    WKPageLoadURL(lowAccuracyWebView.page(), resetUrl.get());
</ins><span class="cx">     Util::run(&amp;stateTracker.finished);
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> // Geolocation start with High Accuracy, then should fall back to low accuracy.
</span><span class="cx"> struct GeolocationTransitionToLowAccuracyStateTracker : GeolocationStateTracker {
</span><del>-    bool finishedFirstStep;
-    bool finished;
</del><ins>+    bool finishedFirstStep { false };
+    bool disabledHighAccuracy { false };
+    bool finished { false };
</ins><span class="cx"> 
</span><del>-    GeolocationTransitionToLowAccuracyStateTracker()
-        : finishedFirstStep(false)
-        , finished(false)
-    {
-    }
-
</del><span class="cx">     virtual void eventsChanged()
</span><span class="cx">     {
</span><span class="cx">         switch (events.size()) {
</span><span class="lines">@@ -286,11 +292,16 @@
</span><span class="cx">             break;
</span><span class="cx">         case 3:
</span><span class="cx">             EXPECT_EQ(GeolocationEvent::DisableHighAccuracy, events[2]);
</span><ins>+            disabledHighAccuracy = true;
+            break;
+        case 4:
+            EXPECT_EQ(GeolocationEvent::StopUpdating, events[3]);
</ins><span class="cx">             finished = true;
</span><span class="cx">             break;
</span><span class="cx">         default:
</span><span class="cx">             EXPECT_TRUE(false);
</span><span class="cx">             finishedFirstStep = true;
</span><ins>+            disabledHighAccuracy = true;
</ins><span class="cx">             finished = true;
</span><span class="cx">         }
</span><span class="cx">     }
</span><span class="lines">@@ -334,6 +345,8 @@
</span><span class="cx"> 
</span><span class="cx">     WKRetainPtr&lt;WKURLRef&gt; resetUrl = adoptWK(WKURLCreateWithUTF8CString(&quot;about:blank&quot;));
</span><span class="cx">     WKPageLoadURL(highAccuracyWebView.page(), resetUrl.get());
</span><ins>+    Util::run(&amp;stateTracker.disabledHighAccuracy);
+    WKPageLoadURL(lowAccuracyWebView.page(), resetUrl.get());
</ins><span class="cx">     Util::run(&amp;stateTracker.finished);
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre>
</div>
</div>

</body>
</html>