<!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>[177610] 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/177610">177610</a></dd>
<dt>Author</dt> <dd>commit-queue@webkit.org</dd>
<dt>Date</dt> <dd>2014-12-19 16:57:55 -0800 (Fri, 19 Dec 2014)</dd>
</dl>

<h3>Log Message</h3>
<pre>Web Inspector: Inspector does not reopen correctly after Inspector Process crashes
https://bugs.webkit.org/show_bug.cgi?id=139838

Patch by Joseph Pecoraro &lt;pecoraro@apple.com&gt; on 2014-12-19
Reviewed by Timothy Hatcher.

When the WebContentProcess holding the Inspector Frontend crashes, we
would properly tear down the inspector objects. However, the next time
the inspector is opened, when creating the new page in the Inspector
Page Group, a WebPageProxy is created with a Terminated WebProcessProxy.

That Terminated WebProcessProxy is automatically replaced with the next
load request is given. The newly created process was missing the
message listeners and assumed URL access settings that the
WebInspectorProxy had set on the old process.

So, WebInspectorProxy now listens for and resets the process properties
when the inspector process is recreated.

* UIProcess/WebInspectorProxy.h:
* UIProcess/WebInspectorProxy.cpp:
(WebKit::WebInspectorProxy::didRelaunchInspectorPageProcess):
Reset process properties when the process is relaunched.

(WebKit::WebInspectorProxy::createInspectorPage):
(WebKit::WebInspectorProxy::didClose):
Save connection identifier if we need to establish connections later.

* UIProcess/mac/WebInspectorProxyMac.mm:
(-[WKWebInspectorProxyObjCAdapter didRelaunchProcess]):
(-[WKWebInspectorWKView _didRelaunchProcess]):
(WebKit::WebInspectorProxy::closeTimerFired):
(WebKit::WebInspectorProxy::platformCreateInspectorPage):
Send WebInspectorProxy a message when the process underlying the
WKView is relaunched.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebKit2ChangeLog">trunk/Source/WebKit2/ChangeLog</a></li>
<li><a href="#trunkSourceWebKit2UIProcessWebInspectorProxycpp">trunk/Source/WebKit2/UIProcess/WebInspectorProxy.cpp</a></li>
<li><a href="#trunkSourceWebKit2UIProcessWebInspectorProxyh">trunk/Source/WebKit2/UIProcess/WebInspectorProxy.h</a></li>
<li><a href="#trunkSourceWebKit2UIProcessmacWebInspectorProxyMacmm">trunk/Source/WebKit2/UIProcess/mac/WebInspectorProxyMac.mm</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebKit2ChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/ChangeLog (177609 => 177610)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/ChangeLog        2014-12-20 00:52:35 UTC (rev 177609)
+++ trunk/Source/WebKit2/ChangeLog        2014-12-20 00:57:55 UTC (rev 177610)
</span><span class="lines">@@ -1,3 +1,40 @@
</span><ins>+2014-12-19  Joseph Pecoraro  &lt;pecoraro@apple.com&gt;
+
+        Web Inspector: Inspector does not reopen correctly after Inspector Process crashes
+        https://bugs.webkit.org/show_bug.cgi?id=139838
+
+        Reviewed by Timothy Hatcher.
+
+        When the WebContentProcess holding the Inspector Frontend crashes, we
+        would properly tear down the inspector objects. However, the next time
+        the inspector is opened, when creating the new page in the Inspector
+        Page Group, a WebPageProxy is created with a Terminated WebProcessProxy.
+
+        That Terminated WebProcessProxy is automatically replaced with the next
+        load request is given. The newly created process was missing the
+        message listeners and assumed URL access settings that the
+        WebInspectorProxy had set on the old process.
+
+        So, WebInspectorProxy now listens for and resets the process properties
+        when the inspector process is recreated.
+
+        * UIProcess/WebInspectorProxy.h:
+        * UIProcess/WebInspectorProxy.cpp:
+        (WebKit::WebInspectorProxy::didRelaunchInspectorPageProcess):
+        Reset process properties when the process is relaunched.
+
+        (WebKit::WebInspectorProxy::createInspectorPage):
+        (WebKit::WebInspectorProxy::didClose):
+        Save connection identifier if we need to establish connections later.
+
+        * UIProcess/mac/WebInspectorProxyMac.mm:
+        (-[WKWebInspectorProxyObjCAdapter didRelaunchProcess]):
+        (-[WKWebInspectorWKView _didRelaunchProcess]):
+        (WebKit::WebInspectorProxy::closeTimerFired):
+        (WebKit::WebInspectorProxy::platformCreateInspectorPage):
+        Send WebInspectorProxy a message when the process underlying the
+        WKView is relaunched.
+
</ins><span class="cx"> 2014-12-19  Anders Carlsson  &lt;andersca@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Get rid of the hardcoded set of structs in the message generation script
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessWebInspectorProxycpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/WebInspectorProxy.cpp (177609 => 177610)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/WebInspectorProxy.cpp        2014-12-20 00:52:35 UTC (rev 177609)
+++ trunk/Source/WebKit2/UIProcess/WebInspectorProxy.cpp        2014-12-20 00:57:55 UTC (rev 177610)
</span><span class="lines">@@ -236,6 +236,17 @@
</span><span class="cx">     didClose();
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void WebInspectorProxy::didRelaunchInspectorPageProcess()
+{
+    m_inspectorPage-&gt;process().addMessageReceiver(Messages::WebInspectorProxy::messageReceiverName(), m_page-&gt;pageID(), *this);
+    m_inspectorPage-&gt;process().assumeReadAccessToBaseURL(inspectorBaseURL());
+
+    // When didRelaunchInspectorPageProcess is called we can assume it is during a load request.
+    // Any messages we would have sent to a terminated process need to be re-sent.
+
+    m_inspectorPage-&gt;process().send(Messages::WebInspectorUI::EstablishConnection(m_connectionIdentifier, m_page-&gt;pageID(), m_underTest), m_inspectorPage-&gt;pageID());
+}
+
</ins><span class="cx"> void WebInspectorProxy::showConsole()
</span><span class="cx"> {
</span><span class="cx">     if (!m_page)
</span><span class="lines">@@ -526,8 +537,9 @@
</span><span class="cx">         return;
</span><span class="cx"> 
</span><span class="cx">     m_underTest = underTest;
</span><ins>+    m_connectionIdentifier = connectionIdentifier;
</ins><span class="cx"> 
</span><del>-    m_inspectorPage-&gt;process().send(Messages::WebInspectorUI::EstablishConnection(connectionIdentifier, m_page-&gt;pageID(), m_underTest), m_inspectorPage-&gt;pageID());
</del><ins>+    m_inspectorPage-&gt;process().send(Messages::WebInspectorUI::EstablishConnection(m_connectionIdentifier, m_page-&gt;pageID(), m_underTest), m_inspectorPage-&gt;pageID());
</ins><span class="cx"> 
</span><span class="cx">     if (!m_underTest) {
</span><span class="cx">         m_canAttach = canAttach;
</span><span class="lines">@@ -581,6 +593,7 @@
</span><span class="cx">     m_isAttached = false;
</span><span class="cx">     m_canAttach = false;
</span><span class="cx">     m_underTest = false;
</span><ins>+    m_connectionIdentifier = IPC::Attachment();
</ins><span class="cx"> 
</span><span class="cx">     platformDidClose();
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessWebInspectorProxyh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/WebInspectorProxy.h (177609 => 177610)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/WebInspectorProxy.h        2014-12-20 00:52:35 UTC (rev 177609)
+++ trunk/Source/WebKit2/UIProcess/WebInspectorProxy.h        2014-12-20 00:57:55 UTC (rev 177610)
</span><span class="lines">@@ -94,6 +94,8 @@
</span><span class="cx">     void show();
</span><span class="cx">     void hide();
</span><span class="cx">     void close();
</span><ins>+
+    void didRelaunchInspectorPageProcess();
</ins><span class="cx">     
</span><span class="cx"> #if PLATFORM(MAC)
</span><span class="cx">     void createInspectorWindow();
</span><span class="lines">@@ -224,6 +226,8 @@
</span><span class="cx">     // all the inspectors in the same group will make it impossible to debug
</span><span class="cx">     // the inspector code, so we use the level to make different page groups.
</span><span class="cx">     unsigned m_level;
</span><ins>+    
+    IPC::Attachment m_connectionIdentifier;
</ins><span class="cx"> 
</span><span class="cx">     AttachmentSide m_attachmentSide;
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessmacWebInspectorProxyMacmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/mac/WebInspectorProxyMac.mm (177609 => 177610)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/mac/WebInspectorProxyMac.mm        2014-12-20 00:52:35 UTC (rev 177609)
+++ trunk/Source/WebKit2/UIProcess/mac/WebInspectorProxyMac.mm        2014-12-20 00:57:55 UTC (rev 177610)
</span><span class="lines">@@ -35,7 +35,7 @@
</span><span class="cx"> #import &quot;WKOpenPanelResultListener.h&quot;
</span><span class="cx"> #import &quot;WKRetainPtr.h&quot;
</span><span class="cx"> #import &quot;WKURLCF.h&quot;
</span><del>-#import &quot;WKViewPrivate.h&quot;
</del><ins>+#import &quot;WKViewInternal.h&quot;
</ins><span class="cx"> #import &quot;WebContext.h&quot;
</span><span class="cx"> #import &quot;WebInspectorMessages.h&quot;
</span><span class="cx"> #import &quot;WebInspectorUIMessages.h&quot;
</span><span class="lines">@@ -86,6 +86,7 @@
</span><span class="cx"> 
</span><span class="cx"> - (id)initWithWebInspectorProxy:(WebInspectorProxy*)inspectorProxy;
</span><span class="cx"> - (void)close;
</span><ins>+- (void)didRelaunchProcess;
</ins><span class="cx"> 
</span><span class="cx"> @end
</span><span class="cx"> 
</span><span class="lines">@@ -123,6 +124,11 @@
</span><span class="cx">     _inspectorProxy = nullptr;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+- (void)didRelaunchProcess
+{
+    static_cast&lt;WebInspectorProxy*&gt;(_inspectorProxy)-&gt;didRelaunchInspectorPageProcess();
+}
+
</ins><span class="cx"> - (void)windowDidMove:(NSNotification *)notification
</span><span class="cx"> {
</span><span class="cx">     static_cast&lt;WebInspectorProxy*&gt;(_inspectorProxy)-&gt;windowFrameDidChange();
</span><span class="lines">@@ -165,6 +171,7 @@
</span><span class="cx"> @end
</span><span class="cx"> 
</span><span class="cx"> @interface WKWebInspectorWKView : WKView
</span><ins>+@property (nonatomic, assign) WKWebInspectorProxyObjCAdapter *inspectorProxyObjCAdapter;
</ins><span class="cx"> @end
</span><span class="cx"> 
</span><span class="cx"> @implementation WKWebInspectorWKView
</span><span class="lines">@@ -174,6 +181,13 @@
</span><span class="cx">     return WKInspectorViewTag;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+- (void)_didRelaunchProcess
+{
+    [super _didRelaunchProcess];
+
+    [self.inspectorProxyObjCAdapter didRelaunchProcess];
+}
+
</ins><span class="cx"> @end
</span><span class="cx"> 
</span><span class="cx"> @interface NSView (AppKitDetails)
</span><span class="lines">@@ -294,6 +308,7 @@
</span><span class="cx">     if (m_inspectorView) {
</span><span class="cx">         WebPageProxy* inspectorPage = toImpl(m_inspectorView.get().pageRef);
</span><span class="cx">         inspectorPage-&gt;close();
</span><ins>+        [m_inspectorView setInspectorProxyObjCAdapter:nil];
</ins><span class="cx">         m_inspectorView = nil;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -469,6 +484,8 @@
</span><span class="cx">     m_inspectorProxyObjCAdapter = adoptNS([[WKWebInspectorProxyObjCAdapter alloc] initWithWebInspectorProxy:this]);
</span><span class="cx">     ASSERT(m_inspectorProxyObjCAdapter);
</span><span class="cx"> 
</span><ins>+    [m_inspectorView setInspectorProxyObjCAdapter:m_inspectorProxyObjCAdapter.get()];
+
</ins><span class="cx">     WebPageProxy* inspectorPage = toImpl(m_inspectorView.get().pageRef);
</span><span class="cx">     ASSERT(inspectorPage);
</span><span class="cx"> 
</span></span></pre>
</div>
</div>

</body>
</html>